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: TYPE ty_match, TYPE ty_match. " Longest matches SORT ct_matches BY offset length DESCENDING. lv_line_len = strlen( iv_line ). LOOP AT ct_matches ASSIGNING . " Delete matches after open text match IF lv_prev_token = c_token-text AND -token <> c_token-text. CLEAR -token. CONTINUE. ENDIF. lv_match = substring( val = iv_line off = -offset len = -length ). IF -token = c_token-text. -text_tag = lv_match. IF lv_prev_token = c_token-text. IF -text_tag = -text_tag. -length = -offset + -length - -offset. CLEAR lv_prev_token. ENDIF. CLEAR -token. CONTINUE. ENDIF. ENDIF. lv_prev_token = -token. ASSIGN TO . ENDLOOP. DELETE ct_matches WHERE token IS INITIAL. ENDMETHOD. ENDCLASS.