Pimp My Message [3] – HTML-Darstellung

Dies ist Teil 3 von 5 der Serie Nachrichten

So, nach den Grundlagen zu Meldungen und deren Langtexte, jetzt endlich mal wieder Sourcecode. Ich möchte dir zeigen, wie du den Meldungslangtext in einer Dialogbox darstellen kannst. Die Meldung soll dabei mit HTML etwas aufbereitet werden.

ITF in HTML umwandeln

Die Langtexte werden intern im ITF-Format gespeichert. Das bedeutet, dass das Absatzformat in der Spalte TDFORMAT und die Zeile selbst in der Spalte TDLINE gespeichert wird. Die zu Grunde liegende Struktur ist TLINE.

Zu den Zeilen der Struktur TLINE gehören auch Kopfinformationen, die in der Struktur THEAD gehalten werden. Hier stehen zum Beispiel der Name und der Titel eines Langtextes.

Header oder nicht?

Um die interne ITF-Darstellung in HTML umzuwandeln, kann der Funktionsbaustein  CONVERT_ITF_TO_HTML verwendet werden. Dem Baustein kann ein Flag übergeben werden, in dem ein kompletter HTML-Text erstellt wird (I_HTML_HEADER = X) oder nur der Body (I_HTML_HEADER = space). Die Verwendung zeige ich im Coding.

Umwandlung von Absatzformaten

Die intern verwendeten Absatzformate können in eigene HTML-Tags umgesetzt werden. U1 ist im ITF-Format eine Überschrift der Kategorie 1. Die Entsprechung im HTML ist das Tag h1. In der Tabelle T_CONV_PARFORMATS kann die Übersetzung definiert werden. Das Ende-Tag, zum Beispiel </h1> für den Abschluss des h1-Tags, wird automatisch für das Ende der Zeile gesetzt.

Das Programm

Das hier vorgestellte Programm liest eine Nachricht sowie den Langtext der Nachricht. Das interne ITF-Format wird in HTML umgewandelt. Dabei werden die Absatzformate entsprechend umgesetzt. Die Ausgabe sieht aus wie folgt:

Die Darstellung ist immer noch langweilig. Aber immerhin.

Code

REPORT.

PARAMETERS p_msgno TYPE symsgno DEFAULT '313'.

CLASS lcl_info DEFINITION.
  PUBLIC SECTION.
    METHODS show.
    METHODS get_message_short RETURNING VALUE(rv_message) TYPE string.
    METHODS get_message_long RETURNING VALUE(rt_html) TYPE htmltable.
  PROTECTED SECTION.
    CLASS-METHODS build_box.
    CLASS-DATA mo_box TYPE REF TO cl_gui_dialogbox_container.
    CLASS-DATA mo_html TYPE REF TO cl_gui_html_viewer.
    DATA mv_short TYPE string.
    DATA mt_long  TYPE htmltable.
    CLASS-METHODS handle_close FOR EVENT close OF cl_gui_dialogbox_container.
    METHODS show_message.
ENDCLASS.

CLASS lcl_info IMPLEMENTATION.

  METHOD show.
    build_box( ).
    mv_short = get_message_short( ).
    mt_long  = get_message_long( ).
    show_message( ).
  ENDMETHOD.
  METHOD get_message_short.
    MESSAGE ID sy-msgid
          TYPE sy-msgty
        NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
          INTO rv_message.
  ENDMETHOD.

  METHOD build_box.
    IF mo_box IS INITIAL.
      mo_box  = NEW #( width = 900 height = 400 top = 20 left = 400 ).
      mo_html = NEW #( parent = mo_box ).
      SET HANDLER handle_close FOR mo_box.
    ENDIF.
    mo_box->set_caption( sy-title ).
  ENDMETHOD.

  METHOD show_message.
    DATA lv_url TYPE c LENGTH 1000.
    mo_html->load_data( EXPORTING encoding = 'utf-8'
                        IMPORTING assigned_url = lv_url
                        CHANGING data_table = mt_long ).
    mo_html->show_data( url = lv_url ).
  ENDMETHOD.

  METHOD handle_close.
    mo_box->set_visible( space ).
  ENDMETHOD.

  METHOD get_message_long.

    DATA ls_header           TYPE thead.

    DATA lt_itf_text         TYPE STANDARD TABLE OF tline.
    DATA lt_html_text        TYPE STANDARD TABLE OF htmlline.
    DATA lv_object           TYPE dokhl-object.
    
    "Namen der Nachricht erstellen
    CALL FUNCTION 'DOCU_OBJECT_NAME_CONCATENATE'
      EXPORTING
        docu_id  = 'NA'
        element  = sy-msgid
        addition = sy-msgno
      IMPORTING
        object   = lv_object.

    "Langtext zur Doku lesen
    CALL FUNCTION 'DOCU_GET'
      EXPORTING
        id     = 'NA'
        langu  = sy-langu
        object = lv_object
      IMPORTING
        head   = ls_header
      TABLES
        line   = lt_itf_text
      EXCEPTIONS
        OTHERS = 5.

    "Absatzformate umwandeln
    DATA(lt_conv_parformats) = VALUE tline_t(
                   ( tdformat = 'U1' tdline = '<h1>' )
                   ( tdformat = 'U2' tdline = '<h2>' )
                   ( tdformat = 'AS'  tdline = '<p>' ) ).

    CALL FUNCTION 'CONVERT_ITF_TO_HTML'
      EXPORTING
        i_header          = ls_header
        i_html_header     = abap_true
      TABLES
        t_itf_text        = lt_itf_text
        t_html_text       = rt_html
        t_conv_parformats = lt_conv_parformats
      EXCEPTIONS
        OTHERS            = 4.

  ENDMETHOD.


ENDCLASS.

AT SELECTION-SCREEN.

  NEW lcl_info( )->show( ) .

 

 

 

 

Enno Wulff
Letzte Artikel von Enno Wulff (Alle anzeigen)
Series Navigation<< Pimp My Message [2] – Langtext anzeigenPimp My Message [4] – W3CSS >>