diff options
Diffstat (limited to 'kate/data/perl.xml')
-rw-r--r-- | kate/data/perl.xml | 827 |
1 files changed, 827 insertions, 0 deletions
diff --git a/kate/data/perl.xml b/kate/data/perl.xml new file mode 100644 index 000000000..15212c376 --- /dev/null +++ b/kate/data/perl.xml @@ -0,0 +1,827 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE language SYSTEM "language.dtd"> +<!-- + This file is part of the KDE project + Copyright (C) 2001, 2002, 2003, 2004 Anders Lund <anders@alweb.dk> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + + *** NOTICE *** + This file is maintained by Anders Lund <anders@alweb.dk> + Please do not commit changes without checking with me. + + *** TODO *** + + Work on the comment support in the REPLACEMENT part of s/// - we may support + the comment, if the line remainder does not contain the delimiter char. + + Try to support ?PATTERN? (at least in one line, like if "\?(?=.*\?)" matches). + + parse code behind '<<HEREDELIMITER' as code, or at least ignore it, to eol. + Requires the ability to pass the delimiter through a context level. + + find a here delimiter like '*END*' (Shell.pm). Requires that when a regex is + inserting a dynamic string, it escapes [*(){}$[] + + support for more regex extensions, such as (?>), (?{}), (?(cond)yes|no) + + Enhance tr/// and y/// support. +--> +<language name="Perl" version="1.20" kateversion="2.4" section="Scripts" extensions="*.pl;*.pm" mimetype="application/x-perl;text/x-perl" author="Anders Lund (anders@alweb.dk)" license="LGPL"> + <highlighting> + <list name="keywords"> + <item> if </item> + <item> unless </item> + <item> else </item> + <item> elsif </item> + <item> while </item> + <item> until </item> + <item> for </item> + <item> each </item> + <item> foreach </item> + <item> next </item> + <item> last </item> + <item> break </item> + <item> continue </item> + <item> return </item> + <item> use </item> + <item> no </item> + <item> require </item> + <item> my </item> + <item> our </item> + <item> local </item> + <item> BEGIN </item> + <item> END </item> + <item>require</item> + <item> package </item> + <item> sub </item> + <item> do </item> + <item> __END__ </item> + <item> __DATA__ </item> + <item> __FILE__ </item> + <item> __LINE__ </item> + <item> __PACKAGE__ </item> + </list> + <list name="operators"> + <item> = </item> + <item> != </item> + <item> ~= </item> + <item> += </item> + <item> -= </item> + <item> *= </item> + <item> /= </item> + <item> **= </item> + <item> |= </item> + <item> ||= </item> + <item> &= </item> + <item> &&= </item> + <item> ?= </item> + <item> + </item> + <item> - </item> + <item> * </item> + <!-- <item> / </item>//--> + <item> % </item> + <item> || </item> + <item> && </item> + <item> | </item> + <item> & </item> + <item> < </item> + <item> << </item> + <item> > </item> + <item> >> </item> + <item> ^ </item> + <item> -> </item> + <item> => </item> + <item> . </item> + <item> , </item> + <item> ; </item> + <item> :: </item> + <item> \ </item> + <item> and </item> + <item> or </item> + <item> not </item> + <item> eq </item> + <item> ne </item> + </list> + <list name="functions"> + <item>abs</item> + <item>accept</item> + <item>alarm</item> + <item>atan2</item> + <item>bind</item> + <item>binmode</item> + <item>bless</item> + <item>caller</item> + <item>chdir</item> + <item>chmod</item> + <item>chomp</item> + <item>chop</item> + <item>chown</item> + <item>chr</item> + <item>chroot</item> + <item>close</item> + <item>closedir</item> + <item>connect</item> + <item>cos</item> + <item>crypt</item> + <item>dbmclose</item> + <item>dbmopen</item> + <item>defined</item> + <item>delete</item> + <item>die</item> + <item>dump</item> + <item>endgrent</item> + <item>endhostent</item> + <item>endnetent</item> + <item>endprotoent</item> + <item>endpwent</item> + <item>endservent</item> + <item>eof</item> + <item>eval</item> + <item>exec</item> + <item>exists</item> + <item>exit</item> + <item>exp</item> + <item>fcntl</item> + <item>fileno</item> + <item>flock</item> + <item>fork</item> + <item>format</item> + <item>formline</item> + <item>getc</item> + <item>getgrent</item> + <item>getgrgid</item> + <item>getgrnam</item> + <item>gethostbyaddr</item> + <item>gethostbyname</item> + <item>gethostent</item> + <item>getlogin</item> + <item>getnetbyaddr</item> + <item>getnetbyname</item> + <item>getnetent</item> + <item>getpeername</item> + <item>getpgrp</item> + <item>getppid</item> + <item>getpriority</item> + <item>getprotobyname</item> + <item>getprotobynumber</item> + <item>getprotoent</item> + <item>getpwent</item> + <item>getpwnam</item> + <item>getpwuid</item> + <item>getservbyname</item> + <item>getservbyport</item> + <item>getservent</item> + <item>getsockname</item> + <item>getsockopt</item> + <item>glob</item> + <item>gmtime</item> + <item>goto</item> + <item>grep</item> + <item>hex</item> + <item>import</item> + <item>index</item> + <item>int</item> + <item>ioctl</item> + <item>join</item> + <item>keys</item> + <item>kill</item> + <item>last</item> + <item>lc</item> + <item>lcfirst</item> + <item>length</item> + <item>link</item> + <item>listen</item> + <item>localtime</item> + <item>lock</item> + <item>log</item> + <item>lstat</item> + <item>map</item> + <item>mkdir</item> + <item>msgctl</item> + <item>msgget</item> + <item>msgrcv</item> + <item>msgsnd</item> + <item>oct</item> + <item>open</item> + <item>opendir</item> + <item>ord</item> + <item>pack</item> + <item>package</item> + <item>pipe</item> + <item>pop</item> + <item>pos</item> + <item>print</item> + <item>printf</item> + <item>prototype</item> + <item>push</item> + <item>quotemeta</item> + <item>rand</item> + <item>read</item> + <item>readdir</item> + <item>readline</item> + <item>readlink</item> + <item>recv</item> + <item>redo</item> + <item>ref</item> + <item>rename</item> + <item>reset</item> + <item>return</item> + <item>reverse</item> + <item>rewinddir</item> + <item>rindex</item> + <item>rmdir</item> + <item>scalar</item> + <item>seek</item> + <item>seekdir</item> + <item>select</item> + <item>semctl</item> + <item>semget</item> + <item>semop</item> + <item>send</item> + <item>setgrent</item> + <item>sethostent</item> + <item>setnetent</item> + <item>setpgrp</item> + <item>setpriority</item> + <item>setprotoent</item> + <item>setpwent</item> + <item>setservent</item> + <item>setsockopt</item> + <item>shift</item> + <item>shmctl</item> + <item>shmget</item> + <item>shmread</item> + <item>shmwrite</item> + <item>shutdown</item> + <item>sin</item> + <item>sleep</item> + <item>socket</item> + <item>socketpair</item> + <item>sort</item> + <item>splice</item> + <item>split</item> + <item>sprintf</item> + <item>sqrt</item> + <item>srand</item> + <item>stat</item> + <item>study</item> + <item>sub</item> + <item>substr</item> + <item>symlink</item> + <item>syscall</item> + <item>sysread</item> + <item>sysseek</item> + <item>system</item> + <item>syswrite</item> + <item>tell</item> + <item>telldir</item> + <item>tie</item> + <item>time</item> + <item>times</item> + <item>truncate</item> + <item>uc</item> + <item>ucfirst</item> + <item>umask</item> + <item>undef</item> + <item>unlink</item> + <item>unpack</item> + <item>unshift</item> + <item>untie</item> + <item>utime</item> + <item>values</item> + <item>vec</item> + <item>wait</item> + <item>waitpid</item> + <item>wantarray</item> + <item>warn</item> + <item>write</item> + </list> + <list name="pragmas"> + <item>strict</item> + <item>english</item> + <item>warnings</item> + <item>vars</item> + <item>subs</item> + <item>utf8</item> + <item>sigtrap</item> + <item>locale</item> + <item>open</item> + <item>less</item> + <item>integer</item> + <item>filetest</item> + <item>constant</item> + <item>bytes</item> + <item>diagnostics</item> + </list> + <contexts> + <context name="normal" attribute="Normal Text" lineEndContext="#stay"> + <RegExpr attribute="Keyword" context="#stay" String="^#!\/.*" /> + <StringDetect attribute="Keyword" context="data_handle" String="__DATA__" firstNonSpace="true" /> + <StringDetect attribute="Keyword" context="#stay" String="__END__" firstNonSpace="true"/> + <RegExpr attribute="Keyword" context="sub_name_def" String="\bsub\s+" /> + <keyword attribute="Keyword" context="#stay" String="keywords" /> + <keyword attribute="Operator" context="#stay" String="operators" /> + <keyword attribute="Function" context="#stay" String="functions" /> + <keyword attribute="Pragma" context="#stay" String="pragmas" /> + <RegExpr attribute="Pod" context="pod" String="\=(?:head[1-6]|over|back|item|for|begin|end|pod)(\s|$)" column="0" beginRegion="POD"/> + <DetectSpaces /> + <DetectChar attribute="Comment" context="comment" char="#" /> + + <HlCOct attribute="Octal" context="slash_safe_escape" /> + <HlCHex attribute="Hex" context="slash_safe_escape" /> + <Float attribute="Float" context="slash_safe_escape" /> + <Int attribute="Decimal" context="slash_safe_escape" /> + + <RegExpr attribute="Normal Text" context="#stay" String="\\(["'])[^\1]" /> + <Detect2Chars attribute="Normal Text" context="#stay" char="&" char1="'" /><!-- ??? --> + <DetectChar attribute="Operator" context="ip_string" char=""" beginRegion="String" /> + <DetectChar attribute="Operator" context="string" char="'" beginRegion="String"/> + <DetectChar attribute="Operator" context="Backticked" char="`" /> + + <RegExpr attribute="Normal Text" context="find_variable" String="(?:[$@]\S|%[\w{]|\*[^\d\*{\$@%=(])" lookAhead="true" /> + + <RegExpr attribute="Keyword" context="#stay" String="<[A-Z0-9_]+>" /> + + <RegExpr attribute="Operator" context="find_here_document" String="\s*<<(?=\w+|\s*["'])" beginRegion="HereDocument" /> + + <RegExpr attribute="Normal Text" context="#stay" String="\s*\}\s*/" endRegion="Block"/> + <RegExpr attribute="Normal Text" context="#stay" String="\s*[)]\s*/" /> + <RegExpr attribute="Function" context="sub_name_def" String="\w+::" /> + <RegExpr attribute="Normal Text" context="#stay" String="\w+[=]" /> + + <RegExpr attribute="Operator" context="find_quoted" String="\bq(?=[qwx]?\s*[^\w\s])" /> + <RegExpr attribute="Operator" context="find_subst" String="\bs(?=\s*[^\w\s])" /> + <RegExpr attribute="Operator" context="tr" String="\b(?:tr|y)\s*(?=[^\w\s\]})])" /> + + <RegExpr attribute="Operator" context="find_pattern" String="\b(?:m|qr)(?=\s*[^\w\s\]})])" /> + + <RegExpr attribute="Normal Text" context="#stay" String="[\w_]+\s*/" /> + <RegExpr attribute="Normal Text" context="#stay" String="[<>"':]/" /> + <DetectChar attribute="Operator" context="pattern_slash" char="/" beginRegion="Pattern" /> + <RegExpr attribute="Operator" context="#stay" String="-[rwxoRWXOeszfdlpSbctugkTBMAC]" /> + + <DetectChar attribute="Normal Text" context="#stay" char="{" beginRegion="Block" /> + <DetectChar attribute="Normal Text" context="#stay" char="}" endRegion="Block" /> + </context> + + <!-- ====== quoted construct central ===== --> + <context name="find_quoted" attribute="Normal Text" lineEndContext="#stay" > + <!-- NOTE - qx'not interpolated regex' does not cover newline between "qr" and "'" --> + <RegExpr attribute="Operator" context="string_6" String="x\s*(')" beginRegion="String" /> + <AnyChar attribute="Operator" context="find_qqx" String="qx" /> + <DetectChar attribute="Operator" context="find_qw" char="w" /> + <DetectChar attribute="Operator" context="string_2" char="(" beginRegion="String" /> + <DetectChar attribute="Operator" context="string_3" char="{" beginRegion="String" /> + <DetectChar attribute="Operator" context="string_4" char="[" beginRegion="String" /> + <DetectChar attribute="Operator" context="string_5" char="<" beginRegion="String" /> + <RegExpr attribute="Operator" context="string_6" String="([^a-zA-Z0-9_\s[\]{}()])" beginRegion="String" /> + <RegExpr attribute="Comment" context="#stay" String="\s+#.*" /><!-- q[qwx] # == comment, look for the delim on the next line --> + </context> + <context name="find_qqx" attribute="Normal Text" lineEndContext="#stay" > + <DetectChar attribute="Operator" context="ip_string_2" char="(" beginRegion="String" /> + <DetectChar attribute="Operator" context="ip_string_3" char="{" beginRegion="String" /> + <DetectChar attribute="Operator" context="ip_string_4" char="[" beginRegion="String" /> + <DetectChar attribute="Operator" context="ip_string_5" char="<" beginRegion="String" /> + <RegExpr attribute="Operator" context="ip_string_6" String="([^a-zA-Z0-9_\s[\]{}()])" beginRegion="String" /> + <RegExpr attribute="Comment" context="#stay" String="\s+#.*" /><!-- q[qwx] # == comment, look for the delim on the next line --> + </context> + <context name="find_qw" attribute="Normal Text" lineEndContext="#stay" > + <DetectChar attribute="Operator" context="quote_word_paren" char="(" beginRegion="Wordlist" /> + <DetectChar attribute="Operator" context="quote_word_brace" char="{" beginRegion="Wordlist" /> + <DetectChar attribute="Operator" context="quote_word_bracket" char="[" beginRegion="Wordlist" /> + <RegExpr attribute="Operator" context="quote_word" String="([^a-zA-Z0-9_\s[\]{}()])" beginRegion="Wordlist" /> + <RegExpr attribute="Comment" context="#stay" String="\s+#.*" /><!-- q[qwx] # == comment, look for the delim on the next line --> + </context> + + <!-- ====== Contexts for strings ===== --> + <context name="ipstring_internal" attribute="String (interpolated)" lineEndContext="#stay"> + <DetectIdentifier /> + <RegExpr attribute="String Special Character" context="#stay" String="\\[UuLlEtnaefr]" /> + <RegExpr attribute="String (interpolated)" context="#stay" String="\\." /> + <RegExpr attribute="Normal Text" context="find_variable_unsafe" String="(?:[\$@]\S|%[\w{])" lookAhead="true" /> + </context> + <context name="ip_string" attribute="String (interpolated)" lineEndContext="#stay"> + <DetectChar attribute="Operator" context="#pop" char=""" endRegion="String"/> + <IncludeRules context="ipstring_internal" /> + </context> + <context name="ip_string_2" attribute="String (interpolated)" lineEndContext="#stay"> + <RangeDetect attribute="String (interpolated)" context="#stay" char="(" char1=")" /> + <DetectChar attribute="Operator" context="#pop#pop#pop" char=")" endRegion="String" /> + <IncludeRules context="ipstring_internal" /> + </context> + <context name="ip_string_3" attribute="String (interpolated)" lineEndContext="#stay"> + <RangeDetect attribute="String (interpolated)" context="#stay" char="{" char1="}" /> + <DetectChar attribute="Operator" context="#pop#pop#pop" char="}" endRegion="String" /> + <IncludeRules context="ipstring_internal" /> + </context> + <context name="ip_string_4" attribute="String (interpolated)" lineEndContext="#stay"> + <RangeDetect attribute="String (interpolated)" context="#stay" char="[" char1="]" /> + <DetectChar attribute="Operator" context="#pop#pop#pop" char="]" endRegion="String" /> + <IncludeRules context="ipstring_internal" /> + </context> + <context name="ip_string_5" attribute="String (interpolated)" lineEndContext="#stay"> + <RangeDetect attribute="String (interpolated)" context="#stay" char="<" char1=">" /> + <DetectChar attribute="Operator" context="#pop#pop#pop" char=">" endRegion="String" /> + <IncludeRules context="ipstring_internal" /> + </context> + <context name="ip_string_6" attribute="String (interpolated)" lineEndContext="#stay" dynamic="true"> + <RegExpr attribute="String (interpolated)" context="#stay" String="\%1" dynamic="true" /> + <DetectChar attribute="Operator" context="#pop#pop#pop" char="1" dynamic="true" endRegion="String"/> + <IncludeRules context="ipstring_internal" /> + </context> + + <context name="string" attribute="String" lineEndContext="#stay"> + <DetectIdentifier /> + <Detect2Chars attribute="String Special Character" context="#stay" char="\" char1="'" /> + <Detect2Chars attribute="String Special Character" context="#stay" char="\" char1="\" /> + <DetectChar attribute="Operator" context="#pop" char="'" endRegion="String" /> + </context> + <context name="string_2" attribute="String" lineEndContext="#stay"> + <DetectIdentifier /> + <Detect2Chars attribute="String Special Character" context="#stay" char="\" char1=")" /> + <Detect2Chars attribute="String Special Character" context="#stay" char="\" char1="\" /> + <RangeDetect attribute="String" context="#stay" char="(" char1=")" /> + <DetectChar attribute="Operator" context="#pop#pop" char=")" endRegion="String" /> + </context> + <context name="string_3" attribute="String" lineEndContext="#stay"> + <DetectIdentifier /> + <Detect2Chars attribute="String Special Character" context="#stay" char="\" char1="}" /> + <Detect2Chars attribute="String Special Character" context="#stay" char="\" char1="\" /> + <RangeDetect attribute="String" context="#stay" char="{" char1="}" /> + <DetectChar attribute="Operator" context="#pop#pop" char="}" endRegion="String" /> + </context> + <context name="string_4" attribute="String" lineEndContext="#stay"> + <DetectIdentifier /> + <Detect2Chars attribute="String Special Character" context="#stay" char="\" char1="]" /> + <Detect2Chars attribute="String Special Character" context="#stay" char="\" char1="\" /> + <RangeDetect attribute="String" context="#stay" char="[" char1="]" /> + <DetectChar attribute="Operator" context="#pop#pop" char="]" endRegion="String" /> + </context> + <context name="string_5" attribute="String" lineEndContext="#stay"> + <DetectIdentifier /> + <Detect2Chars attribute="String Special Character" context="#stay" char="\" char1="<" /> + <Detect2Chars attribute="String Special Character" context="#stay" char="\" char1="\" /> + <Detect2Chars attribute="String" context="#stay" char="\" char1=">" /> + <RangeDetect attribute="String" context="#stay" char="<" char1=">" /> + <DetectChar attribute="Operator" context="#pop#pop" char=">" endRegion="String" /> + </context> + <context name="string_6" attribute="String" lineEndContext="#stay" dynamic="true"> + <DetectIdentifier /> + <Detect2Chars attribute="String Special Character" context="#stay" char="\" char1="\" /> + <RegExpr attribute="String Special Character" context="#stay" String="\%1" dynamic="true"/> + <DetectChar attribute="Operator" context="#pop#pop" char="1" dynamic="true" endRegion="String" /> + </context> + + <!-- ====== contexts for s/// ====== --> + <context name="find_subst" attribute="Normal Text" lineEndContext="#stay" > + <RegExpr attribute="Comment" context="#stay" String="\s+#.*" /><!-- s # == comment, look for the delim on the next line --> + <DetectChar attribute="Operator" context="subst_curlybrace_pattern" char="{" beginRegion="Pattern" /> + <DetectChar attribute="Operator" context="subst_paren_pattern" char="(" beginRegion="Pattern" /> + <DetectChar attribute="Operator" context="subst_bracket_pattern" char="[" beginRegion="Pattern" /> + <DetectChar attribute="Operator" context="subst_sq_pattern" char="'" beginRegion="Pattern" /> + <RegExpr attribute="Operator" context="subst_slash_pattern" String="([^\w\s[\]{}()])" beginRegion="Pattern" /> + </context> + + <!-- Fully parse s {} {}. + This means that + - comments are legal between PATTERN and REPLACEMENT + - REPLACEMENT can contain resursive {} blocks --> + <context name="subst_curlybrace_pattern" attribute="Pattern" lineEndContext="#stay"> + <RegExpr attribute="Comment" context="#stay" String="\s+#.*$" /> + <IncludeRules context="regex_pattern_internal_ip" /> + <DetectChar attribute="Operator" context="subst_curlybrace_middle" char="}" endRegion="Pattern" /> + </context> + <context name="subst_curlybrace_middle" attribute="Normal Text" lineEndContext="#stay" > + <RegExpr attribute="Comment" context="#stay" String="#.*$" /> + <DetectChar attribute="Operator" context="subst_curlybrace_replace" char="{" beginRegion="Replacement" /> + </context> + <context name="subst_curlybrace_replace" attribute="String (interpolated)" lineEndContext="#stay"> + <IncludeRules context="ipstring_internal" /> + <DetectChar attribute="Normal Text" context="subst_curlybrace_replace_recursive" char="{" beginRegion="Block" /> + <RegExpr attribute="Operator" context="#pop#pop#pop#pop" String="\}[cegimosx]*" endRegion="Replacement" /> + </context> + <context name="subst_curlybrace_replace_recursive" attribute="String (interpolated)" lineEndContext="#stay" > + <DetectChar attribute="String (interpolated)" context="subst_curlybrace_replace_recursive" char="{" beginRegion="Block" /> + <DetectChar attribute="Normal Text" context="#pop" char="}" endRegion="Block" /> + <IncludeRules context="ipstring_internal" /> + </context> + + <context name="subst_paren_pattern" attribute="Pattern" lineEndContext="#stay"> + <RegExpr attribute="Comment" context="#stay" String="\s+#.*$" /> + <IncludeRules context="regex_pattern_internal_ip" /> + <DetectChar attribute="Operator" context="subst_paren_replace" char="}" endRegion="Pattern" /> + </context> + <context name="subst_paren_replace" attribute="String (interpolated)" lineEndContext="#stay"> + <IncludeRules context="ipstring_internal" /> + <DetectChar attribute="Operator" context="#stay" char="(" beginRegion="Replacement" /> + <RegExpr attribute="Operator" context="#pop#pop#pop" String="\)[cegimosx]*" endRegion="Replacement" /> + </context> + + <context name="subst_bracket_pattern" attribute="Pattern" lineEndContext="#stay"> + <RegExpr attribute="Comment" context="#stay" String="\s+#.*$" /> + <IncludeRules context="regex_pattern_internal_ip" /> + <DetectChar attribute="Operator" context="subst_bracket_replace" char="]" endRegion="Pattern" /> + </context> + <context name="subst_bracket_replace" attribute="String (interpolated)" lineEndContext="#stay"> + <IncludeRules context="ipstring_internal" /> + <DetectChar attribute="Operator" context="#stay" char="[" beginRegion="Replacement" /> + <RegExpr attribute="Operator" context="#pop#pop#pop" String="\][cegimosx]*" endRegion="Replacement" /> + </context> + + <context name="subst_slash_pattern" attribute="Pattern" lineEndContext="#stay" dynamic="true"> + <RegExpr attribute="Pattern Internal Operator" context="#stay" String="\$(?=%1)" dynamic="true" /> + <RegExpr attribute="Operator" context="subst_slash_replace" String="(%1)" dynamic="true" endRegion="Pattern" beginRegion="Replacement" /> + <IncludeRules context="regex_pattern_internal_ip" /> + </context> + <context name="subst_slash_replace" attribute="String (interpolated)" lineEndContext="#stay" dynamic="true"> + <IncludeRules context="ipstring_internal" /> + <RegExpr attribute="Operator" context="#pop#pop#pop" String="%1[cegimosx]*" dynamic="true" endRegion="Replacement" /> + </context> + + <context name="subst_sq_pattern" attribute="Pattern" lineEndContext="#stay"> + <RegExpr attribute="Comment" context="#stay" String="\s+#.*$" /> + <IncludeRules context="regex_pattern_internal" /> + <DetectChar attribute="Operator" context="subst_sq_replace" char="'" endRegion="Pattern" beginRegion="Pattern" /> + </context> + <context name="subst_sq_replace" attribute="String" lineEndContext="#stay"> + <RegExpr attribute="Operator" context="#pop#pop#pop" String="'[cegimosx]*" endRegion="Replacement" /> + </context> + + <context name="tr" attribute="Pattern" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop" > + <RegExpr attribute="Pattern" context="#pop" String="([^)]*\)\s*\(?:[^)]*\)" /> + <RegExpr attribute="Pattern" context="#pop" String="{[^}]*\}\s*\{[^}]*\}" /> + <RegExpr attribute="Pattern" context="#pop" String="\[[^}]*\]\s*\[[^\]]*\]" /> + <RegExpr attribute="Pattern" context="#pop" String="([^a-zA-Z0-9_\s[\]{}()]).*\1.*\1" minimal="true"/> + </context> + + <!-- ====== PATTERNs ====== --> + <context name="find_pattern" attribute="Pattern" lineEndContext="#stay"> + <RegExpr attribute="Comment" context="#stay" String="\s+#.*" /><!-- s # == comment, look for the delim on the next line --> + <DetectChar attribute="Operator" context="pattern_brace" char="{" beginRegion="Pattern" /> + <DetectChar attribute="Operator" context="pattern_paren" char="(" beginRegion="Pattern" /> + <DetectChar attribute="Operator" context="pattern_bracket" char="[" beginRegion="Pattern" /> + <DetectChar attribute="Operator" context="pattern_sq" char="'" beginRegion="Pattern" /> + <RegExpr attribute="Operator" context="pattern" String="([^\w\s])" beginRegion="Pattern" /> + </context> + <context name="pattern_slash" attribute="Pattern" lineEndContext="#stay"> + <RegExpr attribute="Pattern Internal Operator" context="#stay" String="\$(?=/)" /> + <IncludeRules context="regex_pattern_internal_ip" /> + <RegExpr attribute="Operator" context="#pop" String="/[cgimosx]*" endRegion="Pattern" /> + </context> + <context name="pattern" attribute="Pattern" lineEndContext="#stay" dynamic="true"> + <RegExpr attribute="Pattern Internal Operator" context="#stay" String="\$(?=%1)" dynamic="true" /> + <RegExpr attribute="Operator" context="#pop#pop" String="%1[cgimosx]*" dynamic="true" endRegion="Pattern" /> + <IncludeRules context="regex_pattern_internal_ip" /> + <RegExpr attribute="Pattern Internal Operator" context="#stay" String="\$(?=\%1)" dynamic="true" /> + </context> + <context name="pattern_brace" attribute="Pattern" lineEndContext="#stay"> + <RegExpr attribute="Operator" context="#pop#pop" String="\}[cgimosx]*" endRegion="Pattern" /> + <IncludeRules context="regex_pattern_internal_ip" /> + </context> + <context name="pattern_bracket" attribute="Pattern" lineEndContext="#stay"> + <RegExpr attribute="Operator" context="#pop#pop" String="\][cgimosx]*" endRegion="Pattern" /> + <IncludeRules context="regex_pattern_internal_ip" /> + </context> + <context name="pattern_paren" attribute="Pattern" lineEndContext="#stay"> + <RegExpr attribute="Operator" context="#pop#pop" String="\)[cgimosx]*" endRegion="Pattern" /> + <IncludeRules context="regex_pattern_internal_ip" /> + </context> + <context name="pattern_sq" attribute="Pattern" lineEndContext="#stay"> + <RegExpr attribute="Operator" context="#pop#pop" String="'[cgimosx]*" endRegion="Pattern" /> + <IncludeRules context="regex_pattern_internal" /> + </context> + + <!-- rules internal stuff wrt regex patterns --> + <context name="regex_pattern_internal_rules_1" lineEndContext="#stay"> + <RegExpr attribute="Comment" context="#stay" String="#.*$" firstNonSpace="true" /> + <RegExpr attribute="Pattern Character Class" context="#stay" String="\\[anDdSsWw]" /> + <RegExpr attribute="Pattern Internal Operator" context="#stay" String="\\[ABbEGLlNUuQdQZz]" /> + <RegExpr attribute="Special Variable" context="#stay" String="\\[\d]+" /> + <RegExpr attribute="Pattern" context="#stay" String="\\." /> + </context> + <context name="regex_pattern_internal_rules_2" lineEndContext="#stay"> + <Detect2Chars attribute="Pattern Internal Operator" context="pat_ext" char="(" char1="?" /> + <DetectChar attribute="Pattern Internal Operator" context="pat_char_class" char="[" /> + <RegExpr attribute="Pattern Internal Operator" context="#stay" String="[()?^*+|]" /> + <RegExpr attribute="Pattern Internal Operator" context="#stay" String="\{[\d, ]+\}" /> + <DetectChar attribute="Pattern Internal Operator" context="#stay" char="$" /> + <RegExpr attribute="Comment" context="#stay" String="\s{3,}#.*$" /> + </context> + <context name="regex_pattern_internal" attribute="Pattern" lineEndContext="#stay"> + <IncludeRules context="regex_pattern_internal_rules_1" /> + <IncludeRules context="regex_pattern_internal_rules_2" /> + </context> + <context name="regex_pattern_internal_ip" attribute="Pattern" lineEndContext="#stay" > + <IncludeRules context="regex_pattern_internal_rules_1" /> + <!-- NOTE the below means that the special variables $' $], $} and $> are not supported + within interpolated PATTERNs (apart from $(, $) and ${ and $| not supported by perl). + This is because perl considers + s{foo$} {bar} OK as well as s{foo$}} {bar}, and detecting that is a huge work overload + for something that is unlikely to happen. --> + <RegExpr attribute="Data Type" context="find_variable_unsafe" String="[$@][^]\s{}()|>']" lookAhead="true" /> + <IncludeRules context="regex_pattern_internal_rules_2" /> + </context> + <context name="pat_ext" attribute="Pattern Internal Operator" lineEndContext="#stay"> + <RegExpr attribute="Comment" context="#pop" String="\#[^)]*" /> + <RegExpr attribute="Pattern Internal Operator" context="#pop" String="[:=!><]+" /> + <DetectChar attribute="Pattern Internal Operator" context="#pop" char=")" /> + </context> + <context name="pat_char_class" attribute="Pattern Character Class" lineEndContext="#stay"> + <DetectChar attribute="Pattern Internal Operator" context="#stay" char="^" /> + <Detect2Chars attribute="Pattern Character Class" context="#stay" char="\" char1="\" /> + <Detect2Chars attribute="Pattern Character Class" context="#stay" char="\" char1="]" /> + <RegExpr attribute="Pattern Character Class" context="#stay" String="\[:^?[a-z]+:\]" /> + <DetectChar attribute="Pattern Internal Operator" context="#pop" char="]" /> + </context> + + <!-- ====== Variables ====== --> + <context name="find_variable" attribute="Data Type" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop" > + <RegExpr attribute="Special Variable" context="var_detect" String="\$[0-9]+" /> + <RegExpr attribute="Special Variable" context="var_detect" String="[@\$](?:[\+\-_]\B|ARGV\b|INC\b)" /> + <RegExpr attribute="Special Variable" context="var_detect" String="[%\$](?:INC\b|ENV\b|SIG\b)" /> + <RegExpr attribute="Data Type" context="var_detect" String="\$\$[\$\w_]" /> + <RegExpr attribute="Data Type" context="var_detect" String="\$[#_][\w_]" /> + <RegExpr attribute="Data Type" context="var_detect" String="\$+::" /> + <RegExpr attribute="Special Variable" context="#stay" String="\$[^a-zA-Z0-9\s{][A-Z]?" /> + <RegExpr attribute="Data Type" context="var_detect" String="[\$@%]\{[\w_]+\}" /> + <AnyChar attribute="Data Type" context="var_detect" String="$@%" /> + <RegExpr attribute="Data Type" context="var_detect" String="\*[a-zA-Z_]+" /> + <RegExpr attribute="Special Variable" context="#stay" String="\*[^a-zA-Z0-9\s{][A-Z]?" /> + <!-- this should be a rare case! --> + <AnyChar attribute="Operator" context="#pop" String="$@%*" /> + </context> + <!-- This does not check fo a trailing slash, for usage in strings. --> + <context name="find_variable_unsafe" attribute="Data Type" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop" > + <RegExpr attribute="Special Variable" context="var_detect_unsafe" String="\$[0-9]+" /> + <RegExpr attribute="Special Variable" context="var_detect_unsafe" String="[@\$](?:[\+\-_]\B|ARGV\b|INC\b)" /> + <RegExpr attribute="Special Variable" context="var_detect_unsafe" String="[%\$](?:INC\b|ENV\b|SIG\b)" /> + <RegExpr attribute="Data Type" context="var_detect_unsafe" String="\$\$[\$\w_]" /> + <RegExpr attribute="Data Type" context="var_detect_unsafe" String="\$[#_][\w_]" /> + <RegExpr attribute="Data Type" context="var_detect_unsafe" String="\$+::" /> + <RegExpr attribute="Special Variable" context="#stay" String="\$[^a-zA-Z0-9\s{][A-Z]?" /> + <RegExpr attribute="Data Type" context="var_detect_unsafe" String="[\$@%]\{[\w_]+\}" /> + <RegExpr attribute="Data Type" context="var_detect_unsafe" String="[\$@%]" /> + <RegExpr attribute="Data Type" context="var_detect_unsafe" String="\*\w+" /> + <AnyChar attribute="Operator" context="#pop" String="$@%*" /> + </context> + <context name="var_detect" attribute="Data Type" lineEndContext="#pop#pop" fallthrough="true" fallthroughContext="#pop#pop"> + <IncludeRules context="var_detect_rules" /> + <IncludeRules context="slash_safe_escape" /> + </context> + <context name="var_detect_unsafe" attribute="Data Type" lineEndContext="#pop#pop" fallthrough="true" fallthroughContext="#pop#pop"> + <IncludeRules context="var_detect_rules" /> + </context> + <context name="var_detect_rules" attribute="Data Type" lineEndContext="#pop#pop" > + <RegExpr attribute="Data Type" context="#stay" String="[\w_]+" /> + <Detect2Chars attribute="Normal Text" context="#stay" char=":" char1=":" /> + <DetectChar attribute="Operator" context="#stay" char="'" /> + <Detect2Chars attribute="Normal Text" context="#stay" char="-" char1=">" /> + <!-- safe with operator / --> + <Detect2Chars attribute="Normal Text" context="#stay" char="+" char1="+" /> + <Detect2Chars attribute="Normal Text" context="#stay" char="-" char1="-" /> + </context> + + + <!-- ====== Word lists ====== --> + <context name="quote_word" attribute="Normal Text" lineEndContext="#stay" dynamic="true"> + <DetectSpaces /> + <DetectIdentifier /> + <RegExpr attribute="Normal Text" context="#stay" String="\\%1" dynamic="true" /> + <DetectChar attribute="Operator" context="#pop#pop#pop" char="1" dynamic="true" endRegion="Wordlist" /> + </context> + <context name="quote_word_paren" attribute="Normal Text" lineEndContext="#stay"> + <DetectSpaces /> + <DetectIdentifier /> + <Detect2Chars attribute="Normal Text" context="#stay" char="\" char1=")" /> + <DetectChar attribute="Operator" context="#pop#pop#pop" char=")" endRegion="Wordlist" /> + </context> + <context name="quote_word_brace" attribute="Normal Text" lineEndContext="#stay"> + <DetectSpaces /> + <DetectIdentifier /> + <Detect2Chars attribute="Normal Text" context="#stay" char="\" char1="}" /> + <DetectChar attribute="Operator" context="#pop#pop#pop" char="}" endRegion="Wordlist" /> + </context> + <context name="quote_word_bracket" attribute="Normal Text" lineEndContext="#stay"> + <DetectSpaces /> + <DetectIdentifier /> + <Detect2Chars attribute="Normal Text" context="#stay" char="\" char1="]" /> + <DetectChar attribute="Operator" context="#pop#pop#pop" char="]" endRegion="Wordlist" /> + </context> + + <!-- ====== Here Documents ====== --> + <context name="find_here_document" attribute="Normal Text" lineEndContext="#pop" > + <RegExpr attribute="Keyword" context="here_document" String="(\w+)\s*;?" /> + <RegExpr attribute="Keyword" context="here_document" String="\s*"([^"]+)"\s*;?" /> + <RegExpr attribute="Keyword" context="here_document" String="\s*`([^`]+)`\s*;?" /> + <RegExpr attribute="Keyword" context="here_document_dumb" String="\s*'([^']+)'\s*;?" /> + </context> + <context name="here_document" attribute="String (interpolated)" lineEndContext="#stay" dynamic="true"> + <DetectSpaces /> + <RegExpr attribute="Keyword" context="#pop#pop" String="%1" column="0" dynamic="true" endRegion="HereDocument"/> + <RegExpr attribute="Keyword" context="here_document" String="\=\s*<<\s*["']?([A-Z0-9_\-]+)["']?" beginRegion="HEREDoc" /> + <IncludeRules context="ipstring_internal" /> + </context> + <context name="here_document_dumb" attribute="Normal Text" lineEndContext="#stay" dynamic="true"> + <DetectSpaces /> + <RegExpr attribute="Keyword" context="#pop#pop" String="%1" column="0" dynamic="true" endRegion="HereDocument"/> + <DetectIdentifier /> + </context> + + <!-- ====== Misc ====== --> + <context name="data_handle" attribute="Data" lineEndContext="#stay"> + <RegExpr attribute="Pod" context="pod" String="\=(?:head[1-6]|over|back|item|for|begin|end|pod)\s+.*" column="0" beginRegion="POD"/> + <StringDetect attribute="Keyword" context="normal" String="__END__" firstNonSpace="true" /> + </context> + <context name="end_handle" attribute="Nothing" lineEndContext="#stay"> + <RegExpr attribute="Pod" context="pod" String="^\=(?:head[1-6]|over|back|item|for|begin|end|pod)\s*.*"/> + <StringDetect attribute="Keyword" context="data_handle" String="__DATA__" firstNonSpace="true" /> + </context> + + <context name="Backticked" attribute="String (interpolated)" lineEndContext="#stay"> + <IncludeRules context="ipstring_internal"/> + <DetectChar attribute="Operator" context="#pop" char="`"/> + </context> + + <context name="slash_safe_escape" attribute="Normal Text" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop"> + <RegExpr attribute="Normal Text" context="#pop" String="\s*\]?\s*/" /> + <RegExpr attribute="Normal Text" context="#pop" String="\s*\}?\s*/" endRegion="Block" /> + <RegExpr attribute="Normal Text" context="#pop" String="\s*\)?\s*/" /> + <keyword attribute="Keyword" context="#pop" String="keywords" /> + </context> + + <context name="package_qualified_blank" attribute="Normal Text" lineEndContext="#stay"> + <RegExpr attribute="Normal Text" context="#pop" String="[\w_]+" /> + </context> + + <context name="sub_name_def" attribute="Normal Text" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop"> + <RegExpr attribute="Function" context="#stay" String="\w+" /> + <RegExpr attribute="Normal Text" context="find_variable" String="\$\S" lookAhead="true" /> + <RegExpr attribute="Normal Text" context="sub_arg_definition" String="\s*\(" /> + <Detect2Chars attribute="Normal Text" context="#stay" char=":" char1=":" /> + </context> + + <context name="sub_arg_definition" attribute="Normal Text" lineEndContext="#stay" fallthrough="true" fallthroughContext="#pop#pop"> + <AnyChar attribute="Data Type" context="#stay" String="*$@%" /> + <AnyChar attribute="Normal Text" context="#stay" String="&\[];" /> + <DetectChar attribute="Normal Text" context="slash_safe_escape" char=")" /> + </context> + + <context name="pod" attribute="Pod" lineEndContext="#stay"> + <DetectSpaces /> + <DetectIdentifier /> + <RegExpr attribute="Pod" context="#stay" String="\=(?:head[1-6]|over|back|item|for|begin|end|pod)\s*.*" column="0" beginRegion="POD" endRegion="POD"/> + <RegExpr attribute="Pod" context="#pop" String="\=cut.*$" column="0" endRegion="POD"/> + </context> + + <context name="comment" attribute="Comment" lineEndContext="#pop"> + <DetectSpaces /> + <IncludeRules context="##Alerts" /> + <DetectIdentifier /> + </context> + + </contexts> + <itemDatas> + <itemData name="Normal Text" defStyleNum="dsNormal" /> + <itemData name="Keyword" defStyleNum="dsKeyword" /> + <itemData name="Pragma" defStyleNum="dsKeyword" /> + <itemData name="Function" defStyleNum="dsFunction" /> + <itemData name="Operator" defStyleNum="dsKeyword" color="#008000"/> + <itemData name="Data Type" defStyleNum="dsDataType" /> + <itemData name="Special Variable" defStyleNum="dsDataType" color="#C00000" selColor="#C00000" bold="0" italic="0" /> + <itemData name="Decimal" defStyleNum="dsDecVal" /> + <itemData name="Octal" defStyleNum="dsBaseN" /> + <itemData name="Hex" defStyleNum="dsBaseN" /> + <itemData name="Float" defStyleNum="dsFloat" /> + <itemData name="String" defStyleNum="dsString" color="#FF6C6C" selColor="#FF6C6C" bold="0" italic="0" /> + <itemData name="String (interpolated)" defStyleNum="dsString" /> + <itemData name="String Special Character" defStyleNum="dsChar" /> + <itemData name="Pattern" defStyleNum="dsOthers" /> + <itemData name="Pattern Internal Operator" defStyleNum="dsChar" /> + <itemData name="Pattern Character Class" defStyleNum="dsBaseN" /> + <itemData name="Data" defStyleNum="dsNormal" /> + <itemData name="Comment" defStyleNum="dsComment" /> + <itemData name="Pod" defStyleNum="dsComment" /> + <itemData name="Nothing" defStyleNum="dsComment" /> + </itemDatas> + </highlighting> + <general> + <comments> + <comment name="singleLine" start="#" /> + </comments> + <keywords casesensitive="1" /> + </general> +</language> +<!-- kate: space-indent on; indent-width 2; replace-tabs on; --> |