Bug 432785 - javascript-react.xml has external file ref in a Rule's context
Summary: javascript-react.xml has external file ref in a Rule's context
Status: RESOLVED NOT A BUG
Alias: None
Product: frameworks-syntax-highlighting
Classification: Frameworks and Libraries
Component: syntax (other bugs)
Version First Reported In: unspecified
Platform: Other Other
: NOR normal
Target Milestone: ---
Assignee: KWrite Developers
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2021-02-11 05:14 UTC by Gene Thomas
Modified: 2021-03-10 02:44 UTC (History)
2 users (show)

See Also:
Latest Commit:
Version Fixed/Implemented In:
Sentry Crash Report:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Gene Thomas 2021-02-11 05:14:22 UTC
SUMMARY

javascript-react.xml  contains:

<DetectChar attribute="Normal Text" context="NoRegExp##JavaScript" char="]" endRegion="List" />

My reading of https://docs.kde.org/stable5/en/applications/katepart/highlight.html only says that a Rule's context can contain references like:

"The context can be identified by:

1. An identifier, which is the name of the other context.
2. An order telling the engine to stay in the current context (#stay), or to pop back to a previous context used in the string (#pop).
3. To go back more steps, the #pop keyword can be repeated: #pop#pop#pop
4. An order followed by an exclamation mark (!) and an identifier, which will make the engine first follow the order and then switch to the other context, e.g. #pop#pop!OtherContext.
"

Only <IncludeRules> or <list><include> can contain name##file refs.

STEPS TO REPRODUCE
1. Load a .html file into a syntax highlighting engine. This includes javascript-react.xml

OBSERVED RESULT

A complaint about the NoRegExp##JavaScript not being local

EXPECTED RESULT

There should not be file ref like NoRegExp##JavaScript in a Rule's context

SOFTWARE/OS VERSIONS
Windows: 
macOS: 
Linux/KDE Plasma: 
(available in About System)
KDE Plasma Version: 
KDE Frameworks Version: 
Qt Version: 

head of https://github.com/KDE/syntax-highlighting

ADDITIONAL INFORMATION
Comment 1 Gene Thomas 2021-02-15 02:05:37 UTC
Of the 28,000 rule lines in the syntax directory, only 10 use extern file ref context attributes. These are a mistake are they not?


coffee.xml:270:         <Detect2Chars attribute="JavaScript Template" context="RegExpAfterString##JavaScript" char="\" char1="`" endRegion="Template"/> <!-- End template. -->
coffee.xml:292:         <Detect2Chars attribute="JavaScript Template" context="RegExpAfterString##JavaScript" char="\" char1="`" endRegion="Template"/> <!-- End template. -->
javascript-react.xml:81: 			<DetectChar attribute="Normal Text" context="NoRegExp##JavaScript" char="]" endRegion="List" />
javascript-react.xml:96: 			<DetectChar context="RegExpAfterString##JavaScript" attribute="Template" char="`" endRegion="Template" />
qml.xml:121:         <RegExpr attribute="Objects" context="FindMemberObjectMath##JavaScript" String="\bMath(?=\s*\.)" />
qml.xml:148:         <DetectChar attribute="String" context="RegExpAfterString##JavaScript" char="&quot;" />
selinux-fc.xml:90: 			<IncludeRules context="_m4_builtin_keywords##SELinux Policy"/>
typescript.xml:406: 			<DetectChar context="RegExpAfterString##JavaScript" attribute="Template" char="`" endRegion="Template" />
typescript-react.xml:103: 			<DetectChar context="RegExpAfterString##JavaScript" attribute="Template" char="`" endRegion="Template" />
yara.xml:66:         <RegExpr attribute="Start Regular Expression" context="(regex caret first check)##JavaScript" String="/(?=(?:[^/\\\[]|\\.|\[(?:[^\]\\]|\\.)+\])+/(?:[gimsuy]+(?!\s*[\w$])|(?![/\*])|(?=/\*)))" />
Comment 2 Nibaldo G. 2021-02-21 03:59:01 UTC
This is valid and it works!

Using "NoRegExp##JavaScript" switches to the "NoRegExp" context of the "JavaScript" definition.

Apparently this type of context switch isn't in the documentation, I will have to add it.
Comment 3 Nibaldo G. 2021-03-10 02:44:36 UTC
I added this context switch to the documentation: 

"""
An identifier, which is a context name, followed by two hashes (##) and another identifier, which is the name of a language definition. This naming is similar to that used in IncludeRules rules and allows you to switch to a context belonging to another syntax highlighting definition, e.g. "SomeContext##JavaScript". Note that it is not possible to use this context switch in combination with #pop, for example, "#pop!SomeContext##JavaScript" is not valid.
"""

See the commit here: https://invent.kde.org/utilities/kate/-/commit/858b18d7a8d49348e4d4e24531f36e4f93cc6834

The documentation is not updated automatically, so we will have to wait.

In case you still have doubts, you can check the KSyntaxHighlighting source code:  https://invent.kde.org/frameworks/syntax-highlighting/-/blob/master/src/lib/contextswitch.cpp#L47