mirror of
https://github.com/abapGit/abapGit.git
synced 2025-05-01 12:20:51 +08:00
New syntax-highlighters for CSS, JS, JSON (#3381)
* Add syntax-highlighters for CSS, JS, JSON * Update W3MI ZABAPGIT_CSS_THEME_DEFAULT * Fix line size and case statement * Fix line size * Update styles, removed operators * Added highlight for comments in HTML/XML * Fix menu hover background This makes the selected menu more visible. Also includes color fix for repo name and url in dark theme. * Fix for W3xx objects with "." in name * Reverse fix for W3xx * Remove hover style changes Co-authored-by: Lars Hvam <larshp@hotmail.com>
This commit is contained in:
parent
5a21bbba7d
commit
2e2b8584fb
|
@ -81,8 +81,8 @@ CLASS zcl_abapgit_objects_files DEFINITION
|
||||||
VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_file_signatures_tt .
|
VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_file_signatures_tt .
|
||||||
METHODS contains
|
METHODS contains
|
||||||
IMPORTING
|
IMPORTING
|
||||||
!iv_extra TYPE clike OPTIONAL
|
!iv_extra TYPE clike OPTIONAL
|
||||||
!iv_ext TYPE string
|
!iv_ext TYPE string
|
||||||
RETURNING
|
RETURNING
|
||||||
VALUE(rv_present) TYPE abap_bool.
|
VALUE(rv_present) TYPE abap_bool.
|
||||||
PROTECTED SECTION.
|
PROTECTED SECTION.
|
||||||
|
@ -191,6 +191,7 @@ CLASS ZCL_ABAPGIT_OBJECTS_FILES IMPLEMENTATION.
|
||||||
APPEND ls_file TO mt_files.
|
APPEND ls_file TO mt_files.
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
METHOD constructor.
|
METHOD constructor.
|
||||||
ms_item = is_item.
|
ms_item = is_item.
|
||||||
mv_path = iv_path.
|
mv_path = iv_path.
|
||||||
|
|
479
src/syntax/zcl_abapgit_syntax_css.clas.abap
Normal file
479
src/syntax/zcl_abapgit_syntax_css.clas.abap
Normal file
|
@ -0,0 +1,479 @@
|
||||||
|
CLASS zcl_abapgit_syntax_css DEFINITION
|
||||||
|
PUBLIC
|
||||||
|
INHERITING FROM zcl_abapgit_syntax_highlighter
|
||||||
|
CREATE PUBLIC .
|
||||||
|
|
||||||
|
PUBLIC SECTION.
|
||||||
|
|
||||||
|
" CSS Standard https://www.w3.org/TR/css-2018/
|
||||||
|
" CSS Reference https://www.w3schools.com/cssref/default.asp
|
||||||
|
|
||||||
|
" We used a mixture of above as reference for the keyword list
|
||||||
|
" 1) CSS Properties https://www.w3schools.com/cssref/default.asp
|
||||||
|
" 2) CSS Values & Units https://www.w3schools.com/cssref/css_units.asp
|
||||||
|
" 3) CSS Selectors https://www.w3.org/TR/css-2018/#selectors
|
||||||
|
" 4) CSS Functions https://www.w3schools.com/cssref/css_functions.asp
|
||||||
|
" 5) CSS Colors https://www.w3schools.com/colors/colors_names.asp
|
||||||
|
" 6) CSS Extensions
|
||||||
|
" 7) CSS At-Rules https://www.w3.org/TR/css-2018/#at-rules
|
||||||
|
" 8) HTML Tags
|
||||||
|
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_css,
|
||||||
|
keyword TYPE string VALUE 'keyword', "#EC NOTEXT
|
||||||
|
text TYPE string VALUE 'text', "#EC NOTEXT
|
||||||
|
comment TYPE string VALUE 'comment', "#EC NOTEXT
|
||||||
|
selectors TYPE string VALUE 'selectors', "#EC NOTEXT
|
||||||
|
units TYPE string VALUE 'units', "#EC NOTEXT
|
||||||
|
properties TYPE string VALUE 'properties', "#EC NOTEXT
|
||||||
|
values TYPE string VALUE 'values', "#EC NOTEXT
|
||||||
|
functions TYPE string VALUE 'functions', "#EC NOTEXT
|
||||||
|
colors TYPE string VALUE 'colors', "#EC NOTEXT
|
||||||
|
extensions TYPE string VALUE 'extensions', "#EC NOTEXT
|
||||||
|
at_rules TYPE string VALUE 'at_rules', "#EC NOTEXT
|
||||||
|
html TYPE string VALUE 'html', "#EC NOTEXT
|
||||||
|
END OF c_css .
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_token,
|
||||||
|
keyword TYPE c VALUE 'K', "#EC NOTEXT
|
||||||
|
text TYPE c VALUE 'T', "#EC NOTEXT
|
||||||
|
comment TYPE c VALUE 'C', "#EC NOTEXT
|
||||||
|
selectors TYPE c VALUE 'S', "#EC NOTEXT
|
||||||
|
units TYPE c VALUE 'U', "#EC NOTEXT
|
||||||
|
properties TYPE c VALUE 'P', "#EC NOTEXT
|
||||||
|
values TYPE c VALUE 'V', "#EC NOTEXT
|
||||||
|
functions TYPE c VALUE 'F', "#EC NOTEXT
|
||||||
|
colors TYPE c VALUE 'Z', "#EC NOTEXT
|
||||||
|
extensions TYPE c VALUE 'E', "#EC NOTEXT
|
||||||
|
at_rules TYPE c VALUE 'A', "#EC NOTEXT
|
||||||
|
html TYPE c VALUE 'H', "#EC NOTEXT
|
||||||
|
END OF c_token .
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_regex,
|
||||||
|
" comments /* ... */
|
||||||
|
comment TYPE string VALUE '\/\*.*\*\/|\/\*|\*\/', "#EC NOTEXT
|
||||||
|
" single or double quoted strings
|
||||||
|
text TYPE string VALUE '("[^"]*")|(''[^'']*'')', "#EC NOTEXT
|
||||||
|
" in general keywords don't contain numbers (except -ms-scrollbar-3dlight-color)
|
||||||
|
keyword TYPE string VALUE '\b[a-z3@\-]+\b', "#EC NOTEXT
|
||||||
|
" selectors begin with :
|
||||||
|
selectors TYPE string VALUE ':[:a-z]+\b', "#EC NOTEXT
|
||||||
|
" units
|
||||||
|
units TYPE string
|
||||||
|
VALUE '\b[0-9\. ]+(ch|cm|em|ex|in|mm|pc|pt|px|vh|vmax|vmin|vw)\b|\b[0-9\. ]+%', "#EC NOTEXT
|
||||||
|
END OF c_regex .
|
||||||
|
|
||||||
|
CLASS-METHODS class_constructor .
|
||||||
|
METHODS constructor .
|
||||||
|
PROTECTED SECTION.
|
||||||
|
|
||||||
|
TYPES: BEGIN OF ty_keyword,
|
||||||
|
keyword TYPE string,
|
||||||
|
token TYPE char1,
|
||||||
|
END OF ty_keyword.
|
||||||
|
|
||||||
|
CLASS-DATA gt_keywords TYPE HASHED TABLE OF ty_keyword WITH UNIQUE KEY keyword.
|
||||||
|
CLASS-DATA gv_comment TYPE abap_bool.
|
||||||
|
|
||||||
|
CLASS-METHODS init_keywords.
|
||||||
|
CLASS-METHODS insert_keywords
|
||||||
|
IMPORTING
|
||||||
|
iv_keywords TYPE string
|
||||||
|
iv_token TYPE char1.
|
||||||
|
CLASS-METHODS is_keyword
|
||||||
|
IMPORTING iv_chunk TYPE string
|
||||||
|
RETURNING VALUE(rv_yes) TYPE abap_bool.
|
||||||
|
|
||||||
|
METHODS order_matches REDEFINITION.
|
||||||
|
METHODS parse_line REDEFINITION.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
CLASS ZCL_ABAPGIT_SYNTAX_CSS IMPLEMENTATION.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD class_constructor.
|
||||||
|
|
||||||
|
init_keywords( ).
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD constructor.
|
||||||
|
|
||||||
|
super->constructor( ).
|
||||||
|
|
||||||
|
" Initialize instances of regular expression
|
||||||
|
|
||||||
|
add_rule( iv_regex = c_regex-keyword
|
||||||
|
iv_token = c_token-keyword
|
||||||
|
iv_style = c_css-keyword ).
|
||||||
|
|
||||||
|
add_rule( iv_regex = c_regex-comment
|
||||||
|
iv_token = c_token-comment
|
||||||
|
iv_style = c_css-comment ).
|
||||||
|
|
||||||
|
add_rule( iv_regex = c_regex-text
|
||||||
|
iv_token = c_token-text
|
||||||
|
iv_style = c_css-text ).
|
||||||
|
|
||||||
|
add_rule( iv_regex = c_regex-selectors
|
||||||
|
iv_token = c_token-selectors
|
||||||
|
iv_style = c_css-selectors ).
|
||||||
|
|
||||||
|
add_rule( iv_regex = c_regex-units
|
||||||
|
iv_token = c_token-units
|
||||||
|
iv_style = c_css-units ).
|
||||||
|
|
||||||
|
" Styles for keywords
|
||||||
|
add_rule( iv_regex = ''
|
||||||
|
iv_token = c_token-html
|
||||||
|
iv_style = c_css-html ).
|
||||||
|
|
||||||
|
add_rule( iv_regex = ''
|
||||||
|
iv_token = c_token-properties
|
||||||
|
iv_style = c_css-properties ).
|
||||||
|
|
||||||
|
add_rule( iv_regex = ''
|
||||||
|
iv_token = c_token-values
|
||||||
|
iv_style = c_css-values ).
|
||||||
|
|
||||||
|
add_rule( iv_regex = ''
|
||||||
|
iv_token = c_token-functions
|
||||||
|
iv_style = c_css-functions ).
|
||||||
|
|
||||||
|
add_rule( iv_regex = ''
|
||||||
|
iv_token = c_token-colors
|
||||||
|
iv_style = c_css-colors ).
|
||||||
|
|
||||||
|
add_rule( iv_regex = ''
|
||||||
|
iv_token = c_token-extensions
|
||||||
|
iv_style = c_css-extensions ).
|
||||||
|
|
||||||
|
add_rule( iv_regex = ''
|
||||||
|
iv_token = c_token-at_rules
|
||||||
|
iv_style = c_css-at_rules ).
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD init_keywords.
|
||||||
|
|
||||||
|
DATA: lv_keywords TYPE string.
|
||||||
|
|
||||||
|
CLEAR gt_keywords.
|
||||||
|
|
||||||
|
" 1) CSS Properties
|
||||||
|
lv_keywords =
|
||||||
|
'align-content|align-items|align-self|animation|animation-delay|animation-direction|animation-duration|' &&
|
||||||
|
'animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|' &&
|
||||||
|
'backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|' &&
|
||||||
|
'background-image|background-origin|background-position|background-repeat|background-size|border|' &&
|
||||||
|
'border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|' &&
|
||||||
|
'border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|' &&
|
||||||
|
'border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|' &&
|
||||||
|
'border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|' &&
|
||||||
|
'border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|' &&
|
||||||
|
'border-top-style|border-top-width|border-width|box-decoration-break|box-shadow|box-sizing|caption-side|' &&
|
||||||
|
'caret-color|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|' &&
|
||||||
|
'column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|' &&
|
||||||
|
'counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|' &&
|
||||||
|
'flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-kerning|font-size|font-size-adjust|' &&
|
||||||
|
'font-stretch|font-style|font-variant|font-weight|grid|grid-area|grid-auto-columns|grid-auto-flow|' &&
|
||||||
|
'grid-auto-rows|grid-column|grid-column-end|grid-column-gap|grid-column-start|grid-gap|grid-row|' &&
|
||||||
|
'grid-row-end|grid-row-gap|grid-row-start|grid-template|grid-template-areas|grid-template-columns|' &&
|
||||||
|
'grid-template-rows|hanging-punctuation|height|hyphens|isolation|justify-content|' &&
|
||||||
|
'letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|' &&
|
||||||
|
'margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|media|min-height|min-width|' &&
|
||||||
|
'mix-blend-mode|object-fit|object-position|opacity|order|outline|outline-color|outline-offset|' &&
|
||||||
|
'outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|' &&
|
||||||
|
'padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|' &&
|
||||||
|
'perspective-origin|pointer-events|position|quotes|resize|scroll-behavior|tab-size|table-layout|' &&
|
||||||
|
'text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|' &&
|
||||||
|
'text-decoration-style|text-indent|text-justify|text-overflow|text-rendering|text-shadow|text-transform|' &&
|
||||||
|
'transform|transform-origin|transform-style|transition|transition-delay|transition-duration|' &&
|
||||||
|
'transition-property|transition-timing-function|unicode-bidi|user-select|vertical-align|visibility|' &&
|
||||||
|
'white-space|width|word-break|word-spacing|word-wrap|writing-mode|z-index'.
|
||||||
|
insert_keywords( iv_keywords = lv_keywords iv_token = c_token-properties ).
|
||||||
|
|
||||||
|
" 2) CSS Values
|
||||||
|
lv_keywords =
|
||||||
|
'absolute|all|auto|block|bold|border-box|both|bottom|center|counter|cover|dashed|fixed|hidden|important|' &&
|
||||||
|
'inherit|initial|inline-block|italic|left|max-content|middle|min-content|no-repeat|none|normal|pointer|' &&
|
||||||
|
'relative|rem|right|solid|table-cell|text|top|transparent|underline|url'.
|
||||||
|
insert_keywords( iv_keywords = lv_keywords iv_token = c_token-values ).
|
||||||
|
|
||||||
|
" 3) CSS Selectors
|
||||||
|
lv_keywords =
|
||||||
|
':active|::after|::before|:checked|:disabled|:empty|:enabled|:first-child|::first-letter|::first-line|' &&
|
||||||
|
':first-of-type|:focus|:hover|:lang|:last-child|:last-of-type|:link|:not|:nth-child|:nth-last-child|' &&
|
||||||
|
':nth-last-of-type|:nth-of-type|:only-child|:only-of-type|:root|:target|:visited'.
|
||||||
|
insert_keywords( iv_keywords = lv_keywords iv_token = c_token-selectors ).
|
||||||
|
|
||||||
|
" 4) CSS Functions
|
||||||
|
lv_keywords =
|
||||||
|
'attr|calc|cubic-bezier|hsl|hsla|linear-gradient|radial-gradient|repeating-linear-gradient|' &&
|
||||||
|
'repeating-radial-gradient|rgb|rgba|rotate|scale|translateX|translateY|var'.
|
||||||
|
insert_keywords( iv_keywords = lv_keywords iv_token = c_token-functions ).
|
||||||
|
|
||||||
|
" 5) CSS Colors
|
||||||
|
lv_keywords =
|
||||||
|
'#|aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|' &&
|
||||||
|
'burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|' &&
|
||||||
|
'darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|' &&
|
||||||
|
'darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|' &&
|
||||||
|
'deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|' &&
|
||||||
|
'ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|' &&
|
||||||
|
'lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|' &&
|
||||||
|
'lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|' &&
|
||||||
|
'lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|' &&
|
||||||
|
'mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|' &&
|
||||||
|
'mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|' &&
|
||||||
|
'orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|' &&
|
||||||
|
'peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|' &&
|
||||||
|
'seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|' &&
|
||||||
|
'tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen'.
|
||||||
|
insert_keywords( iv_keywords = lv_keywords iv_token = c_token-colors ).
|
||||||
|
|
||||||
|
" 6) CSS Extensions
|
||||||
|
lv_keywords =
|
||||||
|
'moz|moz-binding|moz-border-bottom-colors|moz-border-left-colors|moz-border-right-colors|' &&
|
||||||
|
'moz-border-top-colors|moz-box-align|moz-box-direction|moz-box-flex|moz-box-ordinal-group|' &&
|
||||||
|
'moz-box-orient|moz-box-pack|moz-box-shadow|moz-context-properties|moz-float-edge|' &&
|
||||||
|
'moz-force-broken-image-icon|moz-image-region|moz-orient|moz-osx-font-smoothing|' &&
|
||||||
|
'moz-outline-radius|moz-outline-radius-bottomleft|moz-outline-radius-bottomright|' &&
|
||||||
|
'moz-outline-radius-topleft|moz-outline-radius-topright|moz-stack-sizing|moz-system-metric|' &&
|
||||||
|
'moz-transform|moz-transform-origin|moz-transition|moz-transition-delay|moz-user-focus|' &&
|
||||||
|
'moz-user-input|moz-user-modify|moz-window-dragging|moz-window-shadow|ms|ms-accelerator|' &&
|
||||||
|
'ms-block-progression|ms-content-zoom-chaining|ms-content-zoom-limit|' &&
|
||||||
|
'ms-content-zoom-limit-max|ms-content-zoom-limit-min|ms-content-zoom-snap|' &&
|
||||||
|
'ms-content-zoom-snap-points|ms-content-zoom-snap-type|ms-content-zooming|ms-filter|' &&
|
||||||
|
'ms-flow-from|ms-flow-into|ms-high-contrast-adjust|ms-hyphenate-limit-chars|' &&
|
||||||
|
'ms-hyphenate-limit-lines|ms-hyphenate-limit-zone|ms-ime-align|ms-overflow-style|' &&
|
||||||
|
'ms-scroll-chaining|ms-scroll-limit|ms-scroll-limit-x-max|ms-scroll-limit-x-min|' &&
|
||||||
|
'ms-scroll-limit-y-max|ms-scroll-limit-y-min|ms-scroll-rails|ms-scroll-snap-points-x|' &&
|
||||||
|
'ms-scroll-snap-points-y|ms-scroll-snap-x|ms-scroll-snap-y|ms-scroll-translation|' &&
|
||||||
|
'ms-scrollbar-3dlight-color|ms-scrollbar-arrow-color|ms-scrollbar-base-color|' &&
|
||||||
|
'ms-scrollbar-darkshadow-color|ms-scrollbar-face-color|ms-scrollbar-highlight-color|' &&
|
||||||
|
'ms-scrollbar-shadow-color|ms-scrollbar-track-color|ms-transform|ms-text-autospace|' &&
|
||||||
|
'ms-touch-select|ms-wrap-flow|ms-wrap-margin|ms-wrap-through|o|o-transform|webkit|' &&
|
||||||
|
'webkit-animation-trigger|webkit-app-region|webkit-appearance|webkit-aspect-ratio|' &&
|
||||||
|
'webkit-backdrop-filter|webkit-background-composite|webkit-border-after|' &&
|
||||||
|
'webkit-border-after-color|webkit-border-after-style|webkit-border-after-width|' &&
|
||||||
|
'webkit-border-before|webkit-border-before-color|webkit-border-before-style|' &&
|
||||||
|
'webkit-border-before-width|webkit-border-end|webkit-border-end-color|' &&
|
||||||
|
'webkit-border-end-style|webkit-border-end-width|webkit-border-fit|' &&
|
||||||
|
'webkit-border-horizontal-spacing|webkit-border-radius|webkit-border-start|' &&
|
||||||
|
'webkit-border-start-color|webkit-border-start-style|webkit-border-start-width|' &&
|
||||||
|
'webkit-border-vertical-spacing|webkit-box-align|webkit-box-direction|webkit-box-flex|' &&
|
||||||
|
'webkit-box-flex-group|webkit-box-lines|webkit-box-ordinal-group|webkit-box-orient|' &&
|
||||||
|
'webkit-box-pack|webkit-box-reflect|webkit-box-shadow|webkit-column-axis|' &&
|
||||||
|
'webkit-column-break-after|webkit-column-break-before|webkit-column-break-inside|' &&
|
||||||
|
'webkit-column-progression|webkit-cursor-visibility|webkit-dashboard-region|' &&
|
||||||
|
'webkit-font-size-delta|webkit-font-smoothing|webkit-highlight|webkit-hyphenate-character|' &&
|
||||||
|
'webkit-hyphenate-limit-after|webkit-hyphenate-limit-before|webkit-hyphenate-limit-lines|' &&
|
||||||
|
'webkit-initial-letter|webkit-line-align|webkit-line-box-contain|webkit-line-clamp|' &&
|
||||||
|
'webkit-line-grid|webkit-line-snap|webkit-locale|webkit-logical-height|' &&
|
||||||
|
'webkit-logical-width|webkit-margin-after|webkit-margin-after-collapse|' &&
|
||||||
|
'webkit-margin-before|webkit-margin-before-collapse|webkit-margin-bottom-collapse|' &&
|
||||||
|
'webkit-margin-collapse|webkit-margin-end|webkit-margin-start|webkit-margin-top-collapse|' &&
|
||||||
|
'webkit-marquee|webkit-marquee-direction|webkit-marquee-increment|' &&
|
||||||
|
'webkit-marquee-repetition|webkit-marquee-speed|webkit-marquee-style|webkit-mask-box-image|' &&
|
||||||
|
'webkit-mask-box-image-outset|webkit-mask-box-image-repeat|webkit-mask-box-image-slice|' &&
|
||||||
|
'webkit-mask-box-image-source|webkit-mask-box-image-width|webkit-mask-repeat-x|' &&
|
||||||
|
'webkit-mask-repeat-y|webkit-mask-source-type|webkit-max-logical-height|' &&
|
||||||
|
'webkit-max-logical-width|webkit-min-logical-height|webkit-min-logical-width|' &&
|
||||||
|
'webkit-nbsp-mode|webkit-padding-after|webkit-padding-before|webkit-padding-end|' &&
|
||||||
|
'webkit-padding-start|webkit-perspective-origin-x|webkit-perspective-origin-y|' &&
|
||||||
|
'webkit-print-color-adjust|webkit-rtl-ordering|webkit-svg-shadow|' &&
|
||||||
|
'webkit-tap-highlight-color|webkit-text-combine|webkit-text-decoration-skip|' &&
|
||||||
|
'webkit-text-decorations-in-effect|webkit-text-fill-color|webkit-text-security|' &&
|
||||||
|
'webkit-text-stroke|webkit-text-stroke-color|webkit-text-stroke-width|webkit-text-zoom|' &&
|
||||||
|
'webkit-transform|webkit-transform-origin|webkit-transform-origin-x|' &&
|
||||||
|
'webkit-transform-origin-y|webkit-transform-origin-z|webkit-transition|' &&
|
||||||
|
'webkit-transition-delay|webkit-user-drag|webkit-user-modify|overflow-clip-box|' &&
|
||||||
|
'overflow-clip-box-block|overflow-clip-box-inline|zoom'.
|
||||||
|
insert_keywords( iv_keywords = lv_keywords iv_token = c_token-extensions ).
|
||||||
|
|
||||||
|
" 6) CSS At-Rules
|
||||||
|
lv_keywords =
|
||||||
|
'@|charset|counter-style|font-face|import|keyframes'.
|
||||||
|
insert_keywords( iv_keywords = lv_keywords iv_token = c_token-at_rules ).
|
||||||
|
|
||||||
|
" 7) HTML tage
|
||||||
|
lv_keywords =
|
||||||
|
'doctyype|a|abbr|acronym|address|applet|area|b|base|basefont|bdo|bgsound|big|blink|blockquote|' &&
|
||||||
|
'body|br|button|caption|center|cite|code|col|colgroup|dd|del|dfn|dir|div|dl|dt|em|embed|fieldset|' &&
|
||||||
|
'font|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|hr|html|i|iframe|ilayer|img|input|ins|isindex|' &&
|
||||||
|
'kbd|keygen|label|layer|legend|li|link|listing|map|menu|meta|multicol|nobr|noembed|noframes|' &&
|
||||||
|
'nolayer|noscript|object|ol|optgroup|option|p|param|plaintext|pre|q|s|samp|script|select|server|' &&
|
||||||
|
'small|sound|spacer|span|strike|strong|style|sub|sup|tbody|textarea|title|tt|u|ul|var|wbr|xmp|' &&
|
||||||
|
'xsl|xml|accesskey|action|align|alink|alt|background|balance|behavior|bgcolor|bgproperties|' &&
|
||||||
|
'border|bordercolor|bordercolordark|bordercolorlight|bottommargin|checked|class|classid|clear|' &&
|
||||||
|
'code|codebase|codetype|color|cols|colspan|compact|content|controls|coords|data|datafld|' &&
|
||||||
|
'dataformatas|datasrc|direction|disabled|dynsrc|enctype|event|face|for|frame|frameborder|' &&
|
||||||
|
'framespacing|height|hidden|href|hspace|http-equiv|id|ismap|lang|language|leftmargin|link|loop|' &&
|
||||||
|
'lowsrc|marginheight|marginwidth|maxlength|mayscript|method|methods|multiple|name|nohref|' &&
|
||||||
|
'noresize|noshade|nowrap|palette|pluginspage|public|readonly|rel|rev|rightmargin|rows|rowspan|' &&
|
||||||
|
'rules|scroll|scrollamount|scrolldelay|scrolling|selected|shape|size|span|src|start|style|' &&
|
||||||
|
'tabindex|target|text|title|topmargin|truespeed|type|url|urn|usemap|valign|value|vlink|volume|' &&
|
||||||
|
'vrml|vspace|width|wrap|apply-templates|attribute|choose|comment|define-template-set|' &&
|
||||||
|
'entity-ref|eval|expr|for-each|if|match|no-entities|node-name|order-by|otherwise|select|' &&
|
||||||
|
'stylesheet|template|test|value-of|version|when|xmlns|xsl|cellpadding|cellspacing|table|td|' &&
|
||||||
|
'tfoot|th|thead|tr'.
|
||||||
|
insert_keywords( iv_keywords = lv_keywords iv_token = c_token-html ).
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD insert_keywords.
|
||||||
|
|
||||||
|
DATA: lt_keywords TYPE STANDARD TABLE OF string,
|
||||||
|
ls_keyword TYPE ty_keyword.
|
||||||
|
|
||||||
|
FIELD-SYMBOLS: <lv_keyword> TYPE any.
|
||||||
|
|
||||||
|
SPLIT iv_keywords AT '|' INTO TABLE lt_keywords.
|
||||||
|
|
||||||
|
LOOP AT lt_keywords ASSIGNING <lv_keyword>.
|
||||||
|
CLEAR ls_keyword.
|
||||||
|
ls_keyword-keyword = <lv_keyword>.
|
||||||
|
ls_keyword-token = iv_token.
|
||||||
|
INSERT ls_keyword INTO TABLE gt_keywords.
|
||||||
|
ENDLOOP.
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD is_keyword.
|
||||||
|
|
||||||
|
DATA lv_str TYPE string.
|
||||||
|
|
||||||
|
lv_str = to_lower( iv_chunk ).
|
||||||
|
READ TABLE gt_keywords WITH TABLE KEY keyword = lv_str TRANSPORTING NO FIELDS.
|
||||||
|
rv_yes = boolc( sy-subrc = 0 ).
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD order_matches.
|
||||||
|
|
||||||
|
DATA:
|
||||||
|
lv_match TYPE string,
|
||||||
|
lv_line_len TYPE i,
|
||||||
|
lv_cmmt_end TYPE i,
|
||||||
|
lv_prev_end TYPE i,
|
||||||
|
lv_prev_token TYPE c.
|
||||||
|
|
||||||
|
FIELD-SYMBOLS:
|
||||||
|
<ls_prev> TYPE ty_match,
|
||||||
|
<ls_match> TYPE ty_match,
|
||||||
|
<ls_keyword> TYPE ty_keyword.
|
||||||
|
|
||||||
|
" Longest matches
|
||||||
|
SORT ct_matches BY offset length DESCENDING.
|
||||||
|
|
||||||
|
lv_line_len = strlen( iv_line ).
|
||||||
|
|
||||||
|
" Check if this is part of multi-line comment and mark it accordingly
|
||||||
|
IF gv_comment = abap_true.
|
||||||
|
READ TABLE ct_matches WITH KEY token = c_token-comment TRANSPORTING NO FIELDS.
|
||||||
|
IF sy-subrc <> 0.
|
||||||
|
CLEAR ct_matches.
|
||||||
|
APPEND INITIAL LINE TO ct_matches ASSIGNING <ls_match>.
|
||||||
|
<ls_match>-token = c_token-comment.
|
||||||
|
<ls_match>-offset = 0.
|
||||||
|
<ls_match>-length = lv_line_len.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
LOOP AT ct_matches ASSIGNING <ls_match>.
|
||||||
|
" Delete matches after open text match
|
||||||
|
IF lv_prev_token = c_token-text AND <ls_match>-token <> c_token-text.
|
||||||
|
CLEAR <ls_match>-token.
|
||||||
|
CONTINUE.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
lv_match = substring( val = iv_line
|
||||||
|
off = <ls_match>-offset
|
||||||
|
len = <ls_match>-length ).
|
||||||
|
|
||||||
|
CASE <ls_match>-token.
|
||||||
|
WHEN c_token-keyword.
|
||||||
|
" Skip keyword that's part of previous (longer) keyword
|
||||||
|
IF <ls_match>-offset < lv_prev_end.
|
||||||
|
CLEAR <ls_match>-token.
|
||||||
|
CONTINUE.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
" Map generic keyword to specific CSS token
|
||||||
|
lv_match = to_lower( lv_match ).
|
||||||
|
READ TABLE gt_keywords ASSIGNING <ls_keyword> WITH TABLE KEY keyword = lv_match.
|
||||||
|
IF sy-subrc = 0.
|
||||||
|
<ls_match>-token = <ls_keyword>-token.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
WHEN c_token-comment.
|
||||||
|
IF lv_match = '/*'.
|
||||||
|
DELETE ct_matches WHERE offset > <ls_match>-offset.
|
||||||
|
<ls_match>-length = lv_line_len - <ls_match>-offset.
|
||||||
|
gv_comment = abap_true.
|
||||||
|
ELSEIF lv_match = '*/'.
|
||||||
|
DELETE ct_matches WHERE offset < <ls_match>-offset.
|
||||||
|
<ls_match>-length = <ls_match>-offset + 2.
|
||||||
|
<ls_match>-offset = 0.
|
||||||
|
gv_comment = abap_false.
|
||||||
|
ELSE.
|
||||||
|
lv_cmmt_end = <ls_match>-offset + <ls_match>-length.
|
||||||
|
DELETE ct_matches WHERE offset > <ls_match>-offset AND offset <= lv_cmmt_end.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
WHEN c_token-text.
|
||||||
|
<ls_match>-text_tag = lv_match.
|
||||||
|
IF lv_prev_token = c_token-text.
|
||||||
|
IF <ls_match>-text_tag = <ls_prev>-text_tag.
|
||||||
|
<ls_prev>-length = <ls_match>-offset + <ls_match>-length - <ls_prev>-offset.
|
||||||
|
CLEAR lv_prev_token.
|
||||||
|
ENDIF.
|
||||||
|
CLEAR <ls_match>-token.
|
||||||
|
CONTINUE.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
ENDCASE.
|
||||||
|
|
||||||
|
lv_prev_token = <ls_match>-token.
|
||||||
|
lv_prev_end = <ls_match>-offset + <ls_match>-length.
|
||||||
|
ASSIGN <ls_match> TO <ls_prev>.
|
||||||
|
ENDLOOP.
|
||||||
|
|
||||||
|
DELETE ct_matches WHERE token IS INITIAL.
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD parse_line. "REDEFINITION
|
||||||
|
|
||||||
|
DATA lv_index TYPE i.
|
||||||
|
|
||||||
|
FIELD-SYMBOLS <ls_match> LIKE LINE OF rt_matches.
|
||||||
|
|
||||||
|
rt_matches = super->parse_line( iv_line ).
|
||||||
|
|
||||||
|
" Remove non-keywords
|
||||||
|
LOOP AT rt_matches ASSIGNING <ls_match> WHERE token = c_token-keyword.
|
||||||
|
lv_index = sy-tabix.
|
||||||
|
IF abap_false = is_keyword( substring( val = iv_line
|
||||||
|
off = <ls_match>-offset
|
||||||
|
len = <ls_match>-length ) ).
|
||||||
|
CLEAR <ls_match>-token.
|
||||||
|
ENDIF.
|
||||||
|
ENDLOOP.
|
||||||
|
|
||||||
|
DELETE rt_matches WHERE token IS INITIAL.
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
16
src/syntax/zcl_abapgit_syntax_css.clas.xml
Normal file
16
src/syntax/zcl_abapgit_syntax_css.clas.xml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
|
||||||
|
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
||||||
|
<asx:values>
|
||||||
|
<VSEOCLASS>
|
||||||
|
<CLSNAME>ZCL_ABAPGIT_SYNTAX_CSS</CLSNAME>
|
||||||
|
<LANGU>E</LANGU>
|
||||||
|
<DESCRIPT>CSS Syntax Highlighting</DESCRIPT>
|
||||||
|
<STATE>1</STATE>
|
||||||
|
<CLSCCINCL>X</CLSCCINCL>
|
||||||
|
<FIXPT>X</FIXPT>
|
||||||
|
<UNICODE>X</UNICODE>
|
||||||
|
</VSEOCLASS>
|
||||||
|
</asx:values>
|
||||||
|
</asx:abap>
|
||||||
|
</abapGit>
|
|
@ -84,10 +84,12 @@ CLASS ZCL_ABAPGIT_SYNTAX_HIGHLIGHTER IMPLEMENTATION.
|
||||||
|
|
||||||
DATA ls_rule LIKE LINE OF mt_rules.
|
DATA ls_rule LIKE LINE OF mt_rules.
|
||||||
|
|
||||||
CREATE OBJECT ls_rule-regex
|
IF NOT iv_regex IS INITIAL.
|
||||||
EXPORTING
|
CREATE OBJECT ls_rule-regex
|
||||||
pattern = iv_regex
|
EXPORTING
|
||||||
ignore_case = abap_true.
|
pattern = iv_regex
|
||||||
|
ignore_case = abap_true.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
ls_rule-token = iv_token.
|
ls_rule-token = iv_token.
|
||||||
ls_rule-style = iv_style.
|
ls_rule-style = iv_style.
|
||||||
|
@ -118,6 +120,12 @@ CLASS ZCL_ABAPGIT_SYNTAX_HIGHLIGHTER IMPLEMENTATION.
|
||||||
CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_abap.
|
CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_abap.
|
||||||
ELSEIF iv_filename CP '*.xml' OR iv_filename CP '*.html'.
|
ELSEIF iv_filename CP '*.xml' OR iv_filename CP '*.html'.
|
||||||
CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_xml.
|
CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_xml.
|
||||||
|
ELSEIF iv_filename CP '*.css'.
|
||||||
|
CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_css.
|
||||||
|
ELSEIF iv_filename CP '*.js'.
|
||||||
|
CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_js.
|
||||||
|
ELSEIF iv_filename CP '*.json'.
|
||||||
|
CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_json.
|
||||||
ELSE.
|
ELSE.
|
||||||
CLEAR ro_instance.
|
CLEAR ro_instance.
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
@ -200,7 +208,7 @@ CLASS ZCL_ABAPGIT_SYNTAX_HIGHLIGHTER IMPLEMENTATION.
|
||||||
|
|
||||||
|
|
||||||
" Process syntax-dependent regex table and find all matches
|
" Process syntax-dependent regex table and find all matches
|
||||||
LOOP AT mt_rules ASSIGNING <ls_regex>.
|
LOOP AT mt_rules ASSIGNING <ls_regex> WHERE regex IS BOUND.
|
||||||
lo_regex = <ls_regex>-regex.
|
lo_regex = <ls_regex>-regex.
|
||||||
lo_matcher = lo_regex->create_matcher( text = iv_line ).
|
lo_matcher = lo_regex->create_matcher( text = iv_line ).
|
||||||
lt_result = lo_matcher->find_all( ).
|
lt_result = lo_matcher->find_all( ).
|
||||||
|
|
297
src/syntax/zcl_abapgit_syntax_js.clas.abap
Normal file
297
src/syntax/zcl_abapgit_syntax_js.clas.abap
Normal file
|
@ -0,0 +1,297 @@
|
||||||
|
CLASS zcl_abapgit_syntax_js DEFINITION
|
||||||
|
PUBLIC
|
||||||
|
INHERITING FROM zcl_abapgit_syntax_highlighter
|
||||||
|
CREATE PUBLIC .
|
||||||
|
|
||||||
|
PUBLIC SECTION.
|
||||||
|
|
||||||
|
CONSTANTS:
|
||||||
|
" JavaScript
|
||||||
|
" 1) General keywords
|
||||||
|
" 2) Variable types
|
||||||
|
" 3) HTML Tags
|
||||||
|
BEGIN OF c_css,
|
||||||
|
keyword TYPE string VALUE 'keyword', "#EC NOTEXT
|
||||||
|
text TYPE string VALUE 'text', "#EC NOTEXT
|
||||||
|
comment TYPE string VALUE 'comment', "#EC NOTEXT
|
||||||
|
variables TYPE string VALUE 'variables', "#EC NOTEXT
|
||||||
|
END OF c_css .
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_token,
|
||||||
|
keyword TYPE c VALUE 'K', "#EC NOTEXT
|
||||||
|
text TYPE c VALUE 'T', "#EC NOTEXT
|
||||||
|
comment TYPE c VALUE 'C', "#EC NOTEXT
|
||||||
|
variables TYPE c VALUE 'V', "#EC NOTEXT
|
||||||
|
END OF c_token .
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_regex,
|
||||||
|
" comments /* ... */ or //
|
||||||
|
comment TYPE string VALUE '\/\*.*\*\/|\/\*|\*\/|\/\/', "#EC NOTEXT
|
||||||
|
" single or double quoted strings
|
||||||
|
text TYPE string VALUE '"|''', "#EC NOTEXT
|
||||||
|
" in general keywords don't contain numbers (except -ms-scrollbar-3dlight-color)
|
||||||
|
keyword TYPE string VALUE '\b[a-z-]+\b', "#EC NOTEXT
|
||||||
|
END OF c_regex .
|
||||||
|
|
||||||
|
CLASS-METHODS class_constructor .
|
||||||
|
METHODS constructor .
|
||||||
|
PROTECTED SECTION.
|
||||||
|
|
||||||
|
TYPES: BEGIN OF ty_keyword,
|
||||||
|
keyword TYPE string,
|
||||||
|
token TYPE char1,
|
||||||
|
END OF ty_keyword.
|
||||||
|
|
||||||
|
CLASS-DATA gt_keywords TYPE HASHED TABLE OF ty_keyword WITH UNIQUE KEY keyword.
|
||||||
|
CLASS-DATA gv_comment TYPE abap_bool.
|
||||||
|
|
||||||
|
CLASS-METHODS init_keywords.
|
||||||
|
CLASS-METHODS insert_keywords
|
||||||
|
IMPORTING
|
||||||
|
iv_keywords TYPE string
|
||||||
|
iv_token TYPE char1.
|
||||||
|
CLASS-METHODS is_keyword
|
||||||
|
IMPORTING iv_chunk TYPE string
|
||||||
|
RETURNING VALUE(rv_yes) TYPE abap_bool.
|
||||||
|
|
||||||
|
METHODS order_matches REDEFINITION.
|
||||||
|
METHODS parse_line REDEFINITION.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
CLASS ZCL_ABAPGIT_SYNTAX_JS IMPLEMENTATION.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD class_constructor.
|
||||||
|
|
||||||
|
init_keywords( ).
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD constructor.
|
||||||
|
|
||||||
|
super->constructor( ).
|
||||||
|
|
||||||
|
" Initialize instances of regular expression
|
||||||
|
|
||||||
|
add_rule( iv_regex = c_regex-keyword
|
||||||
|
iv_token = c_token-keyword
|
||||||
|
iv_style = c_css-keyword ).
|
||||||
|
|
||||||
|
add_rule( iv_regex = c_regex-comment
|
||||||
|
iv_token = c_token-comment
|
||||||
|
iv_style = c_css-comment ).
|
||||||
|
|
||||||
|
add_rule( iv_regex = c_regex-text
|
||||||
|
iv_token = c_token-text
|
||||||
|
iv_style = c_css-text ).
|
||||||
|
|
||||||
|
" Styles for keywords
|
||||||
|
add_rule( iv_regex = ''
|
||||||
|
iv_token = c_token-variables
|
||||||
|
iv_style = c_css-variables ).
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD init_keywords.
|
||||||
|
|
||||||
|
DATA: lv_keywords TYPE string.
|
||||||
|
|
||||||
|
CLEAR gt_keywords.
|
||||||
|
|
||||||
|
" 1) General keywords
|
||||||
|
lv_keywords =
|
||||||
|
'alert|all|body|break|bytetostring|case|continue|default|delete|do|document|else|event|export|for|function|if|' &&
|
||||||
|
'import|in|innerhtml|isnan|item|mimetypes|navigator|new|onabort|onblur|onchange|onclick|ondblclick|ondragdrop|' &&
|
||||||
|
'onerror|onfocus|onkeydown|onkeypress|onkeyup|onload|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|' &&
|
||||||
|
'onmove|onreset|onselect|onsubmit|onunload|onresize|options|parsefloat|parseint|prototype|return|screen|switch|' &&
|
||||||
|
'unit|var|void|while|window|with|anchor|applet|area|button|checkbox|fileupload|form|frame|hidden|link|mimetype|' &&
|
||||||
|
'password|plugin|radio|reset|select|submit|text|textarea|abs|acos|alert|anchor|asin|atan|atan2|back|big|blink|' &&
|
||||||
|
'blur|bold|captureevents|ceil|charat|charcodeat|clearinterval|cleartimeout|click|close|concat|confirm|cos|' &&
|
||||||
|
'disableexternalcapture|enableexternalcapture|eval|exp|find|fixed|floor|focus|fontcolor|fontsize|forward|' &&
|
||||||
|
'fromcharcode|getdate|getday|getelementbyid|gethours|getminutes|getmonth|getoptionvalue|getoptionvaluecount|' &&
|
||||||
|
'getseconds|getselection|gettime|gettimezoneoffset|getyear|go|handleevent|home|indexof|italics|javaenabled|join|' &&
|
||||||
|
'lastindexof|link|load|log|match|max|min|moveabove|movebelow|moveby|moveto|movetoabsolute|open|parse|plugins|' &&
|
||||||
|
'pop|pow|preference|print|prompt|push|random|refresh|releaseevents|reload|replace|reset|resizeby|resizeto|' &&
|
||||||
|
'reverse|round|routeevent|scroll|scrollby|scrollto|search|select|setdate|sethours|setinterval|setminutes|' &&
|
||||||
|
'setmonth|setseconds|settime|settimeout|setyear|shift|sin|slice|small|sort|splice|split|sqrt|stop|strike|sub|' &&
|
||||||
|
'submit|substr|substring|sup|taintenabled|tan|togmtstring|tolocalestring|tolowercase|tostring|touppercase|' &&
|
||||||
|
'unshift|unwatch|utc|valueof|watch|write|writeln|e|ln10|ln2|log10e|log2e|max_value|min_value|negative_infinity|' &&
|
||||||
|
'nan|pi|positive_infinity|url|above|action|alinkcolor|anchors|appcodename|appname|appversion|applets|arguments|' &&
|
||||||
|
'arity|availheight|availwidth|background|backgroundcolor|below|bgcolor|border|bottom|caller|cancelbubble|' &&
|
||||||
|
'checked|clientheight|clientwidth|clientx|clienty|clip|closed|color|colordepth|complete|constructor|cookie|' &&
|
||||||
|
'count|current|defaultchecked|defaultselected|defaultstatus|defaultvalue|description|display|document|domain|' &&
|
||||||
|
'elements|embeds|enabledplugin|encoding|false|fgcolor|filename|form|formname|forms|frames|hash|height|history|' &&
|
||||||
|
'host|hostname|href|hspace|images|innerheight|innerwidth|language|lastmodified|layers|left|length|linkcolor|' &&
|
||||||
|
'links|location|locationbar|lowsrc|menubar|method|mimetypes|name|next|null|offsetheight|offsetleft|offsetparent|' &&
|
||||||
|
'offsetwidth|opener|outerheight|outerwidth|pagex|pagexoffset|pagey|pageyoffset|parent|parentlayer|pathname|' &&
|
||||||
|
'personalbar|pixeldepth|platform|plugins|port|poswidth|previous|protocol|prototype|referrer|right|scrolltop|' &&
|
||||||
|
'scrollbars|search|selected|selectedindex|self|siblingabove|siblingbelow|src|srcelement|status|statusbar|style|' &&
|
||||||
|
'suffixes|tags|target|text|this|title|toolbar|top|true|type|useragent|value|visibility|vlinkcolor|vspace|width|' &&
|
||||||
|
'window|zindex'.
|
||||||
|
insert_keywords( iv_keywords = lv_keywords iv_token = c_token-keyword ).
|
||||||
|
|
||||||
|
" 2) Variable types
|
||||||
|
lv_keywords =
|
||||||
|
'array|boolean|date|function|image|layer|math|number|object|option|regexp|string'.
|
||||||
|
insert_keywords( iv_keywords = lv_keywords iv_token = c_token-variables ).
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD insert_keywords.
|
||||||
|
|
||||||
|
DATA: lt_keywords TYPE STANDARD TABLE OF string,
|
||||||
|
ls_keyword TYPE ty_keyword.
|
||||||
|
|
||||||
|
FIELD-SYMBOLS: <lv_keyword> TYPE any.
|
||||||
|
|
||||||
|
SPLIT iv_keywords AT '|' INTO TABLE lt_keywords.
|
||||||
|
|
||||||
|
LOOP AT lt_keywords ASSIGNING <lv_keyword>.
|
||||||
|
CLEAR ls_keyword.
|
||||||
|
ls_keyword-keyword = <lv_keyword>.
|
||||||
|
ls_keyword-token = iv_token.
|
||||||
|
INSERT ls_keyword INTO TABLE gt_keywords.
|
||||||
|
ENDLOOP.
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD is_keyword.
|
||||||
|
|
||||||
|
DATA lv_str TYPE string.
|
||||||
|
|
||||||
|
lv_str = to_lower( iv_chunk ).
|
||||||
|
READ TABLE gt_keywords WITH TABLE KEY keyword = lv_str TRANSPORTING NO FIELDS.
|
||||||
|
rv_yes = boolc( sy-subrc = 0 ).
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD order_matches.
|
||||||
|
|
||||||
|
DATA:
|
||||||
|
lv_match TYPE string,
|
||||||
|
lv_line_len TYPE i,
|
||||||
|
lv_cmmt_end TYPE i,
|
||||||
|
lv_prev_end TYPE i,
|
||||||
|
lv_prev_token TYPE c.
|
||||||
|
|
||||||
|
FIELD-SYMBOLS:
|
||||||
|
<ls_prev> TYPE ty_match,
|
||||||
|
<ls_match> TYPE ty_match,
|
||||||
|
<ls_keyword> TYPE ty_keyword.
|
||||||
|
|
||||||
|
" Longest matches
|
||||||
|
SORT ct_matches BY offset length DESCENDING.
|
||||||
|
|
||||||
|
lv_line_len = strlen( iv_line ).
|
||||||
|
|
||||||
|
" Check if this is part of multi-line comment and mark it accordingly
|
||||||
|
IF gv_comment = abap_true.
|
||||||
|
READ TABLE ct_matches WITH KEY token = c_token-comment TRANSPORTING NO FIELDS.
|
||||||
|
IF sy-subrc <> 0.
|
||||||
|
CLEAR ct_matches.
|
||||||
|
APPEND INITIAL LINE TO ct_matches ASSIGNING <ls_match>.
|
||||||
|
<ls_match>-token = c_token-comment.
|
||||||
|
<ls_match>-offset = 0.
|
||||||
|
<ls_match>-length = lv_line_len.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
LOOP AT ct_matches ASSIGNING <ls_match>.
|
||||||
|
" Delete matches after open text match
|
||||||
|
IF lv_prev_token = c_token-text AND <ls_match>-token <> c_token-text.
|
||||||
|
CLEAR <ls_match>-token.
|
||||||
|
CONTINUE.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
lv_match = substring( val = iv_line
|
||||||
|
off = <ls_match>-offset
|
||||||
|
len = <ls_match>-length ).
|
||||||
|
|
||||||
|
CASE <ls_match>-token.
|
||||||
|
WHEN c_token-keyword.
|
||||||
|
" Skip keyword that's part of previous (longer) keyword
|
||||||
|
IF <ls_match>-offset < lv_prev_end.
|
||||||
|
CLEAR <ls_match>-token.
|
||||||
|
CONTINUE.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
" Map generic keyword to specific token
|
||||||
|
lv_match = to_lower( lv_match ).
|
||||||
|
READ TABLE gt_keywords ASSIGNING <ls_keyword> WITH TABLE KEY keyword = lv_match.
|
||||||
|
IF sy-subrc = 0.
|
||||||
|
<ls_match>-token = <ls_keyword>-token.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
WHEN c_token-comment.
|
||||||
|
IF lv_match = '/*'.
|
||||||
|
DELETE ct_matches WHERE offset > <ls_match>-offset.
|
||||||
|
<ls_match>-length = lv_line_len - <ls_match>-offset.
|
||||||
|
gv_comment = abap_true.
|
||||||
|
ELSEIF lv_match = '//'.
|
||||||
|
DELETE ct_matches WHERE offset > <ls_match>-offset.
|
||||||
|
<ls_match>-length = lv_line_len - <ls_match>-offset.
|
||||||
|
ELSEIF lv_match = '*/'.
|
||||||
|
DELETE ct_matches WHERE offset < <ls_match>-offset.
|
||||||
|
<ls_match>-length = <ls_match>-offset + 2.
|
||||||
|
<ls_match>-offset = 0.
|
||||||
|
gv_comment = abap_false.
|
||||||
|
ELSE.
|
||||||
|
lv_cmmt_end = <ls_match>-offset + <ls_match>-length.
|
||||||
|
DELETE ct_matches WHERE offset > <ls_match>-offset AND offset <= lv_cmmt_end.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
WHEN c_token-text.
|
||||||
|
<ls_match>-text_tag = lv_match.
|
||||||
|
IF lv_prev_token = c_token-text.
|
||||||
|
IF <ls_match>-text_tag = <ls_prev>-text_tag.
|
||||||
|
<ls_prev>-length = <ls_match>-offset + <ls_match>-length - <ls_prev>-offset.
|
||||||
|
CLEAR lv_prev_token.
|
||||||
|
ENDIF.
|
||||||
|
CLEAR <ls_match>-token.
|
||||||
|
CONTINUE.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
ENDCASE.
|
||||||
|
|
||||||
|
lv_prev_token = <ls_match>-token.
|
||||||
|
lv_prev_end = <ls_match>-offset + <ls_match>-length.
|
||||||
|
ASSIGN <ls_match> TO <ls_prev>.
|
||||||
|
ENDLOOP.
|
||||||
|
|
||||||
|
DELETE ct_matches WHERE token IS INITIAL.
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD parse_line. "REDEFINITION
|
||||||
|
|
||||||
|
DATA lv_index TYPE i.
|
||||||
|
|
||||||
|
FIELD-SYMBOLS <ls_match> LIKE LINE OF rt_matches.
|
||||||
|
|
||||||
|
rt_matches = super->parse_line( iv_line ).
|
||||||
|
|
||||||
|
" Remove non-keywords
|
||||||
|
LOOP AT rt_matches ASSIGNING <ls_match> WHERE token = c_token-keyword.
|
||||||
|
lv_index = sy-tabix.
|
||||||
|
IF abap_false = is_keyword( substring( val = iv_line
|
||||||
|
off = <ls_match>-offset
|
||||||
|
len = <ls_match>-length ) ).
|
||||||
|
CLEAR <ls_match>-token.
|
||||||
|
ENDIF.
|
||||||
|
ENDLOOP.
|
||||||
|
|
||||||
|
DELETE rt_matches WHERE token IS INITIAL.
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
16
src/syntax/zcl_abapgit_syntax_js.clas.xml
Normal file
16
src/syntax/zcl_abapgit_syntax_js.clas.xml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
|
||||||
|
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
||||||
|
<asx:values>
|
||||||
|
<VSEOCLASS>
|
||||||
|
<CLSNAME>ZCL_ABAPGIT_SYNTAX_JS</CLSNAME>
|
||||||
|
<LANGU>E</LANGU>
|
||||||
|
<DESCRIPT>JavaScript Syntax Highlighting</DESCRIPT>
|
||||||
|
<STATE>1</STATE>
|
||||||
|
<CLSCCINCL>X</CLSCCINCL>
|
||||||
|
<FIXPT>X</FIXPT>
|
||||||
|
<UNICODE>X</UNICODE>
|
||||||
|
</VSEOCLASS>
|
||||||
|
</asx:values>
|
||||||
|
</asx:abap>
|
||||||
|
</abapGit>
|
103
src/syntax/zcl_abapgit_syntax_json.clas.abap
Normal file
103
src/syntax/zcl_abapgit_syntax_json.clas.abap
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
CLASS zcl_abapgit_syntax_json DEFINITION
|
||||||
|
PUBLIC
|
||||||
|
INHERITING FROM zcl_abapgit_syntax_highlighter
|
||||||
|
CREATE PUBLIC .
|
||||||
|
|
||||||
|
PUBLIC SECTION.
|
||||||
|
|
||||||
|
CONSTANTS:
|
||||||
|
" JSON... This was easy :-)
|
||||||
|
BEGIN OF c_css,
|
||||||
|
keyword TYPE string VALUE 'keyword', "#EC NOTEXT
|
||||||
|
text TYPE string VALUE 'text', "#EC NOTEXT
|
||||||
|
END OF c_css .
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_token,
|
||||||
|
keyword TYPE c VALUE 'K', "#EC NOTEXT
|
||||||
|
text TYPE c VALUE 'T', "#EC NOTEXT
|
||||||
|
END OF c_token .
|
||||||
|
CONSTANTS:
|
||||||
|
BEGIN OF c_regex,
|
||||||
|
" not much here
|
||||||
|
keyword TYPE string VALUE 'true|false|null', "#EC NOTEXT
|
||||||
|
" double quoted strings
|
||||||
|
text TYPE string VALUE '"', "#EC NOTEXT
|
||||||
|
END OF c_regex .
|
||||||
|
|
||||||
|
METHODS constructor .
|
||||||
|
PROTECTED SECTION.
|
||||||
|
|
||||||
|
METHODS order_matches REDEFINITION.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
CLASS ZCL_ABAPGIT_SYNTAX_JSON IMPLEMENTATION.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD constructor.
|
||||||
|
|
||||||
|
super->constructor( ).
|
||||||
|
|
||||||
|
" Initialize instances of regular expression
|
||||||
|
|
||||||
|
add_rule( iv_regex = c_regex-keyword
|
||||||
|
iv_token = c_token-keyword
|
||||||
|
iv_style = c_css-keyword ).
|
||||||
|
|
||||||
|
add_rule( iv_regex = c_regex-text
|
||||||
|
iv_token = c_token-text
|
||||||
|
iv_style = c_css-text ).
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD order_matches.
|
||||||
|
|
||||||
|
DATA:
|
||||||
|
lv_match TYPE string,
|
||||||
|
lv_line_len TYPE i,
|
||||||
|
lv_prev_token TYPE c.
|
||||||
|
|
||||||
|
FIELD-SYMBOLS:
|
||||||
|
<ls_prev> TYPE ty_match,
|
||||||
|
<ls_match> TYPE ty_match.
|
||||||
|
|
||||||
|
" Longest matches
|
||||||
|
SORT ct_matches BY offset length DESCENDING.
|
||||||
|
|
||||||
|
lv_line_len = strlen( iv_line ).
|
||||||
|
|
||||||
|
LOOP AT ct_matches ASSIGNING <ls_match>.
|
||||||
|
" Delete matches after open text match
|
||||||
|
IF lv_prev_token = c_token-text AND <ls_match>-token <> c_token-text.
|
||||||
|
CLEAR <ls_match>-token.
|
||||||
|
CONTINUE.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
lv_match = substring( val = iv_line
|
||||||
|
off = <ls_match>-offset
|
||||||
|
len = <ls_match>-length ).
|
||||||
|
|
||||||
|
IF <ls_match>-token = c_token-text.
|
||||||
|
<ls_match>-text_tag = lv_match.
|
||||||
|
IF lv_prev_token = c_token-text.
|
||||||
|
IF <ls_match>-text_tag = <ls_prev>-text_tag.
|
||||||
|
<ls_prev>-length = <ls_match>-offset + <ls_match>-length - <ls_prev>-offset.
|
||||||
|
CLEAR lv_prev_token.
|
||||||
|
ENDIF.
|
||||||
|
CLEAR <ls_match>-token.
|
||||||
|
CONTINUE.
|
||||||
|
ENDIF.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
|
lv_prev_token = <ls_match>-token.
|
||||||
|
ASSIGN <ls_match> TO <ls_prev>.
|
||||||
|
ENDLOOP.
|
||||||
|
|
||||||
|
DELETE ct_matches WHERE token IS INITIAL.
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
ENDCLASS.
|
16
src/syntax/zcl_abapgit_syntax_json.clas.xml
Normal file
16
src/syntax/zcl_abapgit_syntax_json.clas.xml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
|
||||||
|
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
||||||
|
<asx:values>
|
||||||
|
<VSEOCLASS>
|
||||||
|
<CLSNAME>ZCL_ABAPGIT_SYNTAX_JSON</CLSNAME>
|
||||||
|
<LANGU>E</LANGU>
|
||||||
|
<DESCRIPT>JSON Syntax Highlighting</DESCRIPT>
|
||||||
|
<STATE>1</STATE>
|
||||||
|
<CLSCCINCL>X</CLSCCINCL>
|
||||||
|
<FIXPT>X</FIXPT>
|
||||||
|
<UNICODE>X</UNICODE>
|
||||||
|
</VSEOCLASS>
|
||||||
|
</asx:values>
|
||||||
|
</asx:abap>
|
||||||
|
</abapGit>
|
|
@ -10,27 +10,33 @@ CLASS zcl_abapgit_syntax_xml DEFINITION
|
||||||
xml_tag TYPE string VALUE 'xml_tag', "#EC NOTEXT
|
xml_tag TYPE string VALUE 'xml_tag', "#EC NOTEXT
|
||||||
attr TYPE string VALUE 'attr', "#EC NOTEXT
|
attr TYPE string VALUE 'attr', "#EC NOTEXT
|
||||||
attr_val TYPE string VALUE 'attr_val', "#EC NOTEXT
|
attr_val TYPE string VALUE 'attr_val', "#EC NOTEXT
|
||||||
|
comment TYPE string VALUE 'comment', "#EC NOTEXT
|
||||||
END OF c_css .
|
END OF c_css .
|
||||||
CONSTANTS:
|
CONSTANTS:
|
||||||
BEGIN OF c_token,
|
BEGIN OF c_token,
|
||||||
xml_tag TYPE c VALUE 'X', "#EC NOTEXT
|
xml_tag TYPE c VALUE 'X', "#EC NOTEXT
|
||||||
attr TYPE c VALUE 'A', "#EC NOTEXT
|
attr TYPE c VALUE 'A', "#EC NOTEXT
|
||||||
attr_val TYPE c VALUE 'V', "#EC NOTEXT
|
attr_val TYPE c VALUE 'V', "#EC NOTEXT
|
||||||
|
comment TYPE c VALUE 'C', "#EC NOTEXT
|
||||||
END OF c_token .
|
END OF c_token .
|
||||||
CONSTANTS:
|
CONSTANTS:
|
||||||
BEGIN OF c_regex,
|
BEGIN OF c_regex,
|
||||||
"for XML tags, we will use a submatch
|
"for XML tags, we will use a submatch
|
||||||
" main pattern includes quoted strings so we can ignore < and > in attr values
|
" main pattern includes quoted strings so we can ignore < and > in attr values
|
||||||
xml_tag TYPE string VALUE '(?:"[^"]*")|(?:''[^'']*'')|([<>])', "#EC NOTEXT
|
xml_tag TYPE string VALUE '(?:"[^"]*")|(?:''[^'']*'')|([<>])', "#EC NOTEXT
|
||||||
attr TYPE string VALUE '(?:^|\s)[-a-z:_0-9]+\s*(?==)', "#EC NOTEXT
|
attr TYPE string VALUE '(?:^|\s)[-a-z:_0-9]+\s*(?==)', "#EC NOTEXT
|
||||||
attr_val TYPE string VALUE '("[^"]*")|(''[^'']*'')', "#EC NOTEXT
|
attr_val TYPE string VALUE '("[^"]*")|(''[^'']*'')', "#EC NOTEXT
|
||||||
|
" comments <!-- ... -->
|
||||||
|
comment TYPE string VALUE '[\<]!--.*--[\>]|[\<]!--|--[\>]', "#EC NOTEXT
|
||||||
END OF c_regex .
|
END OF c_regex .
|
||||||
|
|
||||||
METHODS constructor .
|
METHODS constructor .
|
||||||
PROTECTED SECTION.
|
PROTECTED SECTION.
|
||||||
|
CLASS-DATA gv_comment TYPE abap_bool.
|
||||||
|
|
||||||
METHODS order_matches REDEFINITION.
|
METHODS order_matches REDEFINITION.
|
||||||
|
|
||||||
|
PRIVATE SECTION.
|
||||||
ENDCLASS.
|
ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
@ -57,12 +63,19 @@ CLASS ZCL_ABAPGIT_SYNTAX_XML IMPLEMENTATION.
|
||||||
iv_token = c_token-attr_val
|
iv_token = c_token-attr_val
|
||||||
iv_style = c_css-attr_val ).
|
iv_style = c_css-attr_val ).
|
||||||
|
|
||||||
|
add_rule( iv_regex = c_regex-comment
|
||||||
|
iv_token = c_token-comment
|
||||||
|
iv_style = c_css-comment ).
|
||||||
|
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
METHOD order_matches.
|
METHOD order_matches.
|
||||||
|
|
||||||
DATA:
|
DATA:
|
||||||
|
lv_match TYPE string,
|
||||||
|
lv_line_len TYPE i,
|
||||||
|
lv_cmmt_end TYPE i,
|
||||||
lv_index TYPE sy-tabix,
|
lv_index TYPE sy-tabix,
|
||||||
lv_prev_token TYPE c,
|
lv_prev_token TYPE c,
|
||||||
lv_state TYPE c VALUE 'O'. " O - for open tag; C - for closed tag;
|
lv_state TYPE c VALUE 'O'. " O - for open tag; C - for closed tag;
|
||||||
|
@ -71,17 +84,33 @@ CLASS ZCL_ABAPGIT_SYNTAX_XML IMPLEMENTATION.
|
||||||
<ls_prev> TYPE ty_match,
|
<ls_prev> TYPE ty_match,
|
||||||
<ls_match> TYPE ty_match.
|
<ls_match> TYPE ty_match.
|
||||||
|
|
||||||
|
|
||||||
SORT ct_matches BY offset.
|
SORT ct_matches BY offset.
|
||||||
|
|
||||||
|
lv_line_len = strlen( iv_line ).
|
||||||
|
|
||||||
|
" Check if this is part of multi-line comment and mark it accordingly
|
||||||
|
IF gv_comment = abap_true.
|
||||||
|
READ TABLE ct_matches WITH KEY token = c_token-comment TRANSPORTING NO FIELDS.
|
||||||
|
IF sy-subrc <> 0.
|
||||||
|
CLEAR ct_matches.
|
||||||
|
APPEND INITIAL LINE TO ct_matches ASSIGNING <ls_match>.
|
||||||
|
<ls_match>-token = c_token-comment.
|
||||||
|
<ls_match>-offset = 0.
|
||||||
|
<ls_match>-length = lv_line_len.
|
||||||
|
RETURN.
|
||||||
|
ENDIF.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
LOOP AT ct_matches ASSIGNING <ls_match>.
|
LOOP AT ct_matches ASSIGNING <ls_match>.
|
||||||
lv_index = sy-tabix.
|
lv_index = sy-tabix.
|
||||||
|
|
||||||
|
lv_match = substring( val = iv_line
|
||||||
|
off = <ls_match>-offset
|
||||||
|
len = <ls_match>-length ).
|
||||||
|
|
||||||
CASE <ls_match>-token.
|
CASE <ls_match>-token.
|
||||||
WHEN c_token-xml_tag.
|
WHEN c_token-xml_tag.
|
||||||
<ls_match>-text_tag = substring( val = iv_line
|
<ls_match>-text_tag = lv_match.
|
||||||
off = <ls_match>-offset
|
|
||||||
len = <ls_match>-length ).
|
|
||||||
|
|
||||||
" No other matches between two tags
|
" No other matches between two tags
|
||||||
IF <ls_match>-text_tag = '>' AND lv_prev_token = c_token-xml_tag.
|
IF <ls_match>-text_tag = '>' AND lv_prev_token = c_token-xml_tag.
|
||||||
|
@ -101,6 +130,23 @@ CLASS ZCL_ABAPGIT_SYNTAX_XML IMPLEMENTATION.
|
||||||
lv_state = 'O'.
|
lv_state = 'O'.
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
|
WHEN c_token-comment.
|
||||||
|
IF lv_match = '<!--'.
|
||||||
|
DELETE ct_matches WHERE offset > <ls_match>-offset.
|
||||||
|
DELETE ct_matches WHERE offset = <ls_match>-offset AND token = c_token-xml_tag.
|
||||||
|
<ls_match>-length = lv_line_len - <ls_match>-offset.
|
||||||
|
gv_comment = abap_true.
|
||||||
|
ELSEIF lv_match = '-->'.
|
||||||
|
DELETE ct_matches WHERE offset < <ls_match>-offset.
|
||||||
|
<ls_match>-length = <ls_match>-offset + 3.
|
||||||
|
<ls_match>-offset = 0.
|
||||||
|
gv_comment = abap_false.
|
||||||
|
ELSE.
|
||||||
|
lv_cmmt_end = <ls_match>-offset + <ls_match>-length.
|
||||||
|
DELETE ct_matches WHERE offset > <ls_match>-offset AND offset <= lv_cmmt_end.
|
||||||
|
DELETE ct_matches WHERE offset = <ls_match>-offset AND token = c_token-xml_tag.
|
||||||
|
ENDIF.
|
||||||
|
|
||||||
WHEN OTHERS.
|
WHEN OTHERS.
|
||||||
IF lv_prev_token = c_token-xml_tag.
|
IF lv_prev_token = c_token-xml_tag.
|
||||||
<ls_prev>-length = <ls_match>-offset - <ls_prev>-offset. " Extend length of the opening tag
|
<ls_prev>-length = <ls_match>-offset - <ls_prev>-offset. " Extend length of the opening tag
|
||||||
|
|
|
@ -56,6 +56,9 @@ div.tutorial h1, h2 { color: var(--theme-primary-font-color); }
|
||||||
|
|
||||||
/* REPOSITORY */
|
/* REPOSITORY */
|
||||||
div.repo { background-color: var(--theme-container-background-color); }
|
div.repo { background-color: var(--theme-container-background-color); }
|
||||||
|
.repo_name span.name { color: var(--theme-primary-font-color-reduced); }
|
||||||
|
.repo_name span.url { color: #333; }
|
||||||
|
.repo_name a.url { color: #333; }
|
||||||
.repo_attr { color: var(--theme-primary-font-color); }
|
.repo_attr { color: var(--theme-primary-font-color); }
|
||||||
.repo_attr span.branch_branch {
|
.repo_attr span.branch_branch {
|
||||||
border-color: #ffffff;
|
border-color: #ffffff;
|
||||||
|
@ -100,12 +103,25 @@ table.diff_tab td,th { color: #fff; }
|
||||||
table.diff_tab thead.nav_line { background-color: var(--theme-container-background-color); }
|
table.diff_tab thead.nav_line { background-color: var(--theme-container-background-color); }
|
||||||
|
|
||||||
/* STYLES for Syntax Highlighting */
|
/* STYLES for Syntax Highlighting */
|
||||||
|
/* abap */
|
||||||
.syntax-hl span.keyword { color: #4af; }
|
.syntax-hl span.keyword { color: #4af; }
|
||||||
.syntax-hl span.text { color: #8f8; }
|
.syntax-hl span.text { color: #8f8; }
|
||||||
.syntax-hl span.comment { color: #999; }
|
.syntax-hl span.comment { color: #999; }
|
||||||
|
/* xml+html */
|
||||||
.syntax-hl span.xml_tag { color: #659cff; }
|
.syntax-hl span.xml_tag { color: #659cff; }
|
||||||
.syntax-hl span.attr { color: #bab2f9; }
|
.syntax-hl span.attr { color: #bab2f9; }
|
||||||
.syntax-hl span.attr_val { color: #b777fb; }
|
.syntax-hl span.attr_val { color: #b777fb; }
|
||||||
|
/* css+js */
|
||||||
|
.syntax-hl span.properties { color:#0a69ce; }
|
||||||
|
.syntax-hl span.values { color:blue; }
|
||||||
|
.syntax-hl span.units { color:maroon; }
|
||||||
|
.syntax-hl span.selectors { color:purple; }
|
||||||
|
.syntax-hl span.functions { color:purple; }
|
||||||
|
.syntax-hl span.colors { color:purple; }
|
||||||
|
.syntax-hl span.extensions { color:lightblue; }
|
||||||
|
.syntax-hl span.at_rules { color:lightblue; }
|
||||||
|
.syntax-hl span.html { color:green; }
|
||||||
|
.syntax-hl span.variables { color:purple; }
|
||||||
|
|
||||||
/* DEBUG INFO STYLES */
|
/* DEBUG INFO STYLES */
|
||||||
div.debug_container#debug_info { color: var(--theme-primary-font-color); }
|
div.debug_container#debug_info { color: var(--theme-primary-font-color); }
|
||||||
|
|
|
@ -39,7 +39,7 @@ input:focus, textarea:focus { border-color: #8cadd9; }
|
||||||
.attention { color: red !important; }
|
.attention { color: red !important; }
|
||||||
.error { color: #d41919 !important; }
|
.error { color: #d41919 !important; }
|
||||||
.warning { color: #efb301 !important; }
|
.warning { color: #efb301 !important; }
|
||||||
.success { color: green !important; }
|
.success { color: green !important; }
|
||||||
.blue { color: #5e8dc9 !important; }
|
.blue { color: #5e8dc9 !important; }
|
||||||
.red { color: red !important; }
|
.red { color: red !important; }
|
||||||
.white { color: white !important; }
|
.white { color: white !important; }
|
||||||
|
@ -298,12 +298,25 @@ table.diff_tab td.patch, th.patch {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* STYLES for Syntax Highlighting */
|
/* STYLES for Syntax Highlighting */
|
||||||
|
/* abap */
|
||||||
.syntax-hl span.keyword { color: #0a69ce; }
|
.syntax-hl span.keyword { color: #0a69ce; }
|
||||||
.syntax-hl span.text { color: #48ce4f; }
|
.syntax-hl span.text { color: #48ce4f; }
|
||||||
.syntax-hl span.comment { color: var(--theme-greyscale-dark); font-style: italic; }
|
.syntax-hl span.comment { color: var(--theme-greyscale-dark); font-style: italic; }
|
||||||
|
/* xml+html */
|
||||||
.syntax-hl span.xml_tag { color: #457ce3; }
|
.syntax-hl span.xml_tag { color: #457ce3; }
|
||||||
.syntax-hl span.attr { color: #b777fb; }
|
.syntax-hl span.attr { color: #b777fb; }
|
||||||
.syntax-hl span.attr_val { color: #7a02f9; }
|
.syntax-hl span.attr_val { color: #7a02f9; }
|
||||||
|
/* css+js */
|
||||||
|
.syntax-hl span.properties { color:#0a69ce; }
|
||||||
|
.syntax-hl span.values { color:blue; }
|
||||||
|
.syntax-hl span.units { color:maroon; }
|
||||||
|
.syntax-hl span.selectors { color:purple; }
|
||||||
|
.syntax-hl span.functions { color:purple; }
|
||||||
|
.syntax-hl span.colors { color:purple; }
|
||||||
|
.syntax-hl span.extensions { color:darkblue; }
|
||||||
|
.syntax-hl span.at_rules { color:darkblue; }
|
||||||
|
.syntax-hl span.html { color:green; }
|
||||||
|
.syntax-hl span.variables { color:purple; }
|
||||||
|
|
||||||
/* DEBUG INFO STYLES */
|
/* DEBUG INFO STYLES */
|
||||||
div.debug_container { color: #444; }
|
div.debug_container { color: #444; }
|
||||||
|
|
|
@ -66,7 +66,7 @@ ENDCLASS.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CLASS zcl_abapgit_file_status IMPLEMENTATION.
|
CLASS ZCL_ABAPGIT_FILE_STATUS IMPLEMENTATION.
|
||||||
|
|
||||||
|
|
||||||
METHOD build_existing.
|
METHOD build_existing.
|
||||||
|
@ -291,6 +291,24 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION.
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
|
METHOD get_object_package.
|
||||||
|
DATA: lv_name TYPE devclass,
|
||||||
|
li_package TYPE REF TO zif_abapgit_sap_package.
|
||||||
|
|
||||||
|
rv_devclass = zcl_abapgit_factory=>get_tadir( )->get_object_package(
|
||||||
|
iv_object = iv_object
|
||||||
|
iv_obj_name = iv_obj_name ).
|
||||||
|
IF rv_devclass IS INITIAL AND iv_object = 'DEVC' AND iv_obj_name(1) = '$'.
|
||||||
|
" local packages usually have no tadir entry
|
||||||
|
lv_name = iv_obj_name.
|
||||||
|
li_package = zcl_abapgit_factory=>get_sap_package( lv_name ).
|
||||||
|
IF li_package->exists( ) = abap_true.
|
||||||
|
rv_devclass = lv_name.
|
||||||
|
ENDIF.
|
||||||
|
ENDIF.
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
|
|
||||||
METHOD identify_object.
|
METHOD identify_object.
|
||||||
|
|
||||||
DATA: lv_name TYPE tadir-obj_name,
|
DATA: lv_name TYPE tadir-obj_name,
|
||||||
|
@ -454,21 +472,4 @@ CLASS zcl_abapgit_file_status IMPLEMENTATION.
|
||||||
iv_top = io_repo->get_package( ) ).
|
iv_top = io_repo->get_package( ) ).
|
||||||
|
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
METHOD get_object_package.
|
|
||||||
DATA: lv_name TYPE devclass,
|
|
||||||
li_package TYPE REF TO zif_abapgit_sap_package.
|
|
||||||
|
|
||||||
rv_devclass = zcl_abapgit_factory=>get_tadir( )->get_object_package(
|
|
||||||
iv_object = iv_object
|
|
||||||
iv_obj_name = iv_obj_name ).
|
|
||||||
IF rv_devclass IS INITIAL AND iv_object = 'DEVC' AND iv_obj_name(1) = '$'.
|
|
||||||
" local packages usually have no tadir entry
|
|
||||||
lv_name = iv_obj_name.
|
|
||||||
li_package = zcl_abapgit_factory=>get_sap_package( lv_name ).
|
|
||||||
IF li_package->exists( ) = abap_true.
|
|
||||||
rv_devclass = lv_name.
|
|
||||||
ENDIF.
|
|
||||||
ENDIF.
|
|
||||||
ENDMETHOD.
|
|
||||||
ENDCLASS.
|
ENDCLASS.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user