diff --git a/zabapgit.prog.abap b/zabapgit.prog.abap index 071042a72..1f1432841 100644 --- a/zabapgit.prog.abap +++ b/zabapgit.prog.abap @@ -14717,6 +14717,108 @@ CLASS lcl_git_porcelain DEFINITION FINAL. ENDCLASS. "lcl_porcelain DEFINITION +*----------------------------------------------------------------------* +* CLASS lcl_html_helper DEFINITION +*----------------------------------------------------------------------* +CLASS lcl_html_helper DEFINITION FINAL. + PUBLIC SECTION. + CONSTANTS mc_indent_size TYPE i VALUE 2. + + DATA mv_html TYPE string READ-ONLY. + DATA mv_indent TYPE i READ-ONLY. + + METHODS add IMPORTING iv_chunk TYPE any. + METHODS reset. + + PRIVATE SECTION. + METHODS _add_str IMPORTING iv_str TYPE csequence. + METHODS _add_htm IMPORTING io_html TYPE REF TO lcl_html_helper. + +endclass. "lcl_html_helper DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_html_helper IMPLEMENTATION +*----------------------------------------------------------------------* +CLASS lcl_html_helper IMPLEMENTATION. + METHOD add. + DATA lo_type TYPE REF TO cl_abap_typedescr. + DATA lo_html TYPE REF TO lcl_html_helper. + + lo_type = cl_abap_typedescr=>describe_by_data( iv_chunk ). + + CASE lo_type->type_kind. + WHEN cl_abap_typedescr=>typekind_char OR cl_abap_typedescr=>typekind_string. + _add_str( iv_chunk ). + WHEN cl_abap_typedescr=>typekind_oref. + ASSERT iv_chunk IS BOUND. " Dev mistake + TRY. + lo_html ?= iv_chunk. + CATCH cx_sy_move_cast_error. + ASSERT 1 = 0. " Dev mistake + ENDTRY. + _add_htm( lo_html ). + WHEN OTHERS. + ASSERT 1 = 0. " Dev mistake + ENDCASE. + + ENDMETHOD. " add + + METHOD reset. + CLEAR: me->mv_html, me->mv_indent. + ENDMETHOD. "reset + + METHOD _add_str. + DATA lv_tags TYPE i. + DATA lv_tags_open TYPE i. + DATA lv_tags_close TYPE i. + DATA lv_close_offs TYPE i. + DATA lv_shift_back TYPE i. + + FIND FIRST OCCURRENCE OF ' 0. " Found close tag @beginning + lv_shift_back = 1. + ENDIF. + + mv_html = mv_html + && repeat( val = ` ` occ = ( mv_indent - lv_shift_back ) * mc_indent_size ) + && iv_str + && gc_newline. + + FIND ALL OCCURRENCES OF '<' IN iv_str MATCH COUNT lv_tags. + FIND ALL OCCURRENCES OF ' lv_tags_close. " This logic chosen due to possible double tags in a line '' + mv_indent = mv_indent + 1. + ELSEIF lv_tags_open < lv_tags_close AND mv_indent > 0. + mv_indent = mv_indent - 1. + ENDIF. + + ENDMETHOD. "_add_str + + METHOD _add_htm. + DATA lv_indent_str TYPE string. + DATA lv_temp_str TYPE string. + + lv_indent_str = repeat( val = ` ` occ = mv_indent * mc_indent_size ). + lv_temp_str = io_html->mv_html. + + IF me->mv_indent > 0. + REPLACE ALL OCCURRENCES OF gc_newline IN lv_temp_str WITH gc_newline && lv_indent_str. + SHIFT lv_temp_str RIGHT DELETING TRAILING space. + SHIFT lv_temp_str LEFT DELETING LEADING space. + ENDIF. + + mv_html = mv_html && lv_indent_str && lv_temp_str. + mv_indent = mv_indent + io_html->mv_indent. + + ENDMETHOD. "_add_htm + +ENDCLASS. "lcl_html_helper IMPLEMENTATION + +*----------------------------------------------------------------------* +* INTERFACE lif_gui_page DEFINITION +*----------------------------------------------------------------------* INTERFACE lif_gui_page. METHODS: @@ -17088,131 +17190,206 @@ CLASS lcl_gui_page_diff DEFINITION FINAL. DATA: ms_result TYPE lcl_file_status=>ty_result, mo_diff TYPE REF TO lcl_diff. + METHODS styles RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + METHODS render_head RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + METHODS render_diff RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper. + ENDCLASS. CLASS lcl_gui_page_diff IMPLEMENTATION. METHOD constructor. ms_result = is_result. - mo_diff = io_diff. + mo_diff = io_diff. ENDMETHOD. + METHOD styles. + DATA lo_html TYPE REF TO lcl_html_helper. + CREATE OBJECT lo_html. + + lo_html->add( '' ). "#EC NOTEXT + + ro_html = lo_html. + ENDMETHOD. + + METHOD render_head. + DATA lo_html TYPE REF TO lcl_html_helper. + DATA ls_count TYPE lcl_diff=>ty_count. + CREATE OBJECT lo_html. + + ls_count = mo_diff->stats( ). + + lo_html->add( '
' ). "#EC NOTEXT + lo_html->add( |+ { ls_count-insert }| ). "#EC NOTEXT + lo_html->add( |- { ls_count-delete }| ). "#EC NOTEXT + lo_html->add( |~ { ls_count-update }| ). "#EC NOTEXT + lo_html->add( '' ). "#EC NOTEXT + lo_html->add( ms_result-obj_type ). "#EC NOTEXT + lo_html->add( |{ ms_result-obj_name }| ). "#EC NOTEXT + lo_html->add( |({ ms_result-filename })| ). + lo_html->add( '' ). "#EC NOTEXT + lo_html->add( '
' ). "#EC NOTEXT + + ro_html = lo_html. + ENDMETHOD. + + METHOD render_diff. + + DATA lo_html TYPE REF TO lcl_html_helper. + DATA lt_diffs TYPE lcl_diff=>ty_diffs_tt. + DATA lv_index TYPE i. + DATA lv_local TYPE string. + DATA lv_remote TYPE string. + DATA lv_attr_local TYPE string. + DATA lv_attr_remote TYPE string. + DATA lv_anchor_count LIKE sy-tabix. + DATA lv_anchor_name TYPE string. + + FIELD-SYMBOLS: LIKE LINE OF lt_diffs. + + CREATE OBJECT lo_html. + lt_diffs = mo_diff->get( ). + + lo_html->add( '
' ). "#EC NOTEXT + lo_html->add( '' ). "#EC NOTEXT + lo_html->add( '' ). "#EC NOTEXT + lo_html->add( '' ). "#EC NOTEXT + lo_html->add( '' ). "#EC NOTEXT + lo_html->add( '' ). "#EC NOTEXT + lo_html->add( '' ). "#EC NOTEXT + lo_html->add( '' ). "#EC NOTEXT + + LOOP AT lt_diffs ASSIGNING . + lv_index = sy-tabix. + lv_local = escape( val = -local format = cl_abap_format=>e_html_attr ). + lv_remote = escape( val = -remote format = cl_abap_format=>e_html_attr ). + + CLEAR: lv_attr_local, lv_attr_remote. + CASE -result. + WHEN lcl_diff=>c_diff-insert. + lv_attr_local = ' class="diff_ins"'. "#EC NOTEXT + WHEN lcl_diff=>c_diff-delete. + lv_attr_remote = ' class="diff_del"'. "#EC NOTEXT + WHEN lcl_diff=>c_diff-update. + lv_attr_local = ' class="diff_ins"'. "#EC NOTEXT + lv_attr_remote = ' class="diff_del"'. "#EC NOTEXT + ENDCASE. + + lo_html->add( '' ). "#EC NOTEXT + lo_html->add( || ). "#EC NOTEXT + lo_html->add( |{ lv_local }| ). "#EC NOTEXT + lo_html->add( || ). "#EC NOTEXT + lo_html->add( |{ lv_remote }| )."#EC NOTEXT + lo_html->add( '' ). "#EC NOTEXT + + ENDLOOP. + + lo_html->add( '
@LOCAL@REMOTE
{ lv_index }
' ). "#EC NOTEXT + lo_html->add( '
' ). "#EC NOTEXT + + ro_html = lo_html. + ENDMETHOD. + + METHOD lif_gui_page~on_event. CASE iv_action. WHEN 'back'. lcl_gui=>back( ). WHEN OTHERS. - _raise 'Unknown action'. + _raise 'Unknown action'. "#EC NOTEXT ENDCASE. ENDMETHOD. METHOD lif_gui_page~render. - DATA: lv_html TYPE string, - lv_local TYPE string, - lv_remote TYPE string, - lv_clocal TYPE string, - lv_cremote TYPE string, - ls_count TYPE lcl_diff=>ty_count, - lt_diffs TYPE lcl_diff=>ty_diffs_tt, - lv_anchor_count LIKE sy-tabix, - lv_anchor_name TYPE string. + DATA: lv_html TYPE string. + DATA lo_html TYPE REF TO lcl_html_helper. - FIELD-SYMBOLS: LIKE LINE OF lt_diffs. +* REDO + lv_html = lcl_gui=>header( ). + "TODO: crutch, redo later after unification + replace first occurrence of '' in lv_html + with '' && styles( )->mv_html. - lv_html = lcl_gui=>header( ) && - '
' && - '
' && - '

' && - ms_result-obj_type && ' ' && - ms_result-obj_name && ' ' && - ms_result-filename && '



'. + "TODO: crutch, move to SAP back button (code almost ready) + lv_html = lv_html && '
' && 'Back' && '
'. + lo_html->add( lv_html ). +* ^^^ REDO - ls_count = mo_diff->stats( ). - lv_html = lv_html && - '' && gc_newline && - '' && gc_newline && - '' && gc_newline && - '' && gc_newline && - '' && gc_newline && - '' && gc_newline && - '' && gc_newline && - '' && gc_newline && - '' && gc_newline && - '' && gc_newline && - '' && gc_newline && - '' && gc_newline && - '' && gc_newline && - '
Insert' && - ls_count-insert && - '
Delete' && - ls_count-delete && - '
Update' && - ls_count-update && - '

' && gc_newline. + lo_html->add( '
' ). "#EC NOTEXT + lo_html->add( render_head( ) ). + lo_html->add( render_diff( ) ). + lo_html->add( '
' ). "#EC NOTEXT + lo_html->add( lcl_gui=>footer( ) ). - lv_html = lv_html && - '' && gc_newline && - '' && gc_newline && - '' && gc_newline && - || && gc_newline && - '' && gc_newline && - ''. - - lt_diffs = mo_diff->get( ). - - LOOP AT lt_diffs ASSIGNING . - lv_local = escape( val = -local - format = cl_abap_format=>e_html_attr ). - lv_remote = escape( val = -remote - format = cl_abap_format=>e_html_attr ). - - CASE -result. - WHEN lcl_diff=>c_diff-insert. - lv_clocal = ' style="background:lightgreen;"'. "#EC NOTEXT - lv_cremote = ''. - WHEN lcl_diff=>c_diff-delete. - lv_clocal = ''. - lv_cremote = ' style="background:lightpink;"'. "#EC NOTEXT - WHEN lcl_diff=>c_diff-update. - lv_clocal = ' style="background:lightgreen;"'. "#EC NOTEXT - lv_cremote = ' style="background:lightpink;"'. "#EC NOTEXT - WHEN OTHERS. - lv_clocal = ''. - lv_cremote = ''. - ENDCASE. - - IF -result = lcl_diff=>c_diff-delete - OR -result = lcl_diff=>c_diff-insert - OR -result = lcl_diff=>c_diff-update. - lv_anchor_count = lv_anchor_count + 1. - lv_anchor_name = | name="diff_{ lv_anchor_count }"|. - ELSE. - CLEAR lv_anchor_name. - ENDIF. - - lv_html = lv_html && - || && gc_newline && - '
' && lv_local && '
' && - gc_newline && - '
' && - gc_newline && - '
' && lv_remote && '
' && - gc_newline && - '
' && gc_newline. - ENDLOOP. - - rv_html = lv_html && gc_newline && - '

Local

<>

Remote

 ' && - |{ -result }| && - ' 
' && gc_newline && - '
' && gc_newline && - lcl_gui=>footer( ). + rv_html = lo_html->mv_html. ENDMETHOD.