Branch: refs/heads/master Author: Lex elextr@gmail.com Committer: Lex elextr@gmail.com Date: Sat, 17 Nov 2012 08:19:27 UTC Commit: da78a44a1cfeb753e0d06d7175e882f508ad9788 https://github.com/geany/geany/commit/da78a44a1cfeb753e0d06d7175e882f508ad97...
Log Message: ----------- Add Asciidoc filetype with symbol parser
Add an Asciidoc filetype and a basic symbol parser based on ReST. See the FIXMEs for ReST to Asciidoc changes still to be done.
Modified Paths: -------------- data/filetypes.asciidoc tagmanager/ctags/asciidoc.c
Modified: data/filetypes.asciidoc 35 files changed, 35 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,35 @@ +# For complete documentation of this file, please see Geany's main documentation +[styling] +# no syntax highlighting yet + +[settings] +# default extension used when saving files +extension=asciidoc + +# the following characters are these which a "word" can contains, see documentation +#wordchars=_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 + +# single comments, like # in this file +comment_single=// +# multiline comments +#comment_open=//// +#comment_close=//// + +# set to false if a comment character/string should start at column 0 of a line, true uses any +# indentation of the line, e.g. setting to true causes the following on pressing CTRL+d + #command_example(); +# setting to false would generate this +# command_example(); +# This setting works only for single line comments +comment_use_indent=false + +# context action command (please see Geany's main documentation for details) +context_action_cmd= + +# sort tags by appearance +symbol_list_sort_mode=1 + +[indentation] +#width=4 +# 0 is spaces, 1 is tabs, 2 is tab & spaces +#type=1
Modified: tagmanager/ctags/asciidoc.c 208 files changed, 208 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,208 @@ +/* +* +* Copyright (c) 2012, Lex Trotman +* Based on Rest code by Nick Treleaven, see rest.c +* +* This source code is released for free distribution under the terms of the +* GNU General Public License. +* +* This module contains functions for generating tags for asciidoc files. +*/ + +/* +* INCLUDE FILES +*/ +#include "general.h" /* must always come first */ + +#include <ctype.h> +#include <string.h> + +#include "parse.h" +#include "read.h" +#include "vstring.h" +#include "nestlevel.h" + +/* +* DATA DEFINITIONS +*/ +typedef enum { + K_CHAPTER = 0, + K_SECTION, + K_SUBSECTION, + K_SUBSUBSECTION, + K_LEVEL5SECTION, + SECTION_COUNT +} asciidocKind; + +static kindOption AsciidocKinds[] = { + { TRUE, 'n', "namespace", "chapters"}, + { TRUE, 'm', "member", "sections" }, + { TRUE, 'd', "macro", "level2sections" }, + { TRUE, 'v', "variable", "level3sections" }, + { TRUE, 's', "struct", "level4sections" } +}; + +static char kindchars[SECTION_COUNT]={ '=', '-', '~', '^', '+' }; + +static NestingLevels *nestingLevels = NULL; + +/* +* FUNCTION DEFINITIONS +*/ + +static NestingLevel *getNestingLevel(const int kind) +{ + NestingLevel *nl; + + while (1) + { + nl = nestingLevelsGetCurrent(nestingLevels); + if (nl && nl->type >= kind) + nestingLevelsPop(nestingLevels); + else + break; + } + return nl; +} + +static void makeAsciidocTag (const vString* const name, const int kind) +{ + const NestingLevel *const nl = getNestingLevel(kind); + + if (vStringLength (name) > 0) + { + tagEntryInfo e; + initTagEntry (&e, vStringValue (name)); + + e.lineNumber--; /* we want the line before the '---' underline chars */ + e.kindName = AsciidocKinds [kind].name; + e.kind = AsciidocKinds [kind].letter; + + if (nl && nl->type < kind) + { + e.extensionFields.scope [0] = AsciidocKinds [nl->type].name; + e.extensionFields.scope [1] = vStringValue (nl->name); + } + makeTagEntry (&e); + } + nestingLevelsPush(nestingLevels, name, kind); +} + + +/* checks if str is all the same character + * FIXME needs to consider single line titles as well as underlines + * and rename me istitle() */ +static boolean issame(const char *str) +{ + char first = *str; + + while (*str) + { + char c; + + str++; + c = *str; + if (c && c != first) + return FALSE; + } + return TRUE; +} + + +static int get_kind(char c) +{ + int i; + + for (i = 0; i < SECTION_COUNT; i++) + { + if (kindchars[i] == c) + return i; + } + return -1; +} + + +/* computes the length of an UTF-8 string + * if the string doesn't look like UTF-8, return -1 + * FIXME asciidoc also takes the asian character width into consideration */ +static int utf8_strlen(const char *buf, int buf_len) +{ + int len = 0; + const char *end = buf + buf_len; + + for (len = 0; buf < end; len ++) + { + /* perform quick and naive validation (no sub-byte checking) */ + if (! (*buf & 0x80)) + buf ++; + else if ((*buf & 0xe0) == 0xc0) + buf += 2; + else if ((*buf & 0xf0) == 0xe0) + buf += 3; + else if ((*buf & 0xf8) == 0xf0) + buf += 4; + else /* not a valid leading UTF-8 byte, abort */ + return -1; + + if (buf > end) /* incomplete last byte */ + return -1; + } + + return len; +} + + +static void findAsciidocTags (void) +{ + vString *name = vStringNew (); + const unsigned char *line; + + nestingLevels = nestingLevelsNew(); + + while ((line = fileReadLine ()) != NULL) + { + int line_len = strlen((const char*) line); + int name_len_bytes = vStringLength(name); + int name_len = utf8_strlen(vStringValue(name), name_len_bytes); + + /* if the name doesn't look like UTF-8, assume one-byte charset */ + if (name_len < 0) + name_len = name_len_bytes; + + /* underlines must be +-2 chars */ + if (line_len >= name_len - 2 && line_len <= name_len + 2 && name_len > 0 && + ispunct(line[0]) && issame((const char*) line)) + { + char c = line[0]; + int kind = get_kind(c); + + if (kind >= 0) + { + makeAsciidocTag(name, kind); + continue; + } + } + vStringClear (name); + if (! isspace(*line)) + vStringCatS(name, (const char*) line); + vStringTerminate(name); + } + vStringDelete (name); + nestingLevelsFree(nestingLevels); +} + +extern parserDefinition* AsciidocParser (void) +{ + static const char *const patterns [] = { "*.asciidoc", NULL }; + static const char *const extensions [] = { "asciidoc", NULL }; + parserDefinition* const def = parserNew ("Asciidoc"); + + def->kinds = AsciidocKinds; + def->kindCount = KIND_COUNT (AsciidocKinds); + def->patterns = patterns; + def->extensions = extensions; + def->parser = findAsciidocTags; + return def; +} + +/* vi:set tabstop=8 shiftwidth=4: */
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: TBD).