diff options
author | Karl Berry <karl@freefriends.org> | 2024-01-15 21:00:21 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2024-01-15 21:00:21 +0000 |
commit | da17258f17d6073755f72333739dc4d098163907 (patch) | |
tree | dc9bd996027b187bced3dcae3c6ccf3cc06debaa /Master/texmf-dist/tex | |
parent | 3fb6cf2313253dab16594f39926cdc309231b4a6 (diff) |
piton (15jan24)
git-svn-id: svn://tug.org/texlive/trunk@69437 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r-- | Master/texmf-dist/tex/lualatex/piton/piton.lua | 209 | ||||
-rw-r--r-- | Master/texmf-dist/tex/lualatex/piton/piton.sty | 133 |
2 files changed, 304 insertions, 38 deletions
diff --git a/Master/texmf-dist/tex/lualatex/piton/piton.lua b/Master/texmf-dist/tex/lualatex/piton/piton.lua index 5ce6ce746d1..374515eb39c 100644 --- a/Master/texmf-dist/tex/lualatex/piton/piton.lua +++ b/Master/texmf-dist/tex/lualatex/piton/piton.lua @@ -5,7 +5,7 @@ -- The original source files were: -- -- piton.dtx (with options: `LUA') --- ------------------------------------------- +-- --------------------------------------------- -- Copyright (C) 2022-2024 by F. Pantigny -- -- This file may be distributed and/or modified under the @@ -20,7 +20,7 @@ -- ------------------------------------------- -- -- This file is part of the LuaLaTeX package 'piton'. --- Version 2.3 of 2024/01/06 +-- Version 2.4 of 2024/01/15 if piton.comment_latex == nil then piton.comment_latex = ">" end @@ -337,6 +337,17 @@ then * K ( 'ParseAgain.noCR' , balanced_braces ) * L ( P "}" ) end +DetectedCommands = + Ct ( Cc "Open" + * C ( + piton.ListCommands + * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1 + * P "{" + ) + * Cc "}" + ) + * ( C ( balanced_braces ) / (function (s) return MainLoopPython:match(s) end ) ) + * P "}" * Ct ( Cc "Close" ) local PromptHastyDetection = ( # ( P ">>>" + P "..." ) * Lc ( '\\__piton_prompt:' ) ) ^ -1 local Prompt = K ( 'Prompt' , ( ( P ">>>" + P "..." ) * P " " ^ -1 ) ^ -1 ) local EOL = @@ -480,6 +491,7 @@ local MainPython = + Escape + EscapeMath + CommentLaTeX + Beamer + + DetectedCommands + LongString + Comment + ExceptionInConsole @@ -666,6 +678,17 @@ then * K ( 'ParseAgain.noCR' , balanced_braces ) * L ( P "}" ) end +DetectedCommands = + Ct ( Cc "Open" + * C ( + piton.ListCommands + * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1 + * P "{" + ) + * Cc "}" + ) + * ( C ( balanced_braces ) / (function (s) return MainLoopOCaml:match(s) end ) ) + * P "}" * Ct ( Cc "Close" ) local EOL = P "\r" * @@ -814,6 +837,7 @@ MainOCaml = + Tab + Escape + EscapeMath + Beamer + + DetectedCommands + TypeParameter + String + QuotedString + Char + Comment @@ -969,6 +993,17 @@ then * K ( 'ParseAgain.noCR' , balanced_braces ) * L ( P "}" ) end +DetectedCommands = + Ct ( Cc "Open" + * C ( + piton.ListCommands + * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1 + * P "{" + ) + * Cc "}" + ) + * ( C ( balanced_braces ) / (function (s) return MainLoopC:match(s) end ) ) + * P "}" * Ct ( Cc "Close" ) local EOL = P "\r" * @@ -1020,6 +1055,7 @@ local MainC = + Escape + EscapeMath + CommentLaTeX + Beamer + + DetectedCommands + Preproc + Comment + LongComment + Delim @@ -1158,6 +1194,17 @@ then * K ( 'ParseAgain.noCR' , balanced_braces ) * L ( P "}" ) end +DetectedCommands = + Ct ( Cc "Open" + * C ( + piton.ListCommands + * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1 + * P "{" + ) + * Cc "}" + ) + * ( C ( balanced_braces ) / (function (s) return MainLoopSQL:match(s) end ) ) + * P "}" * Ct ( Cc "Close" ) local EOL = P "\r" * @@ -1253,6 +1300,7 @@ local MainSQL = + Escape + EscapeMath + CommentLaTeX + Beamer + + DetectedCommands + Comment + LongComment + Delim + Operator @@ -1277,6 +1325,163 @@ languageSQL = * Lc '\\__piton_end_line:' ) languages['sql'] = languageSQL +local CommentMath = + P "$" * K ( 'Comment.Math' , ( 1 - S "$\r" ) ^ 1 ) * P "$" + +local Comment = + WithStyle ( 'Comment' , + Q ( P "#" ) + * ( CommentMath + Q ( ( 1 - S "$\r" ) ^ 1 ) ) ^ 0 ) + * ( EOL + -1 ) + +local String = + WithStyle ( 'String.Short' , + Q "\"" + * ( VisualSpace + + Q ( ( P "\\\"" + 1 - S " \"" ) ^ 1 ) + ) ^ 0 + * Q "\"" + ) + +local balanced_braces = + P { "E" , + E = + ( + P "{" * V "E" * P "}" + + + String + + + ( 1 - S "{}" ) + ) ^ 0 + } + +if piton_beamer +then + Beamer = + L ( P "\\pause" * ( P "[" * ( 1 - P "]" ) ^ 0 * P "]" ) ^ -1 ) + + + Ct ( Cc "Open" + * C ( + ( + P "\\uncover" + P "\\only" + P "\\alert" + P "\\visible" + + P "\\invisible" + P "\\action" + ) + * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1 + * P "{" + ) + * Cc "}" + ) + * ( C ( balanced_braces ) / (function (s) return MainLoopMinimal:match(s) end ) ) + * P "}" * Ct ( Cc "Close" ) + + OneBeamerEnvironment ( "uncoverenv" , MainLoopMinimal ) + + OneBeamerEnvironment ( "onlyenv" , MainLoopMinimal ) + + OneBeamerEnvironment ( "visibleenv" , MainLoopMinimal ) + + OneBeamerEnvironment ( "invisibleenv" , MainLoopMinimal ) + + OneBeamerEnvironment ( "alertenv" , MainLoopMinimal ) + + OneBeamerEnvironment ( "actionenv" , MainLoopMinimal ) + + + L ( + ( P "\\alt" ) + * P "<" * (1 - P ">") ^ 0 * P ">" + * P "{" + ) + * K ( 'ParseAgain.noCR' , balanced_braces ) + * L ( P "}{" ) + * K ( 'ParseAgain.noCR' , balanced_braces ) + * L ( P "}" ) + + + L ( + ( P "\\temporal" ) + * P "<" * (1 - P ">") ^ 0 * P ">" + * P "{" + ) + * K ( 'ParseAgain.noCR' , balanced_braces ) + * L ( P "}{" ) + * K ( 'ParseAgain.noCR' , balanced_braces ) + * L ( P "}{" ) + * K ( 'ParseAgain.noCR' , balanced_braces ) + * L ( P "}" ) +end + +DetectedCommands = + Ct ( Cc "Open" + * C ( + piton.ListCommands + * ( P "<" * (1 - P ">") ^ 0 * P ">" ) ^ -1 + * P "{" + ) + * Cc "}" + ) + * ( C ( balanced_braces ) / (function (s) return MainLoopMinimal:match(s) end ) ) + * P "}" * Ct ( Cc "Close" ) + +local EOL = + P "\r" + * + ( + ( space^0 * -1 ) + + + Ct ( + Cc "EOL" + * + Ct ( + Lc "\\__piton_end_line:" + * BeamerEndEnvironments + * BeamerBeginEnvironments + * Lc "\\__piton_newline: \\__piton_begin_line:" + ) + ) + ) + * + SpaceIndentation ^ 0 + +local CommentMath = + P "$" * K ( 'Comment.Math' , ( 1 - S "$\r" ) ^ 1 ) * P "$" -- $ + +local CommentLaTeX = + P(piton.comment_latex) + * Lc "{\\PitonStyle{Comment.LaTeX}{\\ignorespaces" + * L ( ( 1 - P "\r" ) ^ 0 ) + * Lc "}}" + * ( EOL + -1 ) + +local identifier = letter * alphanum ^ 0 + +local Identifier = K ( 'Identifier' , identifier ) + +local MainMinimal = + EOL + + Space + + Tab + + Escape + EscapeMath + + CommentLaTeX + + Beamer + + DetectedCommands + + Comment + + Delim + + String + + Punct + + Identifier + + Number + + Word + +MainLoopMinimal = + ( ( space^1 * -1 ) + + MainMinimal + ) ^ 0 + +languageMinimal = + Ct ( + ( ( space - P "\r" ) ^ 0 * P "\r" ) ^ -1 + * BeamerBeginEnvironments + * Lc '\\__piton_begin_line:' + * SpaceIndentation ^ 0 + * MainLoopMinimal + * -1 + * Lc '\\__piton_end_line:' + ) +languages['minimal'] = languageMinimal + function piton.Parse(language,code) local t = languages[language] : match ( code ) if t == nil diff --git a/Master/texmf-dist/tex/lualatex/piton/piton.sty b/Master/texmf-dist/tex/lualatex/piton/piton.sty index 6f450b6405b..06ca2a403da 100644 --- a/Master/texmf-dist/tex/lualatex/piton/piton.sty +++ b/Master/texmf-dist/tex/lualatex/piton/piton.sty @@ -19,8 +19,8 @@ %% LaTeX version 2005/12/01 or later. %% ------------------------------------------- %% -\def\PitonFileVersion{2.3} -\def\PitonFileDate{2024/01/06} +\def\PitonFileVersion{2.4} +\def\PitonFileDate{2024/01/15} \NeedsTeXFormat{LaTeX2e} @@ -37,6 +37,14 @@ \cs_new_protected:Npn \__piton_fatal:n { \msg_fatal:nn { piton } } \cs_new_protected:Npn \__piton_fatal:nn { \msg_fatal:nnn { piton } } \cs_new_protected:Npn \__piton_msg_new:nn { \msg_new:nnn { piton } } +\cs_new_protected:Npn \__piton_msg_new:nnn { \msg_new:nnnn { piton } } +\cs_new_protected:Npn \__piton_gredirect_none:n #1 + { + \group_begin: + \globaldefs = 1 + \msg_redirect_name:nnn { piton } { #1 } { none } + \group_end: + } \__piton_msg_new:nn { LuaLaTeX~mandatory } { LuaLaTeX~is~mandatory.\\ @@ -47,10 +55,16 @@ } \sys_if_engine_luatex:F { \msg_critical:nn { piton } { LuaLaTeX~mandatory } } \RequirePackage { luatexbase } -\__piton_msg_new:nn { piton.lua~not~found } +\__piton_msg_new:nnn { piton.lua~not~found } { The~file~'piton.lua'~can't~be~found.\\ - The~package~'piton'~won't~be~loaded. + The~package~'piton'~won't~be~loaded.\\ + If~you~want~to~know~how~to~retrieve~the~file~'piton.lua',~type~H~<return>. + } + { + On~the~site~CTAN,~go~to~the~page~of~'piton':~https://ctan.org/pkg/piton.~ + The~file~'README.md'~explains~how~to~retrieve~the~files~'piton.sty'~and~ + 'piton.lua'. } \file_if_exist:nF { piton.lua } { \msg_critical:nn { piton } { piton.lua~not~found } } @@ -143,13 +157,16 @@ \bool_gset_true:N \g__piton_footnote_bool } } -\lua_now:n { piton = piton~or { } } -\str_new:N \l__piton_language_str -\str_set:Nn \l__piton_language_str { python } +\lua_now:n + { + piton = piton~or { } + piton.ListCommands = lpeg.P ( false ) + } +\str_new:N \l_piton_language_str +\str_set:Nn \l_piton_language_str { python } \str_new:N \l__piton_path_str \bool_new:N \l__piton_in_PitonOptions_bool \bool_new:N \l__piton_in_PitonInputFile_bool -\bool_new:N \g__piton_in_document_bool \int_new:N \l__piton_nb_lines_int \int_new:N \l__piton_nb_non_empty_lines_int \int_new:N \g__piton_line_int @@ -467,6 +484,9 @@ } \keys_define:nn { PitonOptions } { + detected-commands .code:n = \__piton_detected_commands:n { #1 } , + detected-commands .value_required:n = true , + detected-commands .usage:n = preamble , begin-escape .code:n = \lua_now:e { piton.begin_escape = "\lua_escape:n{#1}" } , begin-escape .value_required:n = true , @@ -495,7 +515,7 @@ math-comments .default:n = true , math-comments .usage:n = preamble , language .code:n = - \str_set:Nx \l__piton_language_str { \str_lowercase:n { #1 } } , + \str_set:Nx \l_piton_language_str { \str_lowercase:n { #1 } } , language .value_required:n = true , path .str_set:N = \l__piton_path_str , path .value_required:n = true , @@ -626,8 +646,6 @@ } \NewDocumentCommand \__piton_fake_PitonOptions { } { \keys_set:nn { PitonOptions } } -\hook_gput_code:nnn { begindocument } { . } - { \bool_gset_true:N \g__piton_in_document_bool } \int_new:N \g__piton_visual_line_int \cs_new_protected:Npn \__piton_print_number: { @@ -681,7 +699,7 @@ \tl_set:Nx \l_tmpa_tl { \lua_now:e - { piton.ParseBis('\l__piton_language_str',token.scan_string()) } + { piton.ParseBis('\l_piton_language_str',token.scan_string()) } { #1 } } \bool_if:NTF \l__piton_show_spaces_bool @@ -703,7 +721,7 @@ \tl_set:Nx \l_tmpa_tl { \lua_now:e - { piton.Parse('\l__piton_language_str',token.scan_string()) } + { piton.Parse('\l_piton_language_str',token.scan_string()) } { #1 } } \bool_if:NT \l__piton_show_spaces_bool @@ -724,7 +742,7 @@ \tl_set:Nx \l_tmpa_tl { \lua_now:e - { piton.ParseTer('\l__piton_language_str',token.scan_string()) } + { piton.ParseTer('\l_piton_language_str',token.scan_string()) } { #1 } } } @@ -732,7 +750,7 @@ \tl_set:Nx \l_tmpa_tl { \lua_now:e - { piton.Parse('\l__piton_language_str',token.scan_string()) } + { piton.Parse('\l_piton_language_str',token.scan_string()) } { #1 } } } @@ -755,7 +773,7 @@ \tl_set:Nx \l_tmpa_tl { \lua_now:e - { piton.ParseTer('\l__piton_language_str',token.scan_string()) } + { piton.ParseTer('\l_piton_language_str',token.scan_string()) } { #1 } } } @@ -763,7 +781,7 @@ \tl_set:Nx \l_tmpa_tl { \lua_now:e - { piton.Parse('\l__piton_language_str',token.scan_string()) } + { piton.Parse('\l_piton_language_str',token.scan_string()) } { #1 } } } @@ -871,7 +889,7 @@ { piton.GobbleParse ( - '\l__piton_language_str' , + '\l_piton_language_str' , \int_use:N \l__piton_gobble_int , token.scan_argument() ) @@ -923,10 +941,9 @@ { \str_set:Nn \l__piton_file_name_str { #3 } } { \str_set_eq:NN \l__piton_file_name_str \l__piton_path_str - \str_put_right:Nn \l__piton_file_name_str { / } - \str_put_right:Nn \l__piton_file_name_str { #3 } + \str_put_right:Nn \l__piton_file_name_str { / #3 } } - \exp_args:NV \file_if_exist:nTF \l__piton_file_name_str + \file_if_exist:nTF { \l__piton_file_name_str } { \__piton_input_file:nn { #1 } { #2 } } { \msg_error:nnn { piton } { Unknown~file } { #3 } } \group_end: @@ -993,7 +1010,7 @@ \lua_now:e { piton.ParseFile( - '\l__piton_language_str' , + '\l_piton_language_str' , '\l__piton_file_name_str' , \int_use:N \l__piton_first_line_int , \int_use:N \l__piton_last_line_int ) @@ -1020,14 +1037,14 @@ } \NewDocumentCommand { \PitonStyle } { m } { - \cs_if_exist_use:cF { pitonStyle _ \l__piton_language_str _ #1 } + \cs_if_exist_use:cF { pitonStyle _ \l_piton_language_str _ #1 } { \use:c { pitonStyle _ #1 } } } \NewDocumentCommand { \SetPitonStyle } { O { } m } { \str_set:Nx \l__piton_SetPitonStyle_option_str { \str_lowercase:n { #1 } } \str_if_eq:onT \l__piton_SetPitonStyle_option_str { current-language } - { \str_set_eq:NN \l__piton_SetPitonStyle_option_str \l__piton_language_str } + { \str_set_eq:NN \l__piton_SetPitonStyle_option_str \l_piton_language_str } \keys_set:nn { piton / Styles } { #2 } \str_clear:N \l__piton_SetPitonStyle_option_str } @@ -1139,8 +1156,28 @@ ParseAgain = \__piton_piton:n , } \bool_if:NT \g__piton_math_comments_bool { \SetPitonStyle { Comment.Math } } +\NewDocumentCommand { \SetPitonIdentifier } { o m m } + { + \clist_set:Nn \l_tmpa_clist { #2 } + \IfNoValueTF { #1 } + { + \clist_map_inline:Nn \l_tmpa_clist + { \cs_set:cpn { pitonIdentifier _ ##1 } { #3 } } + } + { + \str_set:Nx \l_tmpa_str { \str_lowercase:n { #1 } } + \str_if_eq:onT \l_tmpa_str { current-language } + { \str_set_eq:NN \l_tmpa_str \l_piton_language_str } + \clist_map_inline:Nn \l_tmpa_clist + { \cs_set:cpn { pitonIdentifier _ \l_tmpa_str _ ##1 } { #3 } } + } + } \cs_new_protected:Npn \__piton_identifier:n #1 - { \cs_if_exist_use:c { PitonIdentifier _ \l__piton_language_str _ #1 } { #1 } } + { + \cs_if_exist_use:cF { pitonIdentifier _ \l_piton_language_str _ #1 } + { \cs_if_exist_use:c { pitonIdentifier_ #1 } } + { #1 } + } \keys_define:nn { PitonOptions } { identifiers .code:n = \__piton_set_identifiers:n { #1 } } \keys_define:nn { Piton / identifiers } @@ -1150,26 +1187,28 @@ } \cs_new_protected:Npn \__piton_set_identifiers:n #1 { + \__piton_error:n { key~identifiers~deprecated } + \__piton_gredirect_none:n { key~identifiers~deprecated } \clist_clear_new:N \l__piton_identifiers_names_tl \tl_clear_new:N \l__piton_style_tl \keys_set:nn { Piton / identifiers } { #1 } \clist_map_inline:Nn \l__piton_identifiers_names_tl { \tl_set_eq:cN - { PitonIdentifier _ \l__piton_language_str _ ##1 } + { PitonIdentifier _ \l_piton_language_str _ ##1 } \l__piton_style_tl } } \cs_new_protected:cpn { pitonStyle _ Name.Function.Internal } #1 { { \PitonStyle { Name.Function } { #1 } } - \cs_gset_protected:cpn { PitonIdentifier _ \l__piton_language_str _ #1 } + \cs_gset_protected:cpn { PitonIdentifier _ \l_piton_language_str _ #1 } { \PitonStyle { UserFunction } } - \seq_if_exist:cF { g__piton_functions _ \l__piton_language_str _ seq } - { \seq_new:c { g__piton_functions _ \l__piton_language_str _ seq } } - \seq_gput_right:cn { g__piton_functions _ \l__piton_language_str _ seq } { #1 } - \seq_if_in:NVF \g__piton_languages_seq \l__piton_language_str - { \seq_gput_left:NV \g__piton_languages_seq \l__piton_language_str } + \seq_if_exist:cF { g__piton_functions _ \l_piton_language_str _ seq } + { \seq_new:c { g__piton_functions _ \l_piton_language_str _ seq } } + \seq_gput_right:cn { g__piton_functions _ \l_piton_language_str _ seq } { #1 } + \seq_if_in:NVF \g__piton_languages_seq \l_piton_language_str + { \seq_gput_left:NV \g__piton_languages_seq \l_piton_language_str } } \NewDocumentCommand \PitonClearUserFunctions { ! o } { @@ -1215,6 +1254,13 @@ \token_to_str:N \piton\ but~there~is~no~environment~ {piton}.~This~error~is~fatal. } +\__piton_msg_new:nn { key~identifiers~deprecated } + { + The~key~'identifiers'~in~the~command~\token_to_str:N PitonOptions\ + is~now~deprecated:~you~should~use~the~command~ + \token_to_str:N \SetPitonIdentifier\ instead.\\ + However,~you~can~go~on. + } \__piton_msg_new:nn { Unknown~key~for~SetPitonStyle } { The~style~'\l_keys_key_str'~is~unknown.\\ @@ -1255,7 +1301,7 @@ } \__piton_msg_new:nn { syntax~error } { - Your~code~\l__piton_language_str\ is~not~syntactically~correct.\\ + Your~code~\l_piton_language_str\ is~not~syntactically~correct.\\ It~won't~be~printed~in~the~PDF~file. } \NewDocumentCommand \PitonSyntaxError { } @@ -1301,11 +1347,11 @@ break-lines-in-Piton,~ continuation-symbol,~ continuation-symbol-on-indentation,~ + detected-commands,~ end-of-broken-line,~ end-range,~ env-gobble,~ gobble,~ - identifiers,~ indent-broken-lines,~ language,~ left-margin,~ @@ -1343,10 +1389,25 @@ in~Beamer.\\ If~you~go~on,~that~argument~will~be~ignored. } -\__piton_msg_new:nn { Python~error } - { A~Python~error~has~been~detected. } \hook_gput_code:nnn { begindocument } { . } { \lua_now:e { require("piton.lua") } } +\cs_new_protected:Npn \__piton_detected_commands:n #1 + { \lua_now:n { piton.addListCommands('#1') } } +\ExplSyntaxOff +\directlua + { + lpeg.locale(lpeg) + local P , alpha , C , Cf, space = lpeg.P , lpeg.alpha , lpeg.C , lpeg.Cf , lpeg.space + local One_P = space ^ 0 + * C ( alpha ^ 1 ) / ( function (s) return P ( string.char(92) .. s ) end ) + * space ^ 0 + function piton.addListCommands( key_value ) + piton.ListCommands = + piton.ListCommands + + Cf ( One_P * ( P "," * One_P ) ^ 0 , + ( function (s,t) return s + t end ) ) : match ( key_value ) + end + } \endinput %% |