点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
abapgit 程序这里的图片是如何实现的呢?
一开始从程序的入口开始找, 看了半天没找到实现的地方, 猜测是 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'