abapgit 里图片的实现

2021-11-22 17:12发布


          点击此处--->   EasySAP.com 群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)

abapgit 程序这里的图片是如何实现的呢?

20211122_105158.jpg

一开始从程序的入口开始找, 看了半天没找到实现的地方, 猜测是 base64 存储的图片 也没搜索 base64 最后的字符串 ==

后来从图片里下面的版本号的文本上面的图找到了

下面的代码:

4215   CONSTANTS c_abap_version TYPE string VALUE '1.112.0' ##NO_TEXT.
....
  METHOD footer.

    CREATE OBJECT ri_html TYPE zcl_abapgit_html.

    ri_html->add( '<div id="footer">' ).
    ri_html->add( '<table class="w100"><tr>' ).

    ri_html->add( '<td class="w40"></td>' ).  " spacer

    ri_html->add( '<td class="center">' ).
    ri_html->add( '<div class="logo">' ).
    ri_html->add( ri_html->icon( 'git-alt' ) ).
    ri_html->add( ri_html->icon( iv_name = 'abapgit'
                                 iv_hint = |{ iv_time } sec| ) ).
    ri_html->add( '</div>' ).
    ri_html->add( |<div class="version">{ zif_abapgit_version=>c_abap_version }</div>| ).
    ri_html->add( '</td>' ).

    ri_html->add( '<td id="debug-output" class="w40"></td>' ).

    ri_html->add( '</tr></table>' ).
    ri_html->add( '</div>' ).

  ENDMETHOD.
....
找到上面 icon 方法定义的地方:
  METHOD icon.

    DATA: lv_hint       TYPE string,
          lv_name       TYPE string,
          lv_color      TYPE string,
          lv_class      TYPE string,
          lv_large_icon TYPE string,
          lv_xpixel     TYPE i,
          lv_onclick    TYPE string.

    SPLIT iv_name AT '/' INTO lv_name lv_color.

    IF iv_hint IS NOT INITIAL.
      lv_hint  = | title="{ iv_hint }"|.
    ENDIF.
    IF iv_onclick IS NOT INITIAL.
      lv_onclick = | onclick="{ iv_onclick }"|.
    ENDIF.
    IF iv_class IS NOT INITIAL.
      lv_class = | { iv_class }|.
    ENDIF.
    IF lv_color IS NOT INITIAL.
      lv_color = | { lv_color }|.
    ENDIF.

    lv_xpixel = cl_gui_cfw=>compute_pixel_from_metric( x_or_y = 'X'
                                                       in = 1 ).
    IF lv_xpixel >= 2.
      lv_large_icon = ' large'.
    ENDIF.

    rv_str = |<i class="icon{ lv_large_icon } icon-{ lv_name }{ lv_color }|.
    rv_str = |{ rv_str }{ lv_class }"{ lv_onclick }{ lv_hint }></i>|.

  ENDMETHOD.
....
拼接传入的参数, 图片定义的地方应该有: icon-abapgit
搜索 icon-abapgit: 
 26623     lo_buf->add( '.logo .icon.icon-abapgit {' ).
 28428     lo_buf->add( '.logo .icon.icon-abapgit { ' ).
 31151     lo_buf->add( '.icon-abapgit:before { content: "\f101"; }' ).
....
应该是 31151 行定义了图片:

    lo_buf->add( '@font-face {' ).
    lo_buf->add( '    font-family: "ag-icons";' ).
    lo_buf->add( '    font-weight: normal;' ).
    lo_buf->add( '    font-style: normal;' ).
    lo_buf->add( '    src: url("../font/ag-icons.woff") format("woff");' ).
    lo_buf->add( '}' ).
    lo_buf->add( '' ).
    lo_buf->add( '.icon {' ).
    lo_buf->add( '    line-height: 1;' ).
    lo_buf->add( '}' ).
    lo_buf->add( '' ).
    lo_buf->add( '.icon:before {' ).
    lo_buf->add( '    font-family: ag-icons !important;' ).
    lo_buf->add( '    font-style: normal;' ).
    lo_buf->add( '    font-weight: normal !important;' ).
    lo_buf->add( '' ).
    lo_buf->add( '    display: inline-block;' ).
    lo_buf->add( '    text-decoration: none;' ).
    lo_buf->add( '    text-align: center;' ).
    lo_buf->add( '    vertical-align: text-top;' ).
    lo_buf->add( '    /* width: 1.1em; */' ).
    lo_buf->add( '    /* padding-right: 0.2em */' ).
    lo_buf->add( '' ).
    lo_buf->add( '    /* For safety - reset parent styles, that can break glyph codes*/' ).
    lo_buf->add( '    font-variant: normal;' ).
    lo_buf->add( '    text-transform: none;' ).
    lo_buf->add( '}' ).
    lo_buf->add( '' ).
    lo_buf->add( '.icon.large { font-size: 200%; }' ).
    lo_buf->add( '' ).
    31151  lo_buf->add( '.icon-abapgit:before { content: "\f101"; }' ).
    lo_buf->add( '.icon-abaplint:before { content: "\f102"; }' ).
    lo_buf->add( '.icon-arrow-circle-up:before { content: "\f103"; }' ).
    lo_buf->add( '.icon-bars:before { content: "\f104"; }' ).
...
    lo_asset_man->register_asset(
      iv_url       = 'css/ag-icons.css'
      iv_type      = 'text/css'
      iv_mime_name = 'ZABAPGIT_ICON_FONT_CSS'
      iv_inline    = lo_buf->join_w_newline_and_flush( ) ).

可以看到图片是字体文件 ag-icons.woff 里的 icon

综上所述, 执行 abapgit 之后加载了一个网页, 图片是网页上字体文件里的

从图片加载的地方, 看 abapgit 程序启动的流程:

CLASS zcl_abapgit_ui_factory IMPLEMENTATION.
  METHOD get_asset_manager.

    DATA lo_buf TYPE REF TO kHGwlUeWgGWXqMsZwpmucoVfByePXr.
    DATA lo_asset_man TYPE REF TO zcl_abapgit_gui_asset_manager.

    CREATE OBJECT lo_buf.
    CREATE OBJECT lo_asset_man.

****************************************************
 * abapmerge Pragma - ZABAPGIT_CSS_COMMON.W3MI.DATA.CSS
****************************************************
    lo_buf->add( '/*' ).
    lo_buf->add( ' * ABAPGIT COMMON CSS' ).
    lo_buf->add( ' */' ).
    lo_buf->add( '' ).
    lo_buf->add( '/* GLOBALS */' ).
    lo_buf->add( '' ).
    lo_buf->add( 'body {' ).

调用 get_asset_manager 的地方:
 31365       li_asset_man = get_asset_manager( ).

  METHOD get_gui.

    DATA:
      li_hotkey_ctl TYPE REF TO zif_abapgit_gui_hotkey_ctl,
      li_router     TYPE REF TO zif_abapgit_gui_event_handler,
      li_asset_man  TYPE REF TO zif_abapgit_gui_asset_manager.

    DATA lo_html_preprocessor TYPE REF TO zcl_abapgit_gui_html_processor.

    IF go_gui IS INITIAL.
31365 li_asset_man = get_asset_manager( ).

      CREATE OBJECT lo_html_preprocessor EXPORTING ii_asset_man = li_asset_man.
      lo_html_preprocessor->preserve_css( 'css/ag-icons.css' ).
      lo_html_preprocessor->preserve_css( 'css/common.css' ).

      CREATE OBJECT li_router TYPE zcl_abapgit_gui_router.
      CREATE OBJECT li_hotkey_ctl TYPE zcl_abapgit_gui_hotkey_ctl.

      CREATE OBJECT go_gui
        EXPORTING
          io_component      = li_router
          ii_hotkey_ctl     = li_hotkey_ctl
          ii_html_processor = lo_html_preprocessor
          ii_asset_man      = li_asset_man.
    ENDIF.
    ro_gui = go_gui.

  ENDMETHOD.
调用 get_gui 的地方:
31404       gi_gui_services ?= get_gui( ).
 6973     zcl_abapgit_ui_factory=>get_gui( )->go_home( ).
 7023       zcl_abapgit_ui_factory=>get_gui( )->set_focus( ).
 7044           IF zcl_abapgit_ui_factory=>get_gui( )->back( ) = abap_true. " end of stack
 7045             zcl_abapgit_ui_factory=>get_gui( )->free( ). " Graceful shutdown



结合 abapgit 程序事件的代码:

START-OF-SELECTION.
  PERFORM run.
....
AT SELECTION-SCREEN OUTPUT.
  IF sy-dynnr = lcl_password_dialog=>c_dynnr.
    lcl_password_dialog=>on_screen_output( ).
  ELSE.
    PERFORM output.
  ENDIF.

....

run output 两个form 里调用了 get_gui 方法, 显示了 abapgit 的界面

相关链接:
abapGit/zabapgit_icon_font.w3mi.data.woff at main · abapGit/abapGit '0.0'
iconfont 在线预览工具及其解析 - SegmentFault 思否 '0.0'
Iconfont Preview '0.0'



赞赏支持