223 lines
9.2 KiB
Lua
223 lines
9.2 KiB
Lua
|
-- 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
|