*& *& Copyright (C) 2009-2013 Jan Krohn *& *& This program is free software; you can redistribute it and/or *& modify it under the terms of the GNU General Public License as *& published by the Free Software Foundation; version 3 of the *& License. *& *& This program is distributed in the hope that it will be useful, *& but WITHOUT ANY WARRANTY; without even the implied warranty of *& MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *& GNU General Public License for more details. *& *& You should have received a copy of the GNU General Public License *& along with this program; if not, write to the Free Software *& Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, *& MA 02110-1301 USA. *& *& Contact: Jan Krohn, P.O. Box 749, Phnom Penh, Cambodia *& webmaster@vic-fontaine.com; phone: +49-6021-13040990 *&---------------------------------------------------------------------* REPORT z_volxbibel. TYPE-POOLS abap. *======================================================================* * SELECTION SCREEN * *======================================================================* * 'Please choose source and destination file names' SELECTION-SCREEN BEGIN OF BLOCK a WITH FRAME TITLE text-001. * 'Source file (Wiki)' SELECTION-SCREEN BEGIN OF BLOCK b WITH FRAME TITLE text-002. PARAMETERS pv_fin TYPE file. SELECTION-SCREEN END OF BLOCK b. * 'Destination file (ThML)' SELECTION-SCREEN BEGIN OF BLOCK c WITH FRAME TITLE text-003. PARAMETERS pv_fout TYPE file. SELECTION-SCREEN END OF BLOCK c. * 'Old Version 1.3.6' PARAMETERS pv_old TYPE flag. SELECTION-SCREEN END OF BLOCK a. *======================================================================* * MAIN PROGRAMME * *======================================================================* START-OF-SELECTION. TYPES: BEGIN OF ts_wiki, title TYPE char25, text(15000) TYPE c, END OF ts_wiki. TYPES: BEGIN OF ts_bible, book TYPE char20, chapter TYPE num2, verse TYPE num2, text(600) TYPE c, END OF ts_bible. TYPES: BEGIN OF ts_chapters, book TYPE char20, chapter TYPE num2, END OF ts_chapters. TYPES: BEGIN OF ts_id2title, bkid TYPE char6, book TYPE char20, END OF ts_id2title. DATA: gs_fin TYPE string, gs_fout TYPE string, gt_data_tab_in TYPE STANDARD TABLE OF x255, gt_data_tab_out TYPE STANDARD TABLE OF x255, gv_lraw TYPE x255, gs_errtext TYPE string, gc_err TYPE REF TO cx_root, gs_xml_in TYPE xstring, gs_xml_out TYPE xstring, gv_xlen TYPE i, gv_count TYPE i, gv_off TYPE i, gv_mod TYPE i, gv_bookcount TYPE i, gt_wiki TYPE STANDARD TABLE OF ts_wiki, gs_wiki TYPE ts_wiki, gt_chapters TYPE STANDARD TABLE OF ts_chapters, gt_bible TYPE STANDARD TABLE OF ts_bible, gs_bible TYPE ts_bible, gt_id2title TYPE STANDARD TABLE OF ts_id2title, gs_id2title TYPE ts_id2title, gt_result_xml TYPE abap_trans_resbind_tab, gs_result_xml TYPE abap_trans_resbind, gs_book TYPE string, gv_booklen TYPE i, gv_split(600) TYPE c, gt_split LIKE STANDARD TABLE OF gv_split, gv_crlfi TYPE i, gv_crlf TYPE c, gv_newverse TYPE num2, gv_lines TYPE i, gt_source_itab TYPE abap_trans_srcbind_tab, gs_source_wa TYPE abap_trans_resbind. FIELD-SYMBOLS TYPE c. *======================================================================* * PART 1: Transform Wiki to ABAP * *======================================================================* * Both file names must not be initial CHECK pv_fin IS NOT INITIAL AND pv_fout IS NOT INITIAL. gs_fin = pv_fin. gs_fout = pv_fout. * Open file from client PC CALL METHOD cl_gui_frontend_services=>gui_upload EXPORTING filename = gs_fin filetype = 'BIN' CHANGING data_tab = gt_data_tab_in EXCEPTIONS file_open_error = 1 file_read_error = 2 no_batch = 3 gui_refuse_filetransfer = 4 invalid_type = 5 no_authority = 6 unknown_error = 7 bad_data_format = 8 header_not_allowed = 9 separator_not_allowed = 10 header_too_long = 11 unknown_dp_error = 12 access_denied = 13 dp_out_of_memory = 14 disk_full = 15 dp_timeout = 16 not_supported_by_gui = 17 error_no_gui = 18 OTHERS = 19. * Check for errors IF sy-subrc NE 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno. ENDIF. * Write XML from table to string CLEAR gs_xml_in. LOOP AT gt_data_tab_in INTO gv_lraw. CONCATENATE gs_xml_in gv_lraw INTO gs_xml_in IN BYTE MODE. ENDLOOP. "gt_data_tab_in GET REFERENCE OF gt_wiki INTO gs_result_xml-value. gs_result_xml-name = 'IWIKI'. APPEND gs_result_xml TO gt_result_xml. * Perform XSLT TRY. CALL TRANSFORMATION z_read_wiki SOURCE XML gs_xml_in RESULT (gt_result_xml). CATCH cx_root INTO gc_err. gs_errtext = gc_err->get_text( ). MESSAGE gs_errtext TYPE 'E'. ENDTRY. *======================================================================* * PART 2: Conversion of tables * *======================================================================* * Create Mapping id to book: gs_id2title-bkid = 'Matt'. gs_id2title-book = 'Matthäus'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'Mark'. gs_id2title-book = 'Markus'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'Luke'. gs_id2title-book = 'Lukas'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'John'. gs_id2title-book = 'Johannes'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'Acts'. gs_id2title-book = 'Apostelgeschichte'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'Rom'. gs_id2title-book = 'Römer'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'iCor'. gs_id2title-book = '1.Korinther'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'iiCor'. gs_id2title-book = '2.Korinther'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'Gal'. gs_id2title-book = 'Galater'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'Eph'. gs_id2title-book = 'Epheser'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'Phili'. gs_id2title-book = 'Philipper'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'Col'. gs_id2title-book = 'Kolosser'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'iThes'. gs_id2title-book = '1.Thessalonicher'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'iiThes'. gs_id2title-book = '2.Thessalonicher'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'iTim'. gs_id2title-book = '1.Timotheus'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'iiTim'. gs_id2title-book = '2.Timotheus'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'Tit'. gs_id2title-book = 'Titus'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'Phile'. gs_id2title-book = 'Philemon'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'Heb'. gs_id2title-book = 'Hebräer'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'Jam'. gs_id2title-book = 'Jakobus'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'iPet'. gs_id2title-book = '1.Petrus'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'iiPet'. gs_id2title-book = '2.Petrus'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'iJo'. gs_id2title-book = '1.Johannes'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'iiJo'. gs_id2title-book = '2.Johannes'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'iiiJo'. gs_id2title-book = '3.Johannes'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'Jude'. gs_id2title-book = 'Judas'. APPEND gs_id2title TO gt_id2title. gs_id2title-bkid = 'Rev'. gs_id2title-book = 'Offenbarung'. APPEND gs_id2title TO gt_id2title. * Assign Field Symbol to Carriage Return. gv_crlfi = 10. ASSIGN gv_crlfi TO CASTING. gv_crlf = . gv_bookcount = 1. READ TABLE gt_id2title INTO gs_id2title INDEX gv_bookcount. gs_book = gs_id2title-book. gv_booklen = strlen( gs_book ). LOOP AT gt_wiki INTO gs_wiki. IF gs_wiki-title(1) = 'V' AND gs_wiki-title+2(1) = ':'. SHIFT gs_wiki-title BY 3 PLACES. ENDIF. * Find the book to be processed. Either the current or the following one FIND FIRST OCCURRENCE OF gs_id2title-book IN gs_wiki-title. IF sy-subrc NE 0. ADD 1 TO gv_bookcount. READ TABLE gt_id2title INTO gs_id2title INDEX gv_bookcount. gs_book = gs_id2title-book. gv_booklen = strlen( gs_book ). ENDIF. SHIFT gs_wiki-title LEFT BY gv_booklen PLACES. gs_bible-book = gs_id2title-book. gs_bible-chapter = gs_wiki-title. SPLIT gs_wiki-text AT gv_crlf INTO TABLE gt_split. CLEAR: gs_bible-verse, gs_bible-text. LOOP AT gt_split INTO gv_split. * Skip title, annotations etc. CHECK gv_split(2) NE '==' AND gv_split(2) NE '__' AND gv_split(2) NE '--' AND gv_split(2) NE '[[' AND gv_split(2) NE '{{' AND gv_split(2) NE '(*' AND gv_split(21) NE 'Oder anders übersetzt' AND gv_split IS NOT INITIAL. gv_newverse = gv_split(2). * Skip alternative translations CHECK gv_newverse EQ '00' OR gv_newverse GT gs_bible-verse. IF gv_newverse = '00'. * This belongs to the last verse! CHECK gs_bible-text IS NOT INITIAL. DESCRIBE TABLE gt_bible LINES gv_lines. DELETE gt_bible INDEX gv_lines. CONCATENATE gs_bible-text gv_split INTO gs_bible-text SEPARATED BY space. ELSE. * Insert blank verses DO. ADD 1 TO gs_bible-verse. IF gs_bible-verse = gv_newverse. EXIT. ELSE. * For old versions < 2.4.0 IF pv_old = 'X'. gs_bible-text = '---'. ELSE. CLEAR gs_bible-text. ENDIF. APPEND gs_bible TO gt_bible. ENDIF. ENDDO. gs_bible-verse = gv_newverse. gs_bible-text = gv_split. ENDIF. * Delete verse numbering from text SHIFT gs_bible-text LEFT DELETING LEADING '01234567890/+-. '. * Delete annotation marks from text REPLACE ALL OCCURRENCES OF REGEX '\(\*[0-9\*]{0,}\)' IN gs_bible-text WITH space. * Delete double quotes (Wiki syntax) REPLACE ALL OCCURRENCES OF '''''' IN gs_bible-text WITH space. * Delete HTML tags REPLACE ALL OCCURRENCES OF '
' IN gs_bible-text WITH space. APPEND gs_bible TO gt_bible. ENDLOOP. "gt_split ENDLOOP. "gt_wiki gt_chapters = gt_bible. DELETE ADJACENT DUPLICATES FROM gt_chapters. *======================================================================* * PART 3: Transform ABAP to ThML * *======================================================================* GET REFERENCE OF gt_id2title INTO gs_source_wa-value. gs_source_wa-name = 'IID'. APPEND gs_source_wa TO gt_source_itab. GET REFERENCE OF gt_chapters INTO gs_source_wa-value. gs_source_wa-name = 'ICHAPTERS'. APPEND gs_source_wa TO gt_source_itab. GET REFERENCE OF gt_bible INTO gs_source_wa-value. gs_source_wa-name = 'IBIBLE'. APPEND gs_source_wa TO gt_source_itab. * Perform the XSLT stylesheet TRY. CALL TRANSFORMATION z_write_thml SOURCE (gt_source_itab) RESULT XML gs_xml_out. CATCH cx_root INTO gc_err. gs_errtext = gc_err->get_text( ). MESSAGE gs_errtext TYPE 'E'. ENDTRY. * Write XML from string to table REFRESH gt_data_tab_out. CLEAR gv_off. gv_xlen = xstrlen( gs_xml_out ). gv_count = gv_xlen DIV 255. DO gv_count TIMES. gv_lraw = gs_xml_out+gv_off(255). gv_off = gv_off + 255. APPEND gv_lraw TO gt_data_tab_out. ENDDO. gv_mod = gv_xlen MOD 255. IF gv_mod > 0. gv_lraw = gs_xml_out+gv_off(gv_mod). APPEND gv_lraw TO gt_data_tab_out. ENDIF. * Write file to client PC CALL METHOD cl_gui_frontend_services=>gui_download EXPORTING bin_filesize = gv_xlen filename = gs_fout filetype = 'BIN' confirm_overwrite = 'X' CHANGING data_tab = gt_data_tab_out EXCEPTIONS file_write_error = 1 no_batch = 2 gui_refuse_filetransfer = 3 invalid_type = 4 no_authority = 5 unknown_error = 6 header_not_allowed = 7 separator_not_allowed = 8 filesize_not_allowed = 9 header_too_long = 10 dp_error_create = 11 dp_error_send = 12 dp_error_write = 13 unknown_dp_error = 14 access_denied = 15 dp_out_of_memory = 16 disk_full = 17 dp_timeout = 18 file_not_found = 19 dataprovider_exception = 20 control_flush_error = 21 not_supported_by_gui = 22 error_no_gui = 23 OTHERS = 24. * Check for errors IF sy-subrc NE 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno. ENDIF. *======================================================================* * VALUE REQUESTS FOR SELECTION SCREEN * *======================================================================* * When the source file is requested AT SELECTION-SCREEN ON VALUE-REQUEST FOR pv_fin. DATA: lt_filetable TYPE filetable, lv_rc TYPE i, lv_ua TYPE i. *Dialogue box: open file CALL METHOD cl_gui_frontend_services=>file_open_dialog EXPORTING window_title = 'Wiki XML file to be loaded' default_extension = 'xml' file_filter = cl_gui_frontend_services=>filetype_xml initial_directory = 'C:\' CHANGING file_table = lt_filetable rc = lv_rc user_action = lv_ua EXCEPTIONS file_open_dialog_failed = 1 cntl_error = 2 error_no_gui = 3 not_supported_by_gui = 4 OTHERS = 5. * Check for errors IF sy-subrc NE 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno. ENDIF. CHECK lv_rc = 1 AND lv_ua = cl_gui_frontend_services=>action_ok AND lt_filetable IS NOT INITIAL. * Assign selected file to parameter READ TABLE lt_filetable INTO pv_fin INDEX 1. * When the destination file is requested AT SELECTION-SCREEN ON VALUE-REQUEST FOR pv_fout. DATA: ls_filename TYPE string, ls_path TYPE string, ls_fullpath TYPE string, lv_ua TYPE i. * Dialogue box: save file CALL METHOD cl_gui_frontend_services=>file_save_dialog EXPORTING window_title = 'ThML file to be saved' default_extension = 'xml' file_filter = cl_gui_frontend_services=>filetype_xml initial_directory = 'C:\' CHANGING filename = ls_filename path = ls_path fullpath = ls_fullpath user_action = lv_ua EXCEPTIONS cntl_error = 1 error_no_gui = 2 not_supported_by_gui = 3 OTHERS = 4. * Check for errors IF sy-subrc NE 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno. ENDIF. CHECK lv_ua = cl_gui_frontend_services=>action_ok AND ls_fullpath IS NOT INITIAL. * Assign selected file to parameter pv_fout = ls_fullpath.