diff options
author | Karl Berry <karl@freefriends.org> | 2022-10-31 19:49:19 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2022-10-31 19:49:19 +0000 |
commit | 49868cf03e277e482277b3671d839a8d6c029c4f (patch) | |
tree | 74a398d0067402be11b2414a18ca884330cce540 /Master/texmf-dist/tex | |
parent | 730e5760ba776408e8e3ea9fc3d61c7be75afaa6 (diff) |
piton (31oct22)
git-svn-id: svn://tug.org/texlive/trunk@64883 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r-- | Master/texmf-dist/tex/lualatex/piton/piton.sty | 807 |
1 files changed, 397 insertions, 410 deletions
diff --git a/Master/texmf-dist/tex/lualatex/piton/piton.sty b/Master/texmf-dist/tex/lualatex/piton/piton.sty index f175cadc24e..60f6f622742 100644 --- a/Master/texmf-dist/tex/lualatex/piton/piton.sty +++ b/Master/texmf-dist/tex/lualatex/piton/piton.sty @@ -18,8 +18,8 @@ %% and version 1.3 or later is part of all distributions of %% LaTeX version 2005/12/01 or later. %% -\def\myfileversion{0.8} -\def\myfiledate{2022/10/23} +\def\myfileversion{0.9} +\def\myfiledate{2022/10/31} @@ -116,21 +116,44 @@ \bool_set_true:N \c__piton_footnote_bool } } +\int_new:N \l__piton_nb_lines_int +\int_new:N \g__piton_line_int \tl_new:N \g__piton_aux_tl -\bool_new:N \l__piton_splittable_bool +\int_new:N \l__piton_splittable_int +\int_set:Nn \l__piton_splittable_int { 100 } \str_new:N \l__piton_background_color_str -\dim_new:N \l__piton_width_dim +\dim_new:N \g__piton_width_dim \dim_new:N \l__piton_width_on_aux_dim \int_new:N \g__piton_env_int \bool_new:N \l__piton_slim_bool \dim_new:N \l__piton_left_margin_dim +\tl_new:N \l__piton_tab_tl +\cs_new_protected:Npn \__piton_set_tab_tl:n #1 + { + \tl_clear:N \l__piton_tab_tl + \prg_replicate:nn { #1 } + { \tl_put_right:Nn \l__piton_tab_tl { ~ } } + } +\__piton_set_tab_tl:n { 4 } +\cs_new_protected:Npn \__piton_newline: + { + \int_gincr:N \g__piton_line_int + \int_compare:nNnT \g__piton_line_int > { \l__piton_splittable_int - 1 } + { + \int_compare:nNnT + { \l__piton_nb_lines_int - \g__piton_line_int } > \l__piton_splittable_int + { + \egroup + \bool_if:NT \c__piton_footnote_bool { \end { savenotes } } + \newline + \bool_if:NT \c__piton_footnote_bool { \begin { savenotes } } + \vtop \bgroup + } + } + } \int_new:N \l__piton_gobble_int -\cs_new_protected:Npn \__piton_define_gobble_syntax:n #1 - { \lua_now:n { define_gobble_syntax(#1) } } \cs_set_protected:Npn \__piton_begin_line: #1 \__piton_end_line: { - \bool_lazy_and:nnT \l__piton_splittable_bool \c__piton_footnote_bool - { \begin { savenotes } } \bool_if:NTF \l__piton_slim_bool { \hbox_set:Nn \l_tmpa_box } { @@ -153,8 +176,8 @@ \str_if_empty:NF \l__piton_background_color_str \space #1 \hfil } - \dim_compare:nNnT { \box_wd:N \l_tmpa_box } > \l__piton_width_dim - { \dim_set:Nn \l__piton_width_dim { \box_wd:N \l_tmpa_box } } + \dim_compare:nNnT { \box_wd:N \l_tmpa_box } > \g__piton_width_dim + { \dim_gset:Nn \g__piton_width_dim { \box_wd:N \l_tmpa_box } } \box_set_dp:Nn \l_tmpa_box { \box_dp:N \l_tmpa_box + 1.25 pt } \box_set_ht:Nn \l_tmpa_box { \box_ht:N \l_tmpa_box + 1.25 pt } \tl_if_empty:NTF \l__piton_background_color_str @@ -174,8 +197,6 @@ \box_use_drop:N \l_tmpa_box } } - \bool_lazy_and:nnT \l__piton_splittable_bool \c__piton_footnote_bool - { \end { savenotes } } \vspace { - 2.5 pt } } \bool_new:N \l__piton_line_numbers_bool @@ -197,14 +218,16 @@ all-line-numbers .value_forbidden:n = true , resume .bool_set:N = \l__piton_resume_bool , resume .value_forbidden:n = true , - splittable .bool_set:N = \l__piton_splittable_bool , - splittable .default:n = true , + splittable .int_set:N = \l__piton_splittable_int , + splittable .default:n = 1 , background-color .str_set:N = \l__piton_background_color_str , background-color .value_required:n = true , slim .bool_set:N = \l__piton_slim_bool , slim .default:n = true , left-margin .dim_set:N = \l__piton_left_margin_dim , left-margin .value_required:n = true , + tab-size .code:n = \__piton_set_tab_tl:n { #1 } , + tab-size .value_required:n = true , unknown .code:n = \msg_error:nn { piton } { Unknown~key~for~PitonOptions } } @@ -213,17 +236,17 @@ Unknown~key. \\ The~key~'\l_keys_key_str'~is~unknown~for~\token_to_str:N \PitonOptions.~The~ available~keys~are:~all-line-numbers,~auto-gobble,~env-gobble,~gobble,~ - left-margin,~line-numbers,~resume,~slim~and~splittable.\\ + left-margin,~line-numbers,~resume,~slim~splittable~and~tab-size.\\ If~you~go~on,~that~key~will~be~ignored. } \NewDocumentCommand \PitonOptions { } { \keys_set:nn { PitonOptions } } -\int_new:N \g__piton_line_int +\int_new:N \g__piton_visual_line_int \cs_new_protected:Npn \__piton_print_number: { - \int_gincr:N \g__piton_line_int + \int_gincr:N \g__piton_visual_line_int \hbox_overlap_left:n { - { \color { gray } \footnotesize \int_to_arabic:n \g__piton_line_int } + { \color { gray } \footnotesize \int_to_arabic:n \g__piton_visual_line_int } \skip_horizontal:n { 0.4 em } } } @@ -250,7 +273,7 @@ \tl_gput_right:Nx \g__piton_aux_tl { \dim_set:Nn \l__piton_width_on_aux_dim - { \dim_use:N \l__piton_width_dim + 0.5 em } + { \dim_eval:n { \g__piton_width_dim + 0.5 em } } } } } @@ -272,26 +295,35 @@ \lua_now:e { Parse(token.scan_argument()) } { #1 } \group_end: } -\NewDocumentCommand { \PitonInputFile } { m } +\cs_new:Npn \__piton_pre_env: { \int_gincr:N \g__piton_env_int \tl_gclear:N \g__piton_aux_tl \tl_if_exist:cT { c__piton _ \int_use:N \g__piton_env_int _ tl } { \use:c { c__piton _ \int_use:N \g__piton_env_int _ tl } } - \bool_if:NF \l__piton_splittable_bool - { \bool_if:NT \c__piton_footnote_bool { \begin { savenotes } } } \dim_compare:nNnT \l__piton_width_on_aux_dim = \c_zero_dim { \dim_set_eq:NN \l__piton_width_on_aux_dim \linewidth } - \bool_if:NF \l__piton_resume_bool { \int_gzero:N \g__piton_line_int } + \bool_if:NF \l__piton_resume_bool { \int_gzero:N \g__piton_visual_line_int } + \dim_gzero:N \g__piton_width_dim + \int_gzero:N \g__piton_line_int + \dim_zero:N \parindent + \dim_zero:N \lineskip + } +\NewDocumentCommand { \PitonInputFile } { m } + { \group_begin: - \dim_set_eq:NN \parindent \c_zero_dim + \__piton_pre_env: + \mode_if_vertical:TF \mode_leave_vertical: \newline + \lua_now:n { CountLinesFile(token.scan_argument()) } { #1 } \ttfamily - \lua_now:e { ParseFile(token.scan_argument()) } { #1 } - \__piton_width_to_aux: + \bool_if:NT \c__piton_footnote_bool { \begin { savenotes } } + \vtop \bgroup + \lua_now:n { ParseFile(token.scan_argument()) } { #1 } + \egroup + \bool_if:NT \c__piton_footnote_bool { \end { savenotes } } + \__piton_width_to_aux: \group_end: \__piton_write_aux: - \bool_if:NF \l__piton_splittable_bool - { \bool_if:NT \c__piton_footnote_bool { \end { savenotes } } } } \NewDocumentCommand { \NewPitonEnvironment } { m m m m } { @@ -305,53 +337,31 @@ } { \group_end: - \mode_if_vertical:TF - { \mode_leave_vertical: } - \newline - \bool_if:NF \l__piton_splittable_bool + \mode_if_vertical:TF \mode_leave_vertical: \newline + \lua_now:n { CountLines(token.scan_argument()) } { ##1 } + \ttfamily + \bool_if:NT \c__piton_footnote_bool { \begin { savenotes } } + \vtop \bgroup + \lua_now:e { - \bool_if:NT \c__piton_footnote_bool { \begin { savenotes } } - \vbox_top:n + GobbleParse + ( \int_use:N \l__piton_gobble_int , token.scan_argument() ) } - { - \ttfamily - \dim_zero:N \lineskip - \int_case:nnF \l__piton_gobble_int - { - 0 - { \lua_now:n { Parse(token.scan_argument()) } } - { -1 } - { \lua_now:n { AutoGobbleParse(token.scan_argument()) } } - { -2 } - { \lua_now:n { EnvGobbleParse(token.scan_argument()) } } - } - { - \exp_args:NV \__piton_define_gobble_syntax:n \l__piton_gobble_int - \lua_now:n { GobbleParse(token.scan_argument()) } - } - { ##1 } - \vspace { 2.5 pt } - \__piton_width_to_aux: - } - \bool_if:NF \l__piton_splittable_bool - { \bool_if:NT \c__piton_footnote_bool { \end { savenotes } } } + { ##1 } + \vspace { 2.5 pt } + \egroup + \bool_if:NT \c__piton_footnote_bool { \end { savenotes } } + \__piton_width_to_aux: \end { #1 } \__piton_write_aux: } \NewDocumentEnvironment { #1 } { #2 } { #3 - \int_gincr:N \g__piton_env_int - \tl_gclear:N \g__piton_aux_tl - \tl_if_exist:cT { c__piton _ \int_use:N \g__piton_env_int _ tl } - { \use:c { c__piton _ \int_use:N \g__piton_env_int _ tl } } - \dim_compare:nNnT \l__piton_width_on_aux_dim = \c_zero_dim - { \dim_set_eq:NN \l__piton_width_on_aux_dim \linewidth } - \bool_if:NF \l__piton_resume_bool { \int_gzero:N \g__piton_line_int } + \__piton_pre_env: \group_begin: - \box_clear:N \l_tmpa_box \tl_map_function:nN - { \ \\ \{ \} \$ \& \# \^ \_ \% \~ } + { \ \\ \{ \} \$ \& \# \^ \_ \% \~ \^^I } \char_set_catcode_other:N \use:c { __piton_collect_ #1 :w } } @@ -465,8 +475,8 @@ Name.Type = \color[HTML]{336666} , InitialValues = \__piton_piton:n , Dict.Value = \__piton_piton:n , - Post.Function = \__piton_piton:n , Interpol.Inside = \color{black}\__piton_piton:n , + Post.Function = \__piton_piton:n , } \AddToHook { env / piton / begin } { \msg_fatal:nn { piton } { No~environment~piton } } @@ -481,342 +491,336 @@ \ExplSyntaxOff \RequirePackage{luacode} \begin{luacode*} -local P, S, V , C , Ct, Cc, Cf = lpeg.P, lpeg.S, lpeg.V, lpeg.C, lpeg.Ct, lpeg.Cc, lpeg.Cf - ---[[ By convention, a capture which provides as value a table (and not a string), provides, in fact, -a string (the first element of the table) which is a formatting LaTeX instruction (it will be -thrown back to TeX with normal catcodes (ant not ``other'' catcode for everybody).]] - -local function L(string) - return Cc ( { string } ) +local P, S, V, C, Ct, Cc, Cf = lpeg.P, lpeg.S, lpeg.V, lpeg.C, lpeg.Ct, lpeg.Cc, lpeg.Cf +local function Q(pattern) + return Ct ( Cc ( luatexbase.catcodetables.CatcodeTableOther ) * C ( pattern ) ) +end +local function L(pattern) + return Ct ( C ( pattern ) ) +end +local function Lc(string) + return Cc ( { luatexbase.catcodetables.expl , string } ) end - local function K(pattern, style) return - L ( "{\\PitonStyle{" .. style .. "}{" ) - * C(pattern) - * L ( "}}" ) + Lc ( "{\\PitonStyle{" .. style .. "}{" ) + * Q ( pattern ) + * Lc ( "}}" ) end - ---[[ The text in "escape" (between begin_escape and end_escape) is captured -and put in a table (with only one component). Indeed, we have decided that a capture -which is encapsulated in a table must be transmitted to TeX with the normal TeX catcodes.]] - -local Escape = P(begin_escape) - * Ct ( C ( ( 1 - P(end_escape) ) ^ 1 ) ) - * P(end_escape) - -lpeg.locale(lpeg) -- mandatory - -local alpha , digit , space , punct = lpeg.alpha , lpeg.digit , lpeg.space , lpeg.punct - --- Remember that à, â, ç, etc. are strings of length 2 (2 bytes) +local Escape = + P(begin_escape) + * L ( ( 1 - P(end_escape) ) ^ 1 ) + * P(end_escape) +lpeg.locale(lpeg) +local alpha, digit, space = lpeg.alpha, lpeg.digit, lpeg.space local letter = alpha + P "_" - + P "â" + P "à" + P "ç" + P "é" + P "è" + P "ê" + P "ë" + P "ï" + P "î" + P "ô" + P "û" + P "ü" + - P "Â" + P "À" + P "Ç" + P "É" + P "È" + P "Ê" + P "Ë" + P "Ï" + P "Î" + P "Ô" + P "Û" + P "Ü" + + P "â" + P "à" + P "ç" + P "é" + P "è" + P "ê" + P "ë" + P "ï" + P "î" + + P "ô" + P "û" + P "ü" + P "Â" + P "À" + P "Ç" + P "É" + P "È" + P "Ê" + + P "Ë" + P "Ï" + P "Î" + P "Ô" + P "Û" + P "Ü" local alphanum = letter + digit - local identifier = letter * alphanum ^ 0 - -local Identifier = C ( identifier ) - -local Space = C ( ( space - P "\r" ) ^ 1 ) - -local SkipSpace = C ( ( space - P "\r" ) ^ 0 ) - -local Punct = C ( punct ) - -local EOL = ( P "\r" ) - * - ( - ( space^0 * -1 ) - + - Cc ( - { - luatexbase.catcodetables.expl , - '\\__piton_end_line: \\bool_if:NT \\l__piton_splittable_bool \\newline \\__piton_begin_line:' - } - ) - ) - +local Identifier = Q ( identifier ) local Number = - K ( - ( digit^1 * P "." * digit^0 + digit^0 * P "." * digit^1 + digit^1 ) - * ( S "eE" * S "+-" ^ -1 * digit^1 ) ^ -1 - + digit^1 - , 'Number' ) - -local Word = C ( ( ( 1 - space ) - S "'\"\r[()]" - digit ) ^ 1 ) - + K ( + ( digit^1 * P "." * digit^0 + digit^0 * P "." * digit^1 + digit^1 ) + * ( S "eE" * S "+-" ^ -1 * digit^1 ) ^ -1 + + digit^1 , + 'Number' + ) if begin_escape ~= '' -then Word = C ( ( ( 1 - space - P(begin_escape) - P(end_escape) ) - S "'\"\r[()]" - digit ) ^ 1 ) +then Word = Q ( ( ( 1 - space - P(begin_escape) - P(end_escape) ) + - S "'\"\r[()]" - digit ) ^ 1 ) +else Word = Q ( ( ( 1 - space ) - S "'\"\r[()]" - digit ) ^ 1 ) end +local Space = Q ( ( space - P "\r" ) ^ 1 ) -local Delim = C ( S "[()]" ) +local SkipSpace = Q ( ( space - P "\r" ) ^ 0 ) -local Keyword = - K ( P "assert" + P "break" + P "case" + P "continue" + P "del" - + P "elif" + P "else" + P "except" + P "exec" + P "finally" + P "for" + P "from" - + P "global" + P "if" + P "import" + P "lambda" + P "non local" - + P "pass" + P "return" + P "try" + P "while" - + P "with" + P "yield" + P "yield from" , - 'Keyword' ) - + K ( P "True" + P "False" + P "None" , 'Keyword.Constant' ) - -local Builtin = - K ( P "__import__" + P "abs" + P "all" + P "any" + P "bin" + P "bool" + P "bytearray" - + P "bytes" + P "chr" + P "classmethod" + P "compile" + P "complex" + P "delattr" - + P "dict" + P "dir" + P "divmod" + P "enumerate" + P "eval" + P "filter" - + P "float" + P "format" + P "frozenset" + P "getattr" + P "globals" + P "hasattr" - + P "hash" + P "hex" + P "id" + P "input" + P "int" + P "isinstance" + P "issubclass" - + P "iter" + P "len" + P "list" + P "locals" + P "map" + P "max" + P "memoryview" + P "min" - + P "next" + P "object" + P "oct" + P "open" + P "ord" + P "pow" + P "print" + P "property" - + P "range" + P "repr" + P "reversed" + P "round" + P "set" + P "setattr" + P "slice" - + P "sorted" + P "staticmethod" + P "str" + P "sum" + P "super" + P "tuple" + P "type" - + P "vars" + P "zip" , - 'Name.Builtin' ) - -local Exception = - K ( "ArithmeticError" + P "AssertionError" + P "AttributeError" - + P "BaseException" + P "BufferError" + P "BytesWarning" + P "DeprecationWarning" - + P "EOFError" + P "EnvironmentError" + P "Exception" + P "FloatingPointError" - + P "FutureWarning" + P "GeneratorExit" + P "IOError" + P "ImportError" - + P "ImportWarning" + P "IndentationError" + P "IndexError" + P "KeyError" - + P "KeyboardInterrupt" + P "LookupError" + P "MemoryError" + P "NameError" - + P "NotImplementedError" + P "OSError" + P "OverflowError" - + P "PendingDeprecationWarning" + P "ReferenceError" + P "ResourceWarning" - + P "RuntimeError" + P "RuntimeWarning" + P "StopIteration" - + P "SyntaxError" + P "SyntaxWarning" + P "SystemError" + P "SystemExit" - + P "TabError" + P "TypeError" + P "UnboundLocalError" + P "UnicodeDecodeError" - + P "UnicodeEncodeError" + P "UnicodeError" + P "UnicodeTranslateError" - + P "UnicodeWarning" + P "UserWarning" + P "ValueError" + P "VMSError" - + P "Warning" + P "WindowsError" + P "ZeroDivisionError" - + P "BlockingIOError" + P "ChildProcessError" + P "ConnectionError" - + P "BrokenPipeError" + P "ConnectionAbortedError" + P "ConnectionRefusedError" - + P "ConnectionResetError" + P "FileExistsError" + P "FileNotFoundError" - + P "InterruptedError" + P "IsADirectoryError" + P "NotADirectoryError" - + P "PermissionError" + P "ProcessLookupError" + P "TimeoutError" - + P "StopAsyncIteration" + P "ModuleNotFoundError" + P "RecursionError" , - 'Exception' ) - -local RaiseException = K ( P "raise" , 'Keyword' ) * SkipSpace * Exception * C ( P "(" ) +local Punct = Q ( S ".,:;!" ) +local Tab = P "\t" * Lc ( '\\l__piton_tab_tl' ) +local EOL = + P "\r" + * + ( + ( space^0 * -1 ) + + + Lc ( '\\__piton_end_line: \\__piton_newline: \\__piton_begin_line:' ) + ) +local Delim = Q ( S "[()]" ) -local ExceptionInConsole = Exception * C ( ( 1 - P "\r" ) ^ 0 ) * EOL +local Operator = + K ( P "!=" + P "==" + P "<<" + P ">>" + S "-~+/*%=<>&.@|" , 'Operator') -local Namespace = - K ( P "from" , 'Keyword' ) * Space * K ( alphanum^1 , 'Name.Namespace' ) - * ( Space * K ( P "import" , 'Keyword' ) ) ^ -1 +local OperatorWord = + K ( P "in" + P "is" + P "and" + P "or" + P "not" , 'Operator.Word') -local ImportAs = K ( P "import" , 'Keyword' ) - * Space - * K ( identifier , 'Name.Namespace' ) - * ( SkipSpace * C ( P "," ) * SkipSpace * K ( identifier , 'Name.Namespace' ) ) ^ 0 - * ( - Space * K ( P "as" , 'Keyword' ) * Space * K ( identifier , 'Name.Namespace' ) - ) ^ 0 +local Keyword = + K ( P "as" + P "assert" + P "break" + P "case" + P "class" + P "continue" + + P "def" + P "del" + P "elif" + P "else" + P "except" + P "exec" + + P "finally" + P "for" + P "from" + P "global" + P "if" + P "import" + + P "lambda" + P "non local" + P "pass" + P "return" + P "try" + + P "while" + P "with" + P "yield" + P "yield from" , + 'Keyword' ) + + K ( P "True" + P "False" + P "None" , 'Keyword.Constant' ) -local Class = K ( P "class" , 'Keyword' ) - * ( Space * K ( identifier , 'Name.Class' ) ) ^ -1 +local Builtin = + K ( P "__import__" + P "abs" + P "all" + P "any" + P "bin" + P "bool" + + P "bytearray" + P "bytes" + P "chr" + P "classmethod" + P "compile" + + P "complex" + P "delattr" + P "dict" + P "dir" + P "divmod" + + P "enumerate" + P "eval" + P "filter" + P "float" + P "format" + + P "frozenset" + P "getattr" + P "globals" + P "hasattr" + P "hash" + + P "hex" + P "id" + P "input" + P "int" + P "isinstance" + P "issubclass" + + P "iter" + P "len" + P "list" + P "locals" + P "map" + P "max" + + P "memoryview" + P "min" + P "next" + P "object" + P "oct" + P "open" + + P "ord" + P "pow" + P "print" + P "property" + P "range" + P "repr" + + P "reversed" + P "round" + P "set" + P "setattr" + P "slice" + P "sorted" + + P "staticmethod" + P "str" + P "sum" + P "super" + P "tuple" + P "type" + + P "vars" + P "zip" , + 'Name.Builtin' ) +local Exception = + K ( "ArithmeticError" + P "AssertionError" + P "AttributeError" + + P "BaseException" + P "BufferError" + P "BytesWarning" + P "DeprecationWarning" + + P "EOFError" + P "EnvironmentError" + P "Exception" + P "FloatingPointError" + + P "FutureWarning" + P "GeneratorExit" + P "IOError" + P "ImportError" + + P "ImportWarning" + P "IndentationError" + P "IndexError" + P "KeyError" + + P "KeyboardInterrupt" + P "LookupError" + P "MemoryError" + P "NameError" + + P "NotImplementedError" + P "OSError" + P "OverflowError" + + P "PendingDeprecationWarning" + P "ReferenceError" + P "ResourceWarning" + + P "RuntimeError" + P "RuntimeWarning" + P "StopIteration" + + P "SyntaxError" + P "SyntaxWarning" + P "SystemError" + P "SystemExit" + + P "TabError" + P "TypeError" + P "UnboundLocalError" + P "UnicodeDecodeError" + + P "UnicodeEncodeError" + P "UnicodeError" + P "UnicodeTranslateError" + + P "UnicodeWarning" + P "UserWarning" + P "ValueError" + P "VMSError" + + P "Warning" + P "WindowsError" + P "ZeroDivisionError" + + P "BlockingIOError" + P "ChildProcessError" + P "ConnectionError" + + P "BrokenPipeError" + P "ConnectionAbortedError" + P "ConnectionRefusedError" + + P "ConnectionResetError" + P "FileExistsError" + P "FileNotFoundError" + + P "InterruptedError" + P "IsADirectoryError" + P "NotADirectoryError" + + P "PermissionError" + P "ProcessLookupError" + P "TimeoutError" + + P "StopAsyncIteration" + P "ModuleNotFoundError" + P "RecursionError" , + 'Exception' ) + +local RaiseException = K ( P "raise" , 'Keyword' ) * SkipSpace * Exception * Q ( P "(" ) + +local ExceptionInConsole = Exception * Q ( ( 1 - P "\r" ) ^ 0 ) * EOL local Decorator = K ( P "@" * letter^1 , 'Name.Decorator' ) - +local DefClass = + K ( P "class" , 'Keyword' ) * Space * K ( identifier , 'Name.Class' ) +local ImportAs = + K ( P "import" , 'Keyword' ) + * Space + * K ( identifier * ( P "." * identifier ) ^ 0 , + 'Name.Namespace' + ) + * ( + ( Space * K ( P "as" , 'Keyword' ) * Space * K ( identifier , 'Name.Namespace' ) ) + + + ( SkipSpace * Q ( P "," ) * SkipSpace * K ( identifier , 'Name.Namespace' ) ) ^ 0 + ) +local FromImport = + K ( P "from" , 'Keyword' ) + * Space * K ( identifier , 'Name.Namespace' ) + * Space * K ( P "import" , 'Keyword' ) local SingleShortInterpol = K ( P "{" , 'String.Interpol') * K ( ( 1 - S "}':" ) ^ 0 , 'Interpol.Inside' ) - * C ( P ":" * (1 - S "}:'") ^ 0 ) ^ -1 + * Q ( P ":" * (1 - S "}:'") ^ 0 ) ^ -1 * K ( P "}" , 'String.Interpol' ) local DoubleShortInterpol = K ( P "{" , 'String.Interpol' ) * K ( ( 1 - S "}\":" ) ^ 0 , 'Interpol.Inside' ) - * ( K ( P ":" , 'String.Interpol' ) * C ( (1 - S "}:\"") ^ 0 ) ) ^ -1 + * ( K ( P ":" , 'String.Interpol' ) * Q ( (1 - S "}:\"") ^ 0 ) ) ^ -1 * K ( P "}" , 'String.Interpol' ) local SingleLongInterpol = K ( P "{" , 'String.Interpol' ) * K ( ( 1 - S "}:\r" - P "'''" ) ^ 0 , 'Interpol.Inside' ) - * C ( P ":" * (1 - S "}:\r" - P "'''" ) ^ 0 ) ^ -1 + * Q ( P ":" * (1 - S "}:\r" - P "'''" ) ^ 0 ) ^ -1 * K ( P "}" , 'String.Interpol' ) local DoubleLongInterpol = K ( P "{" , 'String.Interpol' ) * K ( ( 1 - S "}:\r" - P "\"\"\"" ) ^ 0 , 'Interpol.Inside' ) - * C ( P ":" * (1 - S "}:\r" - P "\"\"\"" ) ^ 0 ) ^ -1 + * Q ( P ":" * (1 - S "}:\r" - P "\"\"\"" ) ^ 0 ) ^ -1 * K ( P "}" , 'String.Interpol' ) +local SingleShortPureString = + Q ( ( P "\\'" + P "{{" + P "}}" + 1 - S "{}'" ) ^ 1 ) -local SingleShortPureString = C ( ( P "\\'" + P "{{" + P "}}" + 1 - S "{}'" ) ^ 1 ) - -local DoubleShortPureString = C ( ( P "\\\"" + P "{{" + P "}}" + 1 - S "{}\"" ) ^ 1 ) +local DoubleShortPureString = + Q ( ( P "\\\"" + P "{{" + P "}}" + 1 - S "{}\"" ) ^ 1 ) -local SingleLongPureString = C ( ( 1 - P "'''" - S "{}'\r" ) ^ 1 ) - -local DoubleLongPureString = C ( ( 1 - P "\"\"\"" - S "{}\"\r" ) ^ 1 ) +local SingleLongPureString = + Q ( ( 1 - P "'''" - S "{}'\r" ) ^ 1 ) +local DoubleLongPureString = + Q ( ( 1 - P "\"\"\"" - S "{}\"\r" ) ^ 1 ) local SingleShortString = - L ( "{\\PitonStyle{String.Short}{" ) - * ( - C ( P "f'" + P "F'" ) - * ( SingleShortInterpol + SingleShortPureString ) ^ 0 - * C ( P "'" ) - + - C ( ( P "'" + P "r'" + P "R'" ) * ( P "\\'" + 1 - S "'\r" ) ^ 0 * P "'" ) - ) - * L ( "}}" ) + Lc ( "{\\PitonStyle{String.Short}{" ) + * ( + Q ( P "f'" + P "F'" ) + * ( SingleShortInterpol + SingleShortPureString ) ^ 0 + * Q ( P "'" ) + + + Q ( ( P "'" + P "r'" + P "R'" ) + * ( P "\\'" + 1 - S "'\r" ) ^ 0 * P "'" ) + ) + * Lc ( "}}" ) local DoubleShortString = - L ( "{\\PitonStyle{String.Short}{" ) - * ( - C ( P "f\"" + P "F\"" ) - * ( DoubleShortInterpol + DoubleShortPureString ) ^ 0 - * C ( P "\"" ) - + - C ( ( P "\"" + P "r\"" + P "R\"" ) * ( P "\\\"" + 1 - S "\"\r" ) ^ 0 * P "\"" ) - ) - * L ( "}}" ) + Lc ( "{\\PitonStyle{String.Short}{" ) + * ( + Q ( P "f\"" + P "F\"" ) + * ( DoubleShortInterpol + DoubleShortPureString ) ^ 0 + * Q ( P "\"" ) + + + Q ( ( P "\"" + P "r\"" + P "R\"" ) + * ( P "\\\"" + 1 - S "\"\r" ) ^ 0 * P "\"" ) + ) + * Lc ( "}}" ) local ShortString = SingleShortString + DoubleShortString - local SingleLongString = - L "{\\PitonStyle{String.Long}{" - * ( - C ( S "fF" * P "'''" ) - * ( SingleLongInterpol + SingleLongPureString ) ^ 0 - * L "}}" - * ( - EOL - + - L "{\\PitonStyle{String.Long}{" - * ( SingleLongInterpol + SingleLongPureString ) ^ 0 - * L "}}" - * EOL - ) ^ 0 - * L "{\\PitonStyle{String.Long}{" + Lc "{\\PitonStyle{String.Long}{" + * ( + Q ( S "fF" * P "'''" ) + * ( SingleLongInterpol + SingleLongPureString ) ^ 0 + * Lc "}}" + * ( + EOL + + + Lc "{\\PitonStyle{String.Long}{" * ( SingleLongInterpol + SingleLongPureString ) ^ 0 - + - C ( ( S "rR" ) ^ -1 * P "'''" * ( 1 - P "'''" - P "\r" ) ^ 0 ) - * L "}}" - * ( - L "{\\PitonStyle{String.Long}{" - * C ( ( 1 - P "'''" - P "\r" ) ^ 0 ) - * L "}}" - * EOL - ) ^ 0 - * L "{\\PitonStyle{String.Long}{" - * C ( ( 1 - P "'''" - P "\r" ) ^ 0 ) - ) - * C ( P "'''" ) - * L "}}" + * Lc "}}" + * EOL + ) ^ 0 + * Lc "{\\PitonStyle{String.Long}{" + * ( SingleLongInterpol + SingleLongPureString ) ^ 0 + + + Q ( ( S "rR" ) ^ -1 * P "'''" + * ( 1 - P "'''" - P "\r" ) ^ 0 ) + * Lc "}}" + * ( + Lc "{\\PitonStyle{String.Long}{" + * Q ( ( 1 - P "'''" - P "\r" ) ^ 0 ) + * Lc "}}" + * EOL + ) ^ 0 + * Lc "{\\PitonStyle{String.Long}{" + * Q ( ( 1 - P "'''" - P "\r" ) ^ 0 ) + ) + * Q ( P "'''" ) + * Lc "}}" local DoubleLongString = - L "{\\PitonStyle{String.Long}{" - * ( - C ( S "fF" * P "\"\"\"" ) - * ( DoubleLongInterpol + DoubleLongPureString ) ^ 0 - * L "}}" - * ( - EOL - + - L "{\\PitonStyle{String.Long}{" - * ( DoubleLongInterpol + DoubleLongPureString ) ^ 0 - * L "}}" - * EOL - ) ^ 0 - * L "{\\PitonStyle{String.Long}{" + Lc "{\\PitonStyle{String.Long}{" + * ( + Q ( S "fF" * P "\"\"\"" ) + * ( DoubleLongInterpol + DoubleLongPureString ) ^ 0 + * Lc "}}" + * ( + EOL + + + Lc "{\\PitonStyle{String.Long}{" * ( DoubleLongInterpol + DoubleLongPureString ) ^ 0 - + - C ( ( S "rR" ) ^ -1 * P "\"\"\"" * ( 1 - P "\"\"\"" - P "\r" ) ^ 0 ) - * L "}}" - * ( - L "{\\PitonStyle{String.Long}{" - * C ( ( 1 - P "\"\"\"" - P "\r" ) ^ 0 ) - * L "}}" - * EOL - ) ^ 0 - * L "{\\PitonStyle{String.Long}{" - * C ( ( 1 - P "\"\"\"" - P "\r" ) ^ 0 ) - ) - * C ( P "\"\"\"" ) - * L "}}" - + * Lc "}}" + * EOL + ) ^ 0 + * Lc "{\\PitonStyle{String.Long}{" + * ( DoubleLongInterpol + DoubleLongPureString ) ^ 0 + + + Q ( ( S "rR" ) ^ -1 * P "\"\"\"" + * ( 1 - P "\"\"\"" - P "\r" ) ^ 0 ) + * Lc "}}" + * ( + Lc "{\\PitonStyle{String.Long}{" + * Q ( ( 1 - P "\"\"\"" - P "\r" ) ^ 0 ) + * Lc "}}" + * EOL + ) ^ 0 + * Lc "{\\PitonStyle{String.Long}{" + * Q ( ( 1 - P "\"\"\"" - P "\r" ) ^ 0 ) + ) + * Q ( P "\"\"\"" ) + * Lc "}}" local LongString = SingleLongString + DoubleLongString - -local Expression = - P { "E" , - E = ( 1 - S "{}()[]\r," ) ^ 0 - * ( - ( P "{" * V "F" * P "}" - + P "(" * V "F" * P ")" - + P "[" * V "F" * P "]" ) * ( 1 - S "{}()[]\r," ) ^ 0 - ) ^ 0 , - F = ( 1 - S "{}()[]\r\"'" ) ^ 0 - * ( ( - P "'" * (P "\\'" + 1 - S"'\r" )^0 * P "'" - + P "\"" * (P "\\\"" + 1 - S"\"\r" )^0 * P "\"" - + P "{" * V "F" * P "}" - + P "(" * V "F" * P ")" - + P "[" * V "F" * P "]" - ) * ( 1 - S "{}()[]\r\"'" ) ^ 0 ) ^ 0 , - } - -local Param = SkipSpace * K ( identifier , '' ) * SkipSpace - * ( K ( P "=" * Expression , 'InitialValues' ) - + K ( P ":" , '' ) * SkipSpace * K ( letter^1 , 'Name.Type' )) - + SkipSpace * K ( alphanum ^ 1 , '' ) * SkipSpace - -local Params = Param * ( K ( P "," , '' ) * Param ) ^ 0 - -local StringDoc = K ( P "\"\"\"" , 'String.Doc' ) - * ( K ( (1 - P "\"\"\"" - P "\r" ) ^ 0 , 'String.Doc' ) * EOL ) ^ 0 - * K ( ( 1 - P "\"\"\"" - P "\r" ) ^ 0 * P "\"\"\"" , 'String.Doc' ) - + K ( P "'''" , 'String.Doc' ) - * ( K ( (1 - P "'''" - P "\r")^0 , 'String.Doc' ) * EOL ) ^ 0 - * K ( ( 1 - P "'''" - P "\r")^0 * P "'''" , 'String.Doc' ) - -local CommentMath = P "$" * K ( ( 1 - S "$\r" ) ^ 1 , 'Comment.Math' ) * P "$" - -local Comment = L ( "{\\PitonStyle{Comment}{" ) - * C ( P "#" ) * ( CommentMath + C ( ( 1 - S "$\r" ) ^ 1 ) ) ^ 0 - * L ( "}}" ) - * ( EOL + -1 ) +local StringDoc = + K ( P "\"\"\"" , 'String.Doc' ) + * ( K ( (1 - P "\"\"\"" - P "\r" ) ^ 0 , 'String.Doc' ) * EOL * Tab ^0 ) ^ 0 + * K ( ( 1 - P "\"\"\"" - P "\r" ) ^ 0 * P "\"\"\"" , 'String.Doc' ) +local CommentMath = + P "$" * K ( ( 1 - S "$\r" ) ^ 1 , 'Comment.Math' ) * P "$" + +local Comment = + Lc ( "{\\PitonStyle{Comment}{" ) + * Q ( P "#" ) + * ( CommentMath + Q ( ( 1 - S "$\r" ) ^ 1 ) ) ^ 0 + * Lc ( "}}" ) + * ( EOL + -1 ) local CommentLaTeX = - P "##" - * L "{\\PitonStyle{Comment.LaTeX}{\\ignorespaces" - * Ct ( C ( ( 1 - P "\r" ) ^ 0 ) ) - * L "}}" - * ( EOL + -1 ) - + P "##" + * Lc "{\\PitonStyle{Comment.LaTeX}{\\ignorespaces" + * L ( ( 1 - P "\r" ) ^ 0 ) + * Lc "}}" + * ( EOL + -1 ) +local Expression = + P { "E" , + E = ( 1 - S "{}()[]\r," ) ^ 0 + * ( + ( P "{" * V "F" * P "}" + + P "(" * V "F" * P ")" + + P "[" * V "F" * P "]" ) * ( 1 - S "{}()[]\r," ) ^ 0 + ) ^ 0 , + F = ( 1 - S "{}()[]\r\"'" ) ^ 0 + * ( ( + P "'" * (P "\\'" + 1 - S"'\r" )^0 * P "'" + + P "\"" * (P "\\\"" + 1 - S"\"\r" )^0 * P "\"" + + P "{" * V "F" * P "}" + + P "(" * V "F" * P ")" + + P "[" * V "F" * P "]" + ) * ( 1 - S "{}()[]\r\"'" ) ^ 0 ) ^ 0 , + } +local Param = + SkipSpace * Identifier * SkipSpace + * ( + K ( P "=" * Expression , 'InitialValues' ) + + Q ( P ":" ) * SkipSpace * K ( letter^1 , 'Name.Type' ) + ) ^ -1 +local Params = ( Param * ( Q "," * Param ) ^ 0 ) ^ -1 local DefFunction = - K ( P "def" , 'Keyword' ) - * ( Space - * K ( identifier , 'Name.Function' ) - * ( SkipSpace * K ( P "(" , '' ) * Params * K ( P ")" , '' ) ) ^ -1 - * ( SkipSpace - * K ( ( 1 - S ":\r" )^0 , 'Post.Function' ) - * K ( P ":" , 'Keyword' ) - * SkipSpace - * ( EOL + CommentLaTeX + Comment ) - * SkipSpace - * StringDoc ) ^ -1 - ) ^ -1 - -local ItemDict = ShortString * SkipSpace * C ( P ":" ) * K ( Expression , 'Dict.Value' ) + K ( P "def" , 'Keyword' ) + * Space + * K ( identifier , 'Name.Function' ) + * SkipSpace + * Q ( P "(" ) * Params * Q ( P ")" ) + * SkipSpace + * K ( ( 1 - S ":\r" )^0 , 'Post.Function' ) + * Q ( P ":" ) + * ( SkipSpace + * ( EOL + CommentLaTeX + Comment ) -- in all cases, that contains an EOL + * Tab ^ 0 + * SkipSpace + * StringDoc ^ 0 -- there may be additionnal docstrings + ) ^ -1 +local ItemDict = + ShortString * SkipSpace * Q ( P ":" ) * K ( Expression , 'Dict.Value' ) local ItemOfSet = SkipSpace * ( ItemDict + ShortString ) * SkipSpace -local Set = C ( P "{" ) - * ItemOfSet * ( C ( P "," ) * ItemOfSet ) ^ 0 - * C ( P "}" ) - -local Operator = K ( P "!=" + P "==" + P "<<" + P ">>" + S "-~+/*%=<>&.@|" , 'Operator') +local Set = + Q ( P "{" ) + * ItemOfSet * ( Q ( P "," ) * ItemOfSet ) ^ 0 + * Q ( P "}" ) -local OperatorWord = K ( P "in" + P "is" + P "and" + P "or" + P "not" , 'Operator.Word') - -local SyntaxPython = +local SyntaxPythonAux = + Lc ( '\\__piton_begin_line:' ) * ( ( space - P "\r" ) ^0 * P "\r" ) ^ -1 * ( ( space^1 * -1 ) + EOL + + Tab + Space + Escape + CommentLaTeX @@ -825,72 +829,63 @@ local SyntaxPython = + ExceptionInConsole + Set + Delim - + Class * ( Space + Punct + EOL ) - + Namespace * ( Space + Punct + EOL ) + + Operator + + ShortString + + Punct + + FromImport + ImportAs + RaiseException - + Keyword * ( Space + Punct + EOL ) + DefFunction - + ShortString - + Decorator * ( Space + Punct + EOL ) - + Operator - + OperatorWord * ( Space + Punct + EOL ) - + Builtin * ( Space + Punct + EOL ) + + DefClass + + Keyword * ( Space + Punct + Delim + EOL + -1) + + Decorator + + OperatorWord + + Builtin * ( Space + Punct + Delim + EOL + -1) + Identifier + Number + Word - ) ^0 * -1 - -local MinimalSyntax = - P { "S" ; - S = K ( (1 - P "\r" ) ^ 0 , '') + EOL * S - } - + ) ^0 * -1 * Lc ( '\\__piton_end_line:' ) +local SyntaxPython = Ct ( SyntaxPythonAux ) function Parse(code) - local t = Ct(SyntaxPython) : match(code) - tex.sprint( luatexbase.catcodetables.expl , '\\__piton_begin_line:' ) - if t then else t = Ct(MinimalSyntax) : match(code) end - for i = 1 , #t do - if type(t[i]) == 'string' - then - tex.sprint(luatexbase.catcodetables.CatcodeTableOther, t[i]) - else - tex.tprint(t[i]) - end - end - tex.sprint( luatexbase.catcodetables.expl , '\\__piton_end_line:' ) + local t = SyntaxPython : match ( code ) + for _ , s in ipairs(t) do tex.tprint(s) end end - function ParseFile(name) s = '' for line in io.lines(name) do s = s .. '\r' .. line end Parse(s) end - -function define_gobble_syntax(n) - GobbleSyntax = ( 1 - P "\r" ) ^ (-n) * C ( ( 1 - P "\r" ) ^0 ) - * ( C ( P "\r" ) - * ( 1 - P "\r" ) ^ (-n) - * C ( ( 1 - P "\r" ) ^0 ) - ) ^ 0 +function gobble(n,code) + function concat(acc,new_value) + return acc .. new_value + end + if n==0 + then return code + else + return Cf ( + Cc ( "" ) * + ( 1 - P "\r" ) ^ (-n) * C ( ( 1 - P "\r" ) ^ 0 ) + * ( C ( P "\r" ) + * ( 1 - P "\r" ) ^ (-n) + * C ( ( 1 - P "\r" ) ^ 0 ) + ) ^ 0 , + concat + ) : match ( code ) + end end - -function GobbleParse(code) - local t = Ct(GobbleSyntax):match(code) - local new_code = "" - for i = 1 , #t do - new_code = new_code .. t[i] +function GobbleParse(n,code) + if n==-1 + then n = AutoGobbleLPEG : match(code) + else if n==-2 + then n = EnvGobbleLPEG : match(code) + end end - Parse(new_code) + Parse(gobble(n,code)) end - function add(acc,new_value) return acc + new_value end - ---[[ The following LPEG returns as capture the minimal number of spaces at -the beginning of the lines of code]] -AutoGobbleSyntax = +AutoGobbleLPEG = ( space ^ 0 * P "\r" ) ^ -1 * Cf ( ( @@ -904,30 +899,22 @@ AutoGobbleSyntax = * ( 1 - P " " ) * ( 1 - P "\r" ) ^ 0 ) ^ -1 , math.min ) - -function AutoGobbleParse(code) - local n = AutoGobbleSyntax:match(code) - if n==0 - then Parse(code) - else define_gobble_syntax(n) - GobbleParse(code) - end +EnvGobbleLPEG = + ( ( 1 - P "\r" ) ^ 0 * P "\r" ) ^ 0 + * Cf ( Cc(0) * ( P " " * Cc(1) ) ^ 0 , add ) * -1 +function CountLines(code) + local count = 0 + for i in code:gmatch("\r") do count = count + 1 end + tex.sprint( + luatexbase.catcodetables.expl , + '\\int_set:Nn \\l__piton_nb_lines_int {' .. count .. '}' ) end - ---[[ The following LPEG returns as capture the number of spaces at the last line, -that is to say begin the \end{Piton} ]] - -EnvGobbleSyntax = - ( ( 1 - P "\r" ) ^ 0 * P "\r" ) ^ 0 - * Cf ( Cc(0) * ( P " " * Cc(1) ) ^ 0 , add ) * -1 - -function EnvGobbleParse(code) - local n = EnvGobbleSyntax:match(code) - if n==0 - then Parse(code) - else define_gobble_syntax(n) - GobbleParse(code) - end +function CountLinesFile(name) + local count = 0 + for line in io.lines(name) do count = count + 1 end + tex.sprint( + luatexbase.catcodetables.expl , + '\\int_set:Nn \\l__piton_nb_lines_int {' .. count .. '}' ) end \end{luacode*} |