Add Asciidoc filetype
Add a filetype for Asciidoc with symbol parser, but not styling.
This commit is contained in:
parent
76aec0852a
commit
8294ea2c2e
@ -5,6 +5,7 @@
|
||||
Abc=*.abc;*.abp;
|
||||
ActionScript=*.as;
|
||||
Ada=*.adb;*.ads;
|
||||
Asciidoc=*.asciidoc;
|
||||
ASM=*.asm;
|
||||
CAML=*.ml;*.mli;
|
||||
C=*.c;*.h;
|
||||
|
||||
35
data/filetypes.asciidoc
Normal file
35
data/filetypes.asciidoc
Normal file
@ -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=true
|
||||
|
||||
# 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
|
||||
@ -496,6 +496,14 @@ static void init_builtin_filetypes(void)
|
||||
ft->name = g_strdup("Forth");
|
||||
filetype_make_title(ft, TITLE_SOURCE_FILE);
|
||||
ft->group = GEANY_FILETYPE_GROUP_SCRIPT;
|
||||
|
||||
#define ASCIIDOC
|
||||
ft = filetypes[GEANY_FILETYPES_ASCIIDOC];
|
||||
ft->lang = 43;
|
||||
ft->name = g_strdup("Asciidoc");
|
||||
filetype_make_title(ft, TITLE_SOURCE_FILE);
|
||||
ft->group = GEANY_FILETYPE_GROUP_MARKUP;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -90,6 +90,7 @@ typedef enum
|
||||
GEANY_FILETYPES_ERLANG,
|
||||
GEANY_FILETYPES_COBOL,
|
||||
GEANY_FILETYPES_OBJECTIVEC,
|
||||
GEANY_FILETYPES_ASCIIDOC,
|
||||
/* ^ append items here */
|
||||
GEANY_MAX_BUILT_IN_FILETYPES /* Don't use this, use filetypes_array->len instead */
|
||||
}
|
||||
|
||||
@ -807,6 +807,17 @@ static void add_top_level_items(GeanyDocument *doc)
|
||||
NULL);
|
||||
break;
|
||||
}
|
||||
case GEANY_FILETYPES_ASCIIDOC:
|
||||
{
|
||||
tag_list_add_groups(tag_store,
|
||||
&(tv_iters.tag_namespace), _("Chapter"), NULL,
|
||||
&(tv_iters.tag_member), _("Section"), NULL,
|
||||
&(tv_iters.tag_macro), _("Level2section"), NULL,
|
||||
&(tv_iters.tag_variable), _("Level3section"), NULL,
|
||||
&(tv_iters.tag_struct), _("Level4section"), NULL,
|
||||
NULL);
|
||||
break;
|
||||
}
|
||||
case GEANY_FILETYPES_RUBY:
|
||||
{
|
||||
tag_list_add_groups(tag_store,
|
||||
|
||||
@ -13,6 +13,7 @@ noinst_LIBRARIES = libctags.a
|
||||
parsers = \
|
||||
abc.c \
|
||||
actionscript.c \
|
||||
asciidoc.c \
|
||||
asm.c \
|
||||
basic.c \
|
||||
c.c \
|
||||
|
||||
205
tagmanager/ctags/asciidoc.c
Normal file
205
tagmanager/ctags/asciidoc.c
Normal file
@ -0,0 +1,205 @@
|
||||
/*
|
||||
*
|
||||
* 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 */
|
||||
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 */
|
||||
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: */
|
||||
@ -46,7 +46,7 @@ clean:
|
||||
|
||||
$(COMPLIB): abc.o args.o c.o cobol.o fortran.o make.o conf.o pascal.o perl.o php.o diff.o vhdl.o verilog.o lua.o js.o \
|
||||
actionscript.o nsis.o objc.o \
|
||||
haskell.o haxe.o html.o python.o lregex.o rest.o sh.o ctags.o entry.o get.o keyword.o nestlevel.o \
|
||||
haskell.o haxe.o html.o python.o lregex.o asciidoc.o rest.o sh.o ctags.o entry.o get.o keyword.o nestlevel.o \
|
||||
options.o \
|
||||
parse.o basic.o read.o sort.o strlist.o latex.o markdown.o matlab.o docbook.o tcl.o ruby.o asm.o sql.o txt2tags.o css.o \
|
||||
vstring.o r.o
|
||||
|
||||
@ -57,7 +57,8 @@
|
||||
VerilogParser, \
|
||||
RParser, \
|
||||
CobolParser, \
|
||||
ObjcParser
|
||||
ObjcParser, \
|
||||
AsciidocParser
|
||||
/*
|
||||
langType of each parser
|
||||
0 CParser
|
||||
@ -103,6 +104,7 @@ langType of each parser
|
||||
40 RParser
|
||||
41 CobolParser
|
||||
42 ObjcParser
|
||||
43 AsciidocParser
|
||||
*/
|
||||
#endif /* _PARSERS_H */
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user