Branch: refs/heads/master
Author: Colomban Wendling <ban(a)herbesfolles.org>
Committer: Colomban Wendling <ban(a)herbesfolles.org>
Date: Tue, 19 Aug 2014 14:24:48 UTC
Commit: e587038dea5215cb2db1b6c61ed0a287e5ed1fd1
https://github.com/geany/geany/commit/e587038dea5215cb2db1b6c61ed0a287e5ed1…
Log Message:
-----------
Add a Txt2tags test case
>From the official docs:
https://txt2tags.googlecode.com/svn/trunk/doc/English/rules.t2t
Modified Paths:
--------------
tests/ctags/Makefile.am
tests/ctags/rules.t2t
tests/ctags/rules.t2t.tags
Modified: tests/ctags/Makefile.am
1 lines changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -215,6 +215,7 @@ test_sources = \
recursive.f95 \
refcurs.sql \
regexp.js \
+ rules.t2t \
secondary_fcn_name.js \
semicolon.f90 \
shebang.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(a)domain.com
+user(a)domain.com.
+user(a)domain.com. any text.
+any text: user(a)domain.com. any text.
+[label user(a)domain.com]
+%%% Syntax: E-mail with form data
+user(a)domain.com?subject=bla
+user(a)domain.com?subject=bla.
+user(a)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=+.@*_-#anchor_-1%.
+http://foo._user-9:pass!#$%&*()+word@domain.com:8080/~user/_st-r@a=n$g,e/index%20new.htm?a=/%22&b=+.@*_-#anchor_-1%.
+%%% Test: Various per line
+http://L1.com ! L2(a)www.com ! [L3 www.com] ! [L4 w(a)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
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
Branch: refs/heads/master
Author: Colomban Wendling <ban(a)herbesfolles.org>
Committer: Colomban Wendling <ban(a)herbesfolles.org>
Date: Tue, 19 Aug 2014 14:46:20 UTC
Commit: 72897bac7d5475170eeefab82060c1ffffe3cc0f
https://github.com/geany/geany/commit/72897bac7d5475170eeefab82060c1ffffe3c…
Log Message:
-----------
Add a Txt2tags test case for titles
This is simply extracted from the rules.t2t test, but with unique title
content as the tagmanager removes duplicate tags in tags files.
Modified Paths:
--------------
tests/ctags/Makefile.am
tests/ctags/titles.t2t
tests/ctags/titles.t2t.tags
Modified: tests/ctags/Makefile.am
1 lines changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -248,6 +248,7 @@ test_sources = \
test.vhd \
test_input.rs \
test_input2.rs \
+ titles.t2t \
traffic_signal.v \
traits.php \
union.f \
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).
Branch: refs/heads/master
Author: Colomban Wendling <ban(a)herbesfolles.org>
Committer: Colomban Wendling <ban(a)herbesfolles.org>
Date: Tue, 19 Aug 2014 14:34:21 UTC
Commit: a1466f656fd260739f48e2d0e162ac7805ffb4ac
https://github.com/geany/geany/commit/a1466f656fd260739f48e2d0e162ac7805ffb…
Log Message:
-----------
Add a Txt2tags test case
>From the official docs:
https://txt2tags.googlecode.com/svn/trunk/samples/sample.t2t
Modified Paths:
--------------
tests/ctags/Makefile.am
tests/ctags/sample.t2t
tests/ctags/sample.t2t.tags
Modified: tests/ctags/Makefile.am
1 lines changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -216,6 +216,7 @@ test_sources = \
refcurs.sql \
regexp.js \
rules.t2t \
+ sample.t2t \
secondary_fcn_name.js \
semicolon.f90 \
shebang.js \
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(a)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(a)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
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
Branch: refs/heads/master
Author: Colomban Wendling <lists.ban(a)herbesfolles.org>
Committer: Colomban Wendling <lists.ban(a)herbesfolles.org>
Date: Sat, 29 Nov 2014 22:40:58 UTC
Commit: af7d63cdf28945d2d177149a11565b24eaf4ee13
https://github.com/geany/geany/commit/af7d63cdf28945d2d177149a11565b24eaf4e…
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(a)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(a)domain.com
+user(a)domain.com.
+user(a)domain.com. any text.
+any text: user(a)domain.com. any text.
+[label user(a)domain.com]
+%%% Syntax: E-mail with form data
+user(a)domain.com?subject=bla
+user(a)domain.com?subject=bla.
+user(a)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=+.@*_-#anchor_-1%.
+http://foo._user-9:pass!#$%&*()+word@domain.com:8080/~user/_st-r@a=n$g,e/index%20new.htm?a=/%22&b=+.@*_-#anchor_-1%.
+%%% Test: Various per line
+http://L1.com ! L2(a)www.com ! [L3 www.com] ! [L4 w(a)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(a)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(a)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).