added a bibtex parser that extracts identifiers of entries in bib-files and makes them accessible on the sidebar

master
Mirco Schoenfeld 2019-07-09 16:33:53 +02:00
parent aa54866f98
commit 82e09b5d9b
10 changed files with 257 additions and 1 deletions

View File

@ -14,6 +14,7 @@ parsers = \
parsers/asciidoc.c \
parsers/asm.c \
parsers/basic.c \
parsers/bibtex.c \
parsers/c.c \
parsers/cobol.c \
parsers/iniconf.c \

View File

@ -24,6 +24,7 @@
PhpParser, \
PythonParser, \
TexParser, \
BibParser, \
AsmParser, \
ConfParser, \
SqlParser, \

180
ctags/parsers/bibtex.c Normal file
View File

@ -0,0 +1,180 @@
/*
* Copyright (c) 2000-2001, Jérôme Plût
* Copyright (c) 2006, Enrico Tröger
* Copyright (c) 2019, Mirco Schönfeld
*
* 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 source files
* for the BibTex formatting system.
* https://en.wikipedia.org/wiki/BibTeX
*/
/*
* 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 "routines.h"
/*
* DATA DEFINITIONS
*/
typedef enum {
K_ARTICLE,
K_BOOK,
K_PAPER,
K_THESIS,
K_OTHER
} BibKind;
static kindDefinition BibKinds[] = {
{ true, 'f', "function", "@article @inbook @incollection" },
{ true, 'c', "class", "@book @booklet @proceedings" },
{ true, 'm', "member", "@inproceedings @conference" },
{ true, 'v', "variable", "@phdthesis @mastersthesis" },
{ true, 's', "struct", "@manual @misc @techreport" }
};
/*
* FUNCTION DEFINITIONS
*/
#define BIB_LABEL (1<<2)
static int getBibWord(const char * ref, const char **ptr)
{
const char *p = *ptr;
while ((*ref != '\0') && (*p != '\0') && (*ref == *p))
ref++, p++;
if (*ref)
return false;
*ptr = p;
return true;
}
static void createBibTag(int flags, BibKind kind, const char * l)
{
vString *name = vStringNew ();
while ((*l == ' '))
l++;
if (flags & (BIB_LABEL))
{
if (*l != '{')
goto no_tag;
l++;
do
{
vStringPut(name, (int) *l);
++l;
} while ((*l != '\0') && (*l != ','));
if (name->buffer[0] != ',')
makeSimpleTag(name, kind);
}
else
{
vStringPut(name, (int) *l);
makeSimpleTag(name, kind);
}
no_tag:
vStringDelete(name);
}
static void findBibTags(void)
{
const char *line;
while ((line = (const char*)readLineFromInputFile()) != NULL)
{
const char *cp = line;
/*int escaped = 0;*/
for (; *cp != '\0'; cp++)
{
if (*cp == '%')
break;
if (*cp == '@')
{
cp++;
if (getBibWord("article", &cp))
{
createBibTag(BIB_LABEL, K_ARTICLE, cp);
continue;
}else if (getBibWord("inbook", &cp))
{
createBibTag(BIB_LABEL, K_ARTICLE, cp);
continue;
}else if (getBibWord("incollection", &cp))
{
createBibTag(BIB_LABEL, K_ARTICLE, cp);
continue;
}else if (getBibWord("book", &cp))
{
createBibTag(BIB_LABEL, K_BOOK, cp);
continue;
}else if (getBibWord("booklet", &cp))
{
createBibTag(BIB_LABEL, K_BOOK, cp);
continue;
}else if (getBibWord("proceedings", &cp))
{
createBibTag(BIB_LABEL, K_BOOK, cp);
continue;
}else if (getBibWord("inproceedings", &cp))
{
createBibTag(BIB_LABEL, K_PAPER, cp);
continue;
}else if (getBibWord("conference", &cp))
{
createBibTag(BIB_LABEL, K_PAPER, cp);
continue;
}else if (getBibWord("phdthesis", &cp))
{
createBibTag(BIB_LABEL, K_THESIS, cp);
continue;
}else if (getBibWord("mastersthesis", &cp))
{
createBibTag(BIB_LABEL, K_THESIS, cp);
continue;
}else if (getBibWord("manual", &cp))
{
createBibTag(BIB_LABEL, K_OTHER, cp);
continue;
}else if (getBibWord("misc", &cp))
{
createBibTag(BIB_LABEL, K_OTHER, cp);
continue;
}else if (getBibWord("techreport", &cp))
{
createBibTag(BIB_LABEL, K_OTHER, cp);
continue;
}
}
}
}
}
extern parserDefinition* BibParser (void)
{
static const char *const extensions [] = { "bib", NULL };
parserDefinition * def = parserNew ("Bib");
def->kindTable = BibKinds;
def->kindCount = ARRAY_SIZE (BibKinds);
def->extensions = extensions;
def->parser = findBibTags;
return def;
}

View File

@ -0,0 +1,51 @@
# For complete documentation of this file, please see Geany's main documentation
[styling]
# Edit these in the colorscheme .conf file instead
default=default
command=keyword_1
tag=tag
math=number_1
comment=comment
# mappings below may need checking
tag2=tag
math2=number_1
comment2=comment
verbatim=default
shortcmd=keyword_1
special=keyword_2
cmdopt=keyword_1
error=error
[keywords]
# all items must be in one line
primary=article
[settings]
# default extension used when saving files
extension=bib
# MIME type
mime_type=text/x-bibtex
# 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=
[indentation]
#width=4
# 0 is spaces, 1 is tabs, 2 is tab & spaces
#type=1

View File

@ -10,6 +10,7 @@ Arduino=*.ino;*.pde;
Asciidoc=*.asciidoc;*.adoc;
ASM=*.asm;*.asm51;*.a51;*.s;*.S;*.sx;
Batch=*.bat;*.cmd;*.nt;
BibTeX=*.bib;
CAML=*.ml;*.mli;
C=*.c;*.xpm;
C++=*.cpp;*.cxx;*.c++;*.cc;*.h;*.hpp;*.hxx;*.h++;*.hh;*.C;*.H;
@ -41,7 +42,7 @@ HTML=*.htm;*.html;*.shtml;*.hta;*.htd;*.htt;*.cfm;*.tpl;
Java=*.java;*.jsp;
Javascript=*.js;
JSON=*.json;
LaTeX=*.tex;*.sty;*.idx;*.ltx;*.latex;*.aux;*.bib;
LaTeX=*.tex;*.sty;*.idx;*.ltx;*.latex;*.aux;
Lisp=*.lisp;
Lua=*.lua;
Make=*.mak;*.mk;GNUmakefile;makefile;Makefile;makefile.*;Makefile.*;

View File

@ -160,6 +160,7 @@ static void init_builtin_filetypes(void)
FT_INIT( SQL, SQL, "SQL", NULL, FILE, MISC );
FT_INIT( COBOL, COBOL, "COBOL", NULL, SOURCE_FILE, COMPILED );
FT_INIT( LATEX, LATEX, "LaTeX", NULL, SOURCE_FILE, MARKUP );
FT_INIT( BIBTEX, BIBTEX, "BibTeX", NULL, SOURCE_FILE, MARKUP );
FT_INIT( VHDL, VHDL, "VHDL", NULL, SOURCE_FILE, COMPILED );
FT_INIT( VERILOG, VERILOG, "Verilog", NULL, SOURCE_FILE, COMPILED );
FT_INIT( DIFF, DIFF, "Diff", NULL, FILE, MISC );

View File

@ -74,6 +74,7 @@ typedef enum
GEANY_FILETYPES_VALA,
GEANY_FILETYPES_PASCAL,
GEANY_FILETYPES_LATEX,
GEANY_FILETYPES_BIBTEX,
GEANY_FILETYPES_ASM,
GEANY_FILETYPES_CONF,
GEANY_FILETYPES_HAXE,

View File

@ -525,6 +525,17 @@ static void add_top_level_items(GeanyDocument *doc)
NULL);
break;
}
case GEANY_FILETYPES_BIBTEX:
{
tag_list_add_groups(tag_store,
&(tv_iters.tag_function), _("Journal Articles"), ICON_NONE,
&(tv_iters.tag_class), _("Books & Conference Proceedings"), ICON_NONE,
&(tv_iters.tag_member), _("Conference Papers"), ICON_NONE,
&(tv_iters.tag_variable), _("Theses"), ICON_NONE,
&(tv_iters.tag_struct), _("Other"), ICON_NONE,
NULL);
break;
}
case GEANY_FILETYPES_MATLAB:
{
tag_list_add_groups(tag_store,

View File

@ -124,6 +124,13 @@ static TMParserMapEntry map_LATEX[] = {
{'n', tm_tag_namespace_t},
{'s', tm_tag_struct_t},
};
static TMParserMapEntry map_BIBTEX[] = {
{'f', tm_tag_function_t},
{'c', tm_tag_class_t},
{'m', tm_tag_member_t},
{'v', tm_tag_variable_t},
{'s', tm_tag_struct_t},
};
static TMParserMapEntry map_ASM[] = {
{'d', tm_tag_macro_t},
@ -531,6 +538,7 @@ static TMParserMap parser_map[] = {
MAP_ENTRY(PHP),
MAP_ENTRY(PYTHON),
MAP_ENTRY(LATEX),
MAP_ENTRY(BIBTEX),
MAP_ENTRY(ASM),
MAP_ENTRY(CONF),
MAP_ENTRY(SQL),

View File

@ -67,6 +67,7 @@ enum
TM_PARSER_PHP,
TM_PARSER_PYTHON,
TM_PARSER_LATEX,
TM_PARSER_BIBTEX,
TM_PARSER_ASM,
TM_PARSER_CONF,
TM_PARSER_SQL,