From ad1808cc7213b4242b2fc948bab810dc42edc2d9 Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Fri, 8 Apr 2022 11:12:36 +0200 Subject: [PATCH] Improve JSON syntax highlighter (#5450) --- .../zcl_abapgit_syntax_factory.clas.abap | 2 +- src/syntax/zcl_abapgit_syntax_json.clas.abap | 41 ++++++++++++++--- ..._abapgit_syntax_json.clas.testclasses.abap | 45 +++++++++++++++++++ src/syntax/zcl_abapgit_syntax_json.clas.xml | 1 + 4 files changed, 81 insertions(+), 8 deletions(-) create mode 100644 src/syntax/zcl_abapgit_syntax_json.clas.testclasses.abap diff --git a/src/syntax/zcl_abapgit_syntax_factory.clas.abap b/src/syntax/zcl_abapgit_syntax_factory.clas.abap index af5dda81e..3a36c2d7f 100644 --- a/src/syntax/zcl_abapgit_syntax_factory.clas.abap +++ b/src/syntax/zcl_abapgit_syntax_factory.clas.abap @@ -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. diff --git a/src/syntax/zcl_abapgit_syntax_json.clas.abap b/src/syntax/zcl_abapgit_syntax_json.clas.abap index 44e6fdb49..abcc984e7 100644 --- a/src/syntax/zcl_abapgit_syntax_json.clas.abap +++ b/src/syntax/zcl_abapgit_syntax_json.clas.abap @@ -1,30 +1,37 @@ CLASS zcl_abapgit_syntax_json DEFINITION PUBLIC INHERITING FROM zcl_abapgit_syntax_highlighter - CREATE PUBLIC . + CREATE PUBLIC. PUBLIC SECTION. 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 - END OF c_css . + 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 - END OF c_token . + 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 text TYPE string VALUE '"', "#EC NOTEXT - END OF c_regex . + END OF c_regex. - METHODS constructor . + METHODS constructor. PROTECTED SECTION. METHODS order_matches REDEFINITION. @@ -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 WHERE token = c_token-text. + lv_count = lv_count + 1. + IF lv_count >= 2. + -token = c_token-values. + ENDIF. + ENDLOOP. + ENDMETHOD. ENDCLASS. diff --git a/src/syntax/zcl_abapgit_syntax_json.clas.testclasses.abap b/src/syntax/zcl_abapgit_syntax_json.clas.testclasses.abap new file mode 100644 index 000000000..dd12c12fd --- /dev/null +++ b/src/syntax/zcl_abapgit_syntax_json.clas.testclasses.abap @@ -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 = |"key":"value"| ). + ENDMETHOD. + + METHOD comment_1. + cl_abap_unit_assert=>assert_equals( + act = mo_cut->process_line( |"key":"value" // comment| ) + exp = |"key":"value"| + && | // comment| ). + ENDMETHOD. + + METHOD comment_2. + cl_abap_unit_assert=>assert_equals( + act = mo_cut->process_line( |/* comment */| ) + exp = |/* comment */| ). + ENDMETHOD. + +ENDCLASS. diff --git a/src/syntax/zcl_abapgit_syntax_json.clas.xml b/src/syntax/zcl_abapgit_syntax_json.clas.xml index e2449bf1e..7de7ad88e 100644 --- a/src/syntax/zcl_abapgit_syntax_json.clas.xml +++ b/src/syntax/zcl_abapgit_syntax_json.clas.xml @@ -10,6 +10,7 @@ X X X + X