Branch: refs/heads/master Author: Colomban Wendling lists.ban@herbesfolles.org Committer: Colomban Wendling lists.ban@herbesfolles.org Date: Sat, 29 Nov 2014 22:40:58 UTC Commit: af7d63cdf28945d2d177149a11565b24eaf4ee13 https://github.com/geany/geany/commit/af7d63cdf28945d2d177149a11565b24eaf4ee...
Log Message: ----------- Merge pull request #319 from b4n/better-txt2tags-parser
Better txt2tags parser
Modified Paths: -------------- src/symbols.c tagmanager/ctags/txt2tags.c tests/ctags/Makefile.am tests/ctags/rules.t2t tests/ctags/rules.t2t.tags tests/ctags/sample.t2t tests/ctags/sample.t2t.tags tests/ctags/titles.t2t tests/ctags/titles.t2t.tags
Modified: src/symbols.c 1 lines changed, 1 insertions(+), 0 deletions(-) =================================================================== @@ -311,6 +311,7 @@ const gchar *symbols_get_context_separator(gint ft_id)
/* no context separator */ case GEANY_FILETYPES_ASCIIDOC: + case GEANY_FILETYPES_TXT2TAGS: return "\x03";
default:
Modified: tagmanager/ctags/txt2tags.c 176 lines changed, 120 insertions(+), 56 deletions(-) =================================================================== @@ -1,5 +1,6 @@ /* * Copyright (c) 2009, Eric Forgeot +* Copyright (c) 2014, Colomban Wendling colomban@geany.org * * Based on work by Jon Strait * @@ -19,102 +20,165 @@
#include "parse.h" #include "read.h" +#include "nestlevel.h" #include "vstring.h"
+ +/* as any character may happen in an input, use something highly unlikely */ +#define SCOPE_SEPARATOR '\x3' /* ASCII ETX */ + /* * DATA DEFINITIONS */
typedef enum { - K_SECTION = 0, K_HEADER + K_SECTION = 0 } Txt2tagsKind;
static kindOption Txt2tagsKinds[] = { - { TRUE, 'm', "member", "sections" }, - { TRUE, 's', "struct", "header1"} + { TRUE, 'm', "member", "sections" } };
/* * FUNCTION DEFINITIONS */
-static void parse_title (vString* const name, const char control_char) -{ - char *text = vStringValue(name); - char *p = text; - int offset_start = 0; - boolean in_or_after_title = FALSE; - - while (p != NULL && *p != '\0') - { - if (*p == control_char) - { - if (in_or_after_title) - break; - else - offset_start++; - } - else - in_or_after_title = TRUE; - p++; - } - *p = '\0'; - vStringCopyS(name, text + offset_start); - vStringStripLeading(name); - vStringStripTrailing(name); -} - -static void makeTxt2tagsTag (const vString* const name, boolean name_before, Txt2tagsKind type) +static void makeTxt2tagsTag (const vString* const name, + const NestingLevels *const nls, + Txt2tagsKind type) { tagEntryInfo e; + vString *scope = NULL; kindOption *kind = &Txt2tagsKinds[type]; initTagEntry (&e, vStringValue(name));
- if (name_before) - e.lineNumber--; /* we want the line before the underline chars */ e.kindName = kind->name; e.kind = kind->letter;
+ if (nls->n > 0) { + int i; + kindOption *parentKind; + + scope = vStringNew(); + for (i = 0; i < nls->n; i++) { + if (vStringLength(scope) > 0) + vStringPut(scope, SCOPE_SEPARATOR); + vStringCat(scope, nls->levels[i].name); + } + parentKind = &Txt2tagsKinds[nls->levels[nls->n - 1].type]; + + e.extensionFields.scope[0] = parentKind->name; + e.extensionFields.scope[1] = vStringValue(scope); + } + makeTagEntry(&e); + + vStringDelete(scope); +} + +/* matches: ^ *[=_-]{20,} *$ */ +static boolean isTxt2tagsLine (const unsigned char *line) +{ + unsigned int len; + + while (isspace(*line)) line++; + for (len = 0; *line == '=' || *line == '-' || *line == '_'; len++) + line++; + while (isspace(*line)) line++; + + return len >= 20 && *line == 0; +} + +static boolean parseTxt2tagsTitle (const unsigned char *line, + vString *const title, + int *const depth_) +{ + const int MAX_TITLE_DEPTH = 5; /* maximum length of a title delimiter */ + unsigned char delim; + int delim_delta = 0; + const unsigned char *end; + + /* skip leading spaces, but no tabs (probably because they create quotes) */ + while (*line == ' ') line++; + + /* normal/numbered titles */ + if (*line != '=' && *line != '+') + return FALSE; + + delim = *line; + + /* find the start delimiter length */ + while (*line == delim && delim_delta < MAX_TITLE_DEPTH+1) + { + line++; + delim_delta++; + } + while (isspace(*line)) + line++; + + if (delim_delta > MAX_TITLE_DEPTH) /* invalid */ + return FALSE; + + *depth_ = delim_delta; + + /* find the end delimiter */ + end = line + strlen((const char *) line) - 1; + while (end > line && isspace(*end)) end--; + /* skip a possible label: [[A-Za-z0-9_-]+] */ + if (*end == ']') + { + end--; + while (end > line && (isalnum(*end) || *end == '_' || *end == '-')) + end--; + if (*end != '[') /* invalid */ + return FALSE; + end--; + } + while (end > line && *end == delim && delim_delta >= 0) + { + delim_delta--; + end--; + } + while (end > line && isspace(*end)) end--; + end++; + + /* if start and end delimiters are not identical, or the the name is empty */ + if (delim_delta != 0 || (end - line) <= 0) + return FALSE; + + vStringNCopyS(title, (const char *) line, end - line); + return TRUE; }
static void findTxt2tagsTags (void) { + NestingLevels *nls = nestingLevelsNew(); vString *name = vStringNew(); const unsigned char *line;
while ((line = fileReadLine()) != NULL) { - /*int name_len = vStringLength(name);*/ + int depth;
- /* underlines must be the same length or more */ - /*if (name_len > 0 && (line[0] == '=' || line[0] == '-') && issame((const char*) line)) + if (isTxt2tagsLine(line)) + ; /* skip not to improperly match titles */ + else if (parseTxt2tagsTitle(line, name, &depth)) { - makeTxt2tagsTag(name, TRUE); - }*/ - if (line[0] == '=' || line[0] == '+') { - /*vStringClear(name);*/ - vStringCatS(name, (const char *) line); - vStringTerminate(name); - parse_title(name, line[0]); - makeTxt2tagsTag(name, FALSE, K_SECTION); - } - /* TODO what exactly should this match? - * K_HEADER ('struct') isn't matched in src/symbols.c */ - else if (strcmp((char*)line, "°") == 0) { - /*vStringClear(name);*/ - vStringCatS(name, (const char *) line); - vStringTerminate(name); - makeTxt2tagsTag(name, FALSE, K_HEADER); - } - else { - vStringClear (name); - if (! isspace(*line)) - vStringCatS(name, (const char*) line); + NestingLevel *nl = nestingLevelsGetCurrent(nls); + while (nl && nl->indentation >= depth) + { + nestingLevelsPop(nls); + nl = nestingLevelsGetCurrent(nls); + } + vStringTerminate(name); + makeTxt2tagsTag(name, nls, K_SECTION); + nestingLevelsPush(nls, name, K_SECTION); + nestingLevelsGetCurrent(nls)->indentation = depth; } } vStringDelete (name); + nestingLevelsFree(nls); }
extern parserDefinition* Txt2tagsParser (void)
Modified: tests/ctags/Makefile.am 3 lines changed, 3 insertions(+), 0 deletions(-) =================================================================== @@ -233,6 +233,8 @@ test_sources = \ recursive.f95 \ refcurs.sql \ regexp.js \ + rules.t2t \ + sample.t2t \ secondary_fcn_name.js \ semicolon.f90 \ shebang.js \ @@ -264,6 +266,7 @@ test_sources = \ test.vhd \ test_input.rs \ test_input2.rs \ + titles.t2t \ traffic_signal.v \ traits.php \ ui5.controller.js \
Modified: tests/ctags/rules.t2t 782 lines changed, 782 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,782 @@ +Txt2tags Markup Rules + + +%!includeconf: rules.conf + +This document describes all the details about each txt2tags mark. +The target audience are **experienced** users. You may find it +useful if you want to master the marks or solve a specific problem +about a mark. + +If you are new to txt2tags or just want to know which are the +available marks, please read the [Markup Demo MARKUPDEMO]. + +Note 1: This document is generated directly from the txt2tags +test-suite. All the rules mentioned here are 100% in sync with the +current program code. + +Note 2: A good practice is to consult [the sources rules.t2t] when +reading, to see how the texts were made. + +Table of Contents: + +%%TOC + +------------------------------------------------------------- + += Paragraph =[paragraph] + +%INCLUDED(t2t) starts here: ../../../test/marks/paragraph.t2t +BODYINIT + +%%% Syntax: Lines grouped together +A paragraph is composed by one or more lines. +A blank line (or a table, or a list) ends the +current paragraph. + +%%% Syntax: Leading and trailing spaces are ignored + Leading and trailing spaces are ignored. + +%%% Syntax: A comment don't close a paragraph +A comment line can be placed inside a paragraph. +% this comment will be ignored +It will not affect it. + +%%% Closing: EOF closes the open paragraph +The end of the file (EOF) closes the +currently open paragraph. + += Comment =[comment] + +%INCLUDED(t2t) starts here: ../../../test/marks/comment.t2t +BODYINIT + +%%% Syntax: The % character at the line beginning (column 1) +%glued with the % mark +% separated from the % mark +% very distant from the % mark +%%%%%%% lots of % marks +% a blank comment, used for vertical spacing: +% +% NOTE: what matters is the first % being at the line beginning, +% the rest of the line is just ignored. + +%%% Syntax: Area (block) +%%% +You're not seeing this. +%%% + +%%% Syntax: Area (block) with trailing spaces +%%% +You're not seeing this. +%%% + +%%% Invalid: The % in any other position + % not on the line beginning (at column 2) + +some text % half line comments are not allowed + + += Line =[line] + +%INCLUDED(t2t) starts here: ../../../test/marks/line.t2t +BODYINIT + +%%% Syntax: At least 20 chars of - = _ +-------------------- +==================== +____________________ +%%% Syntax: Any kind of mixing is allowed +%% Free mixing is allowed to make the line, +%% but the first char is the identifier for +%% the difference between separator ( - _ ) +%% and strong ( = ) lines. +=========----------- +-_-_-_-_-_-_-_-_-_-_ +=-=-=-=-=-=-=-=-=-=- +=------------------= +--------====-------- +%%% Syntax: Leading and/or trailing spaces are allowed + -------------------- +-------------------- + -------------------- +%%% Invalid: Less than 20 chars (but strike matches) +--------- +%%% Invalid: Strange chars (but strike matches) +--------- ---------- + +---------+---------- + +( -------------------- ) + += Inline =[inline] + +%INCLUDED(t2t) starts here: ../../../test/marks/inline.t2t +BODYINIT + +%%% Syntax: Marks are greedy and must be "glued" with contents +%% GLUED: The contents must be glued with the marks, no spaces +%% between them. Right after the opening mark there must be a +%% non-blank character, as well as right before the closing mark. +%% +%% GREEDY: If the contents boundary character is the same as +%% the mark character, it is considered contents, not mark. +%% So ""****bold****"" turns to ""<B>**bold**</B>"" in HTML. + +i) **b** //i// __u__ --s-- ``m`` ""r"" ''t'' +i) **bo** //it// __un__ --st-- ``mo`` ""ra"" ''tg'' +i) **bold** //ital// __undr__ --strk-- ``mono`` ""raw"" ''tggd'' +i) **bo ld** //it al// __un dr__ --st rk-- ``mo no`` ""r aw"" ''tg gd'' +i) **bo * ld** //it / al// __un _ dr__ --st - rk-- ``mo ` no`` ""r " aw"" ''tg ' gd'' +i) **bo **ld** //it //al// __un __dr__ --st --rk-- ``mo ``no`` ""r ""aw"" ''tg ''gd'' +i) **bo ** ld** //it // al// __un __ dr__ --st -- rk-- ``mo `` no`` ""r "" aw"" ''tg '' gd'' +i) ****bold**** ////ital//// ____undr____ ----strk---- ````mono```` """"raw"""" ''''tggd'''' +i) ***bold*** ///ital/// ___undr___ ---strk--- ```mono``` """raw""" '''tggd''' + +%%% Syntax: Repetition is greedy +%% When the mark character is repeated many times, +%% the contents are expanded to the largest possible. +%% Thats why they are greedy, the outer marks are +%% the ones used. + +i) ***** ///// _____ ----- ````` """"" ''''' +i) ****** ////// ______ ------ `````` """""" '''''' +i) ******* /////// _______ ------- ``````` """"""" ''''''' +i) ******** //////// ________ -------- ```````` """""""" '''''''' +i) ********* ///////// _________ --------- ````````` """"""""" ''''''''' +i) ********** ////////// __________ ---------- `````````` """""""""" '''''''''' + +%%% Invalid: No contents + +i) **** //// ____ ---- ```` """" '''' +i) ** ** // // __ __ -- -- `` `` "" "" '' '' + +%%% Invalid: Contents not "glued" with marks +%% Spaces between the marks and the contents in any side +%% invalidate the mark. + +i) ** bold** // ital// __ undr__ -- strk-- `` mono`` "" raw"" '' tggd'' +i) **bold ** //ital // __undr __ --strk -- ``mono `` ""raw "" ''tggd '' +i) ** bold ** // ital // __ undr __ -- strk -- `` mono `` "" raw "" '' tggd '' + += Link =[link] + +%INCLUDED(t2t) starts here: ../../../test/marks/link.t2t +BODYINIT + +%%% Syntax: E-mail +user@domain.com +user@domain.com. +user@domain.com. any text. +any text: user@domain.com. any text. +[label user@domain.com] +%%% Syntax: E-mail with form data +user@domain.com?subject=bla +user@domain.com?subject=bla. +user@domain.com?subject=bla, +user@domain.com?subject=bla&cc=otheruser@domain.com +user@domain.com?subject=bla&cc=otheruser@domain.com. +user@domain.com?subject=bla&cc=otheruser@domain.com, +[label user@domain.com?subject=bla&cc=otheruser@domain.com]. +[label user@domain.com?subject=bla&cc=otheruser@domain.com.]. +%%% Syntax: URL +http://www.domain.com +http://www.domain.com/dir/ +http://www.domain.com/dir/// +http://www.domain.com. +http://www.domain.com, +http://www.domain.com. any text. +http://www.domain.com, any text. +http://www.domain.com/dir/. any text. +any text: http://www.domain.com. any text. +any text: http://www.domain.com/dir/. any text. +any text: http://www.domain.com/dir/index.html. any text. +any text: http://www.domain.com/dir/index.html, any text. +%%% Syntax: URL with anchor +http://www.domain.com/dir/#anchor +http://www.domain.com/dir/index.html#anchor +http://www.domain.com/dir/index.html#anchor. +http://www.domain.com/dir/#anchor. any text. +http://www.domain.com/dir/index.html#anchor. any text. +any text: http://www.domain.com/dir/#anchor. any text. +any text: http://www.domain.com/dir/index.html#anchor. any text. +%%% Syntax: URL with form data +http://domain.com?a=a@a.a&b=a+b+c. +http://domain.com?a=a@a.a&b=a+b+c, +http://domain.com/bla.cgi?a=a@a.a&b=a+b+c. +http://domain.com/bla.cgi?a=a@a.a&b=a+b+c@. +%%% Syntax: URL with form data and anchor +http://domain.com?a=a@a.a&b=a+b+c.#anchor +http://domain.com/bla.cgi?a=a@a.a&b=a+b+c.#anchor +http://domain.com/bla.cgi?a=a@a.a&b=a+b+c@.#anchor +%%% Syntax: URL with login data +http://user:password@domain.com/bla.html. +http://user:password@domain.com/dir/. +http://user:password@domain.com. +http://user:@domain.com. +http://user@domain.com. +%%% Syntax: URL with login, form and anchor +http://user:password@domain.com/bla.cgi?a=a@a.a&b=a+b+c.#anchor +http://user:password@domain.com/bla.cgi?a=a@a.a&b=a+b+c@#anchor +%%% Syntax: URL with label +[label www.domain.com] +%%% Syntax: URL with label (trailing spaces are discarded, leading are maintained) +%TODO normalize this behavior +[ label www.domain.com] +[label www.domain.com] +%%% Syntax: URL with label, stressing +[anchor http://www.domain.com/dir/index.html#anchor.] +[login http://user:password@domain.com/bla.html] +[form http://www.domain.com/bla.cgi?a=a@a.a&b=a+b+c.] +[form & anchor http://www.domain.com/bla.cgi?a=a@a.a&b=a+b+c.#anchor] +[login & form http://user:password@domain.com/bla.cgi?a=a@a.a&b=a+b+c.] +%%% Syntax: Link with label for local files +[local link up ..] +[local link file bla.html] +[local link anchor #anchor] +[local link file/anchor bla.html#anchor] +[local link file/anchor bla.html#anchor.] +[local link img abc.gif] +%%% Syntax: Another link as a label +[www.fake.com www.domain.com] +%%% Syntax: URL with funny chars +http://domain.com:8080/~user/_st-r@a=n$g,e/index%20new.htm +http://domain.com:8080/~user/_st-r@a=n$g,e/index%20new.htm?a=/%22&b=+.@*... +http://domain.com:8080/~user/_st-r@a=n$g,e/index%20new.htm?a=/%22&b=+.@*.... +http://foo._user-9:pass!#$%&*()+word@domain.com:8080/~user/_st-r@a=n$g,e.... +%%% Test: Various per line +http://L1.com ! L2@www.com ! [L3 www.com] ! [L4 w@ww.com] ! www.L5.com +%%% Feature: Guessed link, adding protocol automatically +www.domain.com +www2.domain.com +ftp.domain.com +WWW.DOMAIN.COM +FTP.DOMAIN.COM +[label www.domain.com] +[label ftp.domain.com] +[label WWW.DOMAIN.COM] +[label FTP.DOMAIN.COM] +%%% Invalid: Trailing space on link +[label www.domain.com ] +%%% Invalid: Label with ] char (use postproc) +[label] www.domain.com] + += Image =[image] + +%INCLUDED(t2t) starts here: ../../../test/marks/image.t2t +BODYINIT + +%%% Syntax: Image name inside brackets: [img] +[img.png] + +%%% Syntax: Image pointing to a link: [[img] link] +[[img.png] http://txt2tags.org] + +%%% Align: Image position is preserved when inside paragraph +[img.png] Image at the line beginning. + +Image in the middle [img.png] of the line. + +Image at the line end. [img.png] + +%%% Align: Image alone with spaces around is aligned +[img.png] + [img.png] + [img.png] + +%%% Test: Two glued images with no spaces (left & right) +[img.png][img.png] + +%%% Test: Various per line +Images [img.png] mixed [img.png] with [img.png] text. + +Images glued together: [img.png][img.png][img.png]. + +%%% Invalid: Spaces inside are not allowed +[img.png ] + +[ img.png] + +[ img.png ] + += Macro =[macro] + +%INCLUDED(t2t) starts here: ../../../test/marks/macro.t2t +BODYINIT + +%%% Syntax: Macro without formatting string +Date : %%date - %%date() +Mtime : %%mtime - %%mtime() +Infile : %%infile - %%infile() +Outfile : %%outfile - %%outfile() + +%%% Syntax: Macro name is case insensitive +Date : %%dAtE +Mtime : %%mTiMe +Infile : %%iNfIlE +Outfile : %%oUtFiLe + +%%% Syntax: Macro with formatting string +Date : %%date(txt %C txt) +Mtime : %%mtime(txt %C txt) +Infile : %%infile(txt %e txt) +Outfile : %%outfile(txt %e txt) + +%%% Syntax: Leading and trailing spaces are preserved +Date : (%%date( txt )) - (%%date( %C )) +Mtime : (%%mtime( txt )) - (%%mtime( %C )) +Infile : (%%infile( txt )) - (%%infile( %e )) +Outfile : (%%outfile( txt )) - (%%outfile( %e )) + +%%% Test: Expansion of the percent char +Date : %%date(%) - %%date(%%) - %%date(%%%) - %%date(%%%) +Mtime : %%mtime(%) - %%mtime(%%) - %%mtime(%%%) - %%mtime(%%%) +Infile : %%infile(%) - %%infile(%%) - %%infile(%%%) - %%infile(%%%) +Outfile : %%outfile(%) - %%outfile(%%) - %%outfile(%%%) - %%outfile(%%%) + +%%% Test: Various per line, glued +Date : %%date(%C)%%date%%date +Mtime : %%mtime(%C)%%mtime%%mtime +Infile : %%infile(%e)%%infile%%infile +Outfile : %%outfile(%e)%%outfile%%outfile + +%%% Test: Path formatters +Path : %%infile(%p) +Path : %%outfile(%p) +Dirname : %%infile(%d, %D) +Dirname : %%outfile(%d, %D) +File : %%infile(%F + %e = %f) +File : %%outfile(%F + %e = %f) + += Numbered Title =[numtitle] + +See [Title #title], the same rules apply. + += Title =[title] + +%INCLUDED(t2t) starts here: ../../../test/marks/title.t2t +BODYINIT + +%%% Syntax: Balanced equal signs (from 1 to 5) += Title Level 1 = +== Title Level 2 == +=== Title Level 3 === +==== Title Level 4 ==== +===== Title Level 5 ===== +%%% Label: Between brackets, alphanumeric [A-Za-z0-9_-] += Title Level 1 =[lab_el-1] +== Title Level 2 ==[lab_el-2] +=== Title Level 3 ===[lab_el-3] +==== Title Level 4 ====[lab_el-4] +===== Title Level 5 =====[lab_el-5] +%%% Syntax: Spaces around and/or inside are allowed (and ignored) + ===Title Level 3=== + === Title Level 3 === + === Title Level 3 === +=== Title Level 3 === +=== Title Level 3 === + === Title Level 3 ===[lab_el-9] +%%% Invalid: Unbalanced equal signs + =Not Title + + ==Not Title= + + ===Not Title==== +%%% Invalid: Level deeper than 5 + ======Not Title 6====== + +=======Not Title 7======= +%%% Invalid: Space between title and label +=Not Title= [label1] +%%% Invalid: Space inside label +=Not Title=[ label ] +%%% Invalid: Strange chars inside label +=Not Title=[la/bel] + += Quote =[quote] + +%INCLUDED(t2t) starts here: ../../../test/marks/quote.t2t +BODYINIT + +%%% Syntax: TAB defines quote + To quote a paragraph, just prefix it by a TAB + character. All the lines of the paragraph must + begin with a TAB. +Any non-tabbed line closes the quote block. + +%%% Nesting: Creating deeper quotes + The number of leading TABs identifies the quote + block depth. This is quote level 1. + With two TABs, we are on the quote + level 2. + The more TABs, more deep is + the quote level. + There isn't a limit. + +%%% Nesting: Reverse nesting works + This quote starts at + level 4. + Then its depth is decreased. + Counting down, one by one. + Until the level 1. + +%%% Nesting: Random count + Unlike lists, any quote block is + independent, not part of a tree. + The TAB count don't need to be incremental + by one. + The nesting don't need + to follow any rule. + Quotes can be opened and closed + in any way. + You choose. + +%%% Nesting: When not supported + Some targets (as sgml) don't support the + nesting of quotes. There is only one quote + level. + In this case, no matter how much + TABs are used to define the quote + block, it always will be level 1. + +%%% Syntax: Spaces after TAB + Spaces AFTER the TAB character are allowed. + But be careful, it can be confusing. + +%%% Invalid: Spaces before TAB + Spaces BEFORE the TAB character + invalidate the mark. It's not quote. + +%%% Invalid: Paragraphs inside + Paragraph breaks inside a quote aren't + possible. + + This sample are two separated quoted + paragraphs, not a quote block with + two paragraphs inside. + +%%% Closing: EOF closes the open block + The end of the file (EOF) closes the + currently open quote block. + += Raw =[raw] + +See [Verbatim #verbatim], the same rules apply. + += Verbatim =[verbatim] + +%INCLUDED(t2t) starts here: ../../../test/marks/verbatim.t2t +BODYINIT + +%%% Syntax: A single line +``` A verbatim line. + +%%% Syntax: A single line with leading spaces +``` Another verbatim line, with leading spaces. + +%%% Syntax: Area (block) +``` +A verbatim area delimited + by lines with marks. +``` + +%%% Syntax: Area (block) with trailing spaces +``` +Trailing spaces and TABs after the area marks +are allowed, but not encouraged nor documented. +``` + +%%% Invalid: No space between mark and contents +```Not a verbatim line, need one space after mark. + +%%% Invalid: Leading spaces on block marks + ``` + Not a verbatim area. + The marks must be at the line beginning, + no leading spaces. + ``` + +%%% Closing: EOF closes the open block +``` +The end of the file (EOF) closes +the currently open verbatim area. +``` + += Definition List =[deflist] + +See [List #list], the same rules apply. + += Numbered List =[numlist] + +See [List #list], the same rules apply. + += List =[list] + +%INCLUDED(t2t) starts here: ../../../test/marks/list.t2t +BODYINIT + +%%% Items: Prefixed by hyphen +- Use the hyphen to prefix list items. +- There must be one space after the hyphen. +- The list is closed by two consecutive blank lines. + + +%%% Items: Free leading spacing (indentation) + - The list can be indented on the source document. + - You can use any number of spaces. + - The result will be the same. + + +%%% Items: Vertical spacing between items +- Let one blank line between the list items. + +- It will be maintained on the conversion. + +- Some targets don't support this behavior. + +- This one was separated by a line with blanks. + You can also put a blank line inside + + the item contents and it will be preserved. + + +%%% Items: Exactly ONE space after the hyphen +-This is not a list (no space) + +- This is not a list (more than one space) + +- This is not a list (a TAB instead the space) + + +%%% Items: Catchy cases +- - This is a list +- + This is a list +- : This is a list + + +%%% Nesting: Creating sublists +- This is the "mother" list first item. +- Here is the second, but inside this item, + - there is a sublist, with its own items. + - Note that the items of the same sublist + - must have the same indentation. + - And this can go on, opening sublists. + - Just add leading spaces before the + - hyphen and sublists will be opened. + - The two blank lines closes them all. + + +%%% Nesting: Free leading spacing (indentation) +- When nesting lists, the additional spaces are free. + - You can add just one, + - or many. + - What matters is to put more than the previous. + - But remember that the other items of the same list + - must use the same indentation. + + +%%% Nesting: Maximum depth +- There is not a depth limit, + - you can go deeper and deeper. + - But some targets may have restrictions. + - The LaTeX maximum is here, 4 levels. + - This one and the following sublists + - are moved up to the level 4 + - when converting to LaTeX. + - On the other targets, + - it is just fine + - to have a very deep list. + + +%%% Nesting: Reverse doesn't work + - Reverse nesting doesn't work. + - Because a sublist *must* have a mother list. + - It's the list concept, not a txt2tags limitation. + - All this sublists will be bumped to mother lists. +- At level 1, like this one. + + +%%% Nesting: Going deeper and back + +%% When nesting back to an upper level, the previous sublist +%% is automatically closed. +- Level 1 + - Level 2 + - Level 3 + - Level 4 + - Level 3 -- (closed Level 4) + - Level 2 -- (closed Level 3) +- Level 1 -- (closed Level 2) + + +%% More than one list can be closed when nesting back. +- Level 1 + - Level 2 + - Level 3 + - Level 4 +- Level 1 -- (closed Level 4, Level 3 and Level 2) + + +%%% Nesting: Vertical spacing between lists +- Level 1 + + - Level 2 -- blank BEFORE and AFTER (in) + + - Level 3 +% comment lines are NOT considered blank lines + - Level 4 +% comment lines are NOT considered blank lines + - Level 3 + + - Level 2 -- blank BEFORE and AFTER (out) + +- Level 1 + + - Level 2 -- blank BEFORE (spaces) and AFTER (TAB) + + - Level 3 + + +%%% Nesting: Messing up +%% Be careful when going back on the nesting, +%% it must be on a valid level! If not, it will +%% be bumped up to the previous valid level. +- Level 1 + - Level 2 + - Level 3 + - Level 4 + - Level 3.5 ??? + - Level 3 + - Level 2.5 ??? + - Level 2 + - Level 1.5 ??? +- Level 1 + + +%%% Closing: Two (not so) empty lines +- This list is closed by a line with spaces and other with TABs + + +- This list is NOT closed by two comment lines +% comment lines are NOT considered blank lines +% comment lines are NOT considered blank lines +- This list is closed by a line with spaces and TAB, +- then a comment line, then an empty line. + +% comment lines are NOT considered blank lines + +%%% Closing: Empty item closes current (sub)list + +%% The two blank lines closes ALL the lists. +%% To close just the current, use an empty item. +- Level 1 + - Level 2 + - Level 3 + - + Level 2 + - + Level 1 +- + +%% The empty item can have trailing blanks. +- Empty item with trailing spaces. +- + +- Empty item with trailing TAB. +- + +%%% Closing: EOF closes the lists +- If the end of the file (EOF) is hit, + - all the currently opened list are closed, + - just like when using the two blank lines. + + += Table =[table] + +%INCLUDED(t2t) starts here: ../../../test/marks/table.t2t +BODYINIT + +%%% Syntax: Lines starting with a pipe | +| Cell 1 + +%%% Syntax: Extra pipes separate cells +| Cell 1 | Cell 2 | Cell 3 + +%%% Syntax: With a trailing pipe, make border +| Cell 1 | Cell 2 | Cell 3 | + +%%% Syntax: Table lines starting with double pipe are heading +|| Cell 1 | Cell 2 | Cell 3 | + +%%% Align: Spaces before the leading pipe centralize the table + | Cell 1 | Cell 2 | Cell 3 | + +%%% Align: Spaces inside the cell denote its alignment + || Heading | Heading | Heading | +% comments don't close an opened table + | <- | -- | -> | + | -- | -- | -- | + | -> | -- | <- | + +%%% Span: Column span is defined by extra pipes at cell closing + || 1 | 2 | 3+4 || + | 1 | 2 | 3 | 4 | + | 1+2+3 ||| 4 | + | 1 | 2+3 || 4 | + | 1+2+3+4 |||| + +%%% Test: Empty cells are placed as expected + | 0 | 1 | 2 | | + | 4 | 5 | | 7 | + | 8 | | A | B | + | | D | E | F | + +%%% Test: Lines with different number of cells + | 1 | + | 1 | 2 | + | 1 | 2 | 3 | + | 1 | 2 | 3 | 4 | + | 1 | 2 | 3 | 4 | 5 | + +%%% Test: Empty cells + Span + Messy cell number = Fun! + | Jan | + | Fev || + | Mar ||| + | Apr |||| + | May ||||| + | 20% | 40% | 60% | 80% | 100% | + + | | | / | | | + | | / / / / / ||| | + | / / / / / / / / / ||||| + | | o | | o | | + | | | . | | | + | | = = = = ||| | + + | 01 | 02 | | | 05 | | 07 | | + | | | 11 | | 13 | | | 16 | + | 17 | | 19 | 20 | | | 23 | | + | 25 | 26 | | | 29 | 30 | | 32 | + | | | 35 | | 37 | | 39 | 40 | + +%%% Test: Lots of cells at the same line +| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | + +%%% Test: Empty lines +| | +| | +| | + +%%% Invalid: There must be at least one space around the pipe +|this|is|not|a|table| + +|this| is| not| a| table| + +|this |is |not |a |table | + +%%% Invalid: You must use spaces, not TABs +| this | is | not | a | table | + +------------------------------------------------------------ + +The End.
Modified: tests/ctags/rules.t2t.tags 22 lines changed, 22 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,22 @@ +# format=tagmanager +Comment�64�0 +Definition List�64�0 +Image�64�0 +Inline�64�0 +Line�64�0 +Link�64�0 +List�64�0 +Macro�64�0 +Numbered List�64�0 +Numbered Title�64�0 +Paragraph�64�0 +Quote�64�0 +Raw�64�0 +Table�64�0 +Title�64�0 +Title Level 1�64�0 +Title Level 2�64�Title Level 1�0 +Title Level 3�64�Title Level 1Title Level 2�0 +Title Level 4�64�Title Level 1Title Level 2Title Level 3�0 +Title Level 5�64�Title Level 1Title Level 2Title Level 3Title Level 4�0 +Verbatim�64�0
Modified: tests/ctags/sample.t2t 225 lines changed, 225 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,225 @@ +TXT2TAGS SAMPLE +Aurelio Jargas +%%mtime(%m/%d/%Y) + +%!encoding: UTF-8 + +This text is before the introduction. + +But it's OK. + + = Introduction = + +Welcome to the txt2tags sample file. + +Here you have examples and a brief explanation of all +marks. + +The first 3 lines of this file are used as headers, +on the following format: +``` +line1: document title +line2: author name, email +line3: date, version +``` + +Lines with balanced equal signs = around are titles. + +% a secret comment! +%TODO link to program site http://txt2tags.org + + + = Fonts and Beautifiers = + +We have two sets of fonts: + +The NORMAL type that can be improved with beautifiers. + +The TYPEWRITER type that uses monospaced font for +pre-formatted text. + +We will now enter on a subtitle... + + + == Beautifiers == + +The text marks for beautifiers are simple, just as you +type on a plain text email message. + +We use double *, /, - and _ to represent **bold**, +//italic//, --strike-- and __underline__. + +The **//bold italic//** style is also supported as a +combination. + + + == Pre-Formatted Text == + +We can put a code sample or other pre-formatted text: +``` + here is pre-formatted +//marks// are **not** ``interpreted`` +``` + +And also, it's easy to put a one line pre-formatted +text: +``` prompt$ ls /etc + +Or use ``pre-formatted`` inside sentences. + + + == More Cosmetics == + +Special entities like email (duh@somewhere.com) and +URL (http://www.duh.com) are detected automagically, +as long as the horizontal line: + +-------------------------------------------------------- +^ thin or large v +======================================================== + +You can also specify an [explicit link http://duh.org] +or an [explicit email duh@somewhere.com] with label. + +And remember, + A TAB in front of the line does a quotation. + More TABs, more depth (if allowed). +Nice. + + + = Lists = + +A list of items is natural, just putting a **dash** or +a **plus** at the beginning of the line. + + + == Plain List == + +The dash is the default list identifier. For sublists, +just add **spaces** at the beginning of the line. More +spaces, more sublists. + +- Earth + - America + - South America + - Brazil + - How deep can I go? + - Europe + - Lots of countries +- Mars + - Who knows? + + +The list ends with **two** consecutive blank lines. + + + == Numbered List == + +The same rules as the plain list, just a different +identifier (plus). + ++ one ++ two ++ three + - mixed lists! + - what a mess + + counting again + + ... ++ four + + + == Definition List == + +The definition list identifier is a colon, followed by +the term. The term contents is placed on the next line. + +: orange + a yellow fruit +: apple + a green or red fruit +: other fruits + - wee! + - mixing lists + + again! + + and again! + + + = Tables = + +Use pipes to compose table rows and cells. +Double pipe at the line beginning starts a heading row. +Natural spaces specify each cell alignment. + + | cell 1.1 | cell 1.2 | cell 1.3 | + | cell 2.1 | cell 2.2 | cell 2.3 | + | cell 3.1 | cell 3.2 | cell 3.3 | + +|| heading 1 | heading 2 | heading 3 | + | cell 1.1 | cell 1.2 | cell 1.3 | + | cell 2.1 | cell 2.2 | cell 2.3 | + + |_ heading 1 | cell 1.1 | cell 1.2 | + | heading 2 | cell 2.1 | cell 2.2 | + | heading 3 | cell 3.1 | cell 3.2 | + +|/ heading | heading 1 | heading 2 | + | heading 1 | cell 1.1 | cell 1.2 | + | heading 2 | cell 2.1 | cell 2.2 | + +Without the last pipe, no border: + + | cell 1.1 | cell 1.2 | cell 1.3 + | cell 2.1 | cell 2.2 | cell 2.3 + | cell 3.1 | cell 3.2 | cell 3.3 + +|| heading 1 | heading 2 | heading 3 + | cell 1.1 | cell 1.2 | cell 1.3 + | cell 2.1 | cell 2.2 | cell 2.3 + + |_ heading 1 | cell 1.1 | cell 1.2 + | heading 2 | cell 2.1 | cell 2.2 + | heading 3 | cell 3.1 | cell 3.2 + +|/ heading | heading 1 | heading 2 + | heading 1 | cell 1.1 | cell 1.2 + | heading 2 | cell 2.1 | cell 2.2 + + = Special Entities = + +Because things were too simple. + + + == Images == + +The image mark is as simple as it can be: ``[filename]``. + + [img/photo.jpg] + +And with some targets the image is linkable : + + [[img/photo.jpg] http://www.txt2tags.org] + +- The filename must end in PNG, JPG, GIF, or similar. +- No spaces inside the brackets! + + + == Other == +When the target needs, special chars like <, > and & +are escaped. + +The handy ``%%date`` macro expands to the current date. + +So today is %%date on the ISO ``YYYYMMDD`` format. + +You can also specify the date format with the %? flags, +as ``%%date(%m-%d-%Y)`` which gives: %%date(%m-%d-%Y). + +That's all for now. + +------------------------------------------------------- +%%% TRANSLATOR: Uncomment and translate the next two lines +%Translated by John Smith. +%------------------------------------------------------- +[img/t2tpowered.png] ([%%infile %%infile]) + +% vim: tw=55
Modified: tests/ctags/sample.t2t.tags 14 lines changed, 14 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,14 @@ +# format=tagmanager +Beautifiers�64�Fonts and Beautifiers�0 +Definition List�64�Lists�0 +Fonts and Beautifiers�64�0 +Images�64�Special Entities�0 +Introduction�64�0 +Lists�64�0 +More Cosmetics�64�Fonts and Beautifiers�0 +Numbered List�64�Lists�0 +Other�64�Special Entities�0 +Plain List�64�Lists�0 +Pre-Formatted Text�64�Fonts and Beautifiers�0 +Special Entities�64�0 +Tables�64�0
Modified: tests/ctags/titles.t2t 40 lines changed, 40 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,40 @@ + +% from rules.t2t, with unique title content as our output removed +% duplicate tags (even with different scopes) + + +%%% Syntax: Balanced equal signs (from 1 to 5) += First Title Level 1 = +== First Title Level 2 == +=== First Title Level 3 === +==== First Title Level 4 ==== +===== First Title Level 5 ===== +%%% Label: Between brackets, alphanumeric [A-Za-z0-9_-] += Second Title Level 1 =[lab_el-1] +== Second Title Level 2 ==[lab_el-2] +=== Second Title Level 3 ===[lab_el-3] +==== Second Title Level 4 ====[lab_el-4] +===== Second Title Level 5 =====[lab_el-5] +%%% Syntax: Spaces around and/or inside are allowed (and ignored) + ===Third Title Level 3=== + === Fourth Title Level 3 === + === Fifth Title Level 3 === +=== Sixth Title Level 3 === +=== Seventh Title Level 3 === + === Eighth Title Level 3 ===[lab_el-9] +%%% Invalid: Unbalanced equal signs + =First Not Title + + ==Second Not Title= + + ===Third Not Title==== +%%% Invalid: Level deeper than 5 + ======First Not Title 6====== + +=======First Not Title 7======= +%%% Invalid: Space between title and label +=Fourth Not Title= [label1] +%%% Invalid: Space inside label +=Fifth Not Title=[ label ] +%%% Invalid: Strange chars inside label +=Sixth Not Title=[la/bel]
Modified: tests/ctags/titles.t2t.tags 17 lines changed, 17 insertions(+), 0 deletions(-) =================================================================== @@ -0,0 +1,17 @@ +# format=tagmanager +Eighth Title Level 3�64�Second Title Level 1Second Title Level 2�0 +Fifth Title Level 3�64�Second Title Level 1Second Title Level 2�0 +First Title Level 1�64�0 +First Title Level 2�64�First Title Level 1�0 +First Title Level 3�64�First Title Level 1First Title Level 2�0 +First Title Level 4�64�First Title Level 1First Title Level 2First Title Level 3�0 +First Title Level 5�64�First Title Level 1First Title Level 2First Title Level 3First Title Level 4�0 +Fourth Title Level 3�64�Second Title Level 1Second Title Level 2�0 +Second Title Level 1�64�0 +Second Title Level 2�64�Second Title Level 1�0 +Second Title Level 3�64�Second Title Level 1Second Title Level 2�0 +Second Title Level 4�64�Second Title Level 1Second Title Level 2Second Title Level 3�0 +Second Title Level 5�64�Second Title Level 1Second Title Level 2Second Title Level 3Second Title Level 4�0 +Seventh Title Level 3�64�Second Title Level 1Second Title Level 2�0 +Sixth Title Level 3�64�Second Title Level 1Second Title Level 2�0 +Third Title Level 3�64�Second Title Level 1Second Title Level 2�0
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).