*&---------------------------------------------------------------------* *& Include ZUTIL_CONVERT_TEXT * *& * *&---------------------------------------------------------------------* *& * *& This file is part of ZUTIL. * *& * *& ZUTIL 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, either version 3 of the License, * *& or any later version. * *& * *& ZUTIL 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 ZUTIL. If not, see . * *& * *&---------------------------------------------------------------------* *& * *& Author: Ruediger von Creytz ruediger.creytz@globalbit.net * *& Copyright: globalBIT, LLC http://www.globalbit.net * *& * *&---------------------------------------------------------------------* *----------------------------------------------------------------------- * decode_html *----------------------------------------------------------------------- FORM decode_html CHANGING c_txt TYPE any. DATA: l_xstr TYPE xstring, l_hex TYPE string, l_xpos TYPE i, l_str TYPE string, l_fdpos TYPE i, l_strlen TYPE i, l_out TYPE string, l_outlen TYPE i, l_char TYPE string. CHECK NOT c_txt IS INITIAL. CHECK c_txt CS '&#x'. l_str = c_txt. DO. IF l_str CS '&#x'. l_fdpos = sy-fdpos. IF l_fdpos > 0. CONCATENATE l_out+0(l_outlen) l_str+0(l_fdpos) INTO l_out. l_outlen = l_outlen + l_fdpos. ENDIF. l_xpos = l_fdpos + 3. l_strlen = strlen( l_str ). l_strlen = l_strlen - l_xpos. l_str = l_str+l_xpos(l_strlen). SPLIT l_str AT ';' INTO l_hex l_str. l_xstr = l_hex. CALL FUNCTION 'NLS_STRING_CONVERT_TO_SYS' EXPORTING lang_used = sy-langu SOURCE = l_xstr IMPORTING RESULT = l_char EXCEPTIONS OTHERS = 1. IF sy-subrc = 0. CONCATENATE l_out+0(l_outlen) l_char+0(1) INTO l_out. ELSE. CONCATENATE l_out+0(l_outlen) '#' INTO l_out. ENDIF. l_outlen = l_outlen + 1. ELSE. EXIT. ENDIF. ENDDO. l_strlen = strlen( l_str ). CONCATENATE l_out+0(l_outlen) l_str+0(l_strlen) INTO l_out. c_txt = l_out. ENDFORM. "decode_html *----------------------------------------------------------------------- * decode_html_io *----------------------------------------------------------------------- FORM decode_html_io USING i_html TYPE string CHANGING c_txt TYPE any. c_txt = i_html. PERFORM decode_html CHANGING c_txt. ENDFORM. "decode_html_io *----------------------------------------------------------------------- * encode_html *----------------------------------------------------------------------- FORM encode_html CHANGING c_txt TYPE string. CHECK NOT c_txt IS INITIAL. CHECK c_txt NS '&#'. PERFORM encode_html_force CHANGING c_txt. ENDFORM. "encode_html *----------------------------------------------------------------------- * encode_html_force *----------------------------------------------------------------------- FORM encode_html_force CHANGING c_txt TYPE string. DATA: l_xstr TYPE xstring, l_hex TYPE string, l_hexlen TYPE i, l_xlen TYPE i, l_xpos TYPE i, l_str TYPE string, l_strlen TYPE i, l_out TYPE string, l_outlen TYPE i, l_pos TYPE i, l_chars(255) TYPE c, l_xchar(4) TYPE c. CHECK NOT c_txt IS INITIAL. CONCATENATE "characters not to encode ' :;,./()-_+*#=' '0123456789' 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' INTO l_chars. l_str = c_txt. CALL FUNCTION 'NLS_STRING_CONVERT_FROM_SYS' EXPORTING lang_used = sy-langu SOURCE = l_str IMPORTING RESULT = l_xstr. l_hex = l_xstr. l_hexlen = strlen( l_hex ). l_strlen = strlen( l_str ). l_xlen = l_hexlen / l_strlen. DO. l_xpos = l_pos * l_xlen. l_xchar = l_hex+l_xpos(l_xlen). IF l_chars NA l_str+l_pos(1) AND NOT l_xchar = '23'. IF l_outlen = 0. CONCATENATE '&#x' l_xchar ';' INTO l_out. ELSE. CONCATENATE l_out+0(l_outlen) '&#x' l_xchar ';' INTO l_out. ENDIF. l_outlen = l_outlen + 4 + l_xlen. ELSE. IF l_outlen = 0. l_out = l_str+l_pos(1). ELSE. CONCATENATE l_out+0(l_outlen) l_str+l_pos(1) INTO l_out. ENDIF. l_outlen = l_outlen + 1. ENDIF. l_pos = l_pos + 1. l_strlen = strlen( l_str ). IF l_pos = l_strlen. EXIT. ENDIF. ENDDO. c_txt = l_out. ENDFORM. "encode_html_force *----------------------------------------------------------------------- * form: encode_uri *----------------------------------------------------------------------- FORM encode_uri CHANGING c_url TYPE string. DATA: l_prot TYPE string, l_url TYPE string, l_params TYPE string, lt_param TYPE it_string, l_key TYPE string, l_value TYPE string, l_len TYPE i. FIELD-SYMBOLS: TYPE string. CHECK NOT c_url IS INITIAL. IF c_url CA '?' OR c_url NA '='. SPLIT c_url AT '?' INTO l_url l_params. IF l_url CA ':'. SPLIT l_url AT ':' INTO l_prot l_url. ENDIF. PERFORM encode_uri_link CHANGING l_url. IF NOT l_prot IS INITIAL. CONCATENATE l_prot ':' l_url INTO l_url. ENDIF. CONCATENATE l_url '?' INTO l_url. ELSEIF c_url CA '='. l_params = c_url. ENDIF. SPLIT l_params AT '&' INTO TABLE lt_param. LOOP AT lt_param ASSIGNING . CLEAR: l_key, l_value. SPLIT AT '=' INTO l_key l_value. PERFORM encode_uri_value CHANGING l_value. CONCATENATE l_url l_key '=' l_value '&' INTO l_url. ENDLOOP. l_len = strlen( l_url ). l_len = l_len - 1. "remove last '&' c_url = l_url+0(l_len). ENDFORM. "encode_uri *----------------------------------------------------------------------- * form: encode_uri_link *----------------------------------------------------------------------- FORM encode_uri_link CHANGING c_value TYPE string. DATA: l_chars(66) TYPE c. CHECK NOT c_value IS INITIAL. CONCATENATE "characters not to encode '/_-.' '0123456789' 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' INTO l_chars. PERFORM encode_uri_string USING l_chars CHANGING c_value. ENDFORM. "encode_uri_link *----------------------------------------------------------------------- * form: encode_uri_string *----------------------------------------------------------------------- FORM encode_uri_string USING value(i_chars) CHANGING c_value TYPE string. DATA: l_xstr TYPE xstring, l_hex TYPE string, l_hexlen TYPE i, l_chex TYPE string, l_chex_pos TYPE i, l_xlen TYPE i, l_xpos TYPE i, l_str TYPE string, l_strlen TYPE i, l_out TYPE string, l_outlen TYPE i, l_pos TYPE i. CHECK NOT c_value IS INITIAL. l_str = c_value. CALL FUNCTION 'NLS_STRING_CONVERT_FROM_SYS' EXPORTING lang_used = sy-langu SOURCE = l_str IMPORTING RESULT = l_xstr. l_hex = l_xstr. l_hexlen = strlen( l_hex ). l_strlen = strlen( l_str ). l_xlen = l_hexlen / l_strlen. DO. IF i_chars NA l_str+l_pos(1). l_xpos = l_pos * l_xlen. l_chex = l_hex+l_xpos(l_xlen). l_chex_pos = strlen( l_chex ). l_chex_pos = l_chex_pos - 2. l_chex = l_chex+l_chex_pos(2). IF l_outlen = 0. CONCATENATE '%' l_chex INTO l_out. ELSE. CONCATENATE l_out+0(l_outlen) '%' l_chex INTO l_out. ENDIF. l_outlen = l_outlen + 3. ELSE. IF l_outlen = 0. l_out = l_str+l_pos(1). ELSE. CONCATENATE l_out+0(l_outlen) l_str+l_pos(1) INTO l_out. ENDIF. l_outlen = l_outlen + 1. ENDIF. l_pos = l_pos + 1. l_strlen = strlen( l_str ). IF l_pos = l_strlen. EXIT. ENDIF. ENDDO. c_value = l_out. ENDFORM. "encode_uri_string *----------------------------------------------------------------------- * form: encode_uri_value *----------------------------------------------------------------------- FORM encode_uri_value CHANGING c_value TYPE string. DATA: l_chars(62) TYPE c. CHECK NOT c_value IS INITIAL. CONCATENATE "characters not to encode '0123456789' 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' INTO l_chars. PERFORM encode_uri_string USING l_chars CHANGING c_value. ENDFORM. "encode_uri_value