diff --git a/src/zabapgit_css_common.w3mi.data.css b/src/zabapgit_css_common.w3mi.data.css index f81327870..924b1d664 100644 --- a/src/zabapgit_css_common.w3mi.data.css +++ b/src/zabapgit_css_common.w3mi.data.css @@ -503,6 +503,9 @@ table.diff_tab code { table.diff_tab code span.keyword { color: #0a69ce; } table.diff_tab code span.text { color: #48ce4f; } table.diff_tab code span.comment { color: #808080; font-style: italic; } +table.diff_tab code span.xml_tag { color: #3370e0; } +table.diff_tab code span.attr { color: #f20707; } +table.diff_tab code span.attr_val { color: #7a02f9; } table.diff_tab tbody tr:first-child td { padding-top: 0.5em; } table.diff_tab tbody tr:last-child td { padding-bottom: 0.5em; } diff --git a/src/zabapgit_syntax_highlighter.prog.abap b/src/zabapgit_syntax_highlighter.prog.abap index 718357b6c..65f8b1601 100644 --- a/src/zabapgit_syntax_highlighter.prog.abap +++ b/src/zabapgit_syntax_highlighter.prog.abap @@ -5,8 +5,8 @@ *& Class lcl_syntax_highligher *&---------------------------------------------------------------------* -CLASS ltcl_syntax_highlighter1 DEFINITION DEFERRED. -CLASS ltcl_syntax_highlighter2 DEFINITION DEFERRED. +CLASS ltcl_syntax_cases DEFINITION DEFERRED. +CLASS ltcl_syntax_basic_logic DEFINITION DEFERRED. CLASS lcl_syntax_abap DEFINITION DEFERRED. CLASS lcl_syntax_xml DEFINITION DEFERRED. @@ -15,9 +15,10 @@ CLASS lcl_syntax_xml DEFINITION DEFERRED. * CLASS lcl_syntax_highlighter DEFINITION *----------------------------------------------------------------------* CLASS lcl_syntax_highlighter DEFINITION ABSTRACT - FRIENDS ltcl_syntax_highlighter1 ltcl_syntax_highlighter2. + FRIENDS ltcl_syntax_cases ltcl_syntax_basic_logic. PUBLIC SECTION. + CLASS-METHODS create IMPORTING iv_filename TYPE string RETURNING VALUE(ro_instance) TYPE REF TO lcl_syntax_highlighter. @@ -27,6 +28,7 @@ CLASS lcl_syntax_highlighter DEFINITION ABSTRACT RETURNING VALUE(rv_line) TYPE string. PROTECTED SECTION. + TYPES: BEGIN OF ty_match, token TYPE char1, " Type of matches @@ -39,74 +41,37 @@ CLASS lcl_syntax_highlighter DEFINITION ABSTRACT ty_match_tt TYPE STANDARD TABLE OF ty_match WITH DEFAULT KEY. TYPES: - BEGIN OF ty_regex, + BEGIN OF ty_rule, regex TYPE REF TO cl_abap_regex, token TYPE char1, - END OF ty_regex. + style TYPE string, + END OF ty_rule. - TYPES: - BEGIN OF ty_style_map, - token TYPE char1, - style TYPE string, - END OF ty_style_map. + CONSTANTS c_token_none TYPE c VALUE '.'. - 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 - xml_tag TYPE string VALUE 'xml_tag', "#EC NOTEXT - attr TYPE string VALUE 'attr', "#EC NOTEXT - attr_val TYPE string VALUE 'attr_val', "#EC NOTEXT - none TYPE string VALUE 'none', "#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 - xml_tag TYPE c VALUE 'X', "#EC NOTEXT - attr TYPE c VALUE 'A', "#EC NOTEXT - attr_val TYPE c VALUE 'V', "#EC NOTEXT - none TYPE c VALUE 'N', "#EC NOTEXT - END OF c_token. - - CLASS-DATA: - BEGIN OF c_regex, - comment TYPE string, - text TYPE string, - keyword TYPE string, - xml_tag TYPE string, - attr TYPE string, - attr_val TYPE string, - END OF c_regex. - - CLASS-DATA: - mo_regex_table TYPE TABLE OF ty_regex, - mo_style_map TYPE TABLE OF ty_style_map. + DATA mt_rules TYPE STANDARD TABLE OF ty_rule. METHODS parse_line - IMPORTING iv_line TYPE string - RETURNING VALUE(rt_matches) TYPE ty_match_tt. + IMPORTING iv_line TYPE string + RETURNING VALUE(rt_matches) TYPE ty_match_tt. METHODS order_matches ABSTRACT - IMPORTING iv_line TYPE string - CHANGING ct_matches TYPE ty_match_tt. + IMPORTING iv_line TYPE string + CHANGING ct_matches TYPE ty_match_tt. METHODS extend_matches - IMPORTING iv_line TYPE string - CHANGING ct_matches TYPE ty_match_tt. + IMPORTING iv_line TYPE string + CHANGING ct_matches TYPE ty_match_tt. METHODS format_line - IMPORTING iv_line TYPE string - it_matches TYPE ty_match_tt - RETURNING VALUE(rv_line) TYPE string. + IMPORTING iv_line TYPE string + it_matches TYPE ty_match_tt + RETURNING VALUE(rv_line) TYPE string. METHODS apply_style - IMPORTING iv_line TYPE string - iv_class TYPE string - RETURNING VALUE(rv_line) TYPE string. + IMPORTING iv_line TYPE string + iv_class TYPE string + RETURNING VALUE(rv_line) TYPE string. ENDCLASS. " lcl_syntax_highlighter DEFINITION @@ -115,13 +80,40 @@ ENDCLASS. " lcl_syntax_highlighter DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -CLASS lcl_syntax_abap DEFINITION INHERITING FROM lcl_syntax_highlighter. +CLASS lcl_syntax_abap DEFINITION INHERITING FROM lcl_syntax_highlighter FINAL. PUBLIC SECTION. - CLASS-METHODS class_constructor. + + CLASS-METHODS class_constructor. + METHODS constructor. + + 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 + 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 + END OF c_token. PROTECTED SECTION. - CLASS-METHODS get_keywords RETURNING VALUE(rv_string) TYPE string. + + CLASS-DATA: + c_keyword_regex TYPE REF TO cl_abap_regex, " Temporary + BEGIN OF c_regex, + comment TYPE string, + text TYPE string, + keyword TYPE string, + END OF c_regex. + + CLASS-METHODS get_keywords + RETURNING VALUE(rv_string) TYPE string. + METHODS order_matches REDEFINITION. ENDCLASS. " lcl_syntax_abap DEFINITION @@ -131,11 +123,35 @@ ENDCLASS. " lcl_syntax_abap DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -CLASS lcl_syntax_xml DEFINITION INHERITING FROM lcl_syntax_highlighter. +CLASS lcl_syntax_xml DEFINITION INHERITING FROM lcl_syntax_highlighter FINAL. + PUBLIC SECTION. - CLASS-METHODS class_constructor. + + METHODS constructor. + + CONSTANTS: + BEGIN OF c_css, + xml_tag TYPE string VALUE 'xml_tag', "#EC NOTEXT + attr TYPE string VALUE 'attr', "#EC NOTEXT + attr_val TYPE string VALUE 'attr_val', "#EC NOTEXT + END OF c_css. + + CONSTANTS: + BEGIN OF c_token, + xml_tag TYPE c VALUE 'X', "#EC NOTEXT + attr TYPE c VALUE 'A', "#EC NOTEXT + attr_val TYPE c VALUE 'V', "#EC NOTEXT + END OF c_token. PROTECTED SECTION. + + CLASS-DATA: + BEGIN OF c_regex, + xml_tag TYPE string, + attr TYPE string, + attr_val TYPE string, + END OF c_regex. + METHODS order_matches REDEFINITION. ENDCLASS. " lcl_syntax_xml DEFINITION @@ -144,34 +160,25 @@ ENDCLASS. " lcl_syntax_xml DEFINITION * Macros to fill table with a regular expressions to be parsed *----------------------------------------------------------------------* -DEFINE _add_regex. +DEFINE _add_rule. - CREATE OBJECT ls_regex_table-regex + CREATE OBJECT ls_rule-regex EXPORTING pattern = c_regex-&1 ignore_case = abap_true. - ls_regex_table-token = c_token-&1. - APPEND ls_regex_table TO mo_regex_table. + ls_rule-token = c_token-&1. + ls_rule-style = c_css-&1. + APPEND ls_rule TO mt_rules. -END-OF-DEFINITION. " _add_regex +END-OF-DEFINITION. " _add_rule -*----------------------------------------------------------------------* -* Macros to fill table with mapping of tokens against CSS-styles -*----------------------------------------------------------------------* - -DEFINE _add_style_mapping. - - ls_style_map-token = c_token-&1. - ls_style_map-style = c_css-&1. - APPEND ls_style_map TO mo_style_map. - -END-OF-DEFINITION. " _add_style_mapping *----------------------------------------------------------------------* * CLASS lcl_syntax_highlighter IMPLEMENTATION *----------------------------------------------------------------------* * Implementation of syntax highligther for ABAP source code *----------------------------------------------------------------------* + CLASS lcl_syntax_highlighter IMPLEMENTATION. METHOD create. @@ -196,12 +203,12 @@ CLASS lcl_syntax_highlighter IMPLEMENTATION. ls_match TYPE ty_match. FIELD-SYMBOLS: - TYPE ty_regex, + LIKE LINE OF mt_rules, TYPE match_result, TYPE ty_match. " Process syntax-dependent regex table and find all matches - LOOP AT mo_regex_table ASSIGNING . + LOOP AT mt_rules ASSIGNING . lo_regex = -regex. lo_matcher = lo_regex->create_matcher( text = iv_line ). lt_result = lo_matcher->find_all( ). @@ -219,6 +226,7 @@ CLASS lcl_syntax_highlighter IMPLEMENTATION. ENDMETHOD. " parse_line METHOD extend_matches. + DATA: lv_line_len TYPE i, lv_last_pos TYPE i VALUE 0, @@ -229,11 +237,13 @@ CLASS lcl_syntax_highlighter IMPLEMENTATION. lv_line_len = strlen( iv_line ). + SORT ct_matches BY offset. + " Add entries refering to parts of text that should not be formatted LOOP AT ct_matches ASSIGNING . IF -offset > lv_last_pos. lv_length = -offset - lv_last_pos. - ls_match-token = c_token-none. + ls_match-token = c_token_none. ls_match-offset = lv_last_pos. ls_match-length = lv_length. INSERT ls_match INTO ct_matches INDEX sy-tabix. @@ -244,7 +254,7 @@ CLASS lcl_syntax_highlighter IMPLEMENTATION. " Add remainder of the string IF lv_line_len > lv_last_pos. lv_length = lv_line_len - lv_last_pos. - ls_match-token = c_token-none. + ls_match-token = c_token_none. ls_match-offset = lv_last_pos. ls_match-length = lv_length. APPEND ls_match TO ct_matches. @@ -255,25 +265,19 @@ CLASS lcl_syntax_highlighter IMPLEMENTATION. METHOD format_line. DATA: - lv_chunk TYPE string, - lv_css_class TYPE string, - ls_style_map TYPE ty_style_map. + lv_chunk TYPE string, + ls_rule LIKE LINE OF mt_rules. FIELD-SYMBOLS TYPE ty_match. LOOP AT it_matches ASSIGNING . lv_chunk = substring( val = iv_line off = -offset len = -length ). - READ TABLE mo_style_map INTO ls_style_map WITH KEY token = -token. - - IF sy-subrc IS INITIAL. - lv_css_class = ls_style_map-style. - ELSE. - CLEAR: lv_css_class. - ENDIF. + CLEAR ls_rule. " Failed read equals no style + READ TABLE mt_rules INTO ls_rule WITH KEY token = -token. lv_chunk = me->apply_style( iv_line = lv_chunk - iv_class = lv_css_class ). + iv_class = ls_rule-style ). rv_line = rv_line && lv_chunk. ENDLOOP. @@ -321,31 +325,40 @@ ENDCLASS. " lcl_syntax_highlighter IMPLEMENTATION *----------------------------------------------------------------------* * Implementation of syntax highligther for XML source code *----------------------------------------------------------------------* + CLASS lcl_syntax_abap IMPLEMENTATION. METHOD class_constructor. - DATA: - ls_regex_table TYPE ty_regex, - ls_style_map TYPE ty_style_map. - - " Declare regular expressions' constants - c_regex-comment = '##|"|^\*'. "#EC NOTEXT - c_regex-text = '`|''|\||\{|\}'. "#EC NOTEXT - c_regex-keyword = '&&|\b(' && get_keywords( ) && ')\b'. "#EC NOTEXT - - " Initialize instances of regular expressions - _add_regex keyword. - _add_regex comment. - _add_regex text. - - " Initialize mapping of tokens and CSS-styles - _add_style_mapping keyword. - _add_style_mapping comment. - _add_style_mapping text. + CREATE OBJECT c_keyword_regex + EXPORTING + pattern = '&&|\b(' && get_keywords( ) && ')\b' + ignore_case = abap_true. ENDMETHOD. " class_constructor + METHOD constructor. + + DATA ls_rule LIKE LINE OF mt_rules. + + super->constructor( ). + + " Declare regular expressions' constants + c_regex-comment = '##|"|^\*'. "#EC NOTEXT + c_regex-text = '`|''|\||\{|\}'. "#EC NOTEXT + + " Initialize instances of regular expression + _add_rule comment. + _add_rule text. + + " Temporary + ls_rule-regex = c_keyword_regex. + ls_rule-token = c_token-keyword. + ls_rule-style = c_css-keyword. + APPEND ls_rule TO mt_rules. + + ENDMETHOD. " constructor + METHOD get_keywords. rv_string = @@ -426,7 +439,7 @@ CLASS lcl_syntax_abap IMPLEMENTATION. '|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC|SCIENTIFIC_WITH_LEADING_ZERO' && '|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH|SECONDARY|SECONDS|SECTION|SELECT|SELECTION' && '|SELECTIONS|SELECTION-SCREEN|SELECTION-SET|SELECTION-SETS|SELECTION-TABLE|SELECT-OPTIONS' && - '|SELECTOR|SELECTOR|SEND|SEPARATE|SEPARATED|SET|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN' && + '|SELECTOR|SEND|SEPARATE|SEPARATED|SET|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN' && '|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE' && '|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP' && '|STANDARD|STARTING|START-OF-SELECTION|STATE|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO' && @@ -443,6 +456,7 @@ CLASS lcl_syntax_abap IMPLEMENTATION. '|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER' && '|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITHOUT|WITH-TITLE|WORD|WORK' && '|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE'. + ENDMETHOD. " get_keywords. METHOD order_matches. @@ -478,10 +492,12 @@ CLASS lcl_syntax_abap IMPLEMENTATION. CONTINUE. ENDIF. ENDIF. + WHEN c_token-comment. -length = lv_line_len - -offset. DELETE ct_matches FROM lv_index + 1. CONTINUE. + WHEN c_token-text. -text_tag = substring( val = iv_line off = -offset len = -length ). IF lv_prev_token = c_token-text. @@ -503,12 +519,15 @@ CLASS lcl_syntax_abap IMPLEMENTATION. DELETE ct_matches INDEX lv_index. CONTINUE. ENDIF. + ENDCASE. lv_prev_token = -token. ASSIGN TO . ENDLOOP. + ENDMETHOD. " order_matches. + ENDCLASS. " lcl_syntax_abap IMPLEMENTATION *----------------------------------------------------------------------* @@ -517,29 +536,26 @@ ENDCLASS. " lcl_syntax_abap IMPLEMENTATION * *----------------------------------------------------------------------* CLASS lcl_syntax_xml IMPLEMENTATION. - METHOD class_constructor. - DATA: - ls_regex_table TYPE ty_regex, - ls_style_map TYPE ty_style_map. + METHOD constructor. - c_regex-xml_tag = '[<>]'. "#EC NOTEXT - c_regex-attr = '\s[a-z:]+\s*(?==)'. "#EC NOTEXT - c_regex-attr_val = '["''][^''"]+[''"]'. "#EC NOTEXT + DATA ls_rule LIKE LINE OF mt_rules. + + super->constructor( ). + + c_regex-xml_tag = '[<>]'. "#EC NOTEXT + c_regex-attr = '\s[-a-z:_0-9]+\s*(?==)'. "#EC NOTEXT + c_regex-attr_val = '["''][^''"]+[''"]'. "#EC NOTEXT " Initialize instances of regular expressions - _add_regex xml_tag. - _add_regex attr. - _add_regex attr_val. - - " Initialize mapping of tokens and CSS-styles - _add_style_mapping xml_tag. - _add_style_mapping attr. - _add_style_mapping attr_val. + _add_rule xml_tag. + _add_rule attr. + _add_rule attr_val. ENDMETHOD. METHOD order_matches. + DATA: lv_index TYPE sy-tabix, lv_line_len TYPE i, @@ -582,48 +598,54 @@ CLASS lcl_syntax_xml IMPLEMENTATION. DELETE ct_matches INDEX lv_index. CONTINUE. ENDIF. + ENDCASE. lv_prev_token = -token. ASSIGN TO . ENDLOOP. + ENDMETHOD. " order_matches + ENDCLASS. " lcl_syntax_xml IMPLEMENTATION *----------------------------------------------------------------------* -* CLASS ltcl_syntax_highlighter1 definition +* CLASS ltcl_syntax_cases definition *----------------------------------------------------------------------* -CLASS ltcl_syntax_highlighter1 DEFINITION FINAL +CLASS ltcl_syntax_cases DEFINITION FINAL FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. PRIVATE SECTION. DATA: - mo TYPE REF TO lcl_syntax_highlighter, mt_after_parse TYPE lcl_syntax_highlighter=>ty_match_tt, mt_after_order TYPE lcl_syntax_highlighter=>ty_match_tt, mt_after_extend TYPE lcl_syntax_highlighter=>ty_match_tt, ms_match TYPE lcl_syntax_highlighter=>ty_match. METHODS: - setup, - test IMPORTING iv_line TYPE string - iv_filename TYPE string - RETURNING VALUE(ro_instance) TYPE REF TO lcl_syntax_highlighter, - test01 FOR TESTING, - test02 FOR TESTING, - test03 FOR TESTING, - test04 FOR TESTING, - test05 FOR TESTING, - test06 FOR TESTING, - test07 FOR TESTING, - test08 FOR TESTING. + do_test IMPORTING iv_line TYPE string + iv_filename TYPE string + RETURNING VALUE(ro_instance) TYPE REF TO lcl_syntax_highlighter, + test_abap_01 FOR TESTING, + test_abap_02 FOR TESTING, + test_abap_03 FOR TESTING, + test_abap_04 FOR TESTING, + test_abap_05 FOR TESTING, + test_abap_06 FOR TESTING, + test_abap_07 FOR TESTING, + test_abap_08 FOR TESTING, + test_xml_01 FOR TESTING, + test_xml_02 FOR TESTING, + test_xml_03 FOR TESTING, + test_xml_04 FOR TESTING, + test_xml_05 FOR TESTING. -ENDCLASS. " ltcl_syntax_highlighter1 +ENDCLASS. " ltcl_syntax_cases *----------------------------------------------------------------------* -* CLASS ltcl_syntax_highlighter1 IMPLEMENTATION +* CLASS ltcl_syntax_cases IMPLEMENTATION *----------------------------------------------------------------------* -CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. +CLASS ltcl_syntax_cases IMPLEMENTATION. DEFINE _generate_parse. ms_match-token = &1. @@ -648,20 +670,14 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. append ms_match to mt_after_extend. END-OF-DEFINITION. " _generate_extend - METHOD setup. - CLEAR mt_after_parse. - CLEAR mt_after_order. - CLEAR mt_after_extend. - ENDMETHOD. " setup + METHOD do_test. - METHOD test. + DATA: lt_matches_act TYPE lcl_syntax_highlighter=>ty_match_tt, + lo TYPE REF TO lcl_syntax_highlighter. - DATA: - lt_matches_act TYPE lcl_syntax_highlighter=>ty_match_tt. - mo = lcl_syntax_highlighter=>create( iv_filename ). - - lt_matches_act = mo->parse_line( iv_line = iv_line ). + lo = lcl_syntax_highlighter=>create( iv_filename ). + lt_matches_act = lo->parse_line( iv_line = iv_line ). SORT lt_matches_act BY offset. @@ -669,15 +685,15 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. act = lt_matches_act msg = | Error during parsing: { iv_line }| ). - mo->order_matches( EXPORTING iv_line = iv_line + lo->order_matches( EXPORTING iv_line = iv_line CHANGING ct_matches = lt_matches_act ). cl_abap_unit_assert=>assert_equals( exp = mt_after_order act = lt_matches_act msg = | Error during ordering: { iv_line }| ). - mo->extend_matches( EXPORTING iv_line = iv_line - CHANGING ct_matches = lt_matches_act ). + lo->extend_matches( EXPORTING iv_line = iv_line + CHANGING ct_matches = lt_matches_act ). cl_abap_unit_assert=>assert_equals( exp = mt_after_extend act = lt_matches_act @@ -688,11 +704,9 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. ****************************************************** * Test parsing and ordering of comments * ****************************************************** - METHOD test01. + METHOD test_abap_01. - DATA: - lv_line TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT + DATA lv_line TYPE string. lv_line = '* commented out line with key word data'. "#EC NOTEXT @@ -711,18 +725,16 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. " Generate table with expected values after ordering _generate_extend 'C' 0 39 ''. - test( iv_line = lv_line iv_filename = lv_filename ). + do_test( iv_line = lv_line iv_filename = '*.abap' ). - ENDMETHOD. "test01 + ENDMETHOD. " test_abap_01 ****************************************************** * Test parsing and ordering of remainder of string * ****************************************************** - METHOD test02. + METHOD test_abap_02. - DATA: - lv_line TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT + DATA lv_line TYPE string. lv_line = 'data: lv_var_name type string.'. "#EC NOTEXT @@ -736,22 +748,20 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. " Generate table with expected values after extending _generate_extend 'K' 0 4 ''. - _generate_extend 'N' 4 14 ''. + _generate_extend '.' 4 14 ''. _generate_extend 'K' 18 4 ''. - _generate_extend 'N' 22 8 ''. + _generate_extend '.' 22 8 ''. - test( iv_line = lv_line iv_filename = lv_filename ). + do_test( iv_line = lv_line iv_filename = '*.abap' ). - ENDMETHOD. "test02 + ENDMETHOD. " test_abap_02 ****************************************************** * Test parsing and ordering of key words & texts * ****************************************************** - METHOD test03. + METHOD test_abap_03. - DATA: - lv_line TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT + DATA lv_line TYPE string. lv_line = 'call function ''FM_NAME''. " Commented'. "#EC NOTEXT @@ -771,25 +781,23 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. " Generate table with expected values after extending _generate_extend 'K' 0 4 ''. - _generate_extend 'N' 4 1 ''. + _generate_extend '.' 4 1 ''. _generate_extend 'K' 5 8 ''. - _generate_extend 'N' 13 1 ''. + _generate_extend '.' 13 1 ''. _generate_extend 'T' 14 9 ''''. - _generate_extend 'N' 23 2 ''. + _generate_extend '.' 23 2 ''. _generate_extend 'C' 25 11 ''. - test( iv_line = lv_line iv_filename = lv_filename ). + do_test( iv_line = lv_line iv_filename = '*.abap' ). - ENDMETHOD. "test03 + ENDMETHOD. " test_abap_03 ****************************************************** * Test parsing and ordering of key words in texts * ****************************************************** - METHOD test04. + METHOD test_abap_04. - DATA: - lv_line TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT + DATA lv_line TYPE string. lv_line = 'constants: lc_var type string value ''simpletext data simpletext''.'. "#EC NOTEXT @@ -809,26 +817,24 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. " Generate table with expected values after ordering _generate_extend 'K' 0 9 ''. - _generate_extend 'N' 9 9 ''. + _generate_extend '.' 9 9 ''. _generate_extend 'K' 18 4 ''. - _generate_extend 'N' 22 8 ''. + _generate_extend '.' 22 8 ''. _generate_extend 'K' 30 5 ''. - _generate_extend 'N' 35 1 ''. + _generate_extend '.' 35 1 ''. _generate_extend 'T' 36 28 ''''. - _generate_extend 'N' 64 1 ''. + _generate_extend '.' 64 1 ''. - test( iv_line = lv_line iv_filename = lv_filename ). + do_test( iv_line = lv_line iv_filename = '*.abap' ). - ENDMETHOD. "test04 + ENDMETHOD. " test_abap_04 ****************************************************** * Test parsing and ordering texts in curly brackets * ****************************************************** - METHOD test05. + METHOD test_abap_05. - DATA: - lv_line TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT + DATA lv_line TYPE string. lv_line = 'a = |{ b }={ c }|.'. "#EC NOTEXT @@ -848,28 +854,26 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. _generate_order 'T' 16 1 '}'. " Generate table with expected values after extending - _generate_extend 'N' 0 4 ''. + _generate_extend '.' 0 4 ''. _generate_extend 'T' 4 1 '|'. - _generate_extend 'N' 5 5 ''. + _generate_extend '.' 5 5 ''. _generate_extend 'T' 10 1 '}'. - _generate_extend 'N' 11 2 ''. + _generate_extend '.' 11 2 ''. _generate_extend 'K' 13 1 ''. - _generate_extend 'N' 14 2 ''. + _generate_extend '.' 14 2 ''. _generate_extend 'T' 16 1 '}'. - _generate_extend 'N' 17 1 ''. + _generate_extend '.' 17 1 ''. - test( iv_line = lv_line iv_filename = lv_filename ). + do_test( iv_line = lv_line iv_filename = '*.abap' ). - ENDMETHOD. "test05 + ENDMETHOD. " test_abap_05 ****************************************************** * Test parsing and ordering of texts * ****************************************************** - METHOD test06. + METHOD test_abap_06. - DATA: - lv_line TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT + DATA lv_line TYPE string. lv_line = 'lv_line = lc_constant && |XYZ { ''ab'' && |ac{ ''UU'' }| }|'. "#EC NOTEXT @@ -900,35 +904,33 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. _generate_order 'T' 54 1 '}'. " Generate table with expected values after extending - _generate_extend 'N' 00 22 ''. + _generate_extend '.' 00 22 ''. _generate_extend 'K' 22 2 ''. - _generate_extend 'N' 24 1 ''. + _generate_extend '.' 24 1 ''. _generate_extend 'T' 25 5 '|'. - _generate_extend 'N' 30 2 ''. + _generate_extend '.' 30 2 ''. _generate_extend 'T' 32 4 ''''. - _generate_extend 'N' 36 1 ''. + _generate_extend '.' 36 1 ''. _generate_extend 'K' 37 2 ''. - _generate_extend 'N' 39 1 ''. + _generate_extend '.' 39 1 ''. _generate_extend 'T' 40 3 '|'. - _generate_extend 'N' 43 2 ''. + _generate_extend '.' 43 2 ''. _generate_extend 'T' 45 4 ''''. - _generate_extend 'N' 49 2 ''. + _generate_extend '.' 49 2 ''. _generate_extend 'T' 51 1 '}'. - _generate_extend 'N' 52 2 ''. + _generate_extend '.' 52 2 ''. _generate_extend 'T' 54 1 '}'. - test( iv_line = lv_line iv_filename = lv_filename ). + do_test( iv_line = lv_line iv_filename = '*.abap' ). - ENDMETHOD. "test06 + ENDMETHOD. " test_abap_06 ******************************************************** * Check that '*' in select statement is not a match * ******************************************************** - METHOD test07. + METHOD test_abap_07. - DATA: - lv_line TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT + DATA lv_line TYPE string. lv_line = 'SELECT * FROM foo'. "#EC NOTEXT @@ -940,24 +942,22 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. _generate_order 'K' 0 6 ''. _generate_order 'K' 9 4 ''. - " Generate table with expected values after ordering + " Generate table with expected values after extending _generate_extend 'K' 0 6 ''. - _generate_extend 'N' 6 3 ''. + _generate_extend '.' 6 3 ''. _generate_extend 'K' 9 4 ''. - _generate_extend 'N' 13 4 ''. + _generate_extend '.' 13 4 ''. - test( iv_line = lv_line iv_filename = lv_filename ). + do_test( iv_line = lv_line iv_filename = '*.abap' ). - ENDMETHOD. "test07 + ENDMETHOD. " test_abap_07 ******************************************************** * Test parsing and ordering of key words in structures * ******************************************************** - METHOD test08. + METHOD test_abap_08. - DATA: - lv_line TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT + DATA lv_line TYPE string. lv_line = 'lv_length = -length.'. "#EC NOTEXT @@ -965,46 +965,197 @@ CLASS ltcl_syntax_highlighter1 IMPLEMENTATION. _generate_parse 'K' 13 5. _generate_parse 'K' 20 6. + " Generate table with expected values after extending + _generate_extend '.' 0 27 ''. + + do_test( iv_line = lv_line iv_filename = '*.abap' ). + + ENDMETHOD. " test_abap_08 + +******************************************************** +* Test parsing and ordering of tags in xml * +******************************************************** + METHOD test_xml_01. + + DATA lv_line TYPE string. + + lv_line = 'Text'. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'X' 0 1. + _generate_parse 'X' 4 1. + _generate_parse 'X' 9 1. + _generate_parse 'X' 14 1. + " Generate table with expected values after ordering - _generate_extend 'N' 0 27 ''. + _generate_order 'X' 0 5 '<'. + _generate_order 'X' 9 6 '<'. - test( iv_line = lv_line iv_filename = lv_filename ). + " Generate table with expected values after extending + _generate_extend 'X' 0 5 '<'. + _generate_extend '.' 5 4 ''. + _generate_extend 'X' 9 6 '<'. - ENDMETHOD. "test08 -ENDCLASS. " ltcl_syntax_highlighter1 IMPLEMENTATION + do_test( iv_line = lv_line iv_filename = '*.xml' ). + + ENDMETHOD. " test_xml_01 + + METHOD test_xml_02. + + DATA lv_line TYPE string. + + lv_line = ''. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'X' 0 1. + _generate_parse 'X' 5 1. + + " Generate table with expected values after ordering + _generate_order 'X' 0 6 '<'. + + " Generate table with expected values after extending + _generate_extend 'X' 0 6 '<'. + + do_test( iv_line = lv_line iv_filename = '*.xml' ). + + ENDMETHOD. " test_xml_02 + + METHOD test_xml_03. + + DATA lv_line TYPE string. + + lv_line = ''. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'X' 0 1. + _generate_parse 'A' 4 10. + _generate_parse 'V' 15 7. + _generate_parse 'X' 23 1. + + " Generate table with expected values after ordering + _generate_order 'X' 0 4 '<'. + _generate_order 'A' 4 10 ''. + _generate_order 'V' 15 7 ''. + _generate_order 'X' 22 2 '>'. + + " Generate table with expected values after extending + _generate_extend 'X' 0 4 '<'. + _generate_extend 'A' 4 10 ''. + _generate_extend '.' 14 1 ''. + _generate_extend 'V' 15 7 ''. + _generate_extend 'X' 22 2 '>'. + + do_test( iv_line = lv_line iv_filename = '*.xml' ). + + ENDMETHOD. " test_xml_03 + + METHOD test_xml_04. + + DATA lv_line TYPE string. + + lv_line = ''. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'X' 0 1. + _generate_parse 'A' 5 8. + _generate_parse 'V' 14 5. + _generate_parse 'X' 20 1. + + " Generate table with expected values after ordering + _generate_order 'X' 0 5 '<'. + _generate_order 'A' 5 8 ''. + _generate_order 'V' 14 5 ''. + _generate_order 'X' 19 2 '>'. + + " Generate table with expected values after extending + _generate_extend 'X' 0 5 '<'. + _generate_extend 'A' 5 8 ''. + _generate_extend '.' 13 1 ''. + _generate_extend 'V' 14 5 ''. + _generate_extend 'X' 19 2 '>'. + + do_test( iv_line = lv_line iv_filename = '*.xml' ). + + ENDMETHOD. " test_xml_04 + + METHOD test_xml_05. + + DATA lv_line TYPE string. + + lv_line = '"text"'. "#EC NOTEXT + + " Generate table with expected values after parsing + _generate_parse 'X' 0 1. + _generate_parse 'A' 7 6. + _generate_parse 'V' 14 4. + _generate_parse 'A' 18 6. + _generate_parse 'V' 25 4. + _generate_parse 'X' 29 1. + _generate_parse 'V' 30 6. + _generate_parse 'X' 36 1. + _generate_parse 'X' 44 1. + + " Generate table with expected values after ordering + _generate_order 'X' 0 7 '<'. + _generate_order 'A' 7 6 ''. + _generate_order 'V' 14 4 ''. + _generate_order 'A' 18 6 ''. + _generate_order 'V' 25 4 ''. + _generate_order 'X' 29 1 '>'. + _generate_order 'X' 36 9 '<'. + + " Generate table with expected values after extending + _generate_extend 'X' 0 7 '<'. + _generate_extend 'A' 7 6 ''. + _generate_extend '.' 13 1 ''. + _generate_extend 'V' 14 4 ''. + _generate_extend 'A' 18 6 ''. + _generate_extend '.' 24 1 ''. + _generate_extend 'V' 25 4 ''. + _generate_extend 'X' 29 1 '>'. + _generate_extend '.' 30 6 ''. + _generate_extend 'X' 36 9 '<'. + + do_test( iv_line = lv_line iv_filename = '*.xml' ). + + ENDMETHOD. " test_xml_05 +ENDCLASS. " ltcl_syntax_cases IMPLEMENTATION *----------------------------------------------------------------------* -* CLASS ltcl_syntax_highlighter2 DEFINITION +* CLASS ltcl_syntax_basic_logic DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -CLASS ltcl_syntax_highlighter2 DEFINITION FINAL +CLASS ltcl_syntax_basic_logic DEFINITION FINAL FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. PRIVATE SECTION. DATA mo TYPE REF TO lcl_syntax_highlighter. - METHODS: process_line FOR TESTING. - METHODS: format_line FOR TESTING. - METHODS: apply_style FOR TESTING. + METHODS: + setup, + process_line FOR TESTING, + format_line FOR TESTING, + apply_style FOR TESTING. -ENDCLASS. " ltcl_syntax_highlighter2 +ENDCLASS. " ltcl_syntax_basic_logic *----------------------------------------------------------------------* * CLASS ltcl_syntax_highlighter IMPLEMENTATION *----------------------------------------------------------------------* -CLASS ltcl_syntax_highlighter2 IMPLEMENTATION. +CLASS ltcl_syntax_basic_logic IMPLEMENTATION. + + METHOD setup. + mo = lcl_syntax_highlighter=>create( '*.abap' ). + ENDMETHOD. " setup + METHOD format_line. DATA: lv_line TYPE string, lv_line_act TYPE string, - lv_line_exp TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT. - - " Create syntax highlighter - mo = lcl_syntax_highlighter=>create( lv_filename ). + lv_line_exp TYPE string. lv_line = 'call function ''FM_NAME''. " Commented'. "#EC NOTEXT @@ -1023,29 +1174,22 @@ CLASS ltcl_syntax_highlighter2 IMPLEMENTATION. ENDMETHOD. " format_line METHOD apply_style. - DATA: - lv_line_act TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT. - " Create syntax highlighter - mo = lcl_syntax_highlighter=>create( lv_filename ). + DATA lv_line_act TYPE string. " Call the method and compare results lv_line_act = mo->apply_style( iv_line = 'CALL FUNCTION' "#EC NOTEXT - iv_class = lcl_syntax_highlighter=>c_css-keyword ). + iv_class = lcl_syntax_abap=>c_css-keyword ). cl_abap_unit_assert=>assert_equals( act = lv_line_act exp = 'CALL FUNCTION' "#EC NOTEXT msg = 'Failure during applying of style.' ). "#EC NOTEXT + ENDMETHOD. " apply_style METHOD process_line. - DATA: - lv_line_act TYPE string, - lv_filename TYPE string VALUE 'file_name.abap'. "#EC NOTEXT. - " Create syntax highlighter - mo = lcl_syntax_highlighter=>create( lv_filename ). + DATA lv_line_act TYPE string. " Call the method with empty parameter and compare results lv_line_act = mo->process_line( iv_line = '' ). @@ -1060,6 +1204,7 @@ CLASS ltcl_syntax_highlighter2 IMPLEMENTATION. cl_abap_unit_assert=>assert_equals( act = lv_line_act exp = '* CALL FUNCTION' "#EC NOTEXT msg = 'Failure in method process_line.' ). "#EC NOTEXT + ENDMETHOD. " process_line ENDCLASS. " ltcl_syntax_highlighter \ No newline at end of file