Fix html_helper to indent styles in {}

This commit is contained in:
atsy 2016-09-03 19:30:45 +03:00
parent c28e5a9caf
commit 94e28625f6
2 changed files with 50 additions and 9 deletions

View File

@ -270,8 +270,9 @@ CLASS lcl_html_helper DEFINITION FINAL.
PUBLIC SECTION.
CONSTANTS: c_indent_size TYPE i VALUE 2.
DATA mv_html TYPE string READ-ONLY.
DATA mv_indent TYPE i READ-ONLY.
DATA mv_html TYPE string READ-ONLY.
DATA mv_indent TYPE i READ-ONLY.
DATA mv_within_style TYPE i READ-ONLY.
METHODS add IMPORTING iv_chunk TYPE any.
METHODS reset.
@ -327,18 +328,26 @@ CLASS lcl_html_helper IMPLEMENTATION.
CONSTANTS lc_single_tags_re TYPE string " HTML5 singleton tags
VALUE '<(area|base|br|col|command|embed|hr|img|input|link|meta|param|source|!)'.
DATA lv_tags TYPE i.
DATA lv_tags_open TYPE i.
DATA lv_tags_close TYPE i.
DATA lv_tags_single TYPE i.
DATA lv_close_offs TYPE i.
DATA lv_shift_back TYPE i.
DATA lv_tags TYPE i.
DATA lv_tags_open TYPE i.
DATA lv_tags_close TYPE i.
DATA lv_tags_single TYPE i.
DATA lv_close_offs TYPE i.
DATA lv_shift_back TYPE i.
DATA lv_style_tag_open TYPE i.
DATA lv_style_tag_close TYPE i.
DATA lv_curly TYPE i.
FIND FIRST OCCURRENCE OF '</' IN iv_str MATCH OFFSET lv_close_offs.
IF sy-subrc = 0 AND lv_close_offs = 0 AND mv_indent > 0. " Found close tag @beginning
lv_shift_back = 1.
ENDIF.
FIND FIRST OCCURRENCE OF '}' IN iv_str MATCH OFFSET lv_close_offs. " Find close } @beginning
IF mv_within_style > 0 AND sy-subrc = 0 AND lv_close_offs = 0 AND mv_indent > 0.
lv_shift_back = 1.
ENDIF.
mv_html = mv_html
&& repeat( val = ` ` occ = ( mv_indent - lv_shift_back ) * c_indent_size )
&& iv_str
@ -350,6 +359,17 @@ CLASS lcl_html_helper IMPLEMENTATION.
lv_tags_open = lv_tags - lv_tags_close - lv_tags_single.
FIND ALL OCCURRENCES OF '<style' IN iv_str MATCH COUNT lv_style_tag_open IGNORING CASE.
FIND ALL OCCURRENCES OF '</style>' IN iv_str MATCH COUNT lv_style_tag_close IGNORING CASE.
mv_within_style = mv_within_style + lv_style_tag_open - lv_style_tag_close.
IF mv_within_style > 0.
FIND ALL OCCURRENCES OF '{' IN iv_str MATCH COUNT lv_curly.
lv_tags_open = lv_tags_open + lv_curly.
FIND ALL OCCURRENCES OF '}' IN iv_str MATCH COUNT lv_curly.
lv_tags_close = lv_tags_close + lv_curly.
ENDIF.
" More-less logic chosen due to possible double tags in a line '<a><b>'
IF lv_tags_open > lv_tags_close.
mv_indent = mv_indent + 1.

View File

@ -1166,7 +1166,8 @@ CLASS ltcl_html_helper DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT
indent1 FOR TESTING RAISING lcx_exception,
indent2 FOR TESTING RAISING lcx_exception,
indent3 FOR TESTING RAISING lcx_exception,
indent4 FOR TESTING RAISING lcx_exception.
indent4 FOR TESTING RAISING lcx_exception,
style1 FOR TESTING RAISING lcx_exception.
METHODS:
setup,
@ -1239,6 +1240,26 @@ CLASS ltcl_html_helper IMPLEMENTATION.
ENDMETHOD.
METHOD style1.
mo_html->add( '<style type="text/css">' ).
mo_html->add( '.class1 { color: red }' ).
mo_html->add( '.class2 {' ).
mo_html->add( 'color: red' ).
cl_abap_unit_assert=>assert_equals( act = last_line( ) exp = ' color: red' ).
mo_html->add( '}' ).
cl_abap_unit_assert=>assert_equals( act = last_line( ) exp = ' }' ).
mo_html->add( '</style>' ).
cl_abap_unit_assert=>assert_equals( act = last_line( ) exp = '</style>' ).
ENDMETHOD.
ENDCLASS.
*----------------------------------------------------------------------*