summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2022-10-31 19:49:19 +0000
committerKarl Berry <karl@freefriends.org>2022-10-31 19:49:19 +0000
commit49868cf03e277e482277b3671d839a8d6c029c4f (patch)
tree74a398d0067402be11b2414a18ca884330cce540 /Master/texmf-dist/tex
parent730e5760ba776408e8e3ea9fc3d61c7be75afaa6 (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.sty807
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*}