aboutsummaryrefslogtreecommitdiffhomepage
path: root/lexlua/texinfo.lua
diff options
context:
space:
mode:
authormitchell <unknown>2018-03-11 23:04:41 -0400
committermitchell <unknown>2018-03-11 23:04:41 -0400
commit519b7328b66c4c84f03893a31e4be5ba6b1395f2 (patch)
tree2055cd79006357e94c185f341d0df17b9a8769eb /lexlua/texinfo.lua
parentc0373e036e965a70045971e2abc582cb4bf12a4e (diff)
downloadscintilla-mirror-519b7328b66c4c84f03893a31e4be5ba6b1395f2.tar.gz
Added optional Lua lexer support.
This support is disabled by default and must be enabled via compile-time option.
Diffstat (limited to 'lexlua/texinfo.lua')
-rw-r--r--lexlua/texinfo.lua222
1 files changed, 222 insertions, 0 deletions
diff --git a/lexlua/texinfo.lua b/lexlua/texinfo.lua
new file mode 100644
index 000000000..9a742f251
--- /dev/null
+++ b/lexlua/texinfo.lua
@@ -0,0 +1,222 @@
+-- Copyright 2014-2018 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