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. CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_css.
ELSEIF iv_filename CP '*.js'. ELSEIF iv_filename CP '*.js'.
CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_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. CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_json.
ELSEIF iv_filename CP '*.txt' OR iv_filename CP '*.ini' OR iv_filename CP '*.text'. ELSEIF iv_filename CP '*.txt' OR iv_filename CP '*.ini' OR iv_filename CP '*.text'.
CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_txt. CREATE OBJECT ro_instance TYPE zcl_abapgit_syntax_txt.

View File

@ -1,30 +1,37 @@
CLASS zcl_abapgit_syntax_json DEFINITION CLASS zcl_abapgit_syntax_json DEFINITION
PUBLIC PUBLIC
INHERITING FROM zcl_abapgit_syntax_highlighter INHERITING FROM zcl_abapgit_syntax_highlighter
CREATE PUBLIC . CREATE PUBLIC.
PUBLIC SECTION. PUBLIC SECTION.
CONSTANTS: CONSTANTS:
" JSON... This was easy :-) " JSON... This was easy :-)
" JSONC... With comments
BEGIN OF c_css, 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 text TYPE string VALUE 'text', "#EC NOTEXT
END OF c_css . values TYPE string VALUE 'properties', "#EC NOTEXT
comment TYPE string VALUE 'comment', "#EC NOTEXT
END OF c_css.
CONSTANTS: CONSTANTS:
BEGIN OF c_token, BEGIN OF c_token,
keyword TYPE c VALUE 'K', "#EC NOTEXT keyword TYPE c VALUE 'K', "#EC NOTEXT
text TYPE c VALUE 'T', "#EC NOTEXT text TYPE c VALUE 'T', "#EC NOTEXT
END OF c_token . values TYPE c VALUE 'V', "#EC NOTEXT
comment TYPE c VALUE 'C', "#EC NOTEXT
END OF c_token.
CONSTANTS: CONSTANTS:
BEGIN OF c_regex, BEGIN OF c_regex,
" comments /* ... */ or //
comment TYPE string VALUE '\/\*.*\*\/|\/\*|\*\/|\/\/', "#EC NOTEXT
" not much here " not much here
keyword TYPE string VALUE 'true|false|null', "#EC NOTEXT keyword TYPE string VALUE 'true|false|null', "#EC NOTEXT
" double quoted strings " double quoted strings
text TYPE string VALUE '"', "#EC NOTEXT text TYPE string VALUE '"', "#EC NOTEXT
END OF c_regex . END OF c_regex.
METHODS constructor . METHODS constructor.
PROTECTED SECTION. PROTECTED SECTION.
METHODS order_matches REDEFINITION. METHODS order_matches REDEFINITION.
@ -34,7 +41,7 @@ ENDCLASS.
CLASS ZCL_ABAPGIT_SYNTAX_JSON IMPLEMENTATION. CLASS zcl_abapgit_syntax_json IMPLEMENTATION.
METHOD constructor. METHOD constructor.
@ -47,10 +54,21 @@ CLASS ZCL_ABAPGIT_SYNTAX_JSON IMPLEMENTATION.
iv_token = c_token-keyword iv_token = c_token-keyword
iv_style = c_css-keyword ). iv_style = c_css-keyword ).
" Style for keys
add_rule( iv_regex = c_regex-text add_rule( iv_regex = c_regex-text
iv_token = c_token-text iv_token = c_token-text
iv_style = c_css-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. ENDMETHOD.
@ -58,6 +76,7 @@ CLASS ZCL_ABAPGIT_SYNTAX_JSON IMPLEMENTATION.
DATA: DATA:
lv_match TYPE string, lv_match TYPE string,
lv_count TYPE i,
lv_line_len TYPE i, lv_line_len TYPE i,
lv_prev_token TYPE c. lv_prev_token TYPE c.
@ -99,5 +118,13 @@ CLASS ZCL_ABAPGIT_SYNTAX_JSON IMPLEMENTATION.
DELETE ct_matches WHERE token IS INITIAL. 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. ENDMETHOD.
ENDCLASS. 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> <CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT> <FIXPT>X</FIXPT>
<UNICODE>X</UNICODE> <UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS> </VSEOCLASS>
</asx:values> </asx:values>
</asx:abap> </asx:abap>