-- Copyright 2014-2019 stef@ailleurs.land. See License.txt. -- Plain Texinfo version 5.2 LPeg lexer -- Freely inspired from Mitchell work and valuable help from him too ! -- Directives are processed (more or less) in the Reference Card Texinfo order -- Reference Card page for each directive group is in comment for reference --[[ Note: Improving Fold Points use with Texinfo At the very beginning of your Texinfo file, it could be wised to insert theses alias : @alias startchapter = comment @alias endchapter = comment Then use this to begin each chapter : @endchapter -------------------------------------------------------------------- @chapter CHAPTER TITLE @startchapter ------------------------------------------------------------------ With the use of Scintilla's `SCI_FOLDALL(SC_FOLDACTION_TOGGLE)` or Textadept's `buffer:fold_all(buffer.FOLDACTION_TOGGLE)`, you have then a nice chapter folding, useful with large documents. ]] local lexer = require('lexer') local token, word_match = lexer.token, lexer.word_match local P, R, S = lpeg.P, lpeg.R, lpeg.S local lex = lexer.new('texinfo') -- Whitespace. lex:add_rule('whitespace', token(lexer.WHITESPACE, lexer.space^1)) -- Directives. local directives_base = word_match([[ end -- Custom keywords for chapter folding startchapter endchapter -- List and tables (page 2, column 2) itemize enumerate -- Beginning a Texinfo document (page 1, column 1) titlepage copying -- Block environments (page 2, column 1) cartouche -- Block environments > Displays using fixed-width fonts (page 2, column 2) example smallexample -- List and tables (page 2, column 2) multitable -- Floating Displays (page 2, column 3) float listoffloats caption shortcaption image -- Floating Displays > Footnotes (page 2, column 3) footnote footnotestyle -- Conditionally (in)visible text > Output formats (page 3, column 3) ifdocbook ifhtml ifinfo ifplaintext iftex ifxml ifnotdocbook ifnothtml ifnotplaintext ifnottex ifnotxml ifnotinfo inlinefmt inlinefmtifelse -- Conditionally (in)visible text > Raw formatter text (page 4, column 1) docbook html tex xml inlineraw -- Conditionally (in)visible text > Documents variables (page 4, column 1) set clear value ifset ifclear inlineifset inlineifclear -- Conditionally (in)visible text > Testing for commands (page 4, column 1) ifcommanddefined ifcommandnotdefined end -- Defining new Texinfo commands (page 4, column 1) alias macro unmacro definfounclose -- File inclusion (page 4, column 1) include verbatiminclude -- Formatting and headers footers for TeX (page 4, column 1) allowcodebreaks finalout fonttextsize -- Formatting and headers footers for TeX > paper size (page 4, column 2) smallbook afourpaper afivepaper afourlatex afourwide pagesizes -- Formatting and headers footers for TeX > Page headers and footers (page 4, -- column 2) -- not implemented -- Document preferences (page 4, column 2) -- not implemented -- Ending a Texinfo document (page 4, column 2) bye ]], true) lex:add_rule('directive', token('directives', ('@end' * lexer.space^1 + '@') * directives_base)) lex:add_style('directives', lexer.STYLE_FUNCTION) -- Chapters. local chapters_base = word_match([[ -- Chapter structuring (page 1, column 2) lowersections raisesections part -- Chapter structuring > Numbered, included in contents (page 1, column 2) chapter centerchap -- Chapter structuring > Context-dependent, included in contents (page 1, -- column 2) section subsection subsubsection -- Chapter structuring > Unumbered, included in contents (page 1, column 2) unnumbered unnumberedsec unnumberedsubsec unnumberedsubsection unnumberedsubsubsec unnumberedsubsubsection -- Chapter structuring > Letter and numbered, included in contents (page 1, -- column 2) appendix appendixsec appendixsection appendixsubsec appendixsubsection appendixsubsubsec appendixsubsubsection -- Chapter structuring > Unumbered, not included in contents, no new page -- (page 1, column 3) chapheading majorheading heading subheading subsubheading ]], true) lex:add_rule('chapter', token('chapters', ('@end' * lexer.space^1 + '@') * chapters_base)) lex:add_style('chapters', lexer.STYLE_CLASS) -- Common keywords. local keyword_base = word_match([[ end -- Beginning a Texinfo document (page 1, column 1) setfilename settitle insertcopying -- Beginning a Texinfo document > Internationlization (page 1, column 1) documentencoding documentlanguage frenchspacing -- Beginning a Texinfo document > Info directory specification and HTML -- document description (page 1, column 1) dircategory direntry documentdescription -- Beginning a Texinfo document > Titre pages (page 1, column 1) shorttitlepage center titlefont title subtitle author -- Beginning a Texinfo document > Tables of contents (page 1, column 2) shortcontents summarycontents contents setcontentsaftertitlepage setshortcontentsaftertitlepage -- Nodes (page 1, column 2) node top anchor novalidate -- Menus (page 1, column 2) menu detailmenu -- Cross references > Within the Info system (page 1, column 3) xref pxref ref inforef xrefautomaticsectiontitle -- Cross references > Outside of info (page 1, column 3) url cite -- Marking text > Markup for regular text (page 1, column 3) var dfn acronym abbr -- Marking text > Markup for litteral text (page 1, column 3) code file command env option kbd key email indicateurl samp verb -- Marking text > GUI sequences (page 2, column 1) clicksequence click clickstyle arrow -- Marking text > Math (page 2, column 1) math minus geq leq -- Marking text > Explicit font selection (page 2, column 1) sc r i slanted b sansserif t -- Block environments (page 2, column 1) noindent indent exdent -- Block environments > Normally filled displays using regular text fonts -- (page 2, column 1) quotation smallquotation indentedblock smallindentedblock raggedright -- Block environments > Line-for-line displays using regular test fonts (page -- 2, column 2) format smallformat display smalldisplay flushleft flushright -- Block environments > Displays using fixed-width fonts (page 2, column 2) lisp smalllisp verbatim -- List and tables (page 2, column 2) table ftable vtable tab item itemx headitem headitemfont asis -- Indices (page 2, column 3) cindex findex vindex kindex pindex tindex defcodeindex syncodeindex synindex printindex -- Insertions within a paragraph > Characters special to Texinfo (page 2, -- column 3) @ { } backslashcar comma hashcar : . ? ! dmn -- Insertions within a paragraph > Accents (page 3, column 1) -- not implemented -- Insertions within a paragraph > Non-English characters (page 3, column 1) -- not implemented -- Insertions within a paragraph > Other text characters an logos (page 3, -- column 1) bullet dots enddots euro pounds textdegree copyright registeredsymbol TeX LaTeX today guillemetleft guillementright guillemotleft guillemotright -- Insertions within a paragraph > Glyphs for code examples (page 3, column 2) equiv error expansion point print result -- Making and preventing breaks (page 3, column 2) * / - hyphenation tie w refill -- Vertical space (page 3, column 2) sp page need group vskip -- Definition commands (page 3, column 2) -- not implemented ]], true) lex:add_rule('keyword', token(lexer.KEYWORD, ('@end' * lexer.space^1 + '@') * keyword_base)) -- Italics lex:add_rule('emph', token('emph', '@emph' * lexer.delimited_range('{}', false, true, true))) lex:add_style('emph', lexer.STYLE_STRING..',italics') -- Bold lex:add_rule('strong', token('strong', '@strong' * lexer.delimited_range('{}', false, true, true))) lex:add_style('strong', lexer.STYLE_STRING..',bold') -- Identifiers lex:add_rule('identifier', token(lexer.IDENTIFIER, lexer.word)) -- Strings. lex:add_rule('string', token(lexer.STRING, lexer.delimited_range('{}', false, true, true))) -- Numbers. lex:add_rule('number', token(lexer.NUMBER, lexer.float + lexer.integer)) -- Comments. local line_comment = '@c' * lexer.nonnewline_esc^0 --local line_comment_long = '@comment' * lexer.nonnewline_esc^0 local block_comment = '@ignore' * (lexer.any - '@end ignore')^0 * P('@end ignore')^-1 lex:add_rule('comment', token(lexer.COMMENT, line_comment + block_comment)) -- Fold points. lex:add_fold_point('directives', '@titlepage', '@end titlepage') lex:add_fold_point('directives', '@copying', '@end copying') lex:add_fold_point('directives', '@ifset', '@end ifset') lex:add_fold_point('directives', '@tex', '@end tex') lex:add_fold_point('directives', '@itemize', '@end itemize') lex:add_fold_point('directives', '@enumerate', '@end enumerate') lex:add_fold_point('directives', '@multitable', '@end multitable') lex:add_fold_point('directives', '@example', '@end example') lex:add_fold_point('directives', '@smallexample', '@end smallexample') lex:add_fold_point('directives', '@cartouche', '@end cartouche') lex:add_fold_point('directives', '@startchapter', '@end startchapter') return lex