From 1c079078212fac30ebc5248d95664a7b4348504b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sl=C3=A1vek=20Banko?= Date: Wed, 12 Dec 2018 15:52:44 +0100 Subject: [PATCH] Update TDEL10n module + Added function to prepare XML files for xgettext. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Slávek Banko --- modules/TDEL10n.cmake | 198 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) diff --git a/modules/TDEL10n.cmake b/modules/TDEL10n.cmake index 86bc6ef..2dfba00 100644 --- a/modules/TDEL10n.cmake +++ b/modules/TDEL10n.cmake @@ -590,3 +590,201 @@ macro( tde_l10n_preparetips _tips ) endif( ) endmacro( ) + + +################################################# +##### +##### tde_l10n_prepare_xml +##### +##### The function is used to prepare XML file for xgettext. +##### The default settings are identical to extractrc. +##### + +function( tde_l10n_prepare_xml ) + + unset( _source ) + unset( _target ) + unset( _context ) + set( _tags "[tT][eE][xX][tT]|title|string|whatsthis|tooltip|label" ) + set( _preserve "line-wrap" "spaces-leading" "spaces-trailing" "spaces-multi" ) + set( _no_c_format 1 ) + unset( _directive ) + set( _var _source ) + + foreach( _arg ${ARGN} ) + + # found directive "SOURCE" + if( "+${_arg}" STREQUAL "+SOURCE" ) + unset( _source ) + set( _var _source ) + set( _directive 1 ) + endif( ) + + # found directive "TARGET" + if( "+${_arg}" STREQUAL "+TARGET" ) + unset( _target ) + set( _var _target ) + set( _directive 1 ) + endif( ) + + # found directive "CONTEXT" + if( "+${_arg}" STREQUAL "+CONTEXT" ) + unset( _context ) + set( _var _context ) + set( _directive 1 ) + endif( ) + + # found directive "TAGS" + if( "+${_arg}" STREQUAL "+TAGS" ) + unset( _tags ) + set( _var _tags ) + set( _directive 1 ) + endif( ) + + # found directive "PRESERVE" + if( "+${_arg}" STREQUAL "+PRESERVE" ) + unset( _preserve ) + set( _var _preserve ) + set( _directive 1 ) + endif( ) + + # found directive "C_FORMAT" + if( "+${_arg}" STREQUAL "+C_FORMAT" ) + unset( _no_c_format ) + set( _directive 1 ) + endif( ) + + # found directive "NO_C_FORMAT" + if( "+${_arg}" STREQUAL "+NO_C_FORMAT" ) + set( _no_c_format 1 ) + set( _directive 1 ) + endif( ) + + # collect data + if( _directive ) + unset( _directive ) + elseif( _var ) + list( APPEND ${_var} ${_arg} ) + endif( ) + + endforeach( ) + + # verify source + if( NOT _source ) + tde_message_fatal( "no source XML file" ) + endif( ) + if( NOT "${_source}" MATCHES "^/" ) + set( _source "${CMAKE_CURRENT_SOURCE_DIR}/${_source}" ) + endif( ) + if( NOT _target ) + set( _target "${_source}.tde_l10n" ) + endif( ) + if( NOT "${_target}" MATCHES "^/" ) + set( _target "${CMAKE_CURRENT_SOURCE_DIR}/${_target}" ) + endif( ) + + # prepare tags to regexp + string( REPLACE ";" "|" _tags "${_tags}" ) + + # read file + file( READ ${_source} _xml_data ) + string( REGEX REPLACE "[^\n]" "" _xml_len ${_xml_data} ) + string( LENGTH "+${_xml_len}" _xml_len ) + + # process lines + set( _xml_pos 0 ) + unset( _xml_l10n ) + unset( _xml_inside ) + unset( _xml_tag_empty ) + while( _xml_pos LESS ${_xml_len} ) + # pick line + string( REGEX REPLACE "^([^\n]*)\n(.*)" "\\1" _xml_line "${_xml_data}" ) + string( REGEX REPLACE "^([^\n]*)\n(.*)" "\\2" _xml_data "${_xml_data}" ) + math( EXPR _xml_pos "${_xml_pos}+1" ) + set( _xml_newline 1 ) + + # process tags on line + while( _xml_newline OR NOT "${_xml_line}" STREQUAL "" ) + unset( _xml_newline ) + unset( _xml_line_prefix ) + unset( _xml_line_suffix ) + unset( _xml_line_rest ) + if( NOT _xml_inside ) + if( "${_xml_line}" MATCHES "<(${_tags})[^>]*>" ) + set( _xml_inside 1 ) + string( REGEX MATCH "<(${_tags})[^>]*>(.*)" _xml_line "${_xml_line}" ) + string( REGEX REPLACE "^<(${_tags})[^>]*>(.*)" "\\2" _xml_line "${_xml_line}" ) + set( _xml_line_prefix "i18n(" ) + if( _no_c_format ) + set( _xml_line_prefix "${_xml_line_prefix}/* xgettext: no-c-format */" ) + endif( ) + if( _context ) + set( _xml_line_prefix "${_xml_line_prefix}\"${_context}\", " ) + endif( ) + set( _xml_tag_empty 1 ) + else( ) + set( _xml_line "" ) + endif( ) + endif( ) + + if( _xml_inside ) + if( "${_xml_line}" MATCHES "" ) + unset( _xml_inside ) + string( REGEX REPLACE "(.*)" "\\2" _xml_line_rest "${_xml_line}" ) + string( REGEX REPLACE "(.*)" "" _xml_line "${_xml_line}" ) + set( _xml_line_suffix ");" ) + endif( ) + + string( REGEX REPLACE "\\\\" "\\\\\\\\" _xml_line "${_xml_line}" ) + string( REGEX REPLACE "\\\"" "\\\\\"" _xml_line "${_xml_line}" ) + string( REGEX REPLACE "\t" "\\\\t" _xml_line "${_xml_line}" ) + if( NOT ";${_preserve};" MATCHES ";entities;" ) + string( REGEX REPLACE "<" "<" _xml_line "${_xml_line}" ) + string( REGEX REPLACE ">" ">" _xml_line "${_xml_line}" ) + string( REGEX REPLACE "&" "&" _xml_line "${_xml_line}" ) + endif( ) + if( NOT ";${_preserve};" MATCHES ";spaces-leading;" ) + string( REGEX REPLACE "^ +" "" _xml_line "${_xml_line}" ) + endif( ) + if( NOT ";${_preserve};" MATCHES ";spaces-trailing;" ) + string( REGEX REPLACE " +$" "" _xml_line "${_xml_line}" ) + endif( ) + if( NOT ";${_preserve};" MATCHES ";spaces-multi;" ) + string( REGEX REPLACE " +" " " _xml_line "${_xml_line}" ) + endif( ) + + if( _xml_inside ) + if( ";${_preserve};" MATCHES ";line-wrap;" ) + set( _xml_line "${_xml_line}\\n" ) + elseif( NOT "${_xml_line}" STREQUAL "" AND NOT _xml_tag_empty ) + set( _xml_line " ${_xml_line}" ) + endif( ) + endif( ) + if( NOT "${_xml_line}" STREQUAL "" ) + unset( _xml_tag_empty ) + endif( ) + endif( ) + + # drop empty tag on single line + if( _xml_line_prefix AND _xml_line_suffix AND _xml_tag_empty ) + set( _xml_l10n "${_xml_l10n}" ) + + # add current tag to output + else( ) + set( _xml_l10n "${_xml_l10n}${_xml_line_prefix}" ) + if( _xml_line OR ( _xml_line_suffix AND _xml_tag_empty ) ) + set( _xml_l10n "${_xml_l10n}\"${_xml_line}\"" ) + endif( ) + set( _xml_l10n "${_xml_l10n}${_xml_line_suffix}" ) + endif( ) + + # take the rest of the line for processing + set( _xml_line "${_xml_line_rest}" ) + endwhile( ) + set( _xml_l10n "${_xml_l10n}\n" ) + endwhile( ) + + # write file + file( WRITE ${_target} "${_xml_l10n}" ) + +endfunction( )