Improve JSON syntax highlighter (#5450)

This commit is contained in:
Marc Bernard 2022-04-08 11:12:36 +02:00 committed by GitHub
parent de39745541
commit ad1808cc72
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 81 additions and 8 deletions

View File

@ -31,7 +31,7 @@ CLASS zcl_abapgit_syntax_factory IMPLEMENTATION.
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'.
ELSEIF iv_filename CP '*.json' OR iv_filename CP '*.jsonc'.
CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_json.
ELSEIF iv_filename CP '*.txt' OR iv_filename CP '*.ini' OR iv_filename CP '*.text'.
CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_txt.

View File

@ -7,17 +7,24 @@ CLASS zcl_abapgit_syntax_json DEFINITION
CONSTANTS:
" JSON... This was easy :-)
" JSONC... With comments
BEGIN OF c_css,
keyword TYPE string VALUE 'keyword', "#EC NOTEXT
keyword TYPE string VALUE 'selectors', "#EC NOTEXT
text TYPE string VALUE 'text', "#EC NOTEXT
values TYPE string VALUE 'properties', "#EC NOTEXT
comment TYPE string VALUE 'comment', "#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
values TYPE c VALUE 'V', "#EC NOTEXT
comment TYPE c VALUE 'C', "#EC NOTEXT
END OF c_token.
CONSTANTS:
BEGIN OF c_regex,
" comments /* ... */ or //
comment TYPE string VALUE '\/\*.*\*\/|\/\*|\*\/|\/\/', "#EC NOTEXT
" not much here
keyword TYPE string VALUE 'true|false|null', "#EC NOTEXT
" double quoted strings
@ -34,7 +41,7 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_SYNTAX_JSON IMPLEMENTATION.
CLASS zcl_abapgit_syntax_json IMPLEMENTATION.
METHOD constructor.
@ -47,10 +54,21 @@ CLASS ZCL_ABAPGIT_SYNTAX_JSON IMPLEMENTATION.
iv_token = c_token-keyword
iv_style = c_css-keyword ).
" Style for keys
add_rule( iv_regex = c_regex-text
iv_token = c_token-text
iv_style = c_css-text ).
" Style for values
add_rule( iv_regex = ''
iv_token = c_token-values
iv_style = c_css-values ).
" JSONC comments
add_rule( iv_regex = c_regex-comment
iv_token = c_token-comment
iv_style = c_css-comment ).
ENDMETHOD.
@ -58,6 +76,7 @@ CLASS ZCL_ABAPGIT_SYNTAX_JSON IMPLEMENTATION.
DATA:
lv_match TYPE string,
lv_count TYPE i,
lv_line_len TYPE i,
lv_prev_token TYPE c.
@ -99,5 +118,13 @@ CLASS ZCL_ABAPGIT_SYNTAX_JSON IMPLEMENTATION.
DELETE ct_matches WHERE token IS INITIAL.
" Switch style of second text match to values
LOOP AT ct_matches ASSIGNING <ls_match> WHERE token = c_token-text.
lv_count = lv_count + 1.
IF lv_count >= 2.
<ls_match>-token = c_token-values.
ENDIF.
ENDLOOP.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,45 @@
CLASS ltcl_abapgit_syntax_json DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA:
mo_cut TYPE REF TO zcl_abapgit_syntax_json.
METHODS:
setup,
key_value FOR TESTING RAISING cx_static_check,
comment_1 FOR TESTING RAISING cx_static_check,
comment_2 FOR TESTING RAISING cx_static_check.
ENDCLASS.
CLASS ltcl_abapgit_syntax_json IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_cut.
ENDMETHOD.
METHOD key_value.
cl_abap_unit_assert=>assert_equals(
act = mo_cut->process_line( |"key":"value"| )
exp = |<span class="text">"key"</span>:<span class="properties">"value"</span>| ).
ENDMETHOD.
METHOD comment_1.
cl_abap_unit_assert=>assert_equals(
act = mo_cut->process_line( |"key":"value" // comment| )
exp = |<span class="text">"key"</span>:<span class="properties">"value"</span>|
&& | <span class="comment">//</span> comment| ).
ENDMETHOD.
METHOD comment_2.
cl_abap_unit_assert=>assert_equals(
act = mo_cut->process_line( |/* comment */| )
exp = |<span class="comment">/* comment */</span>| ).
ENDMETHOD.
ENDCLASS.

View File

@ -10,6 +10,7 @@
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS>
</asx:values>
</asx:abap>