diff options
Diffstat (limited to 'src/libs/3rdparty/syntax-highlighting/data/generators/generate-html.pl')
-rw-r--r-- | src/libs/3rdparty/syntax-highlighting/data/generators/generate-html.pl | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/src/libs/3rdparty/syntax-highlighting/data/generators/generate-html.pl b/src/libs/3rdparty/syntax-highlighting/data/generators/generate-html.pl new file mode 100644 index 0000000000..a5b9bc9d05 --- /dev/null +++ b/src/libs/3rdparty/syntax-highlighting/data/generators/generate-html.pl @@ -0,0 +1,143 @@ +#!/usr/bin/perl + +# This perl script read stdin and write on stdout. It shall be an XML language file. +# +# * If the name of the language is 'HTML', then it creates the language 'PHP (HTML)' +# which shall be used for PHP hl. +# +# * If the name of the language is something else (say '*'), it creates the language '*/PHP'. +# This new language is the same as the old one, but is able to detect PHP everywhere. +# +# This script will correctly set extensions & mimetype, and will replace +# <IncludeRules context="##*"> by <IncludeRules context="##*/PHP"> +# +# Generated languages need a language named 'PHP/PHP', which shall take care of PHP hl itself +# and which will be called every time something like <?php is encountred. +# +# This script also supports Twig and does the same as for PHP. +# +# SPDX-FileCopyrightText: Jan Villat <jan.villat@net2000.ch> +# License: LGPL + +my $file = ""; + +open(my $input, '<:encoding(UTF-8)', $ARGV[0]) + or die "Could not open file '$ARGV[0]': $!"; + +open(my $output, '>:encoding(UTF-8)', $ARGV[1]) + or die "Could not open file '$ARGV[1]': $!"; + +my $language = $ARGV[1]; +if ($language =~ /-php\.xml$/) +{ + $language = "PHP"; +} +else +{ + $language = "Twig"; +} + +while (<$input>) +{ + $file .= $_; +} + +$warning = "\n\n<!-- ***** THIS FILE WAS GENERATED BY A SCRIPT - DO NOT EDIT ***** -->\n"; + +$file =~ s/(?=<language)/$warning\n\n\n/; + +$file =~ /<language.*?name="([^"]+)"/; +my $syntaxName = $1; + +if ($syntaxName eq "HTML") +{ + $root = 1; +} + +if ($language eq "Twig") +{ + $file =~ s/<language([^>]+)priority="[^"]*"/<language$1/s; +} + +if ($root == 1) +{ + $file =~ s/<language([^>]+)name="[^"]*"/<language$1name="$language (HTML)"/s; + $file =~ s/<language([^>]+)section="[^"]*"/<language$1section="Scripts"/s; + if ($language eq "PHP") + { + $file =~ s/<language([^>]+)extensions="[^"]*"/<language$1extensions="*.php;*.php3;*.wml;*.phtml;*.phtm;*.inc;*.ctp"/s; + $file =~ s/<language([^>]+)mimetype="[^"]*"/<language$1mimetype="text\/x-php4-src;text\/x-php3-src;text\/vnd.wap.wml;application\/x-php"/s; + $file =~ s/<language([^>]+)*/<language$1 indenter="cstyle"/s; + } + # Twig + else + { + $file =~ s/<language([^>]+)extensions="[^"]*"/<language$1extensions="*.twig;*.html.twig;*.htm.twig"/s; + $file =~ s/<language([^>]+)mimetype="[^"]*"/<language$1mimetype="text\/x-twig"/s; + } +} +else +{ + $file =~ s/<language([^>]+)hidden="[^"]*"/<language$1/s; + $file =~ s/<language([^>]+)section="[^"]*"/<language$1section="Other"/s; + my $extra = " hidden=\"true\""; + my $mimetype = ""; + my $extensions = ""; + if ($language eq "Twig") + { + $mimetype = "text/x-twig"; + if ($syntaxName eq "JavaScript") + { + $extra = " priority=\"1\""; + $extensions = "*.js.twig;*.mjs.twig;*.cjs.twig"; + } + elsif ($syntaxName eq "TypeScript") + { + $extra = " priority=\"1\""; + $extensions = "*.ts.twig;*.mts.twig;*.cts.twig"; + } + } + $file =~ s/<language([^>]+)mimetype="[^"]*"/<language$1mimetype="$mimetype"/s; + $file =~ s/<language([^>]+)name="([^"]*)"/<language$1name="$2\/$language"$extra/s; + $file =~ s/<language([^>]+)extensions="[^"]*"/<language$1extensions="$extensions"/s; +} + +# replace list with a include +$file =~ s/<list name="([^"]+)">.*?<\/list>/<list name="$1"><include>$1##$syntaxName<\/include><\/list>/gs; + +$file =~ s/<language([^>]+)kateversion="[^"]*"/<language$1kateversion="5.79"/s; +$file =~ s/ fallthrough="(true|1)"//gs; + +if ($language eq "Twig") +{ + # remove Mustache syntax + if ($root == 1) + { + $file =~ s/<context name="MustacheJS.*?<\/context>//gs; + $file =~ s/<StringDetect attribute="Value" context="#pop#pop!MustacheJS" String="[^"]+[^\/]+\/>//gs; + } +} +elsif ($root == 1 || $ARGV[0] =~ /mustache.xml$/) +{ + $file =~ s/<(?:RegExpr (attribute="Processing Instruction" context="PI"|context="PI" attribute="Processing Instruction")|itemData name="Processing Instruction")[^\/]+\/>|<context name="PI".*?<\/context>//gs; +} + +my $find_language = "##$language/$language"; +my $language_suffix = "/$language"; +if ($language eq "PHP") +{ + $find_language = "FindPHP"; +} + +$file =~ s/<IncludeRules\s([^>]*)context="([^"#]*)##(?!Alerts|Comments|Doxygen|Modelines)([^"]+)"/<IncludeRules $1context="$2##$3$language_suffix"/g; +$file =~ s/(<context\s[^>]*[^>\/]>)/$1\n<IncludeRules context="$find_language" \/>/g; +$file =~ s/(<context\s[^>]*[^>\/])\s*\/>/$1>\n<IncludeRules context="$find_language" \/>\n<\/context>/g; + +if ($language eq "PHP") +{ + $findphp = "<context name=\"FindPHP\" attribute=\"Normal Text\" lineEndContext=\"#stay\">\n<Detect2Chars context=\"##PHP/PHP\" char=\"<\" char1=\"?\" lookAhead=\"true\" />\n</context>\n"; + $file =~ s/(?=<\/contexts\s*>)/$findphp/; +} + +print $output $file; +print $output $warning; |