diff --git a/Common/3dParty/boost/boost.pri b/Common/3dParty/boost/boost.pri index e590f9c27d..919b60a42b 100644 --- a/Common/3dParty/boost/boost.pri +++ b/Common/3dParty/boost/boost.pri @@ -4,6 +4,15 @@ CORE_BOOST_LIBS = $$PWD/build/$$CORE_BUILDS_PLATFORM_PREFIX/lib core_android { INCLUDEPATH += $$PWD/build/android/include CORE_BOOST_LIBS = $$PWD/build/android/lib/$$CORE_BUILDS_PLATFORM_PREFIX + + DEFINES += "_HAS_AUTO_PTR_ETC=0" + QMAKE_CFLAGS += -Wno-enum-constexpr-conversion + QMAKE_CXXFLAGS += -Wno-enum-constexpr-conversion +} + +core_ios { + QMAKE_CFLAGS += -Wno-enum-constexpr-conversion + QMAKE_CXXFLAGS += -Wno-enum-constexpr-conversion } bundle_xcframeworks { diff --git a/Common/3dParty/boost/boost_android.sh b/Common/3dParty/boost/boost_android.sh deleted file mode 100755 index e5510d2811..0000000000 --- a/Common/3dParty/boost/boost_android.sh +++ /dev/null @@ -1,326 +0,0 @@ -#!/bin/bash - -cd boost_1_72_0 -OUTPUT_DIR="../build/android" - -BOOST_LIBS="filesystem system date_time regex" - -CPPSTD="-std=c++11 -frtti -fexceptions" - -# Must set these after parseArgs to fill in overriden values -# Todo: -g -DNDEBUG are for debug builds only... -# Boost.test defines are needed to build correct instrumentable boost_unit_test_framework static lib -# it does not affect the functionality of single-header usage. -# See http://www.boost.org/doc/libs/1_66_0/libs/test/doc/html/boost_test/adv_scenarios/static_lib_customizations/entry_point.html -EXTRA_FLAGS="-DBOOST_AC_USE_PTHREADS -DBOOST_SP_USE_PTHREADS \ - -DBOOST_TEST_NO_MAIN -DBOOST_TEST_ALTERNATIVE_INIT_API -DANDROID_STL=c++_static \ - -Wno-unused-local-typedef" -EXTRA_ANDROID_FLAGS="$EXTRA_FLAGS" - -if [[ -n "$USE_CXX11_ABI" ]]; then - EXTRA_LINUX_FLAGS="$EXTRA_FLAGS -D_GLIBCXX_USE_CXX11_ABI=$USE_CXX11_ABI" -else - EXTRA_LINUX_FLAGS="$EXTRA_FLAGS" -fi - -doneSection() -{ - echo - echo "Done" - echo "=================================================================" - echo -} - -bootstrapBoost() -{ - BOOTSTRAP_LIBS=$BOOST_LIBS - BOOST_LIBS_COMMA=$(echo $BOOTSTRAP_LIBS | sed -e "s/ /,/g") - echo "Bootstrapping for $1 (with libs $BOOST_LIBS_COMMA)" - ./bootstrap.sh --with-libraries=$BOOST_LIBS_COMMA - - doneSection -} - -generateAndroidUserConfig() -{ - HOSTOS="$(uname | awk '{ print $1}' | tr [:upper:] [:lower:])-" # darwin or linux - OSARCH="$(uname -m)" - - # Boost doesn't build with -Werror - # Reported to boost-users@lists.boost.org - - cat > "./tools/build/src/user-config.jam" <x86 android ---target=i686-none-linux-android ---gcc-toolchain=$ANDROID_NDK_ROOT/toolchains/x86-4.9/prebuilt/$HOSTOS$OSARCH ---sysroot=$ANDROID_NDK_ROOT/sysroot --isystem $ANDROID_NDK_ROOT/sources/cxx-stl/llvm-libc++/include --isystem $ANDROID_NDK_ROOT/sources/cxx-stl/llvm-libc++abi/include --isystem $ANDROID_NDK_ROOT/sources/android/support/include --isystem $ANDROID_NDK_ROOT/sysroot/usr/include --isystem $ANDROID_NDK_ROOT/sysroot/usr/include/i686-linux-android --DANDROID --D__ANDROID_API__=19 --ffunction-sections --funwind-tables --fstack-protector-strong --fno-limit-debug-info --fPIC --no-canonical-prefixes --mstackrealign --Wa,--noexecstack --Wformat --Werror=format-security --Wall --Wshadow -; -using clang : 5.0~x86_64 -: $ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$HOSTOS$OSARCH/bin/clang++ $EXTRA_ANDROID_FLAGS -: -x86 android ---target=x86_64-none-linux-android ---gcc-toolchain=$ANDROID_NDK_ROOT/toolchains/x86_64-4.9/prebuilt/$HOSTOS$OSARCH ---sysroot=$ANDROID_NDK_ROOT/sysroot --isystem $ANDROID_NDK_ROOT/sources/cxx-stl/llvm-libc++/include --isystem $ANDROID_NDK_ROOT/sources/cxx-stl/llvm-libc++abi/include --isystem $ANDROID_NDK_ROOT/sources/android/support/include --isystem $ANDROID_NDK_ROOT/sysroot/usr/include --isystem $ANDROID_NDK_ROOT/sysroot/usr/include/x86_64-linux-android --DANDROID --D__ANDROID_API__=21 --ffunction-sections --funwind-tables --fstack-protector-strong --fno-limit-debug-info --fPIC --no-canonical-prefixes --mstackrealign --Wa,--noexecstack --Wformat --Werror=format-security --Wall --Wshadow -; -using clang : 5.0~arm -: $ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$HOSTOS$OSARCH/bin/clang++ $EXTRA_ANDROID_FLAGS -: -arm android ---target=armv7-none-linux-androideabi ---gcc-toolchain=$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/$HOSTOS$OSARCH ---sysroot=$ANDROID_NDK_ROOT/sysroot --isystem $ANDROID_NDK_ROOT/sources/cxx-stl/llvm-libc++/include --isystem $ANDROID_NDK_ROOT/sources/cxx-stl/llvm-libc++abi/include --isystem $ANDROID_NDK_ROOT/sources/android/support/include --isystem $ANDROID_NDK_ROOT/sysroot/usr/include --isystem $ANDROID_NDK_ROOT/sysroot/usr/include/arm-linux-androideabi --DANDROID --D__ANDROID_API__=19 --ffunction-sections --funwind-tables --fstack-protector-strong --fno-limit-debug-info --fPIC --fno-integrated-as --no-canonical-prefixes --Wa,--noexecstack --Wformat --Werror=format-security --Wall --Wshadow --march=armv7-a --mfloat-abi=softfp --mfpu=vfpv3-d16 --mthumb -; -using clang : 5.0~arm64 -: $ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/$HOSTOS$OSARCH/bin/clang++ $EXTRA_ANDROID_FLAGS -: -arm android ---target=aarch64-none-linux-android ---gcc-toolchain=$ANDROID_NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/$HOSTOS$OSARCH ---sysroot=$ANDROID_NDK_ROOT/sysroot --isystem $ANDROID_NDK_ROOT/sources/cxx-stl/llvm-libc++/include --isystem $ANDROID_NDK_ROOT/sources/cxx-stl/llvm-libc++abi/include --isystem $ANDROID_NDK_ROOT/sources/android/support/include --isystem $ANDROID_NDK_ROOT/sysroot/usr/include --isystem $ANDROID_NDK_ROOT/sysroot/usr/include/aarch64-linux-android --DANDROID --D__ANDROID_API__=21 --ffunction-sections --funwind-tables --fstack-protector-strong --fno-limit-debug-info --fPIC --no-canonical-prefixes --Wa,--noexecstack --Wformat --Werror=format-security --Wall --Wshadow -; -EOF -} - -buildBoost_Android() -{ - mkdir -p $OUTPUT_DIR - echo > ${OUTPUT_DIR}/android-build.log - - if [[ -z "$ANDROID_NDK_ROOT" ]]; then - echo "Must specify ANDROID_NDK_ROOT" - exit 1 - fi - - export NO_BZIP2=1 - - # build libicu if locale requested but not provided - # if echo $LIBRARIES | grep locale; then - # if [ -e libiconv-libicu-android ]; then - # echo "ICONV and ICU already compiled" - # else - # echo "boost_locale selected - compiling ICONV and ICU" - # git clone https://github.com/pelya/libiconv-libicu-android.git - # cd libiconv-libicu-android - # ./build.sh || exit 1 - # cd .. - # fi - # fi - - echo clean - ./b2 --clean - - echo Building release x86 Boost for Android Emulator - - ./b2 --build-dir=android-build --stagedir=android-build/stage \ - --prefix="$OUTPUT_DIR" \ - --libdir="$OUTPUT_DIR/lib/x86" toolset=clang-5.0~x86 \ - architecture=x86 target-os=android define=_LITTLE_ENDIAN \ - optimization=speed \ - address-model=32 variant=release cxxflags="${CPPSTD}" \ - link=static threading=multi install >> "${OUTPUT_DIR}/android-build.log" 2>&1 - if [ $? != 0 ]; then echo "Error staging Android. Check ${OUTPUT_DIR}/android-build.log"; exit 1; fi - - doneSection - - echo Building release x86_64 Boost for Android Emulator - - ./b2 --build-dir=android-build --stagedir=android-build/stage \ - --prefix="$OUTPUT_DIR" \ - --libdir="$OUTPUT_DIR/lib/x86_64" toolset=clang-5.0~x86_64 \ - architecture=x86 target-os=android define=_LITTLE_ENDIAN \ - optimization=speed \ - address-model=64 variant=release cxxflags="${CPPSTD}" \ - link=static threading=multi install >> "${OUTPUT_DIR}/android-build.log" 2>&1 - if [ $? != 0 ]; then echo "Error staging Android. Check ${OUTPUT_DIR}/android-build.log"; exit 1; fi - - doneSection - - echo Building release armv7 Boost for Android - - ./b2 --build-dir=android-build --stagedir=android-build/stage \ - --prefix="$OUTPUT_DIR" \ - --libdir="$OUTPUT_DIR/lib/armeabi-v7a" toolset=clang-5.0~arm \ - abi=aapcs architecture=arm address-model=32 binary-format=elf threading=multi \ - optimization=space \ - target-os=android variant=release cxxflags="${CPPSTD}" \ - link=static install >> "${OUTPUT_DIR}/android-build.log" 2>&1 - if [ $? != 0 ]; then echo "Error installing Android. Check ${OUTPUT_DIR}/android-build.log"; exit 1; fi - - doneSection - - echo Building release arm64 Boost for Android - - ./b2 --build-dir=android-build --stagedir=android-build/stage \ - --prefix="$OUTPUT_DIR" \ - --libdir="$OUTPUT_DIR/lib/arm64-v8a" toolset=clang-5.0~arm64 \ - abi=aapcs architecture=arm address-model=64 binary-format=elf threading=multi \ - optimization=space \ - target-os=android variant=release cxxflags="${CPPSTD}" \ - link=static install >> "${OUTPUT_DIR}/android-build.log" 2>&1 - if [ $? != 0 ]; then echo "Error installing Android. Check ${OUTPUT_DIR}/android-build.log"; exit 1; fi - - doneSection -} - -buildBoost_Android_debug() -{ - mkdir -p $OUTPUT_DIR - echo > ${OUTPUT_DIR}/android-build.log - - export NO_BZIP2=1 - - # build libicu if locale requested but not provided - # if echo $LIBRARIES | grep locale; then - # if [ -e libiconv-libicu-android ]; then - # echo "ICONV and ICU already compiled" - # else - # echo "boost_locale selected - compiling ICONV and ICU" - # git clone https://github.com/pelya/libiconv-libicu-android.git - # cd libiconv-libicu-android - # ./build.sh || exit 1 - # cd .. - # fi - # fi - - echo Building debug x86 Boost for Android Emulator - - ./b2 $THREADS --build-dir=android-build --stagedir=android-build/stage \ - --prefix="$OUTPUT_DIR" \ - --libdir="$OUTPUT_DIR/lib/debug/x86" toolset=clang-5.0~x86 \ - architecture=x86 target-os=android define=_LITTLE_ENDIAN \ - optimization=speed \ - address-model=32 variant=debug cxxflags="${CPPSTD}" \ - link=static threading=multi install >> "${OUTPUT_DIR}/android-build.log" 2>&1 - if [ $? != 0 ]; then echo "Error staging Android. Check ${OUTPUT_DIR}/android-build.log"; exit 1; fi - - doneSection - - echo Building debug x86_64 Boost for Android Emulator - - ./b2 $THREADS --build-dir=android-build --stagedir=android-build/stage \ - --prefix="$OUTPUT_DIR" \ - --libdir="$OUTPUT_DIR/lib/debug/x86_64" toolset=clang-5.0~x86_64 \ - architecture=x86 target-os=android define=_LITTLE_ENDIAN \ - optimization=speed \ - address-model=64 variant=debug cxxflags="${CPPSTD}" \ - link=static threading=multi install >> "${OUTPUT_DIR}/android-build.log" 2>&1 - if [ $? != 0 ]; then echo "Error staging Android. Check ${OUTPUT_DIR}/android-build.log"; exit 1; fi - - doneSection - - echo Building debug armv7 Boost for Android - - ./b2 $THREADS --build-dir=android-build --stagedir=android-build/stage \ - --prefix="$OUTPUT_DIR" \ - --libdir="$OUTPUT_DIR/lib/debug/armeabi-v7a" toolset=clang-5.0~arm \ - abi=aapcs architecture=arm address-model=32 binary-format=elf threading=multi \ - optimization=space \ - target-os=android variant=debug cxxflags="${CPPSTD}" \ - link=static install >> "${OUTPUT_DIR}/android-build.log" 2>&1 - if [ $? != 0 ]; then echo "Error installing Android. Check ${OUTPUT_DIR}/android-build.log"; exit 1; fi - - doneSection - - echo Building debug arm64 Boost for Android - - ./b2 $THREADS --build-dir=android-build --stagedir=android-build/stage \ - --prefix="$OUTPUT_DIR" \ - --libdir="$OUTPUT_DIR/lib/debug/arm64-v8a" toolset=clang-5.0~arm64 \ - abi=aapcs architecture=arm address-model=64 binary-format=elf threading=multi \ - optimization=space \ - target-os=android variant=debug cxxflags="${CPPSTD}" \ - link=static install >> "${OUTPUT_DIR}/android-build.log" 2>&1 - if [ $? != 0 ]; then echo "Error installing Android. Check ${OUTPUT_DIR}/android-build.log"; exit 1; fi - - doneSection -} - -bootstrapBoost -generateAndroidUserConfig -buildBoost_Android -#buildBoost_Android_debug - -echo "Completed successfully" diff --git a/Common/3dParty/curl/build-android-common.sh b/Common/3dParty/curl/build-android-common.sh deleted file mode 100755 index d1b069c047..0000000000 --- a/Common/3dParty/curl/build-android-common.sh +++ /dev/null @@ -1,220 +0,0 @@ -#!/bin/bash -# -# Copyright 2016 leenjewel -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -source ./build-common.sh - -export PLATFORM_TYPE="Android" -export ARCHS=("arm" "arm64" "x86" "x86_64") -export ABIS=("armeabi-v7a" "arm64-v8a" "x86" "x86_64") -export ABI_TRIPLES=("arm-linux-androideabi" "aarch64-linux-android" "i686-linux-android" "x86_64-linux-android") -export ANDROID_API=21 - -# for test -# export ARCHS=("x86_64") -# export ABIS=("x86_64") -# export ABI_TRIPLES=("x86_64-linux-android") - -if [[ -z ${ANDROID_NDK_ROOT} ]]; then - echo "ANDROID_NDK_ROOT not defined" - exit 1 -fi - -function get_toolchain() { - HOST_OS=$(uname -s) - case ${HOST_OS} in - Darwin) HOST_OS=darwin ;; - Linux) HOST_OS=linux ;; - FreeBsd) HOST_OS=freebsd ;; - CYGWIN* | *_NT-*) HOST_OS=cygwin ;; - esac - - HOST_ARCH=$(uname -m) - case ${HOST_ARCH} in - i?86) HOST_ARCH=x86 ;; - x86_64 | amd64) HOST_ARCH=x86_64 ;; - esac - - echo "${HOST_OS}-${HOST_ARCH}" -} - -function get_android_arch() { - local common_arch=$1 - case ${common_arch} in - arm) - echo "arm-v7a" - ;; - arm64) - echo "arm64-v8a" - ;; - x86) - echo "x86" - ;; - x86_64) - echo "x86-64" - ;; - esac -} - -function get_target_build() { - local arch=$1 - case ${arch} in - arm-v7a) - echo "arm" - ;; - arm64-v8a) - echo "arm64" - ;; - x86) - echo "x86" - ;; - x86-64) - echo "x86_64" - ;; - esac -} - -function get_build_host_internal() { - local arch=$1 - case ${arch} in - arm-v7a | arm-v7a-neon) - echo "arm-linux-androideabi" - ;; - arm64-v8a) - echo "aarch64-linux-android" - ;; - x86) - echo "i686-linux-android" - ;; - x86-64) - echo "x86_64-linux-android" - ;; - esac -} - -function android_get_build_host() { - local arch=$(get_android_arch $1) - get_build_host_internal $arch -} - -function get_clang_target_host() { - local arch=$1 - local api=$2 - case ${arch} in - arm-v7a | arm-v7a-neon) - echo "armv7a-linux-androideabi${api}" - ;; - arm64-v8a) - echo "aarch64-linux-android${api}" - ;; - x86) - echo "i686-linux-android${api}" - ;; - x86-64) - echo "x86_64-linux-android${api}" - ;; - esac -} - -function set_android_toolchain_bin() { - export PATH=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/$(get_toolchain)/bin:$PATH - echo PATH=$PATH -} - -function set_android_toolchain() { - local name=$1 - local arch=$(get_android_arch $2) - local api=$3 - local build_host=$(get_build_host_internal "$arch") - local clang_target_host=$(get_clang_target_host "$arch" "$api") - - export AR=${build_host}-ar - export CC=${clang_target_host}-clang - export CXX=${clang_target_host}-clang++ - export AS=${build_host}-as - export LD=${build_host}-ld - export RANLIB=${build_host}-ranlib - export STRIP=${build_host}-strip -} - -function get_common_includes() { - local toolchain=$(get_toolchain) - echo "-I${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/sysroot/usr/include -I${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/sysroot/usr/local/include" -} -function get_common_linked_libraries() { - local api=$1 - local arch=$2 - local toolchain=$(get_toolchain) - local build_host=$(get_build_host_internal "$arch") - echo "-L${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/${build_host}/lib -L${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/sysroot/usr/lib/${build_host}/${api} -L${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/lib" -} - -function set_android_cpu_feature() { - local name=$1 - local arch=$(get_android_arch $2) - local api=$3 - case ${arch} in - arm-v7a | arm-v7a-neon) - export CFLAGS="-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wno-unused-function -fno-integrated-as -fstrict-aliasing -fPIC -DANDROID -D__ANDROID_API__=${api} -Os -ffunction-sections -fdata-sections $(get_common_includes)" - export CXXFLAGS="-std=c++11 -Os -ffunction-sections -fdata-sections" - export LDFLAGS="-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wl,--fix-cortex-a8 -Wl,--gc-sections -Os -ffunction-sections -fdata-sections $(get_common_linked_libraries ${api} ${arch})" - export CPPFLAGS=${CFLAGS} - ;; - arm64-v8a) - export CFLAGS="-march=armv8-a -Wno-unused-function -fno-integrated-as -fstrict-aliasing -fPIC -DANDROID -D__ANDROID_API__=${api} -Os -ffunction-sections -fdata-sections $(get_common_includes)" - export CXXFLAGS="-std=c++11 -Os -ffunction-sections -fdata-sections" - export LDFLAGS="-march=armv8-a -Wl,--gc-sections -Os -ffunction-sections -fdata-sections $(get_common_linked_libraries ${api} ${arch})" - export CPPFLAGS=${CFLAGS} - ;; - x86) - export CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32 -Wno-unused-function -fno-integrated-as -fstrict-aliasing -fPIC -DANDROID -D__ANDROID_API__=${api} -Os -ffunction-sections -fdata-sections $(get_common_includes)" - export CXXFLAGS="-std=c++11 -Os -ffunction-sections -fdata-sections" - export LDFLAGS="-march=i686 -Wl,--gc-sections -Os -ffunction-sections -fdata-sections $(get_common_linked_libraries ${api} ${arch})" - export CPPFLAGS=${CFLAGS} - ;; - x86-64) - export CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel -Wno-unused-function -fno-integrated-as -fstrict-aliasing -fPIC -DANDROID -D__ANDROID_API__=${api} -Os -ffunction-sections -fdata-sections $(get_common_includes)" - export CXXFLAGS="-std=c++11 -Os -ffunction-sections -fdata-sections" - export LDFLAGS="-march=x86-64 -Wl,--gc-sections -Os -ffunction-sections -fdata-sections $(get_common_linked_libraries ${api} ${arch})" - export CPPFLAGS=${CFLAGS} - ;; - esac -} - -function android_printf_global_params() { - local arch=$1 - local abi=$2 - local abi_triple=$3 - local in_dir=$4 - local out_dir=$5 - echo -e "arch = $arch" - echo -e "abi = $abi" - echo -e "abi_triple = $abi_triple" - echo -e "PLATFORM_TYPE = $PLATFORM_TYPE" - echo -e "ANDROID_API = $ANDROID_API" - echo -e "in_dir = $in_dir" - echo -e "out_dir = $out_dir" - echo -e "AR = $AR" - echo -e "CC = $CC" - echo -e "CXX = $CXX" - echo -e "AS = $AS" - echo -e "LD = $LD" - echo -e "RANLIB = $RANLIB" - echo -e "STRIP = $STRIP" - echo -e "CFLAGS = $CFLAGS" - echo -e "CXXFLAGS = $CXXFLAGS" - echo -e "LDFLAGS = $LDFLAGS" - echo -e "CPPFLAGS = $CPPFLAGS" -} diff --git a/Common/3dParty/curl/build-android-curl.sh b/Common/3dParty/curl/build-android-curl.sh deleted file mode 100755 index 697e8845b9..0000000000 --- a/Common/3dParty/curl/build-android-curl.sh +++ /dev/null @@ -1,128 +0,0 @@ -#!/bin/bash -# -# Copyright 2016 leenjewel -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# # read -n1 -p "Press any key to continue..." - -set -u - -source ./build-android-common.sh - -init_log_color - -TOOLS_ROOT=$(pwd) - -SOURCE="$0" -while [ -h "$SOURCE" ]; do - DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)" - SOURCE="$(readlink "$SOURCE")" - [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" -done -pwd_path="$(cd -P "$(dirname "$SOURCE")" && pwd)" - -echo pwd_path=${pwd_path} -echo TOOLS_ROOT=${TOOLS_ROOT} - -LIB_VERSION="curl-7_68_0" -LIB_NAME="curl-7.68.0" -LIB_DEST_DIR="${pwd_path}/build/android/curl-universal" - -echo "https://github.com/curl/curl/releases/download/${LIB_VERSION}/${LIB_NAME}.tar.gz" - -# https://curl.haxx.se/download/${LIB_NAME}.tar.gz -# https://github.com/curl/curl/releases/download/curl-7_69_0/curl-7.69.0.tar.gz -# https://github.com/curl/curl/releases/download/curl-7_68_0/curl-7.68.0.tar.gz -rm -rf "${LIB_DEST_DIR}" "${LIB_NAME}" -[ -f "${LIB_NAME}.tar.gz" ] || curl -L -o ${LIB_NAME}.tar.gz https://github.com/curl/curl/releases/download/${LIB_VERSION}/${LIB_NAME}.tar.gz -s -[ -f "${LIB_NAME}.tar.gz" ] || log_error "curl download error!" - -set_android_toolchain_bin - -function configure_make() { - - ARCH=$1 - ABI=$2 - ABI_TRIPLE=$3 - - log_info "configure $ABI start..." - - if [ -d "${LIB_NAME}" ]; then - rm -fr "${LIB_NAME}" - fi - tar xfz "${LIB_NAME}.tar.gz" - pushd . - cd "${LIB_NAME}" - - PREFIX_DIR="${pwd_path}/build/android/${ABI}" - if [ -d "${PREFIX_DIR}" ]; then - rm -fr "${PREFIX_DIR}" - fi - mkdir -p "${PREFIX_DIR}" - - OUTPUT_ROOT=${TOOLS_ROOT}/build/android/${ABI} - mkdir -p ${OUTPUT_ROOT}/log - - set_android_toolchain "curl" "${ARCH}" "${ANDROID_API}" - set_android_cpu_feature "curl" "${ARCH}" "${ANDROID_API}" - - export ANDROID_NDK_HOME=${ANDROID_NDK_ROOT} - echo ANDROID_NDK_HOME=${ANDROID_NDK_HOME} - - OPENSSL_OUT_DIR="${pwd_path}/../openssl/build/android/${ABI}" - - export LDFLAGS="${LDFLAGS} -L${OPENSSL_OUT_DIR}/lib" - # export LDFLAGS="-Wl,-rpath-link,-L${OPENSSL_OUT_DIR}/lib $LDFLAGS " - - android_printf_global_params "$ARCH" "$ABI" "$ABI_TRIPLE" "$PREFIX_DIR" "$OUTPUT_ROOT" - - if [[ "${ARCH}" == "x86_64" ]]; then - - ./configure --host=$(android_get_build_host "${ARCH}") --prefix="${PREFIX_DIR}" --enable-ipv6 --with-ssl=${OPENSSL_OUT_DIR} --enable-static --disable-shared >"${OUTPUT_ROOT}/log/${ABI}.log" 2>&1 - - elif [[ "${ARCH}" == "x86" ]]; then - - ./configure --host=$(android_get_build_host "${ARCH}") --prefix="${PREFIX_DIR}" --enable-ipv6 --with-ssl=${OPENSSL_OUT_DIR} --enable-static --disable-shared >"${OUTPUT_ROOT}/log/${ABI}.log" 2>&1 - - elif [[ "${ARCH}" == "arm" ]]; then - - ./configure --host=$(android_get_build_host "${ARCH}") --prefix="${PREFIX_DIR}" --enable-ipv6 --with-ssl=${OPENSSL_OUT_DIR} --enable-static --disable-shared >"${OUTPUT_ROOT}/log/${ABI}.log" 2>&1 - - elif [[ "${ARCH}" == "arm64" ]]; then - - ./configure --host=$(android_get_build_host "${ARCH}") --prefix="${PREFIX_DIR}" --enable-ipv6 --with-ssl=${OPENSSL_OUT_DIR} --enable-static --disable-shared >"${OUTPUT_ROOT}/log/${ABI}.log" 2>&1 - - else - log_error "not support" && exit 1 - fi - - log_info "make $ABI start..." - - make clean >>"${OUTPUT_ROOT}/log/${ABI}.log" - if make -j$(get_cpu_count) >>"${OUTPUT_ROOT}/log/${ABI}.log" 2>&1; then - make install >>"${OUTPUT_ROOT}/log/${ABI}.log" 2>&1 - fi - - popd -} - -log_info "${PLATFORM_TYPE} ${LIB_NAME} start..." - -for ((i = 0; i < ${#ARCHS[@]}; i++)); do - if [[ $# -eq 0 || "$1" == "${ARCHS[i]}" ]]; then - configure_make "${ARCHS[i]}" "${ABIS[i]}" "${ABI_TRIPLES[i]}" - fi -done - -log_info "${PLATFORM_TYPE} ${LIB_NAME} end..." diff --git a/Common/3dParty/curl/curl.pri b/Common/3dParty/curl/curl.pri index d1178d404e..6d24ea212d 100644 --- a/Common/3dParty/curl/curl.pri +++ b/Common/3dParty/curl/curl.pri @@ -1,18 +1,10 @@ core_android { - - ABI_PATH = $$replace(CORE_BUILDS_PLATFORM_PREFIX, "android_", "") - contains(ABI_PATH, "armv7" ) { - ABI_PATH = $$replace(ABI_PATH, "armv7", "armeabi-v7a") - } - contains(ABI_PATH, "arm64_v8a" ) { - ABI_PATH = $$replace(ABI_PATH, "arm64_v8a", "arm64-v8a") - } INCLUDEPATH += \ - $$PWD/build/android/$$ABI_PATH/include \ - $$PWD/../openssl/build/android/$$ABI_PATH/include \ + $$PWD/build/android/include \ + $$PWD/../openssl/build/android/$$CORE_BUILDS_PLATFORM_PREFIX_DST/include LIBS += \ - $$PWD/build/android/$$ABI_PATH/lib/libcurl.a \ - $$PWD/../openssl/build/android/$$ABI_PATH/lib/libssl.a \ - $$PWD/../openssl/build/android/$$ABI_PATH/lib/libcrypto.a \ + $$PWD/build/android/$$CORE_BUILDS_PLATFORM_PREFIX_DST/libcurl.a \ + $$PWD/../openssl/build/android/$$CORE_BUILDS_PLATFORM_PREFIX_DST/lib/libssl.a \ + $$PWD/../openssl/build/android/$$CORE_BUILDS_PLATFORM_PREFIX_DST/lib/libcrypto.a \ } diff --git a/Common/3dParty/hunspell/test/dst/az_Latn_AZ.txt b/Common/3dParty/hunspell/test/dst/az_Latn_AZ.txt new file mode 100644 index 0000000000..5365bb7974 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/az_Latn_AZ.txt @@ -0,0 +1,213 @@ +A [Ü, Ha, Ağ, Ac, Ad, Da, Fa, Ah, Ka, Al, An, Na, Qa] +qocalmaq [almayacaq, almamaq] +Alderaan'ın [Federasiyanın] +hamısı +həmçinin +Və +cavab +dir +incəsənət +kimi +da +uzaq +körpə +zirzəmi [zəmində] +ol +olub +doğuldu [doğulduğu, doğurduğu] +bulvar [bunlar] +fasilə +nəsllər [nəsillər, nəsnələri, nəslə, nələrlə, səslər] +gəlin +lakin +al +ilə +Kaliforniya [Kanalizasiya] +Kalifornikasiya [Kommunikasiya] +bilər +kartlar +şans +Çin +çənə [dənə, çəkə, mənə, nənə, sənə, tənə, çənəyə] +klublar +Cobain [] +bürc [borc, gürcü] +nəzarət +qiymət +edə bilməzdim [bilməzdim] +yaratmaq +lənət +rəqs +saziş +sövdələşmələr [məsləhətləşmələr] +dağıdıcı +almazlar [almanlar, almaz lar, almaz-lar, almaları, marallar, mallara] +etməz +etməyərik [etmərik, etmədikləri] +arzu +xülyalar [yalanlar] +Şərq +kənar +kənarları [kənar ları, kənar-ları, kənarına, kənarında, kəlamları, aparılarkən] +məmnunluq +hamının +uzaq +peri [şeri, geri, meri, yeri] +solğun [dolğun] +üz +son +tap +ilk +üçün +-dan [-dam, -da, -an, -dana, -adan, -nda, -daş, -dən, -dağ, -can, -dad, -din, -lan, -don, -qan, adan, andan] +sərhəd +qız +qızın +yaxşı +gitara [artaraq] +əl +hardcore [hardadır] +var +yoxdur +o [od, ol, on, ot, ov, ox, ü, ı] +eşitmək +ürək +O'nun [Onun, Oyununu] +ona +gizli +yüksək +ona +onun +Hollivud [Holland] +Mən +Mənəm +əgər +içində +məlumat +içində +dir +bu +jack [janra] +sadəcə +kral +qohum +bilmək +qoyulmuş +qanun +yerləşdirilmək [yerləşdirilməsi, yerləşdirilmiş, yerləşdirilib, yerləşdirildiyini] +qurğuşun [quruluşunun] +aparmaq +yerləşdirilmə [yerləşdirilməsi, yerləşdirilmiş, yerləşdirilib, yerləşdirildiyini] +məkan +sevmək +şans +edilmiş +adam +çox +Evlənmək +maska [masa, marka] +o bilər [bilərlər, bilər] +bəlkə də [bəlkə] +mənası +mən +meditasiya [dissertasiya] +xatirə +ağılın +pul +mənim +heç vaxt [vaxtsa] +deyil +heç nə [heçə] +nömrələr [nömrələri, nömrə lər, nömrə-lər, nömrəli, nömrə] +of [od, əf, ol, on, ot, ov, ox, ofis] +of [od, əf, ol, on, ot, ov, ox, ofis] +üstündə +bir +yalnız +və ya [vəla] +nəticə +öz +Ödə [Də, Ədə, Adə, Edə, Idə, Öndə, Ölə, Önə] +Şəftəli [Həftəlik] +yerlər +oynayır +oynamaq +əhali +porno [sponsor] +tərifləmək [təriflər, təklifləri, təkliflərlə, təkliflərə] +ehtimal ki [ehtimal] +ehtimal +psixik [psixi, psixoloji] +kraliça [kralı] +qaldırmaq +qalan +hörmət +qalxmaq +yol +xam +müqəddəs +Xilas et [Xilası] +elmi +çığırmaq [çağırmaq, çıxarmaq] +satılır +şəkil +xəstələnmək [xəstələnməyi, dəstəklənməsi] +gümüşçü [gümüş] +dəri +əsgər +bir şey [şeydir] +Mahnı +mahnılar +qılınclar [qılınc lar, qılınc-lar, qılıncı] +büyü [böyüyü] +casuslar [ruslar] +ulduz +Stansiya +oğurlamaq [vurğulamaq] +daşlar +günəş +şübhəli +İsveç +qılınclar [qılınc lar, qılınc-lar, qılıncı] +yeniyetmə +test +dandan [andan, candan, qandan, yandan, danışanda, adından, yanından, canından] +bu ki [builki] +bu ki [builki] +bu +onların +bu +onlar +düşünmək +bu +onlar +gel-git [get-gedə] +üçün +deyilmişəm [deyilmiş əm, deyilmiş-əm, deyilmişdi, deyilmiş, deyilmi, deyiləm] +çox +cəhd et [cəhdlər] +başa düşdüm [] +qilin [ilin, bilin, dilin] +titrəmək [itirməmək, itirmək] +mübarizə aparır? [] +istəyirəm +müharibə +idi +dalğalar [qadağalar, dağlarda, adalar, dağlar] +geymək [getmək, getməmək] +silahlar +yaxşı +idarə olunan [olunanlardan] +Qərbi [Hərbi, Qəbri, Qərb, Qərbin, Qəbir, Qərbə, Qəlbi] +nə +arasında +qalib gəlmək [qaliblərin] +qalib gəlir [qalibləri] +ilə +qadın +dünya +səhv +siz +sizə +sənsən [səndən, sən sən, sən-sən, nədənsə, mənsə, sənə, səslənən] +sənin diff --git a/Common/3dParty/hunspell/test/dst/bg_BG.txt b/Common/3dParty/hunspell/test/dst/bg_BG.txt new file mode 100644 index 0000000000..57cc73c5c7 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/bg_BG.txt @@ -0,0 +1,212 @@ +A [А, Е, О, И, В, С, Я, У] +остаряване +Алдераан [Дерайлиран] +всичко +също +и +отговор +са +изкуство +като +в +далеч +бебе +мазе +бъда +било +роден +булевард +почивка +породи +невеста +но +купувам +от +Калифорния +Калифорникация [Калифорнийския, Калифорнийка, Калифорния] +може +карти +шанс +Китай +брадичка +клубове +Кобейн [Кобен] +съзвездие +контрол +цена +не можех [можехме] +създаване +проклятие +танц +сделка +сделки +унищожение +диаманти +не прави [неправи, неуправии, неправдиви] +не правим [непоправим] +мечта +мечти +Изток +ръб +ръбове +екстаз +всеки +далеч +приказка +избледнява +лица +краен +намирам +първи +за +от +предел +момиче +момичето +добре +китара +ръка +хардкор [хардуер] +има +няма +той +чуя +сърце +той е [той] +нейни +скрит +висок +него +негов +Холивуд +аз +аз съм [разсъмна] +ако +в +информация +вътре +е +това е [товарен] +вале +просто +крал +родственик +знам +определен +закон +поставям +водя +води +местоположение +обичам +късмет +направен +човек +много +Ожени се [Брожение] +маска +май +може би [можещи] +означава +аз +медитация +спомен +ума +пари +моя +никога +не +нищо +числа +от +изключен +на +един +само +или +изход +свой +Плати +праскова +места +играе +играя +население +порно [бурно, орно, порено, опорно, спорно, упорно, порна, парно, порне, поено, порни, потно, торно, морно, горно] +похвала +вероятно +вероятен +психичен +кралица +въздигам +останал +почит +възход +път +груб +светия +Спасявам +наука +крясък +продава +форма +по-болен +златар +кожа +войник +някаква +Песен +песни +пикове +заклинание +шпиони +звезда +стация [станция, стария, статия, стадия, атестация, стагнация] +крада +камъни +слънце +подозрителен +Швеция +мечове +тийнейджър [тинейджър, пейджър] +тест +отколкото +това +това е [товарен] +на +техни +тези +те с [тесте] +мисли +този +той +прилив +до +каза +също +опитайте +разбрано +еднорог [едно рог, еднороден] +вибрация +водене? [водене, неводен, воден] +искам +война +беше +вълни +носете +оръжия +Ами +бяха +Западна +какво +докато +победа +победи +със +жена +свят +грешка +ти +ти би [табиети] +ти си [тифуси] +вашият diff --git a/Common/3dParty/hunspell/test/dst/ca_ES.txt b/Common/3dParty/hunspell/test/dst/ca_ES.txt new file mode 100644 index 0000000000..be726d0d8a --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/ca_ES.txt @@ -0,0 +1,112 @@ +amor +llum +lluum [lluu, llum, lluus, lluïm, lluu m] +esperança +espirança [esperança, espirant, espinçadora, espinça, espira] +llibertat +força +forrça [forra, força, forçar] +pau +somni +llibre +mar +amistat +cançó +flor +cel +estrella +temps +camí +vent +muntanya +mumntanya [muntanya, muntanyà, muntant] +riu +soroll +silenci +viatge +foc +gel +paraula +vida +dia +nit +tarda +matí +lluna +sol +llac +marbre +ferro +sal +mel +sucre +peix +ocell +oceoll [ocell] +joc +ritme +melodia +pintura +pentura [puntera, entura, pintura, puntura, ventura, penetrant, apertura, parapent] +teatre +dansa +poema +història +llegenda +mitologia +festa +música +vi +cervesa +cervessa [cervesa, cer vessa, cer-vessa, cerves sa, cerves-sa, cervesera, cerveseria, cerveser, cessava] +formatge +pa +ciutat +poble +natura +camp +bosc +platja +sorra +sorrà +pedra +ànima +cos +ment +cor +somriure +somriàre [somriure, somrient] +abraçada +bes +parla +oida [oidà, oïda, ioda, odia, aido, oia, oda, oiada, oxida, aida, sida, onda, mida, dida, vida] +vista +tacte +gust +olfacte +color +forma +número +lletra +sistema +regla +escola +universitat +univversitat [universitat, universitari, universalitat, universalitzat, universalista] +mestre +estudiant +sabiduria [sabuderia] +lliçó +pregunta +resposta +risposta [resposta, disposta, ris posta, ris-posta, risp osta, risp-osta, trasposta, posteritat, riosta, polvorista] +dubte +certesa +veritat +mentida +promesa +secret +descoberta +descaberta [descoberta, desca berta, desca-berta, descabestrat, descartable, descabota, descarta] +aventura +destinació diff --git a/Common/3dParty/hunspell/test/dst/ca_ES_valencia.txt b/Common/3dParty/hunspell/test/dst/ca_ES_valencia.txt new file mode 100644 index 0000000000..87fc1cc63b --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/ca_ES_valencia.txt @@ -0,0 +1,212 @@ +A +envellir +Alderaan [Aldebaran, Aldebrand, Aldeana, Anedera] +tot +també +I +resposta +és +art +com +a +lluny +nadó +celler +ser +ha estat [hastat] +nat +bulevard +pausa +generacions +núvia +però +comprar +amb +Califòrnia +Californication [Californiana, Californita] +pot +cartes +oportunitat +Xina +mentó +clubs +Cobain [Cobai, Cobais, Cobrin, Cob ain, Cob-ain, Cobalamina] +signe del zodíac [signé del zodíac, signè del zodíac, sígne del zodíac, sïgne del zodíac, signE del zodíac, Signe del zodíac, sIgne del zodíac, sigNe del zodíac, siGne del zodíac] +control +preu +no podria [nodriria, podriria, nodria] +crear +maleït +ballar +acord +negocis +destructiu +diamants +no fer [noosfera] +no fem [nomenem] +desitjar +somnis +Est +vora +voreres +satisfacció +tots +llunyà +fada +pallid [pallis, palli, pallin, pali] +cara +final +trobar +primer +per +de +frontera +noia +la noia [la noïa, la Noia] +bé +guitarra +mà +hardcore [recordar] +hi ha [hifa] +no hi ha [nó hi ha, nò hi ha, nO hi ha, No hi ha] +ell +sentir +cor +ell és [estellés] +seva +secret +alt +ell +seu +Hollywood +jo +sóc +si +en +informació +interior +és +és +jack +només +rei +parent +saber +fixat +llei +col·locar +plom +portar +col·locació +lloc +estimar +oportunitat +fet +home +molts +casar-se +màscara +podria +potser +sentit +jo +meditació +memòria +ment +diners +meu +mai +no +res +números +de +fora +sobre +un +només +o +resultat +seu +pagar +préssec +llocs +jugar +joc +població +porno +elogiar +probablement +probable +psíquic +reina +elevar +restant +respecte +pujar +camí +cru +sant +salvar +ciència +crit +vendre’s [vendre's, vendre] +figura +malalt +joier +pell +soldat +alguna cosa [glucosamina] +cançó +cançons +cims +encanteri +espies +estrella +estació +robar +pedres +sol +sospitós +Suècia +espases +adolescent +prova +que +que +això +seu +aqueixos +ells +pensar +aqueix +ells +marees +per +no he estat [nó he estat, nò he estat, nO he estat, No he estat] +molt +intentar +entendre +fer +tremolar +lluitar +desitjar +guerra +va ser [vaser, serva] +ones +portar +armes +bé +administrat +Oest +què +entre +guanyar +guanya +amb +dona +món +equivocat +tu +vostè +tu ets [tubets] +teu diff --git a/Common/3dParty/hunspell/test/dst/cs_CZ.txt b/Common/3dParty/hunspell/test/dst/cs_CZ.txt new file mode 100644 index 0000000000..916cc8419c --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/cs_CZ.txt @@ -0,0 +1,206 @@ +pomaliý [pomalý, pomaličku] +šťstný [šťastný] +smuutný [smutný, smutnu] +horcký [horký, horácký, horecký, horský, hornický, horňácký] +studiený [studený, studie] +záludnast [záludnost, záludný] +náhodillost [nahodilost, náhodnost] +úpěnlevý [úpěnlivý, úpletový] +rozspačitý [rozpačitý, rozpačitěný] +svéhllavý [svéhlavý, svéhlavička] +jablko +slunce +voda +dům +pták +káva +chleba +květina +kniha +pes +kočka +město +zelený +modrý +červený +bílý +černý +velký +malý +rychlý +pomalý +šťastný +smutný +horký +studený +nový +starý +hezký +ošklivý +dobrý +špatný +zdravý +nemocný +silný +slabý +chytrý +hloupý +pracovat +jíst +pít +spát +číst +psát +mluvit +smát se [smát] +plakat +zpívat +hrát +tančit +učit se [učitele] +nakupovat +vařit +telefonovat +dívat se [sedívat] +poslouchat +chodit +běžet +létat +plavat +psát +učit se [učitele] +dělat +mít +být +jít +přijít +odejít +dát +vzít +říct +vidět +slyšet +cítit +myslet +chtít +moct +muset +rád +nerad +ano +ne +prosím +děkuji +na shledanou [shledanou, dohledanou, shledávanou, ohledanou] +omlouvám se [omlouvání] +sbohem +ahoj +čau +hej +jo +fakt +super +blbost +paráda +no jo [nojo] +jasně +takže +vlastně +třeba +snad +leštěnka +pochmurný +živelný +ponaučení +záhada +pochybnost +nádhera +soucit +záludnost +náhodilost [nahodilost, náhodnost] +úpěnlivý +rozpačitý +svéhlavý +marnivost +blahodar [blaho dar, blaho-dar, lahoda] +rozčarování +odchylka +přelud +vytrvalost +neústupnost +lehkost +souznění +rozmarnost +roztržitost +úskočnost +rozkoš +marasmus +rozpolcenost +neúprosnost +ztřeštěnost +chmurnost +okouzlení +zářivost +vyrovnanost +neochvějnost +neúcta +bizarnost +rozmařilost +nepochopení +nevýslovný +pomíjivost +beznaděj +úzkost +odtažitost +rozerv [rozerve, rozervi, rozervu, rezerv, rozervat] +rozervanost +vyčerpanost +bezcitnost +záludnost +nezdolnost +rozkošátnost [rozkošnost, rozkošatěnost, rozkošnickost, rozkoktanost] +nezdolatelnost +rozmarnost +živelnost +bezútěšnost +záhadnost +neposkvrnitelnost [nepotiskovatelnost, nepopisovatelnost, nepřemostitelnost, nezvratitelnost] +rozkošnělost [rozkošatělost, rozkošnost, rozkošnickost, rozkošatěnost] +bezradnost +neuchopitelnost +pošetilost +opojení +rozervanost +marnost +bezstarostnost +nevinnost +náladovost +vyrovnanost +ztracenost +bezbřehost +rozervanost +opojení +bezradnost +neuchopitelnost +pošetilost +opojení +rozervanost +marnost +bezstarostnost +nevinnost +náladovost +vyrovnanost +ztracenost +bezbřehost +opojení +bezradnost +neuchopitelnost +pošetilost +opojení +rozervanost +marnost +bezstarostnost +nevinnost +náladovost +vyrovnanost +bezbřehost diff --git a/Common/3dParty/hunspell/test/dst/da_DK.txt b/Common/3dParty/hunspell/test/dst/da_DK.txt new file mode 100644 index 0000000000..b7a362e12d --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/da_DK.txt @@ -0,0 +1,129 @@ +Hej +Goddag +Tak +Ja +Nej +Måske +Mad +Vand +Hus +Bil +Tog +Cykel +Skole +Børn +Far +Mor +Søster +Bror +Hund +Kat +Fisk +Fugl +Træ +Blomst +Græs +Sol +Måne +Himmel +Regn +Sne +Sommer +Vinter +Forår +Efterår +Aften +Nat +Dag +Uge +Måned +År +Læse +Skrive +Tale +Lære [Lære, Læres, Lærer, Læren, Læreø, Læreå, læreå] +Arbejde +Sove +Vågne +Løbe +Gå +Sidde +Stå +Lytte +Se +Høre [Høre, Høres, Hører, Høreø, Høreå, høreå] +Spise +Drikke +Kød +Frugt +Grøntsager +Ost +Brød +Vand +Juice +Kaffe +Te +Mælk +Smør [Smør, Smøre, Smørs, Smør'] +Æg +Salt +Peber +Sukker +Bolle +Smørrebrød +Køkken +Stue +Soveværelse +Badeværelse +Toilet +Bord +Stol +Sofa +Lampe +Vindue +Dør +Gulv +Loft +Væg +Sofa +Pude +Tæppe +Badekar +Håndvask +Spejl +Håndklæde +Seng +Dyne +Dynee [Dynes, Dyner, Dyne, Dynen, Dynge, Dynees, Dynete, Dyneel, Dynele, Dyneed, Dyneeg, Dyneem, Dynefe, Dyneve] +Pude +Pudee [Pudene, Pudre, Puder, Pude, Pudes, Pudse, Puden, Pudet, Pudel] +Alarm +Alarmm [Alarm, Alarms] +Skrivebord +Stol +Hus +Hund +Kat +Katt [Kett, Katy, Katty, Kate, Kitt, Kata, Kato, Matt, Watt, Kat, Kast, Kats, Takt, Kart, Katte] +Bil +Skole +Skolee [Skolie, Skolede, Skoler, Skole, Skoles, Skolen, Skolet, Skolde] +Sol +Soll [Sol, Sole, Sols, Soli, Sola, Sall, Sold, Solo, Soul] +Vand +Vandd [Vanda, Vandy, Vandt, Vand, Vands, Vande, Vandr] +Mad +Madd [Mads, Maud, Mad, Made, Mand] +By +Barn +Barnn [Barni, Baran, Barny, Barn, Baren, Barns, Baron] +Tørklæde +Skæbne +Uafhængighed +Kærlighed +Kærligheed [Kærlighed, Ærlighed, Hæderlighed, Herlighed, Liderlighed] +overbelastning +Modstandsbevægelsen +Uafhængighedserklæringen +Forårssommertemperaturen +Stabiliseringsperioden diff --git a/Common/3dParty/hunspell/test/dst/de_AT.txt b/Common/3dParty/hunspell/test/dst/de_AT.txt new file mode 100644 index 0000000000..060081d011 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/de_AT.txt @@ -0,0 +1,131 @@ +Ägyptologie +Ährenamt [Ährensamt, Ährenast, Ährenart, Ährenact, Ährenabt, Ährenakt, Ährenaxt, Ehrenamt, Ohrenamt, -ährenamt, Ährenartig] +Ängstlichkeit +Äquatoria +Abarbeiten +Abbild +Abbilden +Abbildungs [Abbildung, Abbildungs-, Bildungsnah, Unbildung] +Abbreviatur +Abbrüche +Abfassen +Abfertigen +Abfolge +Abfuhr +Ableugnen +Ablichten +Ablöse +Absätze +Abschnitts +Abwechseln +Abwehren +Aktiv +Britannia +Browserfenster +Budgetieren +Bugpartie +Bukarester +Burgundersoße +Butterkrem +Button +Cabriolet +Campanile +Canapé +Caprice +Celsius +Chamäleon +Charakteristik +Chronometer +Chronometrie +Cölln +Connectzustände +Cursorspur +Däne +Dachs +Dahindämmern +Darbringen +Daten +Datenbankserver +Desktopsystem +Detektivfilm +Dichtertum +Dinosaurier +Direktion +Diskantgambe +Diskothek +Druckereicode +Kapsel +Karausche +Katzen +Klinge +Klinke +Kohlrabi +Koinzidenz +Kolleg +Komplott +Meereis +Mehrphasigkeit +Memorieren +Messen +Methode +Metrowaggon +Meute +Migräne +Milieuforschung +Mindern +Mineralien +Mitternacht +Mobiliar +Mohrrübe +Mühelosigkeit +Normativität +Notifikation +Ökonomie +Orangeton +Osten +Subjekt +Subsidiarität +Subsumieren +Tagfalter +Speicher +Spielzeugsammlung +Zahler + +Сложные слова [] +Zurückgezogenheit +Äquipotentialfläche +Äußerungsbedeutung +Abfassungszeitraum +Abgeschlossenheits [Abgeschlossenheit, Abgeschlossenheits-, Unabgeschlossenheit, Aufgeschlossenheit, Abgeschlagenheit, Geschlossenheit] +Adjunktionsbeseitigung +Anknüpfungsgrundsätze +Chiffrierschlüssel +Knochenmarktransplantation +Bundeskaderathlet +Carbonsäurechlorid +Cardiazoltherapie +Chancenungleichheit +Charakterisierungsmöglichkeit +Chlorophyllkonzentration +Computerspielemarkt +Deindustrialisieren +Dekodierungsmöglichkeit +Kartoffelschälmesser +Kernspinresonanztomographie +Merkmalskombination +Nachbarschaftszentren +Opportunitätsprinzip +Tiefenstaffelung +Tourismusfachmann +Sequenzbetrachtung + +Слова с ошибками [] +Dechifrierprogramm [Dechiffrierprogramm, Liederprogramm] +Administratorkenwort [Administratorkennwort, Administratorkonto, Administratorrecht, Distriktadministrator, Distriktsadministrator] +Spigeln [Spiegeln] +Tätigkeite [Tätigkeit, Tätigkeiten, Untätigkeit, Nagetätigkeit, Mildtätigkeit, Regietätigkeit] +Draufgangertum [Draufgängertum, Draufgänger] +Abschnit [Abschnitt, Abschritt] +Komunikation [Kommunikation, Exkommunikation, Kommunikativ, Kommunikator, Komplikation] +Drackereicode [Druckereicode, Dreidecker] +Bumeln [Baumeln, Bummeln, Blumen, Brummeln, Bummel] diff --git a/Common/3dParty/hunspell/test/dst/de_CH.txt b/Common/3dParty/hunspell/test/dst/de_CH.txt new file mode 100644 index 0000000000..196e03636b --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/de_CH.txt @@ -0,0 +1,116 @@ +Alpinist +Alteration +Alternative +Alumne +Amateurfilmer +Ambulanz +Amtmänner +Analogie +Analytik +Ananas +Angabe +Ankünfte +Dynastie +Ebenbürtigkeit +Echtheitszertifikat +Editionspläne +Editor +Ehrenamtlichkeit +Eigentümerschaft +Einbau +Eindringling +Eingabequittungsbetrieb +Einhüllen +Einkommen +Einloggen +Einschließen [Einschliessen, Einschliefen] +Einsortier [Einsortier-, Einsorter, Eintortier, Einportier, Einvortier, Einsortiere, Einsortiert, Unsortierter, Unsortiert, Einzusortieren, Sortieren] +Elaboration +Elementar +Entertainer +Entkuppeln +Entschädigungs [Entschädigung, Entschädigungs-, Entschädigungslos, Entschädigens, Entschädigen] +Enumerator +Erbringen +Erdichten +Erfahrenheit +Erhalt +Erleichtern +Ersparnis +Erstatten +Erzählliteratur +Helikopter +Helpdesk +Herunterladen +Hindeuten +Hinterlassenschaft +Hiob +Landesprache [Landessprache, Landesrache, Landsprache, Ladesprache, -landesprache] +flexibilität [Flexibilität, -flexibilität, flexibilisiert] +floristisch +flugbillet [Flugbillet, -flugbillet, flugbereit] +heroben +herrichten +herstellen +herübereilen +herunterzubücken +hie +hieraus +hilfe [Hilfe, hilf, hilfe-, -hilfe, helfe, hilft, hälfe] +himbeere [Himbeere, -himbeere, himbeer-, himbeerrot] +justiz [Justiz, justiz-, -justiz, justiziell] +kältebeständig +kärtchen [Kärtchen, -kärtchen, Gärtchen, Bärtchen, kärglichen] +känguru [Känguru, -känguru] +kaktusgewächs [Kaktusgewächs, -kaktusgewächs, ausgewechselt] +kalligrafie [Kalligrafie, -kalligrafie, kalligrafiere, kalligrafische, kalligrafisch] +kamel [Kamel, kamel-, -kamel, kamen, rammel] +kampagnendirektor [Kampagnendirektor, -kampagnendirektor, kampagnenartig] +kapazitär +kapitalist [Kapitalist, -kapitalist, kapital ist, kapital-ist, kapitalistisch, kapitalisierst, kapitalisiert, kapitalstark] +karamell [Karamell, karamell-, -karamell, lamellar] +kardieren +karpfen [Karpfen, -karpfen, krampfen] +katalogdaten [Katalogdaten, -katalogdaten, katalogartigen] +lyzeum [Lyzeum, -lyzeum] +mahagonirot +makkaroni [Makkaroni, -makkaroni, marokkanisch] +malerausbildung [Malerausbildung, -malerausbildung, ausbildungsreif] +management [Management, -management, managen, gemanagt, angemahnt] +mangel +maniküre +manneskraft [Manneskraft, -manneskraft, maskenhaft] +mansarde [Mansarde, -mansarde, ansparende] +mark [Mark, -mark, merk, park, Sark, Park, Bark, markig] +marketingpraktiker [Marketingpraktiker, -marketingpraktiker, marketingorientiert, marketingwirksamer] +maschinell +massage [Massage, massage-, -massage, massige, Passage, Gassage, passagere] +massengutschifffahrt [Massengutschifffahrt, -massengutschifffahrt, maschinenschriftlich] +materie [Materie, -materie, materiell, materiefrei, maturiere, mattier] +medaille [Medaille, -medaille, medaillenlos] +medizinalshampoo [Medizinalshampoo, -medizinalshampoo, sozialmedizinisch] +meeresfrüchte [Meeresfrüchte, -meeresfrüchte, Heeresfrüchte, meeresfeuchte, meeresfeucht, früchtereiche, früchtereich] +quotient [Quotient, -quotient, quotiert, quotieren, quotiere, quotisieren] +salonwagen [Salonwagen, -salonwagen, lossagen] +satzeinleitend +trilateral +tristesse [Tristesse, -tristesse, tristeste, trist esse, trist-esse, triste, rissfeste, stresse, rissfest] +tropen [Tropen, tropfen, tropen-, -tropen, trogen, tropenfest] +vereisen +verfahren +verfügungs [verfügungs-, verfügen] +verhindern +verkäufer [Verkäufer, -verkäufer, verkämpfe, verkaufe, verkupfer] + +Слова с ошибками [] +Anbindungsystem [Anbindungssystem] +Anglistikdocent [Anglistikdozent, Anglistikstudent, Linguistikdozent] +Ecco [Echo, Codec] +Economclass [Economyclass, Economyklasse] +Einverstandnis [Einverständnis, Einverstandanis, Einverstandnils, Einverstandeis, Einverstandnil, Einverstanden, Seinsverständnis, Koranverständnis, Unverständnis] +Electrik [Elektrik, Electrabel] +Historique [Historisiere, Historie] +herüberzurucken [herüberzugucken, herüberzurücken, herüberzulocken, herüberzustrecken, herüberzublicken, herüberzuschicken] +kartofel [kartoniere] +salade [malade, lade] +sanddornbere [versandbereite] diff --git a/Common/3dParty/hunspell/test/dst/de_DE.txt b/Common/3dParty/hunspell/test/dst/de_DE.txt new file mode 100644 index 0000000000..36cde4a624 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/de_DE.txt @@ -0,0 +1,211 @@ +Hallo +Guten Morgen [Morgenläuten, Morgenröten] +Danke +Bitte +Ja +Nein +Entschuldigung +Tschüss +Liebe +Freund +Familie +Glück +Gesundheit +Schule +Arbeit +Essen +Trinken +Wasser +Brot +Käse +Fleisch +Gemüse +Obst +Kaffee +Tee +Milch +Zucker +Salz +Pfeffer +Haus +Wohnung +Bett +Stuhl +Tisch +Sofa +Fernseher +Telefon +Computer +Buch +Zeitung +Schreiben +Lesen +Hören +Sehen +Fühlen +Laufen +Springen +Schwimmen +Tanzen +Singen +Lachen +Weinen +Freude +Trauer +Angst +Mut +Liebe +Hass +Freundschaft +Beziehung +Familie +Eltern +Kinder +Geschwister +Großeltern +Onkel +Tante +Cousin +Cousine +Ehemann +Ehefrau +Verlobung +Hochzeit +Scheidung +Geburt +Tod +Krankheit +Arzt +Krankenhaus +Medikament +Apotheke +Gesundheit +Wohlbefinden +Fitness +Diät +Schlaf +Ruhe +Entspannung +Sport +Fußball +Tennis +Schwimmen +Laufen +Radfahren +Wandern +Reisen +Urlaub +Strand +Sonne +Meer +Komplementär +Perspektive +Konsens +Integrität +Konsequenz +Authentizität +Korrelation +Charakteristik +Akzeptanz +Flexibilität +Assoziation +Dekomposition +Komplexität +Positivismus +Universalität +Stabilität +Individualität +Konsistenz +Konformität +Dezentralisierung +Kollaboration +Partizipation +Präzision +Transformation +Konkurrenz +Paradoxie +Redundanz +Regeneration +Integration +Isolation +Asymmetrie +Aggregation +Disziplin +Resilienz +Relevanz +Konfusion +Komplikation +Koordination +Harmonie +Ineffizienz +Konstruktion +Konversion +Kollusion +Gerontologie +Differenzierung +Dimensionalität +Inferenz +Fluktuation +Kontraktion +Rezession +Inflation +Dekontamination +Exzellenz +Innovation +Isomorphie +Konnotation +Insuffizienz +Konversion +Kompensation +Koalition +Inkongruenz +Inkontinenz +Kontrahent +Konfiskation +Konjunktur +Aggression +Konfrontation +Kompatibilität +Prognose +Akzeleration +Konstruktion +Diversifikation +Prävention +Sanktion +Indikation +Reduktion +Konkurrenz +Konfiguration +Konnotation +Rezession +Transformation +Interaktion +Kooperation +Innovation +Kollision +Proklamation +Konnotation +Konfrontation +Disposition +Konkordanz +Deklamation +Kollaboration +Isolation +Inflation +Diversifikation +Konnotation +Kompensation +Diffusion +Dekadenz +Konserve +Deklomotion [Deklamation, Deklination, Deletionsklon] +Kolaboration [Kollaboration, Kollaborativ, Elaboration, Korporation, Inkorporation] +Isollation [Isolation, Installation, Kollation, Solmisation, Spallation] +Infllation [Inflation, Inflationär, Inflammation, Inflationiere, Installation] +Divirsifikation [Diversifikation, Ossifikation, Kodifikation, Ratifikation] +Konotation [Konnotation, Korotation, Kinotation, Kontotation, Ökonotation, Konnotativ, Annotation, Notation, Konfrontation] +Kompenssation [Kompensation] +Difusion [Diffusion, Gasdiffusion, Infusion, Diskussion, Fusion] +Dekadens [Dekaden, Dekadenz, Dekadent, Dekade, Dekans, Dekagons, Dekkans] +Kanzerve [Verwanze] + diff --git a/Common/3dParty/hunspell/test/dst/el_GR.txt b/Common/3dParty/hunspell/test/dst/el_GR.txt new file mode 100644 index 0000000000..cc8cf011f2 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/el_GR.txt @@ -0,0 +1,123 @@ +Αβαντάζ +Αβασταγά +Αβγάτισες +αβέβαιο +αβέλτερο +αβέλτεροι +αβίαστους +άβλαβοι +αβοκάντο +αβράδιαστης +άβραστη +αβράχυντου +άβρεχτα +αβρή +αβρότης +άβυσσον +αγαθόν +αγαθούς +αγάλακτο +αγγούρι +αγελαδινού +αγέρα +αγεωμέτρητων +αγίνωτοι +άγκυρες +αγορεύσεις +αγόρευσή +αγορίνα +Αγοριού +Αγροληψία +Αρμόνια +βγαίνοντας +βεβαιώσεων +διάθεση +διαίρεση +Διαιρέσου +Διαιτολογίου +διαψεύσουν +διδασκάλισσας +ενασκήσεις +ενασχόληση +ενασχόλησή +ενδείξεις +ενδεχόμενον +ενδιαμέσου +Επιστήθιες +Επιστημο [Επιστημοσύνη] +Επιστολές +Επιστολή +εύπορους +ευρέα +ευρημάτων +ευρύτητά +ευσταθών +εύστροφα +ευσυνειδησία +εύτακτε +ευτελείς +ευτελίζουν +ιδρυτικό +ιεροψάλτες +Ιζόλα +Ιθαγένειάς +ικανότατος +ιλαρότης +κεφαλής +κεφαλιάτικες +κεφαλωτές +κήπε +κήπευση +Κήρυξής +Λεξικογραφιών +Λεξιλογικός +λεοντή +λεοντής +ολιγοχρόνιου +ολικέ +ολικές +ολική +πελαγώνω +πελατών +πελάων +προστατεύει +προστασίας +σούρουπου +σουρούπωμα +σούρτης +Σούρωνα +Σπαγέτα +Σφάλμα +Σφάλματά +σφικτά +σφικτέ +σφοδρότητας +σφοδρού +σφραγίσω +σχεδιάζουμε +σχεδιάζουν +σχηματίσου +σχηματίσουμε +σχολιάζεσαι +Σχολιάζεστε +Ενδιαφέροντα + +Слова с ошибками [] +Αβασiλευτου [Αβασίλευτου, Αβασίλευτο, Αβόλευτου] +αγαπούσαv [αγαπούσα, αγαπούσαν, αγαπούσε] +βeβαιωμένοι [βεβαιωμένοι, βεβαιωμένο] +εvασxόλησης [ενασχόλησης] +επιoτολικέ [επιστολικέ, επιστολικό] +ιδιωτικοποιήσειc [ιδιωτικοποιήσει, ιδιωτικοποιήσεις, ιδιωτικοποιήσετε, ιδιωτικοποιήσεως, ιδιωτικοποιήσεων, ιδιωτικοποιήστε] +λεπταίσθnτη [λεπταίσθητη, λεπταίσθητα, λεπταίσθητε, λεπταίσθητο] +πρoστιμάρισμα [προστιμάρισμα, στιμάρισμα] +σφάλμαtα [σφάλματα, σφάλμα] +προστάτεuε [προστάτευε, προστάτεψε, προστάτευσε, προστάτες, προστάτευα, προστάτευσα] +κεxριμπαριού [κεχριμπαριού, κεχριμπαρένιο] +διαισθnτικότητες [διαισθητικότητες, διαισθητικότητας, διαισθητικότητα, διαισθητικότης, αισθητικότητες] +αγκιστpώσουv [αγκιστρώσουν] +αγαθoεργiας [αγαθοεργίας] +αβεβαιoτητά [αβεβαιότητά, βεβαιότητά] +αγέρεc [αγέρες] +διδαxθούμε [διδαχθούμε, διδαχτούμε] +εuσταθειώv [ευσταθειών] diff --git a/Common/3dParty/hunspell/test/dst/en_AU.txt b/Common/3dParty/hunspell/test/dst/en_AU.txt new file mode 100644 index 0000000000..55691a415f --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/en_AU.txt @@ -0,0 +1,116 @@ +Acknowledge +acrophobia +adventurousness +aeronautics +algal +Alligator +allegation +alphabetise +Analogy +appropriable +assembly +attempt +Average +barbecue +bathtub +begun +belongingness +Better +binary +blackberry +boatswain +bow-tie +brambly +bright-eyed +bubble +Calender +cancellous +cantankerousness +carefree +categorized [categorised, categorise, categorisation, category, decorticated, cauterised, avant-grist] +cellular +chaos +cheerfulise +childlike +circumstance +close-mouthed +Cocoa +coherent +co-located +Colours +controversial +cottage +creditworthiness +cut-down +dedicated +deep-freeze +Definitive +Designs +digital +distensible +dollar +dyslexia +Egyptian +effectively +etiquette +excess +exotica +fairly +feedback +features +figure's +fjord +forty-seven +government +haematomata +helpless +homologous +implant +Indemnify +inexpert +interior +localises +loquaciousness +maelstrom +mechanizable +melodious +mezzo-soprano +mozzie +municipalisation +mystifier +Neoclassicism +newsletter +non-professional +officiation +orientalisation +palaeoanthropography +parrot +pickpocket +pioneer +cryptanalytic +simplifying +sommelier +spicy +steward +subcontinental +swimwear +Technical +trajectory +wholesomeness +Advantageously +interindustry +red-eye +sub-group + +Слова с ошибками [] +Acredited [Credited, A credited, Accredited, Accredit, Accreted, Creditable, Discredit, Acridity, Aegritude] +agressive [aggressive, regressive, digressive, progressive, transgressive, aggressor, expressive] +appreciativiness [appreciativeness, appreciatively, appreciative, appreciation, apprehensiveness, operativeness, provocativeness] +aritmetical [arithmetical, arithmetica, arithmetic, hermetical, antithetical, paramedical, grammatical] +biosyntesized [biosynthesized, nonsynthesised, synthesised, amniocenteses, amniocentesis] +lisense [license, senilise, linenise, sensualise, sensise, licence, licensable] +paranoa [paranoia, paranoid, paranormal, paragon, panorama, Paringa, parental] +fotoelectronic [photoelectronic] +semi transparent [semitransparent, transparentise, non-transparent, transparency, semi-permanent, transpiration, superintendence] +synonymus [synonyms, synonymous, synonym's, synonym us, synonym-us, synonym, anonymous, synchronous, synoecious, anonymise, unanimous] +wordprocessing [word-processing] diff --git a/Common/3dParty/hunspell/test/dst/en_CA.txt b/Common/3dParty/hunspell/test/dst/en_CA.txt new file mode 100644 index 0000000000..a23012fcfa --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/en_CA.txt @@ -0,0 +1,125 @@ +admire +admittance +aggrandizement +Airmen +Albatross +amateur +angling +apparatus +Architecture +assessment +attempt's +awakening +backgrounder +Balance's +barometric +bashfulness +beautiful +belletristic +blatancy +bonbon +border +Bottom +bountifulness +breakpoints +bulkiness +businesslike +can't +cash +castle +Casual +cauliflower +celebrity +childish +chokecherry +choreographically +chronological +classification +clearheaded +coalesce +Coexistence +collaborative +coloured's +concentration +draconian +drainpipe +demonstrativeness +dependence +dependency +dream +duplication +epidemiological +equitable +Essence +Exemption +exonerate +fainthearted +falsification +ferromagnetic +flammable +fraternization +French +frontier +gadget +galleria +Gallery +gateaux +geocache +ginger +glace +glacier +globalization +hockey +holiday +housemate +intensifier +joystick +Language +leaseholder +non-breakable +northerly +o'clock +oeuvre +openhandedness +oscillation +outface +outlaw +overladen +package +palazzo +panama +Paragraphs +Parliament +particular +pasteurization +pathogen +perception +phenomena +philanthropically +physical +populations +repugnance +request +resplendence +retroactive +rigidity +schedule's +School +scintillation +sensibility +settlement +taxiway +bereft + +Слова с ошибками [] +acomplishment [accomplishment, accomplish, compliment] +anihilate [annihilate, annihilator, annihilation] +caprise [caprice, cap rise, cap-rise, apprise] +chambre [chamber, chambray] +etnographically [ethnographically, pornographically, photographically, typographically, topographically] +horsmanship [horsemanship, sportsmanship, swordsmanship, marksmanship, showmanship] +innundation [inundation, foundation, annunciation, insinuation, intimidation] +lemongras [lemongrass, lemonades] +omelete [omelette, telemeter] +retorical [rhetorical, oratorical, categorical, theoretical, reportorial] +shepishness [sheepishness, snappishness, waspishness, impishness, foppishness] diff --git a/Common/3dParty/hunspell/test/dst/en_GB.txt b/Common/3dParty/hunspell/test/dst/en_GB.txt new file mode 100644 index 0000000000..3b8b7a1426 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/en_GB.txt @@ -0,0 +1,122 @@ +Abbreviation +Acceptability +acquirable +Addressee +afterthought +airworthiness +all-powerful +amateurishness +amorphousness +anthology +Auspiciousness +Bibliographer +Bilberry +birthday +bodyguard +broadleaved +brontosaurus +bumptiousness +Cabaret +Californian +calumny +cancellation +cantonal +capitalize +careful +carry-on +casino +clown +co-ordinate +cockleshell +decennial +deckchair +decryption +deep-freeze +Democracy +financial +fish-plate +Flamenco +housing +Hybrid +hydroelectricity +iceboat +ichthyology +idiomatic +ill-humoured +imperatrix +individuality +interocular +intrasectoral +ironwoods +Jolliness +Jurisprudent +knowledgable +kopeks +labour-intensive +laboratory +lake +language +larynx +latching +leakiness +License +licensed +licensee +life-threatening +linguistics +long-lived +machinable +mainsheet +Major +malleability +man-hour +Mango +ninety-five +nobody +non-blocking +non-judicial +nonconforming +north-Western +nutritiousness +quasi-synchronous +question +racoon [raccoon, racoon's, contra] +radish +Railway +Rarity +saucer +Save +Saying +supplely +tallish +target +Taxi +teach-in +technician +ultramodern +umbrae +uncertainness +unconstitutionality +washing +wasn't +waxen +weather +well-formed +what's-his-name +whereupon +Wi-Fi +Wikipedia + +Слова с ошибками [] +Abstractnes [Abstractness, Abstractedness, Abstracter, Abstraction, Abstracted] +advantageusness [advantageousness, advantageous] +arhythmical [rhythmical, arrhythmical, a rhythmical, arrhythmic, arrhythmia] +autosuggestibility [auto-suggestibility] +kaptor [captor] +coldshouldering [cold-shouldering] +humaneneses [humaneness, humanenesses, humannesses, humanness, humanises, humblenesses] +imaginativness [imaginativeness, imaginative, imaginableness, imitativeness] +knight-erantry [knight-errantry, straight-eight] +magasine [magazine, magnesia, imagine] +night-wachman [night-watchman, nightmarish] +qualifidly [qualifiedly, qualified, squalidly] diff --git a/Common/3dParty/hunspell/test/dst/en_US.txt b/Common/3dParty/hunspell/test/dst/en_US.txt new file mode 100644 index 0000000000..a1cd136a72 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/en_US.txt @@ -0,0 +1,218 @@ +apple +banana +cat +dog +egg +fish +gold +house +ice +juice +kite +lion +mouse +night +orange +pencil +queen +rabbit +sun +tea +umbrella +vase +watch +xylophone +yellow +zebra +arrow +book +cake +car +day +elephant +flower +hat +island +jelly +king +lamp +moon +nose +owl +pink +quilt +radio +sunflower +tree +unicorn +violin +water +xylophone +yellow +zoo +apple juice [applesauce] +blue +calculator +desk +elephant +fire +goat +hat +ice cream [creamer] +jacket +key +lemon +map +notebook +owl +pear +quilt +rose +soccer +table +umbrella +vegetable +whale +xylophone +yellow +zebra +apple pie [pineapple] +beach +computer +drum +elephant +goat cheese [headcheese] +hat +ice skate [cheapskate] +juice box [jukebox] +kite festival [quite festival] +lemonade +mountain +notebook paper [] +orange juice [orangeade] +pizza +queen bee [quin bee, queen bi, keen bee, ween bee] +rainbow +snow +turtle +umbrella hat [umbrella] +valley +Aberration +Absolution +Acquiesce +Adumbrate +Aesthete +Altruistic +Ambivalent +Anomalous +Antediluvian +Antipathy +Aphorism +Apocryphal +Apostasy +Apparition +Arduous +Assiduous +Audacious +Austere +Autonomy +Avaricious +Axiomatic +Baleful +Bellicose +Belligerent +Bereft +Bilious +Bombastic +Cacophony +Capricious +Cartography +Castigate +Clandestine +Coalesce +Cogent +Cognizant +Colloquy +Concomitant +Confabulate +Congenial +Conundrum +Copious +Corpulent +Coven +Credulous +Culpable +Dearth +Debilitate +Deleterious +Denigrate +Despondent +Diatribe +Dilapidated +Disparage +Dissemble +Dissonance +Duplicity +Ebullient +Egregious +Ephemeral +Equanimity +Esoteric +Euphemism +Evanescent +Exacerbate +Exhort +Expatriate +Extol +Facetious +Fatuous +Feckless +Felicitous +Feral +Fervent +Fetter +Flummox +Fractious +Garrulous +Hegemony +Iconoclast +Idiosyncrasy +Ignominious +Impecunious +Ineffable +Inexorable +Inscrutable +Insidious +Intrepid +Intransigent +Invective +Irascible +Juxtapose +Kowtow +Languid +Lassitude +Lurid +Malinger +Maudlin +Mawkish +Mendacious +Metaphysical +Antransigent [Intransigent, Intransigence, Transient, Intransitive, Transcendent] +Inwective [Infective, Invective, Ineffective, Instinctive, Inactive] +Iracible [Irascible, Acquirable] +Juxtopose [Juxtapose, Juxtaposition] +Kovtow [Kowtow, Kowloon] +Langued [Languid, Languished] +Lasitude [Lassitude, Latitude] +Larid [Arid, L arid, La rid, La-rid, Laird, Lard, Laid, Lurid] +Mallinger [Malinger, Salinger, Lingering, Lingerer, Germinal] +Haudlin [Maudlin, Handling] +Mavkish [Mawkish, Mavis] +Mendocious [Mendacious, Mendocino] +Mitaphysical [Metaphysical, Physicality, Physical] +timeline [time line, time-line, timberline] +rollout [roll out, roll-out, rollover] +workshopped [work shopped, work-shopped, works hopped, works-hopped, workshop] +deliverables [deliverable, deliverable s, deliverers, deliberative, desirable] + + diff --git a/Common/3dParty/hunspell/test/dst/en_ZA.txt b/Common/3dParty/hunspell/test/dst/en_ZA.txt new file mode 100644 index 0000000000..89bb91d321 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/en_ZA.txt @@ -0,0 +1,114 @@ +Acceptably +Achievement +administrate +all-day +amount +average +bilayer +blasé +boutique +breezy +byers +cabdriver +carefree +categorised +Chameleon +cheerful +chronology +cliché +cooling-off +courage +crudités +decorates +dooryard +débâcle +electromotive +equalled +Exotica +fellow-traveller +forests +full-timer +graded +habitué +haven't +hide-and-seek +home-building +interaxial +kingdom +largeness +long-distance +Majority +manoeuvre +Matrix +metier +mightn't +multidisciplinary +night-time +officio +old-style +organize +overaggressive +packing +parenthesis +pince-nez +Plaint +play-act +policy-making +Preheat +prohibit +puzzle +queue +quite +re-enact +reason +ready-made +renewal +resize +rooihout +scampi +schoolteacher +sea-green +shop-boy +sidebar +skyscraper +soundless +spelling +stakeout +synchronizing +take-off +Thereof +Trademark +transportable +treatment +tweeness +under-age +unmake +Variate +Visitant +volume +webmaster +well-prepared +window +yesteryear +first-aid +Hydrant +inconstant +network +northernmost +nowhere +souvenir +telecommunicate + +Слова с ошибками [] +afordable [fordable, affordable, a fordable, formidable, recordable, foreseeable, adorable, avoidable, avoidably] +anthropologie [anthropology, anthropologies] +bagage [baggage, bag age, bag-age, Babbage, garbage, bagged, bagel, bakgat, ribcage] +comparatif [comparative, comparator, compatriot, comparable, comparability, comparably] +flammeble [flammable, flamelike, lamentable, blameless, flamed, flammability, flamboyance] +indivizible [indivisible, individualize, indiscernible, divisible, invincible, indefeasible, inadvisability] +jetlag [jet-lag] +lettrebox [letterbox, treble, storybook, legislature] +panoramma [panorama, Panorama, panoramic, paranormal, Panamanian, pentagram, paramagnet] +posessor [possessor, possess, assessor, processor, professor, poses, posses] +selfdoubt [self-doubt] +abandonner [abandoner, abandon, bandoleer, Ndondondwane, Bannerman, abundance, abundant] diff --git a/Common/3dParty/hunspell/test/dst/es_ES.txt b/Common/3dParty/hunspell/test/dst/es_ES.txt new file mode 100644 index 0000000000..c68b9446d3 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/es_ES.txt @@ -0,0 +1,208 @@ +nosotros +vosotros +ellos +ellas +aquí +allí +ahora +antes +después +siempre +nunca +también +solamente +verdad +mentira +bien +mal +grande +pequeño +rápido +lento +nuevo +viejo +bueno +malo +feliz +triste +bonito +feo +caliente +frío +dulce +amargo +fuerte +débil +cerca +lejos +fácil +difícil +cierto +falso +caro +barato +limpio +sucio +fuerte +débil +alto +bajo +claro +oscuro +abierto +cerrado +joven +viejo +corto +largo +alegre +tranquilo +nervioso +amable +grosero +conocido +desconocido +cortés +rudo +agradable +desagradable +sabroso +insípido +difícil +fácil +cansado +descansado +moderno +antiguo +último +primero +posible +imposible +rápido +lento +sencillo +complicado +propio +ajeno +abierto +cerrado +amable +desagradable +seguro +inseguro +correcto +incorrecto +dulce +amargo +Anacoreta +Sobrentender +Embriaguez +Inquebrantable +Empedernido +Derramamiento +Despotricar +Escafandra +Aletargamiento +Estancamiento +Descarado +Exégesis [Génesis] +Contrariedad +Espeluznante +Conspiración +Impedimenta +Deglutir +Engreído +Enmascarado +Exterminio +Embelesar +Permutación [Permutan] +Desesperanza +Impenetrable +Enarbolamiento [Enarbola miento, Enarbola-miento, Enrollamiento, Arrollamiento, Encarcelamiento, Eslabonamiento] +Errabundo +Deslinde +Inefable +Soliviantar +Embriaguez +Perdurable +Opulencia +Trémulo +Desembolso +Empedernido +Anquilosar +Enigmático +Inquebrantable +Contrincante +Desmesurado +Vanagloriar +Exasperar +Desvanecer +Perpetuidad +Desbaratar +Ineficaz +Zozobra +Elucubración +Ineludible +Desgarramiento +Atestiguar +Encascarar [Encascara, Encascaran, Encascaras, Enmascarar, Encascar, Encascar ar, Encascar-ar, Encascabelar, Encascotar, Enmascaran, Enmascara] +Desembozar +Irreverente +Soslayar +Despiadado +Embaucar +Moflete +Endilgar +Desfalco +Embelesamiento +Desestimar +Enajenación +Desavenencia +Inexorable +Atolladero +Egrégoro [Negror] +Desafiar +Afable +Enervar +Belicoso +Enervar +Descacharrante +Entramado +Inigualable +Perplejidad +Descabellado +Diligencia +Enaltecimiento +Desvergonzado +Arrebato +Empatía [Empata, Empate] +Endiosar +Peripecia +Desidia +Subversión +Desfachatado +Desfalco +Desvirtuar +Errático +Desahuciar +Envilecimiento +Empecinado +Estolidez +Despropósito +Engatusar +Culminante +Sobrentender +Enseñorear +Desacato +segguro [seguro, seg guro, seg-guro, seguiros, segur] +insseguro [inseguro, insegura] +correcto +incarrecto [incorrecto, insurrecto] +dalce [salce, dale, alce, dance, calce, dalle, dulce, d alce, cendal, cebadal, celda] +amergo [amero, mergo, amargo, amelgo, a mergo, amorgone] +Anasoreta [Anacoreta, Masoreta, Trasfretana, Asotanas, Asotanara] +Sobrententter [Sobrestante, Soberanamente, Sobriamente, Soberbiamente] +Embreagues [Embregues, Embragues, Embriagues, Embriaguemos, Embragares, Embrague, Embriague] +Inquebranttable [Inquebrantable, Quebrantable, Infranqueable, Intransitable] +Empidernedo [Empedernido, Empedernecer, Empedernir] + diff --git a/Common/3dParty/hunspell/test/dst/eu_ES.txt b/Common/3dParty/hunspell/test/dst/eu_ES.txt new file mode 100644 index 0000000000..a0335c41c0 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/eu_ES.txt @@ -0,0 +1,132 @@ +Abantza +ñabar +abasto +abegikortasun +aberaskeria +aberetzar +abezedario +abialdi +Abiatzaile +abizari +Aboli +abonatu +absenta +absolutibo +accelerando +adabegitsu +adberbio +adiaka +adierazle +adierazkizun +adikuntza +adin +adinaro +adineratu +adin-txikitasun +administratzaile +adoleszentzia +adopzio +adostu +aerolabangailu +Aeroplano +afalordu +agente +agertezin +agiantza +agoran +arradatze +arrakasta +Batata +baterakuntza +baterakor +Bateri +batuar +baud-abiadura +batzuenganako +batzuengandik +batzuengan +batzuengatik +batzuen +baxera +berezi +berezikeria +beritzete +beroa +Beroate +beroatza +berorri +berrabiatu +berra +berresgarri +berripaper +chap +dabilzkidake +dabilzkie +dagitza +dagokik +dagozkieke +erdiondu +galdera +galtzada +garaitiar +garantia +Garaztaketa +garbitasun +gastronomiko +Gaurgero +gaurgoitik +legizkie +legokizue +legozkidake +lehenbizi +nindoakio +publikotasun +publizitate +subsidiario +substantibo +sugestio +superbalorazio +taidun +taldeburu +Talent +Teknografia +xantxa +xerbitor +xerokopia +zabaldura +Zabalkor +Zabaltza +zabilzkieken +zabilzkio +zaharkote +zeneritzeketen +zenerra +zenezagu +zengozkigute +zeniharduke +zenioke +zenioketez +zeniraute +zenizkien +zenizkiguke +Zintut +Zintuzkedan +isiltasun + +Слова с ошибками [] +abriсot [abrikot, abrigo] +absenzia [absentzia] +addikzio [adikzio, dikzio, adukzio, adizio] +administraziozerbizu [administrazio-zerbitzu, administrazio-zuzenbide, administraziopean] +bat-bates [bat-batez] +bermagari [bermagarri, bermagailuari, bermagailuri, armagaberi, bermaguneari] +cataluniar [kataluniar, catalunyar, kataluniera] +dakarza [dakartza, dakarna, dakarzu] +erdemin [erremin, erdimin, iminerdi] +garatienetarikoa [garatuenetarikoa, ugarienetarikoa, gogoratuenetarikoa, argienetarikoa, aberatsenetarikoa] +ishil [isil, istil] +nindezaguane [nindezaguena, nindezaguan, nindezaguanez, nindezaguanek, nindezaguanen, nindezaguanei, nindezaguana, nindezagunan, nindezagutean, nindezagutenan, nindezaguzue] +nintzainaken [nintzainanek, nintzainake, nintzainakeen, nintzainanen, nintzaiakeenen, nintzaiakeen, nintzakenanen, nintzaiekenan] +summa [suma, susma, sumoa] +technologiko [teknologikoko, teknologiko, terminologiko, etnologikoko] +charmant [charmat, xarmant] diff --git a/Common/3dParty/hunspell/test/dst/fr_FR.txt b/Common/3dParty/hunspell/test/dst/fr_FR.txt new file mode 100644 index 0000000000..9b4428ca52 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/fr_FR.txt @@ -0,0 +1,211 @@ +Bonjour +Merci +Oui +Non +S'il +Excusez-moi +Pardon +Bien +Mal +Grosse +Petit +Beau +Moche +Fort +Faible +Chaud +Froid +Vite +Lent +Haut +Bas +Loin +Près +Heureux +Triste +Facile +Difficile +Simple +Compliqué +Bon +Mauvais +Nouveau +Vieux +Jeune +Âgé +Bienvenue +Amitié +Amour +Famille +Travail +Maison +Voiture +Manger +Boire +Courir +Marcher +Nager +Chanter +Dormir +Jouer +Parler +Écouter +Regarder +Lire +Écrire +Acheter +Vendre +Aller +Venir +Faire +Dire +Voir +Savoir +Apprendre +Aimer +Détester +Partir +Rester +Arriver +Revenir +Partager +Aider +Aimer +Ouvrir +Fermer +Manger +Boire +Avoir +Être +Pouvoir +Vouloir +Devoir +Parler +Écouter +Rire +Pleurer +Danse +Étudier +Travailler +Voyager +Vivre +Connaître +Reconnaître +Voyager +Exister +Choisir +Donner +Recevoir +Aimer +Oser +Phénoménologie +Électroencéphalographie +Parallélépipède +Anticonstitutionnellement +Transsubstantiation +Éclectisme +Anachronisme +Catéchuménat +Démagogie +Fructueux +Ineffable +Hypothèque +Propriété +Procrastination +Complaisance +Réminiscence +Éthique +Équinoxe +Exponentiel +Hétérogénéité +Imbroglio +Incorrigible +Maelström +Métaphysique +Protagoniste +Subliminal +Verrouillage +Volumétrique +Énigmatique +Époustouflant +Immatériel +Infini +Polyglotte +Recrudescence +Prophylactique +Symbiotique +Vestibulaire +Épistémologie +Faramineux +Géopolitique +Hypnotique +Inamovible +Intemporel +Labyrinthe +Pacifiste +Quémandeur +Soporifique +Ubuesque +Volumineux +Effervescence +Électrophorèse +Paradoxe +Prorata +Quadrupède +Sarcophage +Trigonométrie +Vaccinologie [Carcinologie, Actinologie, Vaccinogène, Accidentologie] +Xenophobe [Xénophobe, Technophobe] +Zéphyr +Génétique +Labyrintique [Labyrinthique] +Mégalo +Nostalgie +Omniprésent +Pangramme +Périlleux +Quinquennat +Rémunération +Scolopendre +Tautologique +Utopiste +Vexatoire +Wolof +Xanthine +Yacht +Zanzibar +Axiomatique +Chronométrer +Dilettante +Énervement +Facétieux +Générique +Harmonique +Illusoire +Juridique +Kabbaliste +Longetivité [Longévité] +Médiane +Néologisme +Oxygène +Patronymique +Quotidien +Rétorique [Rétorque, Rhétorique, Rotorique, Ré torique, Ré-torique, Météorique, Torique, Théorétique, Théorique] +Sémantique +Tautologie +Utopique +Vaccinologie [Carcinologie, Actinologie, Vaccinogène, Accidentologie] +Xénophobie +Yachting +Zoroastrisme +Voager [Viager, Voyager, Ouvrager] +Exisster [Exister] +Chaiser [Chaires, Chaise, Chaisier, Chaises, Chasser, Chaise r, Chamoiser, Tchadiser] +Doner [Toner, Zoner, Donner, Drone, Doser, Doter, Dorer, Douer, Doler, Doper, Dîner] +Resevoir [Redevoir, Recevoir, Revoir, Reversoir, Ivoire, Voire] +Aimmer [Aimer] +Osero [Oser, Osera, Oser o, Rosser, Roeser, Rose] +Phénoménollogie [Phénoménologie] +Électraencéphallographie [] +Parallélépepède [Parallélépipède] + diff --git a/Common/3dParty/hunspell/test/dst/gl_ES.txt b/Common/3dParty/hunspell/test/dst/gl_ES.txt new file mode 100644 index 0000000000..74cc688633 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/gl_ES.txt @@ -0,0 +1,120 @@ +ola +tipo +Si +non +nonnr [nono] +comida +comidaa [comídaa, comidas, comida, comidan] +auga +augaa [áugaa, augas, auga, augaba, augada, augala, augara, augar] +casa +coche +cochee [coches, coche, chochee, cachee, checo] +un tren [oin tren] +bicicleta +escola +escolaa [escóraa, escoala, escolas, escola, escálaa, escolla, escolma, escolar, escolta] +niños +pai +paii [paio, pai, pii, aii, pali, pais] +nai +naii [nai, nii, aii, naif, nais, nazi] +irmá +irmán +cachorro +gato +gatoo [gato, atoo, gateo, gatos] +peixe +peixee [peidee, peixes, peixe, peitee] +aves +avess [aveas, avesa, aves, avesas, avesos, vesas, aveso, aveces, escave] +árbore +flor +herba +o sol [ou sol] +lúa +o ceo [ou ceo, o ceou] +chuvia +neve +vexa +inverno +primavera +outono +noite +noite +día +unha semana [semanalmente] +mes +ano +para ler [parable] +escribir +fala +ensinar +traballo +durmir +durmir +correr +vai +senta +estado +para escoitar [parasitario] +vexa +escoita +hai +beber +carne +furtas +verduras +queixo +pan +auga +zume +café +té +leite +aceite +ovo +sal +impacienta +azucre +un bocadillo [oin bocadillo] +cociña +sala de estar [sala dei estar] +dormitorio +baño +batela +sofá +lámpada +fiestra +a porta [aporta, portara, portador, porta] +piso +teito +parede +sofá +alfombra +baño +afundir +espello +toalla +cama +manta +almofada +reloxo de alarma [riloxo de alarma, ríloxo de alarma, reiloxo de alarma, reloxo dei alarma, relouxo de alarma, reloxou de alarma, relollo de alarma] +escritorio +cadeira +marabilloso +adverbio +obviamente +Dominante +residenciais +convidado +perigo +cuestión +deporte +mina +cordeiro +cabeza +tratar +avogado +intelixente +guapo diff --git a/Common/3dParty/hunspell/test/dst/hr_HR.txt b/Common/3dParty/hunspell/test/dst/hr_HR.txt new file mode 100644 index 0000000000..6ce3b0a071 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/hr_HR.txt @@ -0,0 +1,215 @@ +boliestan [bolestan, obijestan] +jyak [jak] +slaby [slabu, slab, slaba, slabe, slabi, slabo] +pameetan [pametan, pametna, napamet] +gllup [glup] +bezuspješhno [bezuspješno, bezuspješnih, bezuspješan, bezuspješna] +besimeni [besi meni, besi-meni, bezimeni, besanim] +bezuzban [bezuman, bezuba] +blagastanje [blagostanje, blaga stanje, blaga-stanje, blagostanja, blistanje, oblaganje] +bljeskovica [bljeskovima, bljeskovi, bljeskova, bljeskalica, bljeskavi] +jabuka +sunce +voda +kuća +ptica +kava +kruh +cvijet +knjiga +pas +mačka +grad +zelen +plav +crven +bijel +crn +velik +malen +brz +spor +sretan +tužan +vruć +hladan +nov +star +lijep +ružan +dobar +loš +zdrav +bolestan +jak +slab +pametan +glup +raditi +jesti +piti +spavati +čitati +pisati +govoriti +smijati se [smijati] +plakati +pjevati +igrati +plesati +učiti se [učiti] +kupovati +kuhati +telefonirati +gledati +slušati +hodati +trčati +letjeti +plivati +čitati +pisati +raditi +imati +biti +ići +doći +otići +dati +uzeti +reći +vidjeti +čuti +osjetiti +misliti +htjeti +moći +morati +rado +nerado +da +ne +molim +hvala +doviđenja +oprosti +zbogom +zdravo +čau [ča, ču, čađu, čaju, čamu, času, čađ, čaj, čak, čar, čas, ča u] +ej +da +baš +super +glupost +fantastično +jasno +tako +zapravo +možda +lako +teško +prozračnost +usplahirenost +neoblomivost [neslomivom] +prezir +proigranost [prostranost, programiranosti, razigranosti, pristranost] +uznemirenost +besprijekornost +besprizornost [besprizornom, besprizornoj, besprijekornost, besprizorni] +nepredvidivost +beznadnost +promašenost [promašenosti, promašen, osiromašenom, raspršenost] +protivljenje +neizreciv +bezizlaznost +neuspjelost [neuspjeloj, neuspješnost, neuspjelog, neuspjelom] +zbunjenost +neodlučnost +protivština +nepovratnost [nepovratnoj, nepovratnom, nepovratna, nepovratnima] +bezduhovitost [bez duhovitost, bez-duhovitost, duhovitostu, duhovitosti, duhovitosta, duhovitost] +ravnodušnost +prolaznost +neobaveznost [neobaveznosti, neobaveznom, neobaveznoj, neobavezna, neobavezni] +bezbrižnost +nepovratnost [nepovratnoj, nepovratnom, nepovratna, nepovratnima] +promašenost [promašenosti, promašen, osiromašenom, raspršenost] +neprepoznatljivost [neprepoznatljivosti, ne prepoznatljivost, ne-prepoznatljivost, prepoznatljivosti, prepoznatljivost, neprepoznatljiva, neraspoznatljivosti] +neukrotivost [neukrotivog, neukrotiv, neučtivost, neotuđivosti] +bezobzirnost +nevinost +nestalnost +nepostojanost +bezizlaznost +nepovratnost [nepovratnoj, nepovratnom, nepovratna, nepovratnima] +prolaznost +neodgovornost +bezbrižnost +nevolja +nezadovoljstvo +prolaznost +bezuspješno +bezimeni +bezuzdan [bez uzdan, bez-uzdan, bezdan, bezdušan, beznadan] +blagostanje +bljeskavica [bljeskalica, bljeskavima, bljeska vica, bljeska-vica, bljeskavi, bljeskalici, bljeskava, bljeskalicu] +boren [borne, obrne, bore, oboren, borbena] +carovnija [otrovnija, darovnica] +crpeža [crteža] +dostojanstvo +duhovitost +egzaltacija +gorkoća [gorkoga, gorkošću] +histerija +idila +ironija +izdaja +janjetina +kajanje +kavana +krhotina +ljepljivost +lukavstvo +magnutizam [zategnutima, zamahnutima, izdignutima, vagnutima] +melankolija +misticizam +naivnost +nelagoda +neraspoloženje +obmana +okrutnost +opojenost [opojnost, obojenost, opojenoj, popunjenost, podvojenost, opčinjenost] +prezir +propast +ravnodušnost +sjenka +skitnica +spletka +stid +sudbina +susret +sudbina +šapat +tišina +trepet +utopija +uzaludnost +veličanstvo +zaborav +zanesenost +zanos +zavjera +zbunjenost +zluradost [zluradosti, zlu radost, zlu-radost, zlurad] +zloslutnost [zloslutnoj, zloslutnom, zloslutnu, zloslutna] +žargon +žártva [žrtva] +šaptanje +čarobnost +dileme +hodočasće [hodočaste, hodočašće] +lebdjeti +iznimka +preobilje [preobilne, preoblikuje] +probuditi se [probuditi] +surov diff --git a/Common/3dParty/hunspell/test/dst/hu_HU.txt b/Common/3dParty/hunspell/test/dst/hu_HU.txt new file mode 100644 index 0000000000..c925ed03d0 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/hu_HU.txt @@ -0,0 +1,114 @@ +Szorzótábla +Réges-régen +normálméret +nemeslelkűség +mindegyik +milliós +Mikroflóra +Mezőgazdaságigép +meséskönyv +mennyiség +Memória +kártya +kuráre +Kurzor +jégkorong +jellemesség +Javak +irányzás +iromány +Inkluzíve +hűtőedény +hőmérséklet +hír +hétszázas +hátrány +háromszáz +Hintó +generátor +gavallérság +explozíva +eső +esdeklés +epilógus +Energia +Előélet +előterjesztés +előnézet +elvonás +elszigetelés +ellátmány +Elevátor +egynémelykor +egyenlőség +eddzenek +dzsungel +ananász +akvárium +Szépül +Sztorizik +szobroz +szimbolizál +szemlélődik +sugdolózik +majmol +Macskáz +Létesít +Lokalizálódik +litografál +levelesedik +lepet +közömbösít +kételkedik +kivirágoz +kerekez +kedvez +járkál +jegyzőkönyvez +iskolázik +individualizál +csendesít +borsoz +billentet +bajmolódik +anyagozik +alkonyodik +Aktualizál +színes +szemelt +lassú +hatékony +hasznos +gyúlékony +gyári +abszurd +örökjog +öregkor +ömlő +Zászlaj [Zászlajú, Zászlaja, Zászlai, Zászlóalj] +Zseblámpa +regényirodalom +realitás +raktárhelyiség +pötty +pótlék +pótdíj +pályafutás +Promóció +Processzus +poloska +pernye +pediáter +parancsnoklás + +Слова с ошибками [] +sponzorálás [szponzorálás, szponzorál, zongorálás] +mihamarábiak [mihamarábbiak, mihamarabbiak, mihamarábbi, hamarábbiak, mihamarább] +idohatár [időhatár] +hypnotizmus [hipnotizmus, nepotizmus] +departement [département] +légiesul [légiesül, légiósul] +kutagat [kutatgat, kutazgat, kutasat, kutakat, kutadat, kutamat, kútagát, kútágat, kútágát, kutat] +költségtakkarékos [költségtakarékos, költségtakarékkos, költséghatékony] +redukzió [redukció, redukáló] +pilanatfelvétel [pillanatfelvétel, pialantfelvétel, adatfelvétel] diff --git a/Common/3dParty/hunspell/test/dst/id_ID.txt b/Common/3dParty/hunspell/test/dst/id_ID.txt new file mode 100644 index 0000000000..2d95d3b740 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/id_ID.txt @@ -0,0 +1,121 @@ +acang-acang +Adiksi +Adventisius +Advokat +afirmatif +agroindustry [agroindustri, nonindustri] +agrisilvikultur +akhir-akhir +akomodatif +aksi +aljabar +anggul +anotasi +antusiasme +apoteker +bahagia +bakat +bangkang +Bankir +Barikade +bebaru +belar +beleid +bencana +bentangur +beritawan +besuk +bilingualisme +Cecak +Celempong +cencawan +cengkar +ceremai +cermin +cudang +Dampal +dampan +dansa +datung +debitur +defensi +defisit +demper +dendang +Derivasi +Desember +deskripsi +diskotek +diskusi +distansi +dragon +dramatisasi +Eksamen +Eksistensi +eksperimen +ekstensifikasi +ekuitas +elektron +gelut +Geofisikawan +Gerbang +gerempang +influenza +Informasi +Inisiator +insekta +institusional +instruksional +jelajah +Kamrad +Kapilaritas +kapster +kardiovaskular +karismatik +keranjingan +komunal +Limitatif +Linguistik +lintang +masabodoh [masa bodoh, masa-bodoh, mastodon] +matematikus +medisinal +Melankolia +Memorabilia +nasional +nasionisme +Panen +pangkek +peranti +perian +persekusi +perunjung +regenerasi +reglementer +robotika +runjang +Sabtu +Simbang +simpati +tebing +topi +Unggal +unsuri +urbanisasi +variabel +wahana +warganegara [warga negara, warga-negara, negarawan, antarnegara, mancanegara, waranggana] + +Слова с ошибками [] +Abonement [Abonemen, Bombardemen] +Abcente [Absente, Centet] +ambivalan [ambivalen, ambilan, ambalan] +bakteriostatic [bakteriostatik, bakteriolisis] +cekaw [cekat, cekak, cekau, cekam, cekal, cekah, kacek] +darmavisata [darmawisata, darmatirta, mandataris] +declarasi [deklarasi, deflagrasi] +duplex [dupleks] +ecozona [ekozona, eco zona, eco-zona] +gempur-mengempur [gempur-menggempur, gempul-gempul] +jejengok [jejengkok, jengkeng] +transitive [transitif, transvetisme, transit, transisi] diff --git a/Common/3dParty/hunspell/test/dst/it_IT.txt b/Common/3dParty/hunspell/test/dst/it_IT.txt new file mode 100644 index 0000000000..5b9d3363bd --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/it_IT.txt @@ -0,0 +1,200 @@ +Ciao +Ciaoo [Ciao, Ciano, Ciao o, Ciocia] +Buongiorno +Buonasera +Buonassera [Buonasera, Buon assera, Buon-assera, Buonalbergo] +Grazie +Prego +Arrivederci +Buonanotte +Scusa +Per favore [Favorevole] +Amore +Amico +Famiglia +Casa +Città +Strada +Montagna +Montaga [Montagna, Montata, Montana, Montala, Montava, Montaggi, Montaguto, Montano, Montato] +Mare +Sole +Luna +Stelle +Giorno +Notte +Colazione +Clazione [Colazione, Coazione, Cl azione, Cl-azione, Clonazione, Collazione, Clorazione, Chelazione] +Pranzo +Cena +Acqua +Vino +Caffè +Pane +Formaggio +Pasta +Pizza +Gelato +Dolce +Salato +Frutta +Verdura +Carne +Pesce +Pollo +Uovo +Sale +Pepe +Olio +Burro +Zucchero +Latte +Yogurt +Insalata +Zuppa +Bistecca +Prosciutto +Parmigiano +Biscotti +Cioccolato +Spagggrhetti [Spaghetti, Spaghetteria] +Spaghetti +Lasagne +Risotto +Gnocchi +Penne +Ravioli +Cannelloni +Pesto +Caprese +Limoncello +Espresso +Cappuccino +Tiramisù +Panna cotta [Panbiscotto] +Cannoli +Panettone +Brioche +Focaccia +Foacdccia [Focaccia] +Crostini +Arancini +Antipasto +Primo piatto [Rimpiattato, Primariato, Rimpiatto, Rimpatriato] +Secondo piatto [Attosecondo] +Contorno +Pane tostato [Tostapane] +Marmellata +Accoglienza +Affascinante +Aggressività +Alleviare +Appassionato +Armonioso +Autonomia +Autovfnomia [Autonomia, Autotomia] +Barbarie +Beneficiare +Bizzarro +Burocrazia +Cambiamento +Capriccioso +Cautela +Commemorare +Comportamento +Conseguenza +Controverso +Coraggioso +Debolezza +Decisivo +Delizioso +Desiderare +Destrezza +Determinato +Determin [Determina, Determini, Determino, Determinò, Termine] +Difficoltà +Disponibilità +Divertimento +Eccentrico +Efficienza +Elettrizzante +Emergere +Empatia +Energia +Equilibrio +Esperienza +Fantastico +Fenomenale +Generosità +Gratitudine +Immaginazione +Impressionante +Impressiante [Impressi ante, Impressi-ante, Impressionante, Impressionate, Imprestante, Impressioniste] +Indipendenza +Ingenuità +Innovazione +Intelligenza +Intensità +Intrigante +Ispirazione +Instabilità +Irresistibile +Leggenda +Libertà +Luminoso +Magistrale +Malinconia +Meraviglioso +Metamorfosi +Miracolo +Misterioso +Nostalgia +Opportunità +Originalità +Passione +Pericoloso +Prestigioso +Prodigioso +Prospettiva +Raffinato +Rafinato [Raffinato, Rapinato, Affinato, Trainato, Raffrenato, Raffilato] +Ricchezza +Rispettoso +Sensibilità +Sorprendente +Spontaneità +Spontaneita [Spontaneità, Spontaneista] +Stravagante +Suggestivo +Surreale +Tenerezza +Trasformazione +Unicità +Vibrante +Vittoria +Volontà +Amicizia +Avventura +Bellezza +Calma +Danza +Eleganza +Felicità +Gioia +Incanto +Magia +Natura +Odore +Passatempo +Quotidiano +Relax +Serenità +Tesoro +Umorismo +Vacanza +Zelo +Avventuriero +Speranza +Risate +Armonia +Incanto diff --git a/Common/3dParty/hunspell/test/dst/kk_KZ.txt b/Common/3dParty/hunspell/test/dst/kk_KZ.txt new file mode 100644 index 0000000000..3547d29f05 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/kk_KZ.txt @@ -0,0 +1,209 @@ +сөз +адам +қала +тау +ауа +су +аспан +жер +бала +ата +ана +тамақ +кітап +ұстаз +оқу +тұтыну +тыныш +тұз +ауру +денсаулық +топ +маусым +төс +көз +жүрек +сарғыш +көп +аз +ертең +түн +түс +жас +қара +ақ +көк +қызыл +шай +салт +ыстық +суық +қазақ +жеті +он +жүз +мың +бір +екі +үш +төрт +бес +алты +жеті +сегіз +тоғыз +он +бақша +бұлақ +қиыр +досым +ақша +патша +таң +кеш +тауар +күн +апат +риза +ауырсыну +орман +жаңбыр +бауыр +жел +тұман +үй +бұлақ +көше +айнала +шайыр +тағам +сусын +топ +бас +әрекет +тіл +кеме +сиыр +қой +ешкі +шөп +ит +тұқым +қарындаш +апа +ана +әке +дала +тарлау +дәуір +таңдай +жыл +басқарушылар +басқарушшылар [басқарушылар, басқарушы, басқармасылар, басқаруғалар, бақылаушыларлар] +жауапкер +ерекшеліктерімендерге +тұмылдырықтатқыздан +білімділігінге +білімдарды +алалықсыздар +айырмашылықтарын +тұрақтандырып +сылтауратқандарыңызды +қолдар +байланысқадан +жетілдірілген +зарарсыздандырады +ескеріп +ескеріпп [ескеріп, ескеріпі, ескеріле] +міндеттемелеріндерге +кезеңдердің +себепсіздік +біреудейлер +беделілерің +кездестіріңіз +шектердің +көңіл +көңл [көң, көл, көңіл, көңі] +мол +алайда +мәселе +мәселеу [мәселе, мәселең, мәселен, мәселес, мәпелеу, мәуелеу, мәселем, мә селеу, селеу] +сендің +келер +келерр [келер, керлер, келері, кереле, еркеле, кермеле, келекеле] +кәне +көпір +күндіз +сана +белгілер +дайын +ез +қайшы +саф +рең +шақ +үміткер +бақыт +бақытт [бақыт, бақытта, бақытты, бақырт, бақыты] +республика +консервациялау +мемлекеттік +тағатсыздан +адамда +бәрі +бең +беңр [бең, бер] +жасағанда +жасағоанда [жасағанда, жасалғанда, жасасқанда, жасаманда, жасақанда] +жабайылық +заманда +көшірдік +мерейі +Мерейій [Мерейі, Мерейің, Мерейім, Мерейлі, Мерей, Мейір] +мөлшерсіздікк [мөлшерсіздік, өлшемсіздік, мөлшерсіз, өлшеусіздік] +мөлшерсіздік +пенді +тылда +мәртебесімен +аппаратпен +тегінді +кездеме +ересектік +көңілсіздік +тәуекелсіздік +қанағатсыздық +ғаділетсіздік +сайдақы +басым +тәжікеден +тұрғын +қонақ +қауіпсіздік +қадірсіздік +білгішсінбейсіңдер +талқандас +кешікті +қоздырғышы +бас +емдейсіңдер +құқылы +тақылет +әдемі +көткеншектейсіңдер +әжет +қайтар +белсену +түсінбеймін +жағымсыздық +сыздар +мәртебесі +тұрғыны +мезгіл +әлбетте +барысын +оқылған +безге +жаса +аламаңдайсыңдар +кереметті +епетейсіздік diff --git a/Common/3dParty/hunspell/test/dst/ko_KR.txt b/Common/3dParty/hunspell/test/dst/ko_KR.txt new file mode 100644 index 0000000000..5d30797f0c --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/ko_KR.txt @@ -0,0 +1,157 @@ +안녕하세요 +감사합니다 +사랑해요 +미안합니다 +음식 +친구 +가방 +집 +학교 +컴퓨터 +물 +밥 +책 +산 +바다 +날씨 +일 +노래 +치킨 +반찬 +꽃 +숙제 +가족 +아이 +게임 +영화 +생일 +시간 +동물 +여행 +차 +쇼핑 +추천 +대화 +전화 +사진 +운동 +잠 +병원 +음료수 +능력 +주말 +전자기기 +고양이 +강아지 +바나나 +가을 +겨울 +봄 +여름 +옷 +신발 +지하철 +택시 +버스 +비행기 +샴푸 +브러시 +삼계탕 +국수 +불고기 +된장 +김치 +먹다 +마시다 +보다 +듣다 +놀다 +하다 +가다 +오다 +서다 +늦다 +일어나다 +자다 +빨갛다 +파랗다 +노랗다 +녹색 +보라색 +맛있다 +시원하다 +덥다 +추운 +기분 +슬프다 +즐겁다 +정신이 +바쁘다 +참새 +나비 +병아리 +돌 +물고기 +향신료 +시장 +기차 +공원 +해변 +지갑 +병원 +대학 +교통 +공항 +천재 +연구 +일본 +중국 +사업 +지식 +성격 +자금 +기술 +정부 +전략 +협력 +혁신 +경제 +철학 +신체 +영감 +현상 +역사 +태양 +설명 +사회 +환경 +자연 +현실 +존경 +정확 +장애 +낙관 +발전 +절망 +일상 +소멸 +도전 +반복 +포기 +파괴 +혁혹 [현혹, 혈족] +소외 [쇠오, 소아, 시외, 소오, 소에, 소의, 소와, 소요, 소유, 소위, 소야, 소되, 소뇌, 소 외, 소외감] +식민지 +혐오 +출산 +행복 +불평 +판매 +위험 +안녕하ㅎ요 [안녕하다] +감사합ㅅ다 [감사하다, 감사하여가다, 감사해가다] +사랑ㄱ해요 [사랑해요, 사랑해내요] +미안ㅎ합니다 [미안합니다, 미안한체합니다, 미안할만합니다, 미안해갑니다, 미안하여갑니다] +친ㅔ구 [친구] +가ㅎ방 [가방, 감방] + diff --git a/Common/3dParty/hunspell/test/dst/lb_LU.txt b/Common/3dParty/hunspell/test/dst/lb_LU.txt new file mode 100644 index 0000000000..37c698dbc9 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/lb_LU.txt @@ -0,0 +1,118 @@ +Aarbecht +Aarbechtszäitorganisatioun +Aartgenoss +Abenteuer +abrëll [Abrëll, brëll] +absence [Absence] +Abusives +Abzebillercher +Acquéreur +Adjointeë +Affischéiertes +Airbussen +Alldeegleches +Angschtzoustä +Basketballspiller +Baufirme +bauren [Bauren, bauen, brauen] +bekanntes +Beleg +Berodung +Bewältegung +Datentransfer +Dateschutz +Decisives +Donneschden +Drangsaléiertes +Dränk +Giischtgen +Grondlag +grondreegel [Grondreegel, grondleeënd] +Géies +Handelsdag +hausaufgab [Hausaufgab, ausbaufäheg] +hierschtdag [Hierschtdag, hierarchescht] +Häerzi +Industriell +Infrastrukturelles +Interessi +Internetfore +Intervall +Kamell +Kantoner +Karamell +Klenges +Nopeschhaus +Motors +Muer +Muerenter +Musek +Nettoverméige +niess [miess, Niess, iess, giess, Siess, Fiess] +Protektioun +Prouf +Provisioun +Prozessor +Präis +Präsens +Sanitäres +Schauspiller +Schema +Taxatioun +Telefonsgespréich +termingrë [Termingrë, verminnte] +terrass [Terrass, zerrass] +Textdatei +Textsprooch +Titulaire +Titel +erausféieren +erausjoe +gëeicht +onglécklecherweis +unzesammelen +unzespille +Approvisionnement + +Сложные слова [] +Aktiegesellschaft +Aktivitéitsdéclaratioun +Alarmstëmmung +Allgemengverständleches +Bankenoperatioun +Bensinsreserven +Besteierungsofkommes +Diskriminéierungsmoossnam +Dokumentatiounsaarbecht +Haaptrecommandatioun +Héchstgeschwindegkeet +Héichproblematesches +Hëllefsdéngscht +Integratiounsméisseges +Iwwersetzungsprogramm +Kapitaliséierungsdimensioun +Museksinstrument +Publicitéitsmarché +Transportproblem + +Слова с ошибками [] +Abonnnement [Abonnement, Joresabonnement, Abonnenti, Abonnent, Agebonnent] +Accomodéiertes [Accommodéiertes, Accommodéiert, Accordéiertes, Accommodéiers] +Agrarcenter [Agrarzenter, Agrozenter] +Begrennung [Begrënnung, Begrenzung, Benennung, Verbrennung, Begrenzen, Trennung] +Berodunszentren [Berodungszentren, Berodungszentre, Berodungszentr, Berodungszenter] +Deeluung [Deelung, Andeelung, Opdeelung, Verdeelung, Zelldeelung] +Dialogue [Dialoge, Dialog] +Dictaten [Diktaten, Dichten] +Inspektor +Iwereileges [Iwwereileges, Iwwereilegtes, Iwwereileg, Iwwerfälleges] +Pedagogik +Televisionschaîn [Televisiounschaîn, Televisiounsgeschäft] +Bechäftegungsméiglechkeet [Beschäftegungsméiglechkeet] +Gläicheetspolitik [Gläichheetspolitik, Sécherheetspolitik, Gesondheetspolitik, Geschäftspolitik, Dechetspolitik] +Musekheichschoul [Musekhéichschoul, Museksschoul] +Satelliten [Satellitten, Satellitte, Satellit] +Addressbichelchen [Adressbichelchen, Reklammbichelchen] +Aarbechtsfield [Aarbechtsfeld, Aarbechtsgefier, Aarbechtsblieder, Aarbechtsatelier, Aarbechtsalldag] + + diff --git a/Common/3dParty/hunspell/test/dst/lt_LT.txt b/Common/3dParty/hunspell/test/dst/lt_LT.txt new file mode 100644 index 0000000000..09068f6d85 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/lt_LT.txt @@ -0,0 +1,127 @@ +Abstraktus +šachmatai +žadintoja +agurkas +Aikštė +Akinukai +akmuo +šakoti +aktualinti +aktorius +šalinis +šaltinis +bernystė +beskuo +būgnelis +Bilietas +bilingvizmas +daržavietė +Darbadienis +Darbas +darbuotoja +dargi +daržinė +daugintoja +Daugiaveiksmis +delnė +įdelnis +detalizuoti +šerdelė +erdvėti +šeriškas +šeštadienis +etiketas +Evoliucija +fabrikantė +Fantastika +Fenomenas +fikusas +gaudinėti +gausėja +gūbrinti +geležis +geležtė +gelsvis +geranoris +Gertys +gerviukas +giesmininkė +Gikas +Goža +griaustinis +grįžinys +gėrioja +griozdas +grizijo +gryčia +grožėja +grįžti +grupė +gąstauti +Jaukas +jodinėjo +jodyti +keturnagis +Kiaušina +Kiaurymė +kiausta +kietakaktis +ūkiškas +kilimėlis +kilometrinis +ūkininkaitė +ūkinis +krykti +lapuotis +laukas +laupti +laužtė +Maudulys +Maumedis +mažutėlis +mazgotuvė +mechanikė +medeinė +medikamentinis +meduolinis +Nūdien +nebrendėlė +Negu +neiginys +parudenys +pasakotojas +pasausė +pasieninis +paskyriui +paslapčiom +Pasodas +Pat +Pataikūniškas +patarška +patentinis +proskyna +protekiniais +provizoriškas +rėkčioti +rūmas +rodyklinis +Romanistas +Skylmatis +Skyriklis +skolininkas +skraidžioja +skruzdėda +skėtrus + +Слова с ошибками [] +Abbreviatūra [Abreviatūra, Klaviatūra] +alpinismas [alpinsimas, alpinimas, alpinistas, alpinizmas, alpinistinis, alpinistini, alpinamas, alpinariumas] +amortizacia [amortizacija, amortizacini, amortizavo, amortizuoti] +daugiamžis [daugiaamžis, daugiaamži, daugiamatis, daugiametis, daugiažiedis] +deziderativinis [dezideratyvinis, dezideratyvini, prezidentinis, rezidentinis] +generazija [generacija, energija] +keturiasdešimtūkstantas [keturiasdešimttūkstantas, keturiasdešimttūkstanta, aštuoniasdešimttūkstantas, šešiasdešimttūkstantas, aštuoniasdešimttūkstanta] +krivuluoja [krivuliuoja, kreivuliuoja, kultivuoja] +Šnaukstai [Šnaukštai, Niaukstai, Šniauktai, Šniaukštai, Auksintai] +pazintinis [pažintinis, parazitinis, pantinis, patentinis, panteistinis] +progresa [progresai, progresas, progreso, progrese, progresu, progresą, progresų, progresavo, progresija] diff --git a/Common/3dParty/hunspell/test/dst/lv_LV.txt b/Common/3dParty/hunspell/test/dst/lv_LV.txt new file mode 100644 index 0000000000..6cd9ccc2a0 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/lv_LV.txt @@ -0,0 +1,205 @@ +Sveiks +Sveikks [Sveiks, Sveikas, Sveikās, Sveikts, Sveikus, Sveikos, Sveikt, Saveiks, Ieveiks, Veiks] +Labrīt +Lbrīt [Larīt, Lorīt, Labrīt] +Paldies +Paldiess [Paldies, Paliess, Palaidies] +Lūdzu +Luzu [Lizu, Ludzu, Auzu, Zuzu, Guzu, Lauzu, Lupu, Lubu, Lugu, Lūzu, Luču] +Atvainojiet +Atvainvfojiet [Atvaimanājiet] +Prieks +Perieks [Peries, Prieks, Persiks] +Draugs +Dravfugs [Draugs] +Ģimene +Gimene [Ķimene, Ģimene] +Māja +Maja [Maija, Paja, Raja, Laja, Maža, Maka, Mija, Mana, Masa, Māja, Mata, Maša, Maza, Mala] +Pilsēta +Pilseta [Pilsēta, Pil seta, Pil-seta, Piebilsta] +Ceļš +Ceļšs [Ceļš, Ceļošs, Ceļas, Ceļus, Ceļos] +Kalns +Jūra +Sauls [Auls, Kauls, Rauls, Pauls, Salus, Sauks, Sals, Saules, Sakuls, Saulēs, Saguls, Sulas, Salsu, Sauli, Sauss] +Mēness +Zvaigznes +Diena +Nakts +Brokastis +Pusdienas +Vakariņas +Vīns +Kafija +Maize +Siers +Makaroni +Pica +Saldējums +Deserts +Sāļš +Augļi +Dārzeņi +Gaļa +Zivis +Vistas +Ola +Sāls +Pipari +Eļļa +Sviests +Cukurs +Piens +Jogurts +Salāti +Zupa +Salds +Šokolāde +Spageti +Rīsi +Kakao +Biezpiens +Kūka +Tēja +Karalis +Zelts +Ezis +Tulpe +Lācis +Kaķis +Suns +Putns +Vārna +Zaķis +Pele +Ābols +Aita +Zirgs +Lauva +Pūķis +Lasis +Vilks +Vējš +Uguns +Ūdens +Zeme +Debesis +Saule +Rūpniecība +Aizkustinošs +Izdzīvošana +Nepieciešamība +Atbildība +Lieliski +Apmierināts +Neparasts +Izglītība +Sarežģīts +Atsevišķs +Pamatots +Organizācija +Sadarbība +Efektīvs +Daudzveidīgs +Novērtēt +Pārsteidzošs +Inovatīvs +Vērtība +Aizraujošs +Nopietns +Komunikācija +Māksla +Dzīvība +Ekskluzīvs +Tehnoloģijas +Rezultāts +Atbalsts +Nodrošinātība +Pārbaudīt +Radošs +Sociāls +Izteiksmīgs +Brīvība +Pieredze +Ietekme +Pārmaiņas +Drosmīgs +Racionāls +Empātija +Izpratne +Risinājums +Iespējas +Atklāts +Vadošais +Eksperimentāls +Neatkarība +Tīrība +Samierināšanās +Motivācija +Harmonija +Dinamisks +Iedvesma +Izglītojošs +Komplicēts +Pieejamība +Sadarbība +Tūlītējs +Saprotams +Neizsakāms +Lieliskums +Inovācijas +Aizrautība +Pārdomas +Sapratne +Rezultatīvs +Iespējams +Pārbaude +Sociālais +Izteiksme +Brīvība +Pieredzējis +Ietekmīgs +Pārmaiņu +Racionāla +Izpratni +Risinājumi +Iespējams +Atklāta +Vadošā +Eksperimentāla +Neatkarība +Tīra +Motivējošs +Harmonisks +Dinamika +Iedvesmojošs +Spēks +Mīlestība +Pasaule +Daba +Skaistums +Miers +Sapnis +Prieks +Rītausma +Brīnums +Izcils +Saikne +Dzirksts +Pārmaiņas +Atbalsts +Izcilība +Satriecošs +Dzīvīgums +Pārveidošana +Uzdrīkstēšanās +Uzticamība +Ieguldījums +Vērtība +Līdzsvars +Saskaņa +Izsmalcinātība +Pateicība +Atzinība +Pārsteigums diff --git a/Common/3dParty/hunspell/test/dst/mn_MN.txt b/Common/3dParty/hunspell/test/dst/mn_MN.txt new file mode 100644 index 0000000000..b590811bfc --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/mn_MN.txt @@ -0,0 +1,103 @@ +Баатар +Багаа +Базар +Барра +Бат-Очир +Баттуул +Батхэсэн +Баярмаа +Билгэх +Бор +Бөөнцагаан +Бүрэнхайрхан +Бямбагар +Бэх +Гарам +Гантиг +Гурвантэс +Гүр +Гэрэлтуяа +Давст +Дангаа +Дансран +Дарь-Эх +Дөргөн +Дундбүрд +Дэмүүл +Дэлгэрцэцэг +Жавзан +Жарантай +Заглул +Зүүнхөвөө +Кир +Корона +Лүн +Лха +Лхаваан +Майхан +Манлай +Мөндөөхөө +Мөнхөт +Мөрөн +Мөнххаан +Мөст +Мэгэд +Мухар +Найдалмаа +Найтингейл +Налайх +Нарантуул +Намтай +Насантогтох +Номин +Нямсамбуу +Нэүдэй +Орог +Очир +Өнөржаргал +Өөдөс +Өргөн +Паган +Пас +Пүрэвдорж +Пүрэвхүү +Сайнаа +Сайхандулаан +Сундуй +Сэлх +Сүүж +Сээр +Тайван +Тарав +Тогтуун +Төрболд +Төхөм +Төмөр +Түргэн +Түшиг +Түгтөмөр +Түшиг +Удвал +Улиастай +Улаандэл +гүедэцгээчих +дэвхэрлүүлсхийчих +дэвхэлцгээчих +дэвшигдүүлгэчих +дэвшилцчих +дэвээ +дэггүйчүүд +наламгардуулалц +налбаруулзна + +Слова с ошибками [] +Батарчулуун [Баатарчулуун, Батар чулуун, Батарч улуун] +Баруунхарааа [Баруунхарааг, Баруунхараа, Баруунхараагаа, Баруунхараад] +Даважаргал [Даваажаргал] +Дөрволжин [Дөрвөлжин] +Мягмараран [Мягмараар, Мягмарнаран] +Оюунтулхуур [Унтуурхуул] +оторчилсхилгэ [оторчилсхийлгэ, оторчилсхийчих, оторчилсхий, отогчилсхийлгэ, хорчилсхийлгэ] +Асрамжлулгацгаачих [Асрамжлуулгацгаачих] +гүентүүлгэцгэээ [гүентүүлгэцгээе, гүентүүлгэцгээ, гүентүүлгэцгээгээ, гүентүүлгэцгээж, гүентүүлгэцгээн, гүентүүлгэцгээнэ, гүентүүлгэцгээв, гүентүүлгэцгээг, гүентүүлгэцгээх, гүентүүлгэцгээм] +наладаадуулга [налдаадуулга, наадалдуулгаа, наадалдуулга, налдаадуулцгаа, наадамдуулгаа] diff --git a/Common/3dParty/hunspell/test/dst/nb_NO.txt b/Common/3dParty/hunspell/test/dst/nb_NO.txt new file mode 100644 index 0000000000..37cb4b46e6 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/nb_NO.txt @@ -0,0 +1,113 @@ +Bahamasøyene +Festarrangement +Festarrangemang [Festarrangement, Festarrangør, Fellesarrangement, Storarrangementa] +Festival +festligheta +festnummer +forhandlernett +forgylle +fotballstyre +Fotgå +fotoamatørene +Fotogalleri +fotokopiere +generalkostnadene +generaltabbe +generøs +Generell +genmodifisertst +handlingsresymeet +hardhet +Harmfull +hastighetsregulering +havbanke +havforskningsundersøkelsene +informasjonsutveksling +Infrarødest +kaffeautomat +kaldslig +kalenderåra +kjekk +kjendisstoffa +kjærlighetslyrikk +kjøkken +Kontantautomat +kontantlån +kontrahere +kontraheringsplikt +Låskasse +læregutt +læreprosess +Museums +museumssamling +musikkorps +myggstikka +myndighetsaldere +omløpstider +omregn +områdeplan +omriss +omsetningsgjeld +omsjaltning +omsetningsvolumer +omslutning +omslyngning +omsonst +omstendeligheta +Omstart +Omstreifende +Omsyn +omtåketheta +oppdagelse +oppbygning +oppebære +oppfølgingsapparat +oppgjørsbank +oppgjørsblankett +opphøringene +partisipere +randverdi +rapportskriver +rasjonalisering +Rate +selsak +selskapsinntekt +selskapsoverskudd +selvbetjeningene +snabbingene +Snadderene +Sytti +søkekriterium +søkemulighetene +søkeargumenter +søkingen +søkne +sølvlaga +sørlandsk +søtningene +tabellrad +Tabellkolonne +Takhalm +taksene +takseringssystema +tal +trolsk +trosinnholdene +utfoldelsesmuligheta +Utformingsmetode +Utgift +vekstfaktor +vekstforhold + +Слова с ошибками [] +Arbeidstagerorganisasion [Arbeidstagerorganisasjon, Arbeidstakerorganisasjon, Arbeidsgiverorganisasjon, Sosialarbeiderorganisasjon, Arbeiderorganisasjon] +festsprel [festsprell, festsprek, festsprelt, festspell, feltprest, fengselsprest] +forhandlingsdirektor [forhandlingsdirektør, forhandlingssekretær, forhandlingstekniskere, forhandlingstaktiskere, forhandlingskontor] +handlingforløpa [handlingsforløpa, handling forløpa, handling-forløpa, handlingsforløp, lønnsforhandlinga, lønnsforhandling, forhandlingspart] +kjempeflinktt [kjempeflinkt, kjempeflinkest, kjempeflink, kjempeflott, kjempefint] +lanetilbud [lånetilbud, langetilbud, landetilbud, linetilbud, laketilbud, langtilbud, lagetilbud, landtilbud, danetilbud, lunetilbud, vanetilbud, fanetilbud, banetilbud, hanetilbud, kantinetilbud] +omraming [omramming, omringing, omringning, ramming, omring] +omsvøpssfull [omsvøpsfull, omsvøpslaus] +raportmateriale [rapportmateriale, kartmaterialer, kartmateriale, programmateriale, skrapmateriale] +serstilt [særstilt, ser stilt, ser-stilt, seerstilt, tverrstilt, storstilt, lederstil, stiliser] +taksamst [takksamst, takksamt, takksam, samletakst, samstav] diff --git a/Common/3dParty/hunspell/test/dst/nl_NL.txt b/Common/3dParty/hunspell/test/dst/nl_NL.txt new file mode 100644 index 0000000000..ce7cdbafcc --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/nl_NL.txt @@ -0,0 +1,115 @@ +Advertentie +Advocate +affirmatie +afgevaardigd +afneemster +allerbekendst +alternatieveling +annulering +anticycloon +Backtrackroute [Jacktrackroute, Backtrackrouten, Baktrackroute, Backtrackroute-, Backtrack-route, Back-trackroute, Backtrackroutes] +Bearbeiden +becijfer +bediening +bedrag +beduiden +beïnvloeding +benadeling +bepaaldelijk +Catalogiseer +Catering +cellulair +classificator +collaboreren +collectiviteit +comfortabel +complimenteus +contractant +correctionaliseren +daaraanvolgend +dagelijks +deelgenoot +degelijkheid +demarqueren +Denotative [Denotatie, Denominatieve] +deposant +dergelijken +detail +deugen +diakritisch +Directioneel +dusgenaamd +eendrachtigheid +Eenzaamheid +eersteklascoupé +Eigenschap +felicitatietelegram +centerkanaal [centerkabaal, enterkanaal, centerkanaal-, center-kanaal, callcenter] +Chargeer +filiaal +klare +Klassikaal +kleinhandel +evolutie +exemplaar +exequiën +familiaal +fauteuil +luister +magistratelijk +perelaar +Permitteren +Perseveratie +persoonlijk +pictogram +pixel +sloten +sluimer +sneltoets +Soldij +Solliciteren +zegepraal +zelfbeeld +zevendaags +aangeslotene +meermaals +expedieert +jaargetijden +kaderleden +Kapitelen + +Сложные слова [] +avontuurlijkheid +bedrijfsmaatschappelijk +begrotingstechnisch +belangstellingssfeer +concurrentievoordeel +conferentieganger +democratisch-liberaal +discontoverhoging +doctoraatsverhandeling +dubbeldeksbus +economisch-financieel +energiezuinig +erkentelijkheid +evenwichtigheid +klimaatsverandering +koffiezetmachine +koopmansgebruik +maatschapsovereenkomst +personeelsconsulent +sociaalwetenschappelijk +zelfverzekerdheid +fondsenwervende + +Слова с ошибками [] +afficher [affiche, afficheer, affiche-, affiches] +algorithme [algoritme, algoritmiek] +beeindiging [beëindiging] +client [cliënt] +consnteren [consenteren, contesteren, constateren, consulteren, confronteren] +deactivieren [deactiveren, deactiveerde, reactiveren, deactiveert, geactiveerden] +deblockering [deblokkering] +electrisch [elektrisch] +certificat [certificaat, certificatie, certificeert, certificeer, certificeren] +sovereiniteit [soevereiniteit, suzereiniteit, sereniteit, universiteit] diff --git a/Common/3dParty/hunspell/test/dst/nn_NO.txt b/Common/3dParty/hunspell/test/dst/nn_NO.txt new file mode 100644 index 0000000000..90d328d8e3 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/nn_NO.txt @@ -0,0 +1,116 @@ +Ankeret +Anleggsbedrift +Annandag +annonseavis +annuell +ansats +ansvarsmedviten +Antibiotikai +apal +apoteki +apparattavlor +appetitt +Aprikos +arbeidsdokument +arbeidsmarknad +barndom +bastematte +bautingi +Bedriftsleiar +befolkningi +begynnarkurs +Beheld +belastningi +beredskapsnivå +beredskapsperiode +berglandskapi +berrfrost +beskjedi +beskrivingi +betalingsoppdrag +betalingsplikt +bevismateriale +bildeband +bildebruki +bildespråki +bildeteksti +bilingval +billettlukone +binær +bione +bjørkegreini +bjørnebæri +blenge +blokkeringi +blomsterbordi +blyerts +bogen +bokstavrekningi +bokstavteikni +Borddisk +effektevaluering +elgkalv +Elone +emballer +faktainformasjon +familiebedrifti +familieterapeut +fastbuande +Februar +feili +fisketom +hengelåsi +istandsetjingi +Item +jaguar +jamlig +janen +jarnbanestasjon +kjende +kjentfolki +kjæleri +kjøledisk +kjørety +midli +Mideftnar +midtstrek +multiplikasjonstabell +museumsdirektør +onsdag +operasjon +operasjonskode +opinionsskapingi +opningi +Personalkonsulent +Personligdom +persontryggleik +petroleumspris +redningsaksjon +reduksjon +refusnik +seinst +sekretær +seljande +sendeferd +Standpunkt +støyisolering +støytvis +terminoppgåve +tidløysone +tidsfølgjone +Tilbakebetalingstid +uprofesjonell +upåklageleg + +Слова с ошибками [] +Anlegsarbeid [Anleggsarbeid, Tvangsarbeid, Grunnlagsarbeid, Føregangsarbeid, Bergingsarbeid] +anonse [annonse, nonsens, anse] +ansversproblematikk [ansvarsproblematikk, vurderingsproblematikk, ventelisteproblematikk, valdsproblematikk, drivhusproblematikk] +barneforteling [barneforteljing, barnefordeling, barneforsking, barnefarforelegg, barnebefolkning, barnebortføring] +besoksliste [besøksliste, sortsliste] +bilophoggingi [bilopphoggingi, bilopphogging, opphogging] +effektivitetskontrol [effektivitetskontroll, effektivitetsforskjell, effektivitetsproblem, effektivitetsnøytral, effektivitetsforbetring] +fakturaerklering [fakturaerklæring, faktureringsliste, overfakturering] +miljøbyrad [miljøbyråd, miljøby rad, miljøby-rad, miljøbragd] +selskapskat [selskap skat, selskap-skat, selskaps kat, selskaps-kat, selskapsskatt, selskapskapital, selskapsrett, selskapstype] +cement [sement, dement, centime, cent] diff --git a/Common/3dParty/hunspell/test/dst/oc_FR.txt b/Common/3dParty/hunspell/test/dst/oc_FR.txt new file mode 100644 index 0000000000..26c580cdf5 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/oc_FR.txt @@ -0,0 +1,108 @@ +Ajustaira +alaguiar +alausièr +alberguèri +alcaloïdic +alègrament +alenament +algorisme +Alimentacion +allergologia +alpèstra +amaisament +amorteirar +analista +analogic +atucament +Audicion +auquièr +auscultacion +auscultar +ausèri +autenticament +brilhant +brumós +Burgada +cabelièira +cadeçar +Caducèu +çaicontra +calcièrs +Calmar +camarilha +cambièra +canalhariá +casse +cedar +cendrós +cèrca +cèrtes +cestòdes +chantièr +chartrós +Chassís +dimensionar +diptèrs +dirèctament +discrecionària +discriminar +Distraire +dòler +Enòrme +enqueriái +espicifòrme +esquelèt +Esquèrra +estetic +innocéncia +innocentàs +Maniquèu +mantelejar +Nauchièr +natièr +oxigèn +pacanariá +pagés +pagesiá +Primièirament +requereguèri +requisitòria +saumelèri +S'autodeterminar +sautarèl +scientament +scientologia +secador +secretèri +sècta +sectorial +s'efarcimar +s'endeven +s'engarrar +sentimental +s'entrepausar +shampó +sextant +sòli +Solidament +soquèla [soquèla, roquèla] +subrejornada +suedés +utilitària +Utilizaire +vacàs +vaisselèri +valiái +validament + +Слова с ошибками [] +albatros [albatròs] +amistanza [amistança, amistat, animista] +brunonièr [brunhonièr, prunhonièr] +carpentier [carpentièr] +centrifugation [centrifugacion, centrifugadoira, centrifugador, centrifugar, centrifuga] +estelhad [estelhas, estelha, estelhada, estelhar, estelhan, estelhat, estelham, estrelhada, estervelhada, estenalhada, estendalha] +primaria [primariá, primària, primarai, primaris, primari, primariam, primacia, primarga] +s'embractar [s'embracetar, s'embraceta, s'embodracar, s'embarrassar, embracetar] +sosembrançament [sosembrancament, embraçament, asombrament] +vascularisacion [vascularizacion, secularizacion, cardiovascular] diff --git a/Common/3dParty/hunspell/test/dst/pl_PL.txt b/Common/3dParty/hunspell/test/dst/pl_PL.txt new file mode 100644 index 0000000000..3cb6dba99f --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/pl_PL.txt @@ -0,0 +1,225 @@ +dom +pies +kot +auto +drzewo +książka +szkoła +przyjaciel +mama +tata +dziecko +jabłko +czekolada +kawa +herbata +telefon +telewizor +komputer +muzyka +sport +zdrowie +piękno +praca +miłość +szczęście +czas +pieniądze +język +kraj +miasto +zima +lato +jesień +wiosna +morze +góry +jezioro +rzeka +park +zwierzę +ptak +ryba +drewno +złoto +srebro +metal +szkło +buty +sukienka +spodnie +koszula +czapka +płaszcz +ręka +noga +oko +ucho +nos +usta +ząb +głowa +serce +mózg +król +królowa +książę +księżniczka +chłopak +dziewczyna +mężczyzna +kobieta +staruszek +staruszka +lekarz +pielęgniarka +nauczyciel +uczennica +student +studentka +kucharz +kelner +wojna +pokój +mapa +flaga +śmiech +płacz +sen +marzenie +praca +nauka +sztuka +teatr +kino +muzeum +kaplica +kościół +zamek +most +droga + +Сложные слова на польском языке [] + +1. konstantynopolitańczykowianeczka [nicejsko-konstantynopolitańskiego] +2. niezadogłębienieńskujący [] +3. antykontraatakujący [finansująco-kontraktujący] +4. supersamoobsługiwalnymi [kancelaryjno-archiwalnymi] +5. rozpierduchlanoculka [nieporozpierdzielanie] +6. nieodezwawiałobyś [nieodprzedmiotawiany] +7. przystawieniowy [przedstawieniowy, nieprzystawienie, niepoprzystawianie, nieprzystawianie] +8. nieprzeżyciowakościami [nieprzewartościowywaniami, nieprzewartościowaniami] +9. nieprzekazywających [nieprzekrzywiających, nieprzejednywających, nieprzywdziewających, nieprzepoczwarzających] +10. przeciwzakwaszeniowych [zatokowo-przedsionkowych] +11. nieszczęściodrapańskiego [ogrodniczo-pszczelarskiego] +12. społeczno-wychowawczyniami [socjalizacyjno-wychowawczymi] +13. seledynowo-fioletowymi [mięśniowo-szkieletowymi] +14. przeciwdeszczową [przeciwdeszczową, przeciwdeszczowy] +15. mikroelektroniczno-kwalitacyjną [reumatologiczno-rehabilitacyjną] +16. nieokreślonościowo-losowo-obiektywnie [] +17. zagubieniecioburakowatej [] +18. antyneuroleptyzanckim [] +19. nieupubliczniającymi [nieuwieloznaczniającymi] +20. splądrowałbyś [wyeksplorowałbyś] +21. konserwowano-spożywczymi [konserwiarsko-zamrażalniczymi] +22. ożelośćiowo-miłosnej [] +23. nieprzyzwoitolicjią [nieprzypieczętowującą] +24. nieodporowościę [nieodpoliturowanie] +25. rzeszołkofiołkowatymi [] +26. niezakapiactwuja [niezakatrupiająca] +27. nieoszczędniewczelnianków [oszczędnościowo-rozliczeniowa] +28. przekształconowaczkołępów [] +29. rozwińczywianiu [nieporozwiązywaniu] +30. nieprzeskakiwalnościami [nieprzewartościowywaniami] +31. modernizująco-rewolucyjnego [reumatologiczno-rehabilitacyjnego] +32. nadzwyczajnieuzdolnionymi [] +33. przemocno-wsparciański [warciańsko-odrzańskiemu] +34. przepyszno-peltzerowskiego [faszystowsko-hitlerowskiego] +35. kwestionowano-wzmocnieniami [] +36. nieodczynieństwującą [nieodrzeczywistniającą] +37. niezasłużonowypasionego [] +38. likwidującego/zarządzającego [odchudzająco-oczyszczającego] +39. szeszcześtoplutowanych [nieprzeinstrumentowanych] +40. niewpadkowościowi [wielonarodowościowi] +41. antynazizhownemu [niebizantynizowanemu] +42. nieuchronnieprzekroczeniowym [oszczędnościowo-rozliczeniowym] +43. niezatrawialnieprzyjemnego [] +44. kardiopulmonologiczno-angiologów [endokrynologiczno-ginekologicznemu] +45. gorączkowointensywnościowego [wydolnościowo-sprawnościowego] +46. antykonstytucyjnorozpadowego [konstytucyjno-monarchicznego] +47. nieobawiamysię/źródleni [] +48. prerewolucyjnolphillipsowi [] +49. szóstkaniewygranych [niewykrystalizowywanych] +50. nieupadkokogeneracyjnymi [korekcyjno-kompensacyjnymi] +51. społeczno-humanitarnarządzaniami [] +52. nieodziewowiędzy [nieumiędzynarodowienie] +53. przemocnochamować [] +54. społecznosensacyjnosądowym [kompensacyjno-wyrównawczymi] +55. przerażającorzymskiego [kobylińsko-borzymskiego] +56. nieprzemontowanych/zamuzowych [] +57. referendumkonstytucyjno-reformujące [] +58. niezniesłowiałszymi [niezesłowiańszczonymi] +59. niebohaterystycznymi [charakterystyczniejszymi] +60. produktodenarodowomenopauzalem [] +61. odrywającopierdolca [niedopierdzielająca] +62. niegotowożywione [żywieniowo-noclegowi] +63. niepostronnynarodzonemu [kilkudziesięciostronicowemu] +64. przedniaautochtonicznym [urbanistyczno-architektonicznym] +65. nadciągniono-wchodzących [] +66. promocjostworczym [czteromocarstwowym] +67. niezapowiadającychkoalicji [] +68. bezgłupinczłapie [] +69. wyomjaził [] +70. wagotonizacyjno-radiofonizowanego [] +71. gospodarczo-zasadotwórczej [organizacyjno-gospodarczej] +72. skrupulatno-rzeźniczobardziej [] +73. samokiedy-konstytucyjnej [konstytucyjno-monarchicznej] +74. niedomętnością [nieumiejętnością] +75. nieoszustamiwykorzystana [] +76. przeprowadzonoświeckie [nieprzeprojektowywanie] +77. nieuniknionaobowiązkowo-plastycznej [] +78. poduszkowo-nicościowych [porządkowo-czystościowych] +79. niepowodzeńbutmizeryjewego [] +80. skojarzeniowocolorowymi [wypoczynkowo-szkoleniowymi] +81. przytułkamiwciągarkowych [] +82. wchodziłoprzeciwniepowszechny [] +83. karaublicznociągana [publiczno-prywatnego] +84. przedpolitycznilubelskim [hemolityczno-mocznicowemu] +85. niezapowiedziano-date-expanded [] +86. licznościłodziennej [termiczno-wilgotnościowej] +87. niezawinieniomatołek [] +88. pakujączwobilardowego [] +89. rewersdopisek [] +90. przeprosinoworadosną [nieprzeprojektowywaną] +91. nieakceptacyjnoprospekcyjnymi [adaptacyjno-rehabilitacyjnymi] +92. jedniżużytym [nienadużytymi] +93. ainikopciksemilitechnikowany [] +94. motszynopiszącym [niewspółtowarzyszącym] +95. nieprzerejestrowanasezonowanie [] +96. słupotartackimoblikiem [] +97. nieodbieraniemniedostępności [] +98. dorozwinięcówkobiet [] +99. szybopojabytesłowickiego [] +100. przystępnoracjmujacych [] + +Слова с ошибками [] + +jedniiżużytym [nienadużytymi] + +wiomjaził [jaziowy] + +niezzniesłoowiałszymi [niezesłowiańszczonymi, niezesłowiańszczanymi, niezesłowiańszczającymi, najniesłowniejszymi] + +superrsammoobsługiwalnymi [muzealno-archiwalnymi] + +przemoocnochamować [przeprogramować] + +staruszzka [staruszka, staruszeczka, staruszek, staroruska, starszaka] + +tiatr [tiar, titr, tatr, teatr, wiatr, otiatra, otiatria, tristia] + +woina [wpina, wona, wina, wozina, dwoina, wolina, wonna, wcina, toina, wodna, doina, wolna, wojna, wgina, woźna] + +teleffon [telefon, telef fon, telef-fon, telefoto] + +zołoto [złoto, gołoto, hołoto, Gołoto, Hołoto, zołotnik] diff --git a/Common/3dParty/hunspell/test/dst/pt_BR.txt b/Common/3dParty/hunspell/test/dst/pt_BR.txt new file mode 100644 index 0000000000..1f66fc5565 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/pt_BR.txt @@ -0,0 +1,108 @@ +que +eu +não +de +você +para +ele +se +é +um +sim +por +isso +em +uma +uuma [u uma, uma, usma, suma, numa, ruma, duma, puma, fuma, juma] +está +como +com +bem +na +me +mas +do +era +quando +então +tudo +tydo [tudo, tido, todo] +aqui +disse +estava +esâtava [estava, tavares] +lá +fazer +vai +sobre +vamos +homem +hollmem [homem-gol] +bom +ok [o k, o, k, oó, os, oi, oc, ou, om, oh] +agora +coisa +coissa [coisca, coiça, coisas, coisa, cossa, comissa, cisosa, cissoa, cossai] +quero +foi +meu +seu +só +eles +as +posso +pocso [posso, poco, poso, psoco, poiso, pouso, pocho] +estou +mais +mim +certo +dizer +dizdizerr [dizer] +os +no +sei +ela +vocês +sua +todos +sabe +minha +alguma +algyyma [amalgama] +casa +muito +oh +quallquer [qualquer, alquerque, malquerer, alqueria, alquermes] +qualquer +da +estamos +até +onde +onede [enode, onde, monede, neode, onere, olede, nedendo] +ao +tenho +nós +tem +tinha +tiinha [tinão ha, tiazinha, toinha, tinha, tirinha, tidinha, tipinha, tianha, tainha] +quê +ir +ou +pode +quer +vou +seus +dia +estão +nos +cabeça +quem +anos +depois +sou +vez +vá +fez +irmão +câmera +câmeara [cameara, cameará, câmera, câmara, acâmera, comeara] diff --git a/Common/3dParty/hunspell/test/dst/pt_PT.txt b/Common/3dParty/hunspell/test/dst/pt_PT.txt new file mode 100644 index 0000000000..9477e3d006 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/pt_PT.txt @@ -0,0 +1,135 @@ +pan [pana, pane, pano, pen, par, pai, pau, paz, San, Van, Dan, pança] +manteiga +menteiga [manteiga, antigamente] +queijo +salchichón [salsicha] +saуlchichón [] +óleo +pimenta +pimmenta [pimenta, pigmenta, pimenteira, pavimenta, implementa, impiamente] +sal +baga +mel +geléia [geleia] +cogumelo +cebola +cóbola [cebola] +banana +cenoura +pêra [pera, para, pira, pura] +beterraba +frutas +melão +melancia +bolo +chocolate +carne +batatas +salada +salóda [salda, salada, salsada] +tomate +pepino +pipino [pepino, pi pino, pi-pino, pipi no, pipi-no, filipino, pino] +col [cola, cole, colo, coa, cal, coe, cor, rol, sol, coo, com] +mingau [mingua, mingai, minga, mingar, mingas, mingou, mingam] +sopa +sanduíche +refrigerante +refrigarante [refrigerante, refrigerar, intrigante] +água +café +chá +leite +suco +scuco [suco, cuco, cucos] +maçã +uvas +laranja +abacaxi +adacaxi [abacaxi, cacada] +damasco +demasco [damasco, demarco, remasco, de masco, de-masco, descasco] +açucar [açúcar, açucara, açucare, açucaro, açudar] +arroz +macarrão +res [rés, ser, ares, reis, ires, ores, dres, rei, ris, ses, rãs, rês] +porco +frango +costeleta +cãsteleta [costeleta, chapeleta] +limão +ervilha +pão +peixe +caramelo +sorvete +nogueira +ovo +pêssego +xícara +xíícara [xícara, caraíba] +vidro +prato +colher +garfo +faca +pires +garrafa +guardanapo +café da manhã [ssafé da manhã] +almoço +jantar +avião +carro +bonde +ônibus [ónibus] +trem +bicicleta +janeiro +fevereiro +fevíreiro [fevereiro, ferreiro] +março +abril +maio +junho +julho +agosto +setembro +setembra [setembro, seteara] +outubro +novembro +dezembro +desembro [desmembro, dezembro, deslumbro, setembro, desdobro] +caneta +livro +xadrez +telefone +relógio +pente +televisão +ferro +sabão +rádio +bolsa +cartão +mala +presente +câmera [câmara, comera] +computador +camputador [computador, captador] +filme +flor +vaso +quadro +lenço +bola +balão +brinquedo +brinqueedo [brinquedo, branqueado] +conta +sobre +papel +pepel [papel, repele, pele] +jornal +letra +bilhete diff --git a/Common/3dParty/hunspell/test/dst/ro_RO.txt b/Common/3dParty/hunspell/test/dst/ro_RO.txt new file mode 100644 index 0000000000..b1bd892905 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/ro_RO.txt @@ -0,0 +1,210 @@ +casă +copil +carte +masă +școală +lumină +apă +munte +soare +lună +pâine +fruct +floare +stradă +mașină +aer +timp +zi +noapte +nor +vânt +ochi +gură +nas +mână +picior +inimă +sânge +cap +ureche +voce +melodie +culoare +formă +linie +cerc +dreptunghi +cercetare +știință +limbă +frază +literă +cifră +număr +sunet +zgomot +telefon +internet +computer +program +ecran +tastatură +mouse +joc +sport +muzică +artă +film +televizor +radio +planetă +stea +univers +galaxie +atom +moleculă +substanță +energie +lumină +căldură +frig +aparat +instrument +mașinărie +unelte +hrană +băutură +haine +pantofi +păr +piele +ochelari +ceas +bijuterie +pământ +apă +aer +foc +metal +lemn +piatră +hârtie +cerneală +pix +carte +cadru +tablou +sculptură +model +formă +anticonstituționalitate [anti constituționalitate, anti-constituționalitate, anticonstituționali tate, anticonstituționali-tate, anticonstituționale, neconstituționalitate, anticonstituțională, constituționalitate] +dezvoltare +inexpugnabil +nefast +concomitent +antiseptic +recalcitrant +perseverență +extravagant +inexorabil +colosal +plauzibil +efervescent +perspicacitate +superfluu [superfluă, superfulger] +subversiv +incoruptibil +inefabil +hiperbolic +indefectibil [indestructibil, indefinibil] +peremptoriu +ambivalent +paradoxal +heterogen [eterogen, heterogonie] +indiferent +periferic +subliminal +ultraviolet +indeferent [indiferent, interferent, deferent, inaderent, independent] +conglomerație +circumstanțial +contraproducător [contra producător, contra-producător, contraproductivă, contraproductiv, neproducător] +conglomerat +insurmontabil +intransigent +insidios +inerent +consternant +ambiguitate +inerție +inconsolabil +oniric +remarcabil +repudiat +subiectiv +periculos +infatigabil +abnegare +exuberant +facet [face, falet, facem] +represiune +implacabil +indiferent +infatigabil +insolit +intempestiv +incandescent +letargic +magistral +magnanim [magnaliu] +nefast +oblivial [bolivian] +oportun +periculos +plutitor +propice +reprobabil +risipitor +robust +salutar +simetric +solicitant +stringent +sufocant +superficial +tranzitoriu +tributar +trivial +umilitor +unic +vehement +vernal +vicios +victorios +vindicativ +virtuos +vizibil +volatil +vorace +vulnerabil +xenofob +xerofil +yonder [pondere] +yang +yodel [model] +zonal +zodiac +zoon [ozon, zono, zoom, zoo, zon, zobon, zovon, zvon, zoo n] +zoomorf +zurbagiu +Caaă [Casă, Cară, Cată, Cală, Cană, Cauă, Camă, Capă, Cadă, Cață, Cază, Cavă, Cașă] +Soaare [Soare, Sotare, Solare, Sonare, Somare, Soțioare] +Cartr [Carte, Cart, Carter, Carta, Carto, Cartu, Cartă] +Appă [Papă, Apă, Arpă, Aptă] +Coopil [Copil, Copilo, Copiilor] +Frumoss [Frumos, Frumos s, Frumoasă] +Feriсire [Fericire, Rereferire, Ferire] +Prietenn [Prieten, Prieteni, Prietena, Prietene, Prieteno, Prietenu, Prietenă, Prieten n, Prietinie, Prietin, Pretenție] +Muziică [Muzică, Muzic, Muică] +Exeplu [Exemplu] diff --git a/Common/3dParty/hunspell/test/dst/ru_RU.txt b/Common/3dParty/hunspell/test/dst/ru_RU.txt new file mode 100644 index 0000000000..938369e89b --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/ru_RU.txt @@ -0,0 +1,197 @@ +должен +доллжен [должен, доложен] +наш +думаю +думмаю [думаю] +свою +сам +всем +ни +нас +пока +этом +этой +ваша +всеми +возьми +моей +сама +вся +день +само +всей +бывает +себе +пойду +куда +ими +твоей +всю +своего +твой +пусть +ним +про +точно +иметь +которые +тогда +сюда +наше +самой +взять +наверное +домой +совсем +те +тобой +наверно +что-то +будто +твои +пути +дома +такие +тех +такое +его +самой +вашей +наверное +мои +например +типа +значит +люблю +минут +пор +случае +искусство +лучше +того +такому +ждать +видеть +мною +ждал +имя +важно +чего-то +самому +обычно +представляет +мечтать +стало +помните +взять +моих +самим +своим +вообще +самими +здесь +обратно +сразу +таким +ежели +наоборот +куда +таков +мечтает +значит +покажи +такими +кстати +почти +всякий +научит +вдоль +тогдашний +толком +занимает +Аквапланирование +Барокамера +Библиографирование +Биосинтез +Взаимодействующий +Вибраторный +Виртуальность +Вооруженность +Господствующий +Десантно-штурмовой +Диагностировать +Дипломатический +Дисгармония +Дискриминационный +Достопримечательный +Жизнеустройство +Интернациональный +Инфицированный +Кальцинировать +Ключичный +Коннотация +Лиловатый +Люминесцентный +Метрополитен +Многоплановый +Модернизировать +Наивысший +Наименее +Неопределенный +Нераскрытый +Неоднократный +Неохотно +Непостижимый +Неусыпный +Обезьяноподобный +Обзавестись +Оптический +Оптимизировать +Осуществиться +Очистительный +Парафинировать +Переключатель +Пограничный +Подготовительный +Подрядчик +Полиморфный +Почитать +Преисполниться +Преподаватель +Преследователь +Прирожденный +Проектирование +Профанация +Разграничительный +Распоряжающийся +Реконструктивный +Революционный +Рентгенологический +Рискованный +Роскошествовать +Самоунижение +Сверхъестественный +Светочувствительный +Семантика +Сингулярность +Совершенствовать +Соединительный +Сосуществование +Спорообразующий +Стационарный +Столовая +Сторицей +Сцепной +Трансформирующий +Триумвират +Укротитель +Универсальный +Федеративный +Хронометраж +Целостность +Криумвират [Триумвират] +Укратитель [Укротитель] +Универссальный [Универсальный] +Фидиративный [] +Хранометраж [Хронометраж] +Целосность [Целостность] diff --git a/Common/3dParty/hunspell/test/dst/sk_SK.txt b/Common/3dParty/hunspell/test/dst/sk_SK.txt new file mode 100644 index 0000000000..d8167476c9 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/sk_SK.txt @@ -0,0 +1,205 @@ +hiša [šiša, Riša, Miša, hi ša, hi-ša] +pes +mačka +avto [atto, asto, auto, zavito] +drevo +knjiga [kvadriga] +šola [šila, šoka, šla, švola, škola, šosa, vola, šora, rola, kola, mola, dola, šopa, pola, hola] +prijatelj [prijatej, prijate, prijatie] +mama +oče [očne, otče, toče, očke, koče, moče, očeš, oči, one, ose, oke, oje, obe, očí, očú] +otrok +jabolko [jablko] +čokolada [čokoláda] +kava +čaj +telefon [telefón, telefot] +televizija [televízia] +računalnik [račianski] +glasba [glasnosť] +šport +zdravje [zdravej, zdravie, zdravte, zdravme, zdrav je, zdrav-je] +lepota [pelota, slepota, lopota, lehota, klepotať, epoleta, poleptať] +delo +ljubezen [lezeniu] +sreča [srnča, skeča, smeča] +čas +denar [denár, nedar] +jezik [veziko] +država [držiava, držala, dŕžava, dĺžava] +mesto +zima +poletje [polejte, poleje, poletuje, polje] +jesen [jeseň, jesne, nesej, jeden, jesene, jeseni, jesení] +pomlad [omlad, poklad, p omlad, pomlka] +morje [morke, more, moje, morte, morme, mor je, mor-je, morčej] +gore [hore, gofre, nore, kore, more, zore, bore, šore, Nore, Tore, Lore, Zore, gágore] +jezero [jazero, je zero, je-zero, zero] +reka [areka, rieka, rekta, repka, rezka, raka, roka, rekt, seka, reva, veka, deka, repa, reku, ruka] +park +žival [žuval, živa, živel, živil, rival, ži val, ži-val, živ al, živ-al, živa l, žičieval] +ptica [pica, pätica, psica, štica] +riba [rabi, roba, ria, iba, raba, ribi, ryba, rúba, róba, Tiba, r iba, babri] +les +zlato +srebro [rebro, s rebro, striebro] +kovina [okovina, krovina, ovinka, konina, novina, korina, rovina, kozina, košina, kofina, rakovina, kávovina] +steklo [šteklo, seklo, stekalo, stieklo, stenklo, streklo, stoklo, steblo, stĺklo] +čevlji [nevlhči] +obleka +hlače [hláče, tlače, hlase, hlave, hlade, plače] +srajca [rajca, krajca, s rajca] +kapa +plašč [plaš, plač, plaší, plaš č] +roka +noga [noha, nota, nosa, nova, nora, loga, koga, doga, joga, noža, noša, noxa, Toga, neogab] +oko +uho [ujo, ho, tuho, uhor, uhol, uhlo, ucho, uhoľ, uňho, hou, oho, uto, uhm, cho, uhú] +nos +ustnice [ustrice, kapustnice] +zob +glava [hlava, Ilava, Slava] +srce [drce, srnce, srdce, srne, srde, síce, súce] +možgani [moganie] +kralj [kraj, kraal] +kraljica [kraslica] +princ +princesa +fant +dekle [deke, dele, pekle, de kle, de-kle, debakle] +moški [košmi, kamoši] +ženska [ženská, ženiska, žensky, ženskí, ženský, ženskú, ženské] +starec +starka [starká, straka, statka, starla, stara, ostarka, staríka, starca, starkí, starký, starkú, starké] +zdravnik [zdrav nik, zdrav-nik, zdravenia] +medicinska sestra [medicínska sestra] +učitelj [učitelík] +učenka [učeníka, učenia, učenca, utečenka] +študent +študentka +kuhar [kurare] +natakar [katakana, katarakta, katarakt] +vojna +mir [mri, mor, mi, mira, mire, mier, emir, miri, miru, mar, air, mer, min, sir, mil] +zemljevid [zemediel] +zastava [zástava, zastáva, zastav, zastavia, zastaval, zastavaj, zastavať, zostava, zastala, zastaví] +smeh [sneh, smej, sme, steh, smer, smel, smeč, smeť, sme h] +jok [koj, kok, joj, jol, ojok, jak, jot, tok, sok, vok, rok, lok, mok, dok, job] +spanje [spanie] +sanje [sane, saje, sanuje, banje] +delo +učenje [učenej, učene, učenie] +umetnost [etnosti] +gledališče [nepojedali] +kino +muzej [mušej, muzeálnej] +kapela +cerkev +grad [grád, gard, hrad, graf, rad, grand, gram, gray, úrad, Arad] +most +cesta + +Сложные слова [] + +1. Neparlamentarna [parlamentarizmus] +2. Samozadosten [rozradostene] +3. Nepristranski [protistranícki] +4. Pretirano [pretrénovanosti] +5. Nepredušno [nepriedušnosť] +6. Nesreča [] +7. Razpršeno [zhoršenou] +8. Nesprejemljiv [nesprejazdňujeme] +9. Prekomeren [rekompenzovať] +10. Prostovoljstvo [sprostredkovateľstvo] +11. Izolirati [] +12. Trmast [] +13. Brezpogojno [] +14. Neodvisnost [neodôvodnenosti] +15. Skupnost [ústupnosti] +16. Neizvedljiv [] +17. Nelegitimen [nelegitimizuje] +18. Nevzdržen [] +19. Preobremenjenost [] +20. Ogrevalni sistem [] +21. Preoblikovati [aplikovateľnosti] +22. Nezaslišano [nezasluhujúci] +23. Neugoden [] +24. Prezasedenost [prezamestnanosť] +25. Nesreča [] +26. Neupravičeno [nenapraviteľnosť] +27. Mednaroden [mŕtvonarodeným] +28. Kompatibilnost [najkompatibilnejšom] +29. Neuspeh [neusporte] +30. Neobvladljiv [] +31. Neskončen [neskončenej] +32. Neprimeren [neprimeranie] +33. Amortizacija [amortizovaných] +34. Koncentracija [dekoncentrácia] +35. Cirkulacija [recirkulácia] +36. Obremenitev [odbremenenie] +37. Gromozanski [] +38. Simbol [] +39. Vinjeta [] +40. Digitalizacija [digitalizovaný] +41. Funkcionalnost [funkcionalistické] +42. Rentabilnost [nerentabilnosti] +43. Ekshibicionizem [exhibicionizmus] +44. Frustracija [frustrujúci] +45. Neprilagodljiv [] +46. Severnoameriški [] +47. Ekskluzivnost [] +48. Preverjanje [preverovanej] +49. Celoživljenjsko [] +50. Privlačnost [neprivlastňovala] +51. Periferija [periferický] +52. Sokrivda [dokrivkať] +53. Kompromis [kompromisník] +54. Strpnost [ostrovtipnosť] +55. Racionalizacija [zracionalizovania] +56. Birokracija [gerontokracia] +57. Odraslost [odrastenými] +58. Stabilnost [nestabilnosti] +59. Nepredvidljivost [najnepredstaviteľnejšou] +60. Razkošje [] +61. Smrtnost [úmrtnostným] +62. Obveščenost [presvedčenosti] +63. Produktivnost [neproduktívnosti] +64. Neugodje [] +65. Zapletenost [zakrpatenosti] +66. Hegemonija [] +67. Umetnost [menostatikum] +68. Tranzicija [tranzitivita] +69. Individualnost [individualisticky] +70. Kontaminacija [kontaminantmi] +71. Inkubacija [] +72. Prikrito [prikrátko] +73. Etnični [Letničie] +74. Sovražnost [samovražednosť] +75. Atraktivnost [abstraktnosti] +76. Nestrpnost [nepriestupnosti] +77. Divergenca [divergencia] +78. Digitalna pismenost [] +79. Stabilizacija [autostabilizácia] +80. Raznolikost [] + +Слова с ошибками [] + + Kontamenacija [Kontaminácia] + + Grommozanski [Grobianski] + + Neobvladlliv [Neobkradli] + + Neparlametarna [Neparlamentný, Parlamentárnej, Parlamentne] + + Nevrzdržen [Združene, Zdražene] + + voina [vonia, vina, vojna, voľna, voština] + + muzei [muzeálni] + + ryba + + serebro [se rebro, se-rebro, rebro] + + televiziia [televízia] diff --git a/Common/3dParty/hunspell/test/dst/sl_SI.txt b/Common/3dParty/hunspell/test/dst/sl_SI.txt new file mode 100644 index 0000000000..6bd9384141 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/sl_SI.txt @@ -0,0 +1,210 @@ +Hiša +Sonce +Miza +Stol +Ptica +Trava +Drevo +Noč +Luna +Morje +Gora +Cvet +Riba +Rdeča +Modra +Zelena +Rumena +Bela +Črna +Kamen +Pes +Mačka +Roka +Noga +Glava +Oči +Uho +Nos +Usta +Jabolko +Hruška +Sliva +Jagoda +Malina +Lubenica +Kruh +Mleko +Sir +Mesnica +Sadje +Zelenjava +Voda +Zrak +Ogenj +Sneg +Dež +Oblak +Veter +Zima +Poletje +Jesen +Pomlad +Zajec +Lisica +Volk +Medved +Lev +Tigrica +Slon +Konj +Krava +Ovca +Piščanec +Jajce +Mleko +Kava +Čaj +Sok +Vino +Pivo +Hrana +Pecivo +Testo +Marmelada +Kruh +Sir +Olje +Sol +Poper +Sladkor +Kava +Čaj +Vino +Pivo +Šola +Učitelj +Učenec +Knjiga +Pisarna +Računalnik +Telefon +Glasba +Slika +Film +Gledališče +Mesto +Vas +Trg +Cesta +Reka +Avtomatizacija +Razvoj +Komunikacija +Kompjuter [Juterškov] +Programiranje +Elektronski +Inženiring +Elektrifikacija +Kombinacija +Sistem +Informacija +Univerza +Biblioteka +Univerzitetni +Laboratorij +Raziskava +Razvojna +Inovacija +Intelektualni +Integriteta +Izobraževanje +Izvajanje +Preverjanje +Tehnologija +Implementacija +Program +Sodelovanje +Proizvodnja +Industrija +Organizacija +Administracija +Proaktivnost [Retroaktivnost, Produktivnosti, Produktivnost, Provokativnost] +Kreativnost +Projektni +Razumevanje +Kvaliteta +Upravljanje +Ocenjevanje +Statistika +Kompetentnost +Konsolidacija +Realizacija +Kapaciteta +Distribucija +Kompatibilnost +Konceptualizacija [Konceptualizem] +Povezava +Posodobitev +Fleksibilnost +Ekonomija +Organiziranje +Konkurenca +Stabilnost +Ekologija +Osebnost +Zavzetost +Entuziazem [Entuziast] +Motivacija +Avtorizacija +Kreacija +Akumulacija +Monotonija +Diferenciacija +Transformacija +Koncentracija +Inovativnost +Aktivnost +Vzpostavljanje +Reorganizacija +Kategorizacija +Partikularnost +Homogenost +Izjemenost [Izjemnost, Izjemen ost, Izjemen-ost, Zmenjenosti, Izrojenost, Izmišljenost, Izrinjenost] +Generalizacija +Hierarhija +Koordinacija +Inspiracija +Evaluacija +Ustvarjalnost +Oblikovanje +Kompatibilnost +Konkretizacija +Proaktivnost [Retroaktivnost, Produktivnosti, Produktivnost, Provokativnost] +Identifikacija +Kapaciteta +Intervencija +Konsolidacija +Realizacija +Eksplozivnost +Abstrakcija +Individualnost +Integracija +Segmentacija [Sedimentacija, Sedimentacij, Argumentacija, Alimentacija] +Asimilacija +Artikulacija [Artikuliranja, Artikulirala, Cirkulacija, Kalkulacija] +Kolaboracija +Asociacija +Stabilizacija +Kooperacija +Transformacija +Hšza [Hrza] +Kmojnikacija [Komunikacija] +Progrramiranjee [Programiranje, Reprogramiranj, Programiranega, Programiranj] +Elektornkski [Elektorski, Elektorkin, Elektronski, Elektorki] +Inženeirrng [Inženiring] +Izzobraževanjee [Izobraževanje, Izobraževanj, Izobraževanega, Izobraževane] +Infomracija [Informacija, Informacij, Rafinacijam] +Razvoojnaa [Razvojen] +Proizvdonja [Proizvodnja, Proizvajanja, Proizvajanj, Proizvaja] +Akitvnostt [Aktivnost] diff --git a/Common/3dParty/hunspell/test/dst/sr_Cyrl_RS.txt b/Common/3dParty/hunspell/test/dst/sr_Cyrl_RS.txt new file mode 100644 index 0000000000..ef1ecd7824 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/sr_Cyrl_RS.txt @@ -0,0 +1,227 @@ +кућа +пас +мачка +аутомобил +дрво +књига +школа +пријатељ +мама +тата +дете +јабука +чоколада +кафа +чај +телефон +телевизија +рачунар +музика +спорт +здравље +лепота +посао +љубав +срећа +време +новац +језик +земља +град +зима +лето +јесен +пролеће +море +планине +језеро +река +парк +животиња +птица +риба +дрво +злато +сребро +метал +стакло +ципеле +одећа +панталоне +кошуља +капа +капут +рука +нога +око +уво +нос +усне +зуб +глава +срце +мозак +краљ +краљица +принц +принцеза +дечак +девојчица +мушкарац +жена +старац +старица +доктор +медицинска сестра [војномедицинска] +наставник +ученик +студент +студенткиња +кувар +конобар +рат +мир +мапа +застава +смех +плач +сан +сањарење +посао +учење +уметност +позориште +биоскоп +музеј +црква +дворац +мост +улица +пут + +Сложные слова [Словенства] + +Конечно! Вот сто сложных слов на сербском языке на кириллице: [] + +1. Контраст [контрастира, контраста, контрастно, контрастна] +2. Компликација [компликацијама, компликација, компликације] +3. Конструкција [реконструкција, конструкцијама, конструкција, конструкцију] +4. Диспропорција [пропорцијалном] +5. Корелација [корелацијама, корелација] +6. Колаборација [колаборација] +7. Консервативан [конзервативан] +8. Диференцијација [диференцијације, диференцијацијом, диференцијална, диференцијални] +9. Експерименталан [експерименталним, експериментална, експериментални, експерименталне] +10. Инвалидитет [инвалидитет] +11. Легитиман [нелегитиман] +12. Оптимизација [аклиматизација] +13. Компетентан [некомпетентан, компетентан] +14. Документација [документација, документацијом, документацију, документације] +15. Персистентан [асистенткиња] +16. Апроксимација [апроксимације] +17. Екстраваганција [екстравагантност] +18. Катастрафалан [катастрофалан] +19. Резервација [резервација] +20. Прогресиван [прогресиван] +21. Идентификација [идентификација, идентификације] +22. Генерација [регенерација, генерација] +23. Криминалистички [криминалистички, криминалистичка, криминалистичке] +24. Дестабилизација [индустријализација] +25. Корумпиран [корумпирана, корумпиран] +26. Конфронтација [контаминација] +27. Експлозиван [експлозиван] +28. Функционалан [функционалности] +29. Релевантан [релевантан] +30. Квалификација [квалификацијама, дисквалификација, квалификација] +31. Акредитација [рехабилитација] +32. Петиција [петицијама] +33. Каустичан [аутистичан] +34. Периодичан [периодичан] +35. Контроверзан [контроверзна] +36. Гигантски [гигантских] +37. Принципијалан [беспринципијелан] +38. Управоливост [расположивости] +39. Имунизација [имунизација] +40. Магнетичан [магнетично] +41. Оперативан [оперативан] +42. Десант [десантне] +43. Хиерархија [хијерархија] +44. Феминистички [феминистичког] +45. Сегментација [сегментацијом] +46. Колоритан [колорисан] +47. Деградација [деградација] +48. Диверзификација [диверсификацију] +49. Казуистички [карикатуристички] +50. Реципрочан [реципрочан] +51. Манипулативан [манипулативна] +52. Екстензиван [екстензивна] +53. Колективни [колективни] +54. Каузалитет [локалитету] +55. Синхронизација [синхронизација] +56. Кампања [кампањама] +57. Товарни [товарника] +58. Хируршки [хируршких] +59. Шампионат [шампионати] +60. Геостационаран [револуционарност] +61. Опустошан [опустошености] +62. Клема [] +63. Стационарни [стационарна] +64. Секуларни [секуларних] +65. Исегментација [сегментацијом] +66. Дебелина [дебелића] +67. Прецизан [непрецизан] +68. Рафиниран [рафинирани] +69. Психолошки [психолошких, психолошки] +70. Турбулентан [корпулентан] +71. Интегритет [интегритет] +72. Идеолошки [идеолошких] +73. Манифестација [манифестација] +74. Имплицитан [имплицитан] +75. Хомогеност [хомогеност] +76. Изолација [хидроизолација] +77. Хетерогеност [] +78. Спекулативан [спекулативна] +79. Вагу [превагу] +80. Математички [математичким, математички] +81. Гематолошки [стоматолошки] +82. Психијатријски [психијатријске] +83. Блокада [блокадама] +84. Заплена [заплетена] +85. Монопол [монополом] +86. Дисидент [дисидентски] +87. Екстрадиција [екстрадиција] +88. Ревизија [ревизијама] +89. Ваидан [] +90. Колонизација [колонизација] +91. Мотивација [мотивација] +92. Просек [просектор] +93. Ресурс [ресурсу] +94. Хуманизам [хуманизам] +95. Дравски [Подравских] +96. Коалиција [коалиција] +97. Картеля [картелима] +98. Резолуција [резолуција] +99. Менталитет [менталитет] +100. Епидемиологија [дијалектологија] + +С ошибками [] + + Колонизакаија [Колонизација, Колонизацији, Колонијализам, Колонијализма] + + Епидемиогија [Епидемија, Епидемијом, Демагогија] + + Казуистикаки [Казуистика, Казуистике, Статистика] + + Хуманкзам [Хуманизам, Хуманизма] + + Манитулативан [Манипулативна, Ултимативан, Ултимативни] + + сањваење [сањање] + + утење [хтење, утање, стење, умење, утеше, утече, учење, утехе, утеже, уђење, утезање] + + автомобил [аутомобил, обилатом] + + мекицинска сестра [војномедицинска] + + стукло [стукли, тукло, стукла, стакло, стекло, свукло] diff --git a/Common/3dParty/hunspell/test/dst/sr_Latn_RS.txt b/Common/3dParty/hunspell/test/dst/sr_Latn_RS.txt new file mode 100644 index 0000000000..8996675c19 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/sr_Latn_RS.txt @@ -0,0 +1,173 @@ +ananas +anarhistički +antidepresiv [depresivan, depresivna, represivan, depresivne] +Anđeo +avion +banana +banka +belina +bespomoćnost +bibliotekar +bibliaoteikar [bibliotekarka, bibliotekar, biblioteka] +brod +citat +crkva +cvet +cveće +demokratija +demackratija [demokratija, demokratizacija, demokratiji, demokratije] +demokratizacija +Dobrota +dom +Dragi +ekran +eksperimentalni +eksplozija +epidemiologija [epistemologija, ideologija] +farmakologija +filantropija +flaša +frizura +fudbal [fudbal, fudbala, fudbalu] +garaža +generalitet +geografski +globalizam +gnezdo +grad +građanstvo +grlo +hamburger +Harmonija +himalaji [Himalaji, malajski] +hiperbola +hipotermija [hidroterapija] +hleb +Hrabrost +hrana [hrana] +Hvala +igra +igračka +individualnost +infrastruktura +internet +inmternet [internet, interne] +jabuka +jahač +jastuk +jednakost +jubilej +jurisprudencija +kafa +krevet +kriminalisticki [kriminalistički, kriminalistika, kriminalistička, kriminalistiku, kriminalističke] +kriminalistika +kuća +kvantitativni +lampa +latiaratura [mlatarati, rasturati, maturirala, landarati] +Lepota +lingvistika +literatura +ljubav +Ljubavi +ljubavnica +Ljubazan +Ljubim +lubenica +majica +majka +mašina +mikroorganizama +mikroskopija [mikroskop ija, mikroskop-ija, mikroskopi ja, mikroskopi-ja, mikroskopi, mikroskopska, mikroskopa, mikroskopski] +Milost +Mir +Mirno +nacionalizam +nedopustiv +neurologija +novčanik +noć +nož +oktobar +okultizam +optimističan [optimistička, optimistički, optimističke, optimističku] +optimističnost [optimistički, optimističke, optimistička, optimističku] +ormar +Osoba +oči +pas +peškir +planina [planina, planinar, planinac, planinčina, planini, planinčini, planin] +poniženje +Porodica +Prijatelj +psihologija +psihoterapija +Radost +računar +reka +rekonvalescencija +reumatologija [dermatologija, hematologija, stomatologija] +revolucija +sendvič +Slatko +Sloboda +Slobodan +Snaga +socijalizacija [socijalizam, specijalizacija, specijalizacijom, socijalizma] +socijalizam +Spreman +Sreća +Srećan +Srećno +sunce +superiornost +Svetlost +tata +tehnologija +telefon +telekomunikacije +top +tradicionalni +ulica +univerzalnost +univerzitet +univirzdalnost [univerzalnost] +Usmena +Znanje +usta +Vedar +vegetarijanstvo +velikodušnost +voda +voz +Zabava +zavisnost +Zdravlje +zemlja +Zima +zjmlja [zemlja] +zločinački +zoološki +Zvezda +ćilim +čarapa +čarobnjak +časopis +čizme +đak +đevrek +đumbir +šešir +šišmiš +škola +šljiva +šuma +žaba +ženskara +žirafa +život +životinjski +žurka + diff --git a/Common/3dParty/hunspell/test/dst/sv_SE.txt b/Common/3dParty/hunspell/test/dst/sv_SE.txt new file mode 100644 index 0000000000..408fca774d --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/sv_SE.txt @@ -0,0 +1,210 @@ +Hus +Sol +Mjölk +Vatten +Fisk +Stol +Grön +Blomma +Träd +Katt +Hund +Bok +Cykel +Kaffe +Frukt +Kött +Fönster +Dörr +Säng +Lampa +Bord +Hår +Ögon +Hand +Fötter +Näsa +Mun +Öra +Huvud +Arm +Ben +Kläder +Hatt +Skor +Väska +Papper +Penna +Skrivbord +Telefon +Radio +Musik +Film +Teater +Konst +Sport +Spel +Resa +Bil +Tåg +Buss +Flygplan +Båt +Stad +Land +Hav +Sjö +Flod +Berg +Dal +Park +Skog +Sjukhus +Apotek +Skola +Universitet +Affär +Restaurang +Café +Hotell +Turist +Vän +Familj +Mamma +Pappa +Bror +Syster +Barn +Morfar +Mormor +Vänster +Höger +Framåt +Bakåt +Upp +Ner +Snäll +Osnäll [Snäll, Osäll] +Glad +Ledsen +Trött +Stark +Svag +Tyst +Bullrig +Ren +Smutsig +Vacker +Ful +Liten +Stor +Komplexitet +Oproportionerlig +Ovillkorlig +Efterklokhet +Komplicerad +Desorientering +Konstellation +Otillgänglighet +Irreversibel +Förlåtelse +Overksamhet +Indifferent +Hierarki +Kombinatorik [Kombinatorisk, Kombination] +Inkompatibilitet +Absorption +Konsekvens +Verklighetsfrånvänd +Retrospektiv +Förändringsbarhet [Förändringsbarnet, Förhandlingsbart, Förhandlingsbar] +Ambivalens +Besvikenhet [Besviken, Besviket] +Ineffektivitet +Intrikat +Dilemma +Hesitation +Absurditet +Kompromisslös +Konsolidering +Föresats +Tillfredsställelse +Delegering +Rekommendation +Detaljrikedom +Oanvändbar +Stagnation +Nostalgi +Hemlighetsfull +Avsaknad +Perseverans [Perseverera, Reverseras, Reversera] +Existentialism +Repetitivitet [Repetitivt, Receptivitet, Repetitiv, Representativitet] +Intolerans +Anonymitet +Obetydlig +Paradox +Förvirring +Juxtaposition +Reflektion +Självständighet +Kollision +Kreativitet +Djupgående +Abstraktion +Eufori +Autentisk +Insinuation +Omöjlig +Pessimism +Inkonsekvens +Revisionism +Sensationell +Obeveklig +Subjektivitet +Universalitet +Entropi +Omvälvande +Infiltration +Konservativ +Atypisk +Provokation +Konfrontation +Anarki +Konkurrenskraft +Defensivitet [Defensivt, Sensitivitet, Defensiv, Densitet] +Nihilism +Konklusion +Apori [Apor, Apors, Porig] +Korrespondens +Prioritering +Exponentiell +Fragmentering +Aversion +Harmoni +Vanmakt +Signifikans +Katalysator +Förlust +Enhällighet +Ambition +Tendens +Alienation +Artificiell +Uppfyllelse +Psykosomatisk +Virtuos +Egensinnig +Anpassning +Hållbarhet +Konstitution +Kompleksitet [Komplexitet, Komplementet] +Oproporsjonerlig [Oproportionerlig, Proportionerlig] +Uvilkorlig [Villkorlig] +Etterklokhed [Efterklok] +Komplisert [Komplicerat] +Desorientering +Konstelasjon [Konstellation] +Utilgjengelighet [Tillgänglighet] +Irreversibel +Forlatelse [Förlåtelse] diff --git a/Common/3dParty/hunspell/test/dst/tr_TR.txt b/Common/3dParty/hunspell/test/dst/tr_TR.txt new file mode 100644 index 0000000000..0ea601fe67 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/tr_TR.txt @@ -0,0 +1,205 @@ +Akşam +Almak +Altın +Anahtar +Anlamak +Araba +Atmak +Ayakkabı +Açmak +Ağaç +Bahçe +Bakır +Bakkal +Bakmak +Balık +Beyaz +Bilgisayar +Bilmek +Binmek +Bulmak +Ceket +Cevaplamak +Deniz +Dinlemek +Doktor +Duyurulmamış +Düzenleştirme +Düşmek +Düşünmek +Ekmek +Elbise +Eldiven +Elma +Erkek +Etek +Etmek +Ev +Eşarp +Gelgit +Geliştiricilikle +Geliştirilebilir +Geliştirme +Gerçekleştirme +Gezmek +Geçmek +Gitar +Gitmek +Giymek +Gri +Gömlek +Görülebilirlik +Görünümlü +Görünüşlü +Gözlük +Gümüş +Günaydın +Hareketlendi +Hareketlilik +Hava +Hayalperest +Hüzün +Kahve +Kahverengi +Kalabalıklar +Kalem +Kalkmak +Kalmak +Kapatmak +Kararlılık +Kararlılıkla +Kararsızlık +Kararsızlıkla +Karpuz +Kedi +Kemer +Kemdkcer [Kemerler] +Kırmızı +Kitap +Kız +Kızgınmak [Kızgın] +Koklamak +Koalye [Kolye, Kavalye] +Kolye +Konservatuvar +Konuşmak +Korkmak +Koymak +Koşmak +Kravat +Kullanılabilir +Kullanılmış +Kullanılmışlık +Kullanışlılık +Kurumsallaşma +Köpek +Küpe +Kütüphane +Mavi +Mazbut +Melankoli +Merdiven +Merhaba +Merhabalar +Meurhaba [Merhaba, Murabaha] +Meydan +Meyhane +Meyve +Mor +Muhafazakar +Muhteşem +Mukadderatlarınızdanmışçasına [] +Muvaffak +Muzaffer +Muzafferiyet +Muzip +Mükemmeldik +Münasebet +Münzevi +Müsrif +Mütevazi +Müteessir +Mütercim +Mütereddit +Mütevazı +Müzmin +Okul +Okumak +Otobüs +Otoriterlik +Oynamak +Pantolon +Pasta +Pembe +Pembei [Pembe, Pembeyi, Pembeli, Pembeci, Pembe i, Pembesi, Pemben] +Plaj +Platin +Saat +Sandalye +Sarı +Satmak +Sevinmek +Sevmek +Sıcak +Sıradaymışız +Siyah +Sormak +Soymak +Soğuk +Su +Sükûnet [Sükunet, Sünnet] +Sürrealist +Süt +Tabak +Tadına bakmak [Alınamamaktadır] +Tatlı +Tavuk +Telefoncu +Televizyon +Temizlemek +Teşekkürler +Türkuaz +Tuirkuazu [Türkuaz] +Turuncu +Tutmak +Ulaştırılabilir +Uygulanabilir +Uyumak +Uçak +Yapmak +Yatak +Yazmak +Yemek +Yeşil +Yıkanmak +Yıldız +Yol +Yöneltilmezken +Yüzme +Yüzük +Zenginleştirmek +Çalışamamıştı +Çalışmak +Çalışmamıştır +Çanta +Çay +Çıkarmak +Çiçek +Çorap +Özelleştirilmiş +Özelleştirme +Özgürleştirme +Üzülmek +İnmek +İsteksizlik +İsteksizlikle +İstikrarlı +İstikrarlılık +İstisnai +İslamiyetle +İzlemek +İçmek +İşbirliği +İşitmek +Şapka +Şemsiye diff --git a/Common/3dParty/hunspell/test/dst/uk_UA.txt b/Common/3dParty/hunspell/test/dst/uk_UA.txt new file mode 100644 index 0000000000..be4941540b --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/uk_UA.txt @@ -0,0 +1,210 @@ +абдукція +абіогенез +амбівалентнасть [амбівалентність, амбівалентний, бівалентність, біоеквівалентність, внівалентність] +амбівалентність +анахранізм [анахронізм, брахманізм, анархізм, нанізм] +анахронізм +антропогенез +антропологія +антропоморфізм +апатія +археологія +архетип +аскетизм +астрономія +афект +бачити +бігти +білий +біллий [білий, збілілий] +біологія +бувай +будинок +будь ласка [будь ласку] +бути +важко +велиикий [великий, великоокий] +великий +веселка +взяти +вибачте +відчувати +вода +волюнтаризм +втаємниченість +вчитися +гарний +гарячий +гегемонія +географія +герменевтика +герменевтика +гештальт [штатгальтер] +говорити +гойдалка +готувати +грати +дати +дедукція +деконструктивізм [де конструктивізм, де-конструктивізм, конструктивізм, неконструктивно] +деконструкція +демаркація +детермінізм +дзвіночок +дивитися +дисгарммонія [дисгармонія, дисгармоніям, дисгармонійний, фісгармонія] +дисгармонія +дисфункція +дисфункця [дисфункція, дистинкція] +дихотомія +до побачення [побачення] +добрий +доктрина +думати +дурний +дурня +дякую +евфемізм +езотерика +ей +екзистенціалізм +екзистенціалізм +екзистенцілізм [екзистенціалізм, екзистенціаліст, екзистенція] +екзистенція +економіка +емерджентність +ентелехія +епістемологія +ефемерність +ефемерність +занепадництво +звісно +здоровий +зелений +йти +ілюзорність +ілюзорність +імплікація +інвектива +індукція +інтроспекціїя [інтроспекції, інтроспекція, інтроспекції я, ретроспекція] +їсти +історія +каблучка +кава +казус +калюжа +катарсис +каченя +каштани +квітка +кішка +класно +книга +когнітивістика [когнітивність, когнітивна] +комаха +консенсус +космогенез [номогенез, екогенез] +купувати +легко +лінгвістика +літати +маленький +марнослів'я +математика +мати +метаморфоза +метелик +метелиця +містифікація +місто +могти +можливо +мусити +насправді +не радий [нерадий, незрадний] +незворушність +ні +нігілізм +новий +нонсенс +ностальгія +павучок +парадокс +пес +писати +пити +піти +плавати +плакати +повільний +поганий +політологія +постмодернізм +потворний +працювати +привіт +прийти +психоаналіз +птах +радий +ремінісценція +рефлексія +робити +розбурхання [розбухання, розбурханий, розпухання, бурхання] +розумний +сильний +сингулярність +синестезія [кінестезія, анестезія] +синій +синішй [синій, синішай, синішати] +синкретизм +сказати +скатертина +слабкий +слухати +сміятися +сніг +соліпсизм +соломинка +сонечко +сонце +соціологія +спати +співати +справді +старий +структуралізм +сумний +так +так +танцювати +телефонувати +тож +трансцендентність +фантастично +фаталізм +фемінізм +феномен +феноменологія +фізика +філософія +фрактал +хворий +хімія +хліб +хліб +ходити +холодний +хотіти +чао [чадо, чан, чат, чар, час, чад, дао, чаш, чай, чаї, чаю] +червонй [червоний, червоній, червоно, червона, червоні, червону, червоне, червоню, червонявий] +червоний +черевики +читати +чорнй [чорний, чорній, чорно, чорна, чорни, чорні, чорну, чорне, чорню] +чорний +чути +швидкий +щасливий +яблуко diff --git a/Common/3dParty/hunspell/test/dst/uz_Cyrl_UZ.txt b/Common/3dParty/hunspell/test/dst/uz_Cyrl_UZ.txt new file mode 100644 index 0000000000..7aee309965 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/uz_Cyrl_UZ.txt @@ -0,0 +1,262 @@ +Mарт [Арт, Ғарт, Қарт, Карт, Шарт, Фарт, Варт, Парт, Сарт, Март] +Ёз +Ём +Ёхуд +Август +Адвакат [Адвокат, Адэкват] +Адреси +айтган-лирангиз +айқин +амалга +анча +Апрел +арзонроқ +аҳамият [аҳамият, аҳамияти, ҳамият, ҳамжамият] +аҳднома +бажарилади +бажарилди +баланд +ихтисослан +банкрот +баҳона +Баҳор +бераман +берасизми +беринг +бериш +бешинчи +биз +Бизга +Бизнинг +билан [билан, биланг, билани] +Бирор +Бозорнинг +бор +бошқа +Бу +Бугун +будингиз +бунга +бундай +Бухгалтерлик +бўлади +бўладими +бўлиши +бўлмаган +бўлса +бўш +бўшайди +бўшатасиз +вазифасига +вазият +вариант +вақт +газетадаги +газетадан +даромад +Декабрь +Душанба +Эрталаб +Етказиб +Жисмоний +Жуда +Жума +зарур +зиёфат +Ижара +ижарага +икки +Илтимос +Индинга +информатизациялари +Иситгич +иши +ишлатсак +Ишхона +Июль +Июнь +Йўқ +йил +йилдан +кам +Шинамгина +кампанияси +келдим +келишимдан +келмоқчи +келсам +келтириш +керак +керакдир +керакми +кета-ди [кетади, кетарди, кета-чи, кета-кета, дискета] +кеч +Кеча +кечага +Кечаси +Кечир +Кечирдинг +кирла +кирадими +кондиционер +коррупциядир +кран +Куз +Кун +куни +кўрмоқчи +кўчиб +лойиҳа +Май +маълумоти +маълумотларни +Маъмурият +маъруза +Мен +музлатгич +мумкин +муфмкин [мумкин] +мутахассис +мушовир +муҳим +нарса +нархи +Нархини +нақд +ўшанақасини +неча +Номардлик +Ноябри +интернетдаги +ойнаси +ойнинг +Октябри +олдин +олдиндан +олмаймиз +олмоқчи +орқали +шоти +шорти [шоти, орти, ортиш, шотир, корти, форти, шарти, порти, сорти, ширти, торти, борти, шомурти] +Оқшом +пайдо +Панжшанба +пулини +Раҳмат +резюме +реклама +Салом +Сармоядор +Сентябрь +Сешанба +Сиз +сизга +сизда +Сизнинг +синган +сифатида +совуқ +софвуқ [совуқ] +Солиқларни +Статистик +сўм +тажрибали +тайёргарлик +тайёрладик +тайёрладингизми +таклиф +талафот +талафоти +таъминловчилардан +танишинг +таржимон +тарржимон [таржимон, тарраксимон] +тахминан +ташкил +Телефонни +технология +Безантирани +тозалан +тозалигига [тозалигига, газтозалагич] +Тонгда +топширишимиз +топшириқ +турли +турмоқчи +тутсак +Тушлик +ўладиганингиз +тўлай +тўлаймиз +тилдиришинг +тўлиқ +уйингиз +уйни +уч +учун +ўқидим +фақат +Феврал +хабар +Хайрли кун [Хайрли кўн] +Мотамхонаси +хонлик +Чек +Чоршанба +Шанба +шарт-номани +шартини +шартлар +шартлари +шартни +шартнома +шахс +шовқин +Шом +Шу +эди +Эртага +Эртадан сўнг [Эртасиганг] +Эшитишимга +эълон +эълонингиз +эълонингизни +эътироф +Юклаш +Якшанба +Январи +Ярим кеча [Яримкеча, Яримчиликча] +яхши +қабул +қаерда +Қанақа +қаноатманда +қанча +қачон +қизиқарлидир +қиламиз +қилганим [қилганим, қилганими, қилгандайин] +қилдим +қилинг +қилинди +қилишди +қиммат +қиммати +Қимматидан +қирқ +Қиш +қувонарлими +қўнғироқ +Қўшимча +ҳайвонини +ҳам +ҳамза +Ҳар +ҳафтага +ҳақиқатан +ҳисоблаб +Ҳозир +ҳужжатни +Ўтган кун [Ўтган кўн] + + diff --git a/Common/3dParty/hunspell/test/dst/uz_Latn_UZ.txt b/Common/3dParty/hunspell/test/dst/uz_Latn_UZ.txt new file mode 100644 index 0000000000..0b2717d0ce --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/uz_Latn_UZ.txt @@ -0,0 +1,200 @@ +Salom +Sallom [Slalom, Salom, Musallo, Alloma, Salo] +Rahmat +Rhmat [Rahmat, Marhamat] +Iltimos +Iltimo [Iltimos, Tilsimot, Timol] +Kattalar +Kattalarvf [Kattalashtir] +Yaxshi +Yashi [Ayshi, Tashi, Yash, Yasashi, Yarashish, Yalashish, Yaxshi] +Kelajak +Keljajak [Kelajak] +Oilaviy +Oilaaviy [Oilaviy, Hosilaviy] +Qarindosh +Qarinndosh [Qarindosh, Qayindoshlar, Oqarinish] +Shahar +Shaha [Shah, Shalha] +Dengiz +Dengizzz [Dengiz] +Quyosh +Quyyosh [Quyosh, Quysh] +Yulduz +Oyim +Kechqurun +Tushun +Suvchi +Sharob +Choyxona +Nonushta +Tushlik +Muzqaymoq +Desert +Tuzluq +Mevalar +Sabzavot +Baliq +Tuxumli +Sabza +Sariq +Salatlar +Shirinlik +Shokolad +Rishta +Kakao +Pishloq +Tort +Qaymoq +Sutli +Qatiq +Salomatlik +Temir +Zahar +Oqimli +Shamol +Olov +Yer +Osmon +Shanba +Dushanba +Seshanba +Chorshanba +Payshanba +Juma +Yakshanba +Oltin +Tong +Bomdod +Asr +Shom +Kun +Oqsoqol +Shoshqaloq +Kulgili +Muxlislilar +Tavsiflash +Tuzilishga +Mustaqillik +Tushuntirish +Boshqarish +Mashhurlik +Tarkibiy +Tahlil +Ishchi +Xalqaro +Tarjima +Mustahkamlik +Chaqaloq +Istiqbol +Tasvir +Taklif +Tasavvur +Jiddiy +Majburiyat +Asosiy +Tahdid +Tushunmovchilik +Ishonch +Maqomi +Ijodkor +Tadbirkor +Hayotiy +Mashhur +Bemorlik +Tadbir +Jismoniy +Madaniyat +Xavfsizlik +Sifatli +Suvli +Sotuvchi +Chetel +Tashqi +Sotuv +Tarbiyalanish +Murabbo +Sariqcha +Qovun +Shaharlik +Muhimlik +Tarbiyachilik +Xatolik +Balandlik +Yuzaki +Kuyov +Qiziquvchan +Orzular +Mashq +Qalampir +Muammo +Sadoqatli +Yovuzlik +Fikr-mulohaza +Boylik +Tushuncha +Zanjir +Eslatma +Tabassum +Ishonuvchi +Chidamlilik +Ilova +Birodarlik +Oqilona +Ijodiyot +Tayanch +Hurmat +Baxtli +Tajriba +Samimiylik +Shifokor +Ishrat +Baho +Namoyish +Qiyinchilik +Bolalar +Ishonchli +Taqdir +Shovqinli +Xalqaro +Baxt +Fursat +Hurmatli +Qulaylik +Zamonaviy +Sadoqat +Sabr +Nikoh +Jasorat +Barkamollik +Dunyoqarash +Omadli +Foydali +Yorqin +Mehribonlik +Fazilatli +Kutubxona +Istiqomatli +Fido +Bahor +Shafqatsizlik +Tafakkur +Fazilat +Qochish +Laziz +Uzoq +Ilhom +Omad +Hurmatli +Tandir +Sherzod +Bahoriy +Dilshod +Baxtli +Shonli +Nurli +Shafqatsizlik +Oqqush +Boylik +Toza +Sabrli diff --git a/Common/3dParty/hunspell/test/dst/vi_VN.txt b/Common/3dParty/hunspell/test/dst/vi_VN.txt new file mode 100644 index 0000000000..bcc3ab3150 --- /dev/null +++ b/Common/3dParty/hunspell/test/dst/vi_VN.txt @@ -0,0 +1,128 @@ +Bánh +Bang +bênh +bướng +bậy +Chanh +chum +chuyện +chép +Chùng +chắp +chệnh +chới +chữ +công +cạc +cột +cứu +Doanh +duyên +dùng +dể +dọng +gia +giày +giêng +Giảng +giềng +hon +Hoẳn +Hài +hôm +hước +hấu +hớt +hữu +Khiển +Khoào +khuya +khuyến +khách +khén +khẩn +khắp +khựng +kẻo +lang +liền +Loàng +Luỗng +lình +lương +lấp +lệnh +lịnh +lốn +lời +lựng +Muộn +Mãnh +mại +mạn +mổ +mởn +nghiễm +nghều +Ngoáy +Nguyên +ngóp +người +ngỏ +ngớp +ngụa +ngửng +nhiếp +nhu +nhà +nhân +Nhóm +nhưỡng +nhắm +nhổn +nhứt +ninh +noi +nãy +nạn +nốt +ong +pao +phiên +phiêu +Phên +Phương tiện [] +phẩm chất [] +phố đi bộ [phố đì bộ, phố đĩ bộ] +quan trọng [quàn trọng, quản trọng, quán trọng, quăn trọng, quằn trọng, quắn trọng, quặn trọng, quân trọng, quần trọng, quẩn trọng, quẫn trọng, quấn trọng, quận trọng] +quyền lợi [quyền] +quán cà phê [qùán cà phê, qủán cà phê, qũán cà phê, qúán cà phê, qụán cà phê, qưán cà phê, qừán cà phê, qửán cà phê, qữán cà phê, qứán cà phê, qựán cà phê] +quảng cáo [quảng] +Quốc +Quốc tế [Quốc] +riêng biệt [triêng] +rưỡi +Rải +Rẻng +rộng rãi [rộng] +siễn +sum +Sõng +Sưu +sưu tập [] +sử dụng [sử đụng] +Thiệt thòi [] +Thuộc về [Thuộc] +thuộc tính [] + +Слова с ошибками [] +thiệte [thiệt, thiệt e, thiện] +quốq tế [] +nguên [nguyên, nguồn] +khoao [khoào, khoai, khoa, khao, khoeo, khoèo, khoan] +chenh [chênh, chềnh, chểnh, chễnh, chếnh, chệnh, cheng, chen, chanh, chành, chảnh, chánh, chạnh, chinh, chình] +chhùng [chùng, chùn, hùng] +man +doah [doa, doanh, doan, doa h] +khien [khiên, khiền, khiển, khiến, khin, khen] +ngoay diff --git a/Common/3dParty/hunspell/test/main.cpp b/Common/3dParty/hunspell/test/main.cpp new file mode 100644 index 0000000000..6d9406c53e --- /dev/null +++ b/Common/3dParty/hunspell/test/main.cpp @@ -0,0 +1,131 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ + +#include "../../../../Common/3dParty/hunspell/hunspell/src/hunspell/hunspell.h" +#include "../../../../DesktopEditor/common/StringExt.h" +#include "../../../../DesktopEditor/common/Directory.h" + +bool CheckCaret(std::vector& words) +{ + bool bIsCaret = false; + for (int i = 0, len = (int)words.size(); i < len; ++i) + { + if (words[i].find('\r') == (words[i].length() - 1)) + { + words[i] = words[i].substr(0, words[i].length() - 1); + bIsCaret = true; + } + } + return bIsCaret; +} + +std::wstring CheckWord(Hunhandle* pDic, const std::wstring& sWord, const bool& bIsCaret) +{ + std::wstring sResult = sWord; + + std::string sWordA = U_TO_UTF8(sWord); + int nSpellResult = Hunspell_spell(pDic, sWordA.c_str()); + + if (0 == nSpellResult) + { + char** pSuggest; + int nSuggestCount = Hunspell_suggest(pDic, &pSuggest, sWordA.c_str()); + + sResult += L" ["; + + for (int i = 0; i < nSuggestCount; ++i) + { + std::string sSuggestA(pSuggest[i], strlen(pSuggest[i])); + std::wstring sSuggest = UTF8_TO_U(sSuggestA); + + sResult += sSuggest; + if (i != (nSuggestCount - 1)) + sResult += (L", "); + } + + if (0 < nSuggestCount) + Hunspell_free_list(pDic, &pSuggest, nSuggestCount); + + sResult += L"]"; + } + + if (bIsCaret) + sResult += L"\r"; + sResult += L"\n"; + + return sResult; +} + +int main(int argc, char *argv[]) +{ + std::wstring sSrcDir = NSFile::GetProcessDirectory() + L"/../src"; + std::wstring sDstDir = NSFile::GetProcessDirectory() + L"/../dst"; + std::wstring sDictionariesDir = NSFile::GetProcessDirectory() + L"/../../../../../../dictionaries"; + std::vector arSrcFiles = NSDirectory::GetFiles(sSrcDir); + + for (int i = 0, len = (int)arSrcFiles.size(); i < len; ++i) + { + std::wstring sFileWords = arSrcFiles[i]; + std::wstring sName = NSFile::GetFileName(sFileWords); + std::wstring::size_type sNamePos = sName.find(L"."); + if (std::wstring::npos != sNamePos) + sName = sName.substr(0, sNamePos); + + std::wstring sFileWordsContent = L""; + NSFile::CFileBinary::ReadAllTextUtf8(sFileWords, sFileWordsContent); + + std::vector arWords = NSStringExt::Split(sFileWordsContent, '\n'); + bool bIsCaret = CheckCaret(arWords); + + std::wstring sAff = sDictionariesDir + L"/" + sName + L"/" + sName + L".aff"; + std::wstring sDic = sDictionariesDir + L"/" + sName + L"/" + sName + L".dic"; + + std::string sAffA = U_TO_UTF8(sAff); + std::string sDicA = U_TO_UTF8(sDic); + + Hunhandle* pDictionary = Hunspell_create(sAffA.c_str(), sDicA.c_str()); + + std::wstring sFileDst = sDstDir + L"/" + sName + L".txt"; + + std::wstring sResult = L""; + for (const std::wstring& word : arWords) + { + sResult += CheckWord(pDictionary, word, bIsCaret); + } + + Hunspell_destroy(pDictionary); + + NSFile::CFileBinary::SaveToFile(sFileDst, sResult, true); + } + + return 0; +} diff --git a/Common/3dParty/hunspell/test/src/az_Latn_AZ.txt b/Common/3dParty/hunspell/test/src/az_Latn_AZ.txt new file mode 100644 index 0000000000..4d97adce04 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/az_Latn_AZ.txt @@ -0,0 +1,213 @@ +A +qocalmaq +Alderaan'ın +hamısı +həmçinin +Və +cavab +dir +incəsənət +kimi +da +uzaq +körpə +zirzəmi +ol +olub +doğuldu +bulvar +fasilə +nəsllər +gəlin +lakin +al +ilə +Kaliforniya +Kalifornikasiya +bilər +kartlar +şans +Çin +çənə +klublar +Cobain +bürc +nəzarət +qiymət +edə bilməzdim +yaratmaq +lənət +rəqs +saziş +sövdələşmələr +dağıdıcı +almazlar +etməz +etməyərik +arzu +xülyalar +Şərq +kənar +kənarları +məmnunluq +hamının +uzaq +peri +solğun +üz +son +tap +ilk +üçün +-dan +sərhəd +qız +qızın +yaxşı +gitara +əl +hardcore +var +yoxdur +o +eşitmək +ürək +O'nun +ona +gizli +yüksək +ona +onun +Hollivud +Mən +Mənəm +əgər +içində +məlumat +içində +dir +bu +jack +sadəcə +kral +qohum +bilmək +qoyulmuş +qanun +yerləşdirilmək +qurğuşun +aparmaq +yerləşdirilmə +məkan +sevmək +şans +edilmiş +adam +çox +Evlənmək +maska +o bilər +bəlkə də +mənası +mən +meditasiya +xatirə +ağılın +pul +mənim +heç vaxt +deyil +heç nə +nömrələr +of +of +üstündə +bir +yalnız +və ya +nəticə +öz +Ödə +Şəftəli +yerlər +oynayır +oynamaq +əhali +porno +tərifləmək +ehtimal ki +ehtimal +psixik +kraliça +qaldırmaq +qalan +hörmət +qalxmaq +yol +xam +müqəddəs +Xilas et +elmi +çığırmaq +satılır +şəkil +xəstələnmək +gümüşçü +dəri +əsgər +bir şey +Mahnı +mahnılar +qılınclar +büyü +casuslar +ulduz +Stansiya +oğurlamaq +daşlar +günəş +şübhəli +İsveç +qılınclar +yeniyetmə +test +dandan +bu ki +bu ki +bu +onların +bu +onlar +düşünmək +bu +onlar +gel-git +üçün +deyilmişəm +çox +cəhd et +başa düşdüm +qilin +titrəmək +mübarizə aparır? +istəyirəm +müharibə +idi +dalğalar +geymək +silahlar +yaxşı +idarə olunan +Qərbi +nə +arasında +qalib gəlmək +qalib gəlir +ilə +qadın +dünya +səhv +siz +sizə +sənsən +sənin diff --git a/Common/3dParty/hunspell/test/src/bg_BG.txt b/Common/3dParty/hunspell/test/src/bg_BG.txt new file mode 100644 index 0000000000..a09b554067 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/bg_BG.txt @@ -0,0 +1,212 @@ +A +остаряване +Алдераан +всичко +също +и +отговор +са +изкуство +като +в +далеч +бебе +мазе +бъда +било +роден +булевард +почивка +породи +невеста +но +купувам +от +Калифорния +Калифорникация +може +карти +шанс +Китай +брадичка +клубове +Кобейн +съзвездие +контрол +цена +не можех +създаване +проклятие +танц +сделка +сделки +унищожение +диаманти +не прави +не правим +мечта +мечти +Изток +ръб +ръбове +екстаз +всеки +далеч +приказка +избледнява +лица +краен +намирам +първи +за +от +предел +момиче +момичето +добре +китара +ръка +хардкор +има +няма +той +чуя +сърце +той е +нейни +скрит +висок +него +негов +Холивуд +аз +аз съм +ако +в +информация +вътре +е +това е +вале +просто +крал +родственик +знам +определен +закон +поставям +водя +води +местоположение +обичам +късмет +направен +човек +много +Ожени се +маска +май +може би +означава +аз +медитация +спомен +ума +пари +моя +никога +не +нищо +числа +от +изключен +на +един +само +или +изход +свой +Плати +праскова +места +играе +играя +население +порно +похвала +вероятно +вероятен +психичен +кралица +въздигам +останал +почит +възход +път +груб +светия +Спасявам +наука +крясък +продава +форма +по-болен +златар +кожа +войник +някаква +Песен +песни +пикове +заклинание +шпиони +звезда +стация +крада +камъни +слънце +подозрителен +Швеция +мечове +тийнейджър +тест +отколкото +това +това е +на +техни +тези +те с +мисли +този +той +прилив +до +каза +също +опитайте +разбрано +еднорог +вибрация +водене? +искам +война +беше +вълни +носете +оръжия +Ами +бяха +Западна +какво +докато +победа +победи +със +жена +свят +грешка +ти +ти би +ти си +вашият diff --git a/Common/3dParty/hunspell/test/src/ca_ES.txt b/Common/3dParty/hunspell/test/src/ca_ES.txt new file mode 100644 index 0000000000..3fd8739062 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/ca_ES.txt @@ -0,0 +1,112 @@ +amor +llum +lluum +esperança +espirança +llibertat +força +forrça +pau +somni +llibre +mar +amistat +cançó +flor +cel +estrella +temps +camí +vent +muntanya +mumntanya +riu +soroll +silenci +viatge +foc +gel +paraula +vida +dia +nit +tarda +matí +lluna +sol +llac +marbre +ferro +sal +mel +sucre +peix +ocell +oceoll +joc +ritme +melodia +pintura +pentura +teatre +dansa +poema +història +llegenda +mitologia +festa +música +vi +cervesa +cervessa +formatge +pa +ciutat +poble +natura +camp +bosc +platja +sorra +sorrà +pedra +ànima +cos +ment +cor +somriure +somriàre +abraçada +bes +parla +oida +vista +tacte +gust +olfacte +color +forma +número +lletra +sistema +regla +escola +universitat +univversitat +mestre +estudiant +sabiduria +lliçó +pregunta +resposta +risposta +dubte +certesa +veritat +mentida +promesa +secret +descoberta +descaberta +aventura +destinació \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/ca_ES_valencia.txt b/Common/3dParty/hunspell/test/src/ca_ES_valencia.txt new file mode 100644 index 0000000000..8b31af1a39 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/ca_ES_valencia.txt @@ -0,0 +1,212 @@ +A +envellir +Alderaan +tot +també +I +resposta +és +art +com +a +lluny +nadó +celler +ser +ha estat +nat +bulevard +pausa +generacions +núvia +però +comprar +amb +Califòrnia +Californication +pot +cartes +oportunitat +Xina +mentó +clubs +Cobain +signe del zodíac +control +preu +no podria +crear +maleït +ballar +acord +negocis +destructiu +diamants +no fer +no fem +desitjar +somnis +Est +vora +voreres +satisfacció +tots +llunyà +fada +pallid +cara +final +trobar +primer +per +de +frontera +noia +la noia +bé +guitarra +mà +hardcore +hi ha +no hi ha +ell +sentir +cor +ell és +seva +secret +alt +ell +seu +Hollywood +jo +sóc +si +en +informació +interior +és +és +jack +només +rei +parent +saber +fixat +llei +col·locar +plom +portar +col·locació +lloc +estimar +oportunitat +fet +home +molts +casar-se +màscara +podria +potser +sentit +jo +meditació +memòria +ment +diners +meu +mai +no +res +números +de +fora +sobre +un +només +o +resultat +seu +pagar +préssec +llocs +jugar +joc +població +porno +elogiar +probablement +probable +psíquic +reina +elevar +restant +respecte +pujar +camí +cru +sant +salvar +ciència +crit +vendre’s +figura +malalt +joier +pell +soldat +alguna cosa +cançó +cançons +cims +encanteri +espies +estrella +estació +robar +pedres +sol +sospitós +Suècia +espases +adolescent +prova +que +que +això +seu +aqueixos +ells +pensar +aqueix +ells +marees +per +no he estat +molt +intentar +entendre +fer +tremolar +lluitar +desitjar +guerra +va ser +ones +portar +armes +bé +administrat +Oest +què +entre +guanyar +guanya +amb +dona +món +equivocat +tu +vostè +tu ets +teu diff --git a/Common/3dParty/hunspell/test/src/cs_CZ.txt b/Common/3dParty/hunspell/test/src/cs_CZ.txt new file mode 100644 index 0000000000..a76fe6803e --- /dev/null +++ b/Common/3dParty/hunspell/test/src/cs_CZ.txt @@ -0,0 +1,206 @@ +pomaliý +šťstný +smuutný +horcký +studiený +záludnast +náhodillost +úpěnlevý +rozspačitý +svéhllavý +jablko +slunce +voda +dům +pták +káva +chleba +květina +kniha +pes +kočka +město +zelený +modrý +červený +bílý +černý +velký +malý +rychlý +pomalý +šťastný +smutný +horký +studený +nový +starý +hezký +ošklivý +dobrý +špatný +zdravý +nemocný +silný +slabý +chytrý +hloupý +pracovat +jíst +pít +spát +číst +psát +mluvit +smát se +plakat +zpívat +hrát +tančit +učit se +nakupovat +vařit +telefonovat +dívat se +poslouchat +chodit +běžet +létat +plavat +psát +učit se +dělat +mít +být +jít +přijít +odejít +dát +vzít +říct +vidět +slyšet +cítit +myslet +chtít +moct +muset +rád +nerad +ano +ne +prosím +děkuji +na shledanou +omlouvám se +sbohem +ahoj +čau +hej +jo +fakt +super +blbost +paráda +no jo +jasně +takže +vlastně +třeba +snad +leštěnka +pochmurný +živelný +ponaučení +záhada +pochybnost +nádhera +soucit +záludnost +náhodilost +úpěnlivý +rozpačitý +svéhlavý +marnivost +blahodar +rozčarování +odchylka +přelud +vytrvalost +neústupnost +lehkost +souznění +rozmarnost +roztržitost +úskočnost +rozkoš +marasmus +rozpolcenost +neúprosnost +ztřeštěnost +chmurnost +okouzlení +zářivost +vyrovnanost +neochvějnost +neúcta +bizarnost +rozmařilost +nepochopení +nevýslovný +pomíjivost +beznaděj +úzkost +odtažitost +rozerv +rozervanost +vyčerpanost +bezcitnost +záludnost +nezdolnost +rozkošátnost +nezdolatelnost +rozmarnost +živelnost +bezútěšnost +záhadnost +neposkvrnitelnost +rozkošnělost +bezradnost +neuchopitelnost +pošetilost +opojení +rozervanost +marnost +bezstarostnost +nevinnost +náladovost +vyrovnanost +ztracenost +bezbřehost +rozervanost +opojení +bezradnost +neuchopitelnost +pošetilost +opojení +rozervanost +marnost +bezstarostnost +nevinnost +náladovost +vyrovnanost +ztracenost +bezbřehost +opojení +bezradnost +neuchopitelnost +pošetilost +opojení +rozervanost +marnost +bezstarostnost +nevinnost +náladovost +vyrovnanost +bezbřehost \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/da_DK.txt b/Common/3dParty/hunspell/test/src/da_DK.txt new file mode 100644 index 0000000000..1581a61660 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/da_DK.txt @@ -0,0 +1,129 @@ +Hej +Goddag +Tak +Ja +Nej +Måske +Mad +Vand +Hus +Bil +Tog +Cykel +Skole +Børn +Far +Mor +Søster +Bror +Hund +Kat +Fisk +Fugl +Træ +Blomst +Græs +Sol +Måne +Himmel +Regn +Sne +Sommer +Vinter +Forår +Efterår +Aften +Nat +Dag +Uge +Måned +År +Læse +Skrive +Tale +Lære +Arbejde +Sove +Vågne +Løbe +Gå +Sidde +Stå +Lytte +Se +Høre +Spise +Drikke +Kød +Frugt +Grøntsager +Ost +Brød +Vand +Juice +Kaffe +Te +Mælk +Smør +Æg +Salt +Peber +Sukker +Bolle +Smørrebrød +Køkken +Stue +Soveværelse +Badeværelse +Toilet +Bord +Stol +Sofa +Lampe +Vindue +Dør +Gulv +Loft +Væg +Sofa +Pude +Tæppe +Badekar +Håndvask +Spejl +Håndklæde +Seng +Dyne +Dynee +Pude +Pudee +Alarm +Alarmm +Skrivebord +Stol +Hus +Hund +Kat +Katt +Bil +Skole +Skolee +Sol +Soll +Vand +Vandd +Mad +Madd +By +Barn +Barnn +Tørklæde +Skæbne +Uafhængighed +Kærlighed +Kærligheed +overbelastning +Modstandsbevægelsen +Uafhængighedserklæringen +Forårssommertemperaturen +Stabiliseringsperioden diff --git a/Common/3dParty/hunspell/test/src/de_AT.txt b/Common/3dParty/hunspell/test/src/de_AT.txt new file mode 100644 index 0000000000..fccb06c431 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/de_AT.txt @@ -0,0 +1,131 @@ +Ägyptologie +Ährenamt +Ängstlichkeit +Äquatoria +Abarbeiten +Abbild +Abbilden +Abbildungs +Abbreviatur +Abbrüche +Abfassen +Abfertigen +Abfolge +Abfuhr +Ableugnen +Ablichten +Ablöse +Absätze +Abschnitts +Abwechseln +Abwehren +Aktiv +Britannia +Browserfenster +Budgetieren +Bugpartie +Bukarester +Burgundersoße +Butterkrem +Button +Cabriolet +Campanile +Canapé +Caprice +Celsius +Chamäleon +Charakteristik +Chronometer +Chronometrie +Cölln +Connectzustände +Cursorspur +Däne +Dachs +Dahindämmern +Darbringen +Daten +Datenbankserver +Desktopsystem +Detektivfilm +Dichtertum +Dinosaurier +Direktion +Diskantgambe +Diskothek +Druckereicode +Kapsel +Karausche +Katzen +Klinge +Klinke +Kohlrabi +Koinzidenz +Kolleg +Komplott +Meereis +Mehrphasigkeit +Memorieren +Messen +Methode +Metrowaggon +Meute +Migräne +Milieuforschung +Mindern +Mineralien +Mitternacht +Mobiliar +Mohrrübe +Mühelosigkeit +Normativität +Notifikation +Ökonomie +Orangeton +Osten +Subjekt +Subsidiarität +Subsumieren +Tagfalter +Speicher +Spielzeugsammlung +Zahler + +Сложные слова +Zurückgezogenheit +Äquipotentialfläche +Äußerungsbedeutung +Abfassungszeitraum +Abgeschlossenheits +Adjunktionsbeseitigung +Anknüpfungsgrundsätze +Chiffrierschlüssel +Knochenmarktransplantation +Bundeskaderathlet +Carbonsäurechlorid +Cardiazoltherapie +Chancenungleichheit +Charakterisierungsmöglichkeit +Chlorophyllkonzentration +Computerspielemarkt +Deindustrialisieren +Dekodierungsmöglichkeit +Kartoffelschälmesser +Kernspinresonanztomographie +Merkmalskombination +Nachbarschaftszentren +Opportunitätsprinzip +Tiefenstaffelung +Tourismusfachmann +Sequenzbetrachtung + +Слова с ошибками +Dechifrierprogramm +Administratorkenwort +Spigeln +Tätigkeite +Draufgangertum +Abschnit +Komunikation +Drackereicode +Bumeln \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/de_CH.txt b/Common/3dParty/hunspell/test/src/de_CH.txt new file mode 100644 index 0000000000..12c4663080 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/de_CH.txt @@ -0,0 +1,116 @@ +Alpinist +Alteration +Alternative +Alumne +Amateurfilmer +Ambulanz +Amtmänner +Analogie +Analytik +Ananas +Angabe +Ankünfte +Dynastie +Ebenbürtigkeit +Echtheitszertifikat +Editionspläne +Editor +Ehrenamtlichkeit +Eigentümerschaft +Einbau +Eindringling +Eingabequittungsbetrieb +Einhüllen +Einkommen +Einloggen +Einschließen +Einsortier +Elaboration +Elementar +Entertainer +Entkuppeln +Entschädigungs +Enumerator +Erbringen +Erdichten +Erfahrenheit +Erhalt +Erleichtern +Ersparnis +Erstatten +Erzählliteratur +Helikopter +Helpdesk +Herunterladen +Hindeuten +Hinterlassenschaft +Hiob +Landesprache +flexibilität +floristisch +flugbillet +heroben +herrichten +herstellen +herübereilen +herunterzubücken +hie +hieraus +hilfe +himbeere +justiz +kältebeständig +kärtchen +känguru +kaktusgewächs +kalligrafie +kamel +kampagnendirektor +kapazitär +kapitalist +karamell +kardieren +karpfen +katalogdaten +lyzeum +mahagonirot +makkaroni +malerausbildung +management +mangel +maniküre +manneskraft +mansarde +mark +marketingpraktiker +maschinell +massage +massengutschifffahrt +materie +medaille +medizinalshampoo +meeresfrüchte +quotient +salonwagen +satzeinleitend +trilateral +tristesse +tropen +vereisen +verfahren +verfügungs +verhindern +verkäufer + +Слова с ошибками +Anbindungsystem +Anglistikdocent +Ecco +Economclass +Einverstandnis +Electrik +Historique +herüberzurucken +kartofel +salade +sanddornbere \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/de_DE.txt b/Common/3dParty/hunspell/test/src/de_DE.txt new file mode 100644 index 0000000000..3ab503f810 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/de_DE.txt @@ -0,0 +1,211 @@ +Hallo +Guten Morgen +Danke +Bitte +Ja +Nein +Entschuldigung +Tschüss +Liebe +Freund +Familie +Glück +Gesundheit +Schule +Arbeit +Essen +Trinken +Wasser +Brot +Käse +Fleisch +Gemüse +Obst +Kaffee +Tee +Milch +Zucker +Salz +Pfeffer +Haus +Wohnung +Bett +Stuhl +Tisch +Sofa +Fernseher +Telefon +Computer +Buch +Zeitung +Schreiben +Lesen +Hören +Sehen +Fühlen +Laufen +Springen +Schwimmen +Tanzen +Singen +Lachen +Weinen +Freude +Trauer +Angst +Mut +Liebe +Hass +Freundschaft +Beziehung +Familie +Eltern +Kinder +Geschwister +Großeltern +Onkel +Tante +Cousin +Cousine +Ehemann +Ehefrau +Verlobung +Hochzeit +Scheidung +Geburt +Tod +Krankheit +Arzt +Krankenhaus +Medikament +Apotheke +Gesundheit +Wohlbefinden +Fitness +Diät +Schlaf +Ruhe +Entspannung +Sport +Fußball +Tennis +Schwimmen +Laufen +Radfahren +Wandern +Reisen +Urlaub +Strand +Sonne +Meer +Komplementär +Perspektive +Konsens +Integrität +Konsequenz +Authentizität +Korrelation +Charakteristik +Akzeptanz +Flexibilität +Assoziation +Dekomposition +Komplexität +Positivismus +Universalität +Stabilität +Individualität +Konsistenz +Konformität +Dezentralisierung +Kollaboration +Partizipation +Präzision +Transformation +Konkurrenz +Paradoxie +Redundanz +Regeneration +Integration +Isolation +Asymmetrie +Aggregation +Disziplin +Resilienz +Relevanz +Konfusion +Komplikation +Koordination +Harmonie +Ineffizienz +Konstruktion +Konversion +Kollusion +Gerontologie +Differenzierung +Dimensionalität +Inferenz +Fluktuation +Kontraktion +Rezession +Inflation +Dekontamination +Exzellenz +Innovation +Isomorphie +Konnotation +Insuffizienz +Konversion +Kompensation +Koalition +Inkongruenz +Inkontinenz +Kontrahent +Konfiskation +Konjunktur +Aggression +Konfrontation +Kompatibilität +Prognose +Akzeleration +Konstruktion +Diversifikation +Prävention +Sanktion +Indikation +Reduktion +Konkurrenz +Konfiguration +Konnotation +Rezession +Transformation +Interaktion +Kooperation +Innovation +Kollision +Proklamation +Konnotation +Konfrontation +Disposition +Konkordanz +Deklamation +Kollaboration +Isolation +Inflation +Diversifikation +Konnotation +Kompensation +Diffusion +Dekadenz +Konserve +Deklomotion +Kolaboration +Isollation +Infllation +Divirsifikation +Konotation +Kompenssation +Difusion +Dekadens +Kanzerve + diff --git a/Common/3dParty/hunspell/test/src/el_GR.txt b/Common/3dParty/hunspell/test/src/el_GR.txt new file mode 100644 index 0000000000..badd16854f --- /dev/null +++ b/Common/3dParty/hunspell/test/src/el_GR.txt @@ -0,0 +1,123 @@ +Αβαντάζ +Αβασταγά +Αβγάτισες +αβέβαιο +αβέλτερο +αβέλτεροι +αβίαστους +άβλαβοι +αβοκάντο +αβράδιαστης +άβραστη +αβράχυντου +άβρεχτα +αβρή +αβρότης +άβυσσον +αγαθόν +αγαθούς +αγάλακτο +αγγούρι +αγελαδινού +αγέρα +αγεωμέτρητων +αγίνωτοι +άγκυρες +αγορεύσεις +αγόρευσή +αγορίνα +Αγοριού +Αγροληψία +Αρμόνια +βγαίνοντας +βεβαιώσεων +διάθεση +διαίρεση +Διαιρέσου +Διαιτολογίου +διαψεύσουν +διδασκάλισσας +ενασκήσεις +ενασχόληση +ενασχόλησή +ενδείξεις +ενδεχόμενον +ενδιαμέσου +Επιστήθιες +Επιστημο +Επιστολές +Επιστολή +εύπορους +ευρέα +ευρημάτων +ευρύτητά +ευσταθών +εύστροφα +ευσυνειδησία +εύτακτε +ευτελείς +ευτελίζουν +ιδρυτικό +ιεροψάλτες +Ιζόλα +Ιθαγένειάς +ικανότατος +ιλαρότης +κεφαλής +κεφαλιάτικες +κεφαλωτές +κήπε +κήπευση +Κήρυξής +Λεξικογραφιών +Λεξιλογικός +λεοντή +λεοντής +ολιγοχρόνιου +ολικέ +ολικές +ολική +πελαγώνω +πελατών +πελάων +προστατεύει +προστασίας +σούρουπου +σουρούπωμα +σούρτης +Σούρωνα +Σπαγέτα +Σφάλμα +Σφάλματά +σφικτά +σφικτέ +σφοδρότητας +σφοδρού +σφραγίσω +σχεδιάζουμε +σχεδιάζουν +σχηματίσου +σχηματίσουμε +σχολιάζεσαι +Σχολιάζεστε +Ενδιαφέροντα + +Слова с ошибками +Αβασiλευτου +αγαπούσαv +βeβαιωμένοι +εvασxόλησης +επιoτολικέ +ιδιωτικοποιήσειc +λεπταίσθnτη +πρoστιμάρισμα +σφάλμαtα +προστάτεuε +κεxριμπαριού +διαισθnτικότητες +αγκιστpώσουv +αγαθoεργiας +αβεβαιoτητά +αγέρεc +διδαxθούμε +εuσταθειώv \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/en_AU.txt b/Common/3dParty/hunspell/test/src/en_AU.txt new file mode 100644 index 0000000000..f9404bce0d --- /dev/null +++ b/Common/3dParty/hunspell/test/src/en_AU.txt @@ -0,0 +1,116 @@ +Acknowledge +acrophobia +adventurousness +aeronautics +algal +Alligator +allegation +alphabetise +Analogy +appropriable +assembly +attempt +Average +barbecue +bathtub +begun +belongingness +Better +binary +blackberry +boatswain +bow-tie +brambly +bright-eyed +bubble +Calender +cancellous +cantankerousness +carefree +categorized +cellular +chaos +cheerfulise +childlike +circumstance +close-mouthed +Cocoa +coherent +co-located +Colours +controversial +cottage +creditworthiness +cut-down +dedicated +deep-freeze +Definitive +Designs +digital +distensible +dollar +dyslexia +Egyptian +effectively +etiquette +excess +exotica +fairly +feedback +features +figure's +fjord +forty-seven +government +haematomata +helpless +homologous +implant +Indemnify +inexpert +interior +localises +loquaciousness +maelstrom +mechanizable +melodious +mezzo-soprano +mozzie +municipalisation +mystifier +Neoclassicism +newsletter +non-professional +officiation +orientalisation +palaeoanthropography +parrot +pickpocket +pioneer +cryptanalytic +simplifying +sommelier +spicy +steward +subcontinental +swimwear +Technical +trajectory +wholesomeness +Advantageously +interindustry +red-eye +sub-group + +Слова с ошибками +Acredited +agressive +appreciativiness +aritmetical +biosyntesized +lisense +paranoa +fotoelectronic +semi transparent +synonymus +wordprocessing \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/en_CA.txt b/Common/3dParty/hunspell/test/src/en_CA.txt new file mode 100644 index 0000000000..f3bf6608a7 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/en_CA.txt @@ -0,0 +1,125 @@ +admire +admittance +aggrandizement +Airmen +Albatross +amateur +angling +apparatus +Architecture +assessment +attempt's +awakening +backgrounder +Balance's +barometric +bashfulness +beautiful +belletristic +blatancy +bonbon +border +Bottom +bountifulness +breakpoints +bulkiness +businesslike +can't +cash +castle +Casual +cauliflower +celebrity +childish +chokecherry +choreographically +chronological +classification +clearheaded +coalesce +Coexistence +collaborative +coloured's +concentration +draconian +drainpipe +demonstrativeness +dependence +dependency +dream +duplication +epidemiological +equitable +Essence +Exemption +exonerate +fainthearted +falsification +ferromagnetic +flammable +fraternization +French +frontier +gadget +galleria +Gallery +gateaux +geocache +ginger +glace +glacier +globalization +hockey +holiday +housemate +intensifier +joystick +Language +leaseholder +non-breakable +northerly +o'clock +oeuvre +openhandedness +oscillation +outface +outlaw +overladen +package +palazzo +panama +Paragraphs +Parliament +particular +pasteurization +pathogen +perception +phenomena +philanthropically +physical +populations +repugnance +request +resplendence +retroactive +rigidity +schedule's +School +scintillation +sensibility +settlement +taxiway +bereft + +Слова с ошибками +acomplishment +anihilate +caprise +chambre +etnographically +horsmanship +innundation +lemongras +omelete +retorical +shepishness \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/en_GB.txt b/Common/3dParty/hunspell/test/src/en_GB.txt new file mode 100644 index 0000000000..f50273dd01 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/en_GB.txt @@ -0,0 +1,122 @@ +Abbreviation +Acceptability +acquirable +Addressee +afterthought +airworthiness +all-powerful +amateurishness +amorphousness +anthology +Auspiciousness +Bibliographer +Bilberry +birthday +bodyguard +broadleaved +brontosaurus +bumptiousness +Cabaret +Californian +calumny +cancellation +cantonal +capitalize +careful +carry-on +casino +clown +co-ordinate +cockleshell +decennial +deckchair +decryption +deep-freeze +Democracy +financial +fish-plate +Flamenco +housing +Hybrid +hydroelectricity +iceboat +ichthyology +idiomatic +ill-humoured +imperatrix +individuality +interocular +intrasectoral +ironwoods +Jolliness +Jurisprudent +knowledgable +kopeks +labour-intensive +laboratory +lake +language +larynx +latching +leakiness +License +licensed +licensee +life-threatening +linguistics +long-lived +machinable +mainsheet +Major +malleability +man-hour +Mango +ninety-five +nobody +non-blocking +non-judicial +nonconforming +north-Western +nutritiousness +quasi-synchronous +question +racoon +radish +Railway +Rarity +saucer +Save +Saying +supplely +tallish +target +Taxi +teach-in +technician +ultramodern +umbrae +uncertainness +unconstitutionality +washing +wasn't +waxen +weather +well-formed +what's-his-name +whereupon +Wi-Fi +Wikipedia + +Слова с ошибками +Abstractnes +advantageusness +arhythmical +autosuggestibility +kaptor +coldshouldering +humaneneses +imaginativness +knight-erantry +magasine +night-wachman +qualifidly \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/en_US.txt b/Common/3dParty/hunspell/test/src/en_US.txt new file mode 100644 index 0000000000..f910ca76ce --- /dev/null +++ b/Common/3dParty/hunspell/test/src/en_US.txt @@ -0,0 +1,216 @@ +apple +banana +cat +dog +egg +fish +gold +house +ice +juice +kite +lion +mouse +night +orange +pencil +queen +rabbit +sun +tea +umbrella +vase +watch +xylophone +yellow +zebra +arrow +book +cake +car +day +elephant +flower +hat +island +jelly +king +lamp +moon +nose +owl +pink +quilt +radio +sunflower +tree +unicorn +violin +water +xylophone +yellow +zoo +apple juice +blue +calculator +desk +elephant +fire +goat +hat +ice cream +jacket +key +lemon +map +notebook +owl +pear +quilt +rose +soccer +table +umbrella +vegetable +whale +xylophone +yellow +zebra +apple pie +beach +computer +drum +elephant +goat cheese +hat +ice skate +juice box +kite festival +lemonade +mountain +notebook paper +orange juice +pizza +queen bee +rainbow +snow +turtle +umbrella hat +valley +Aberration +Absolution +Acquiesce +Adumbrate +Aesthete +Altruistic +Ambivalent +Anomalous +Antediluvian +Antipathy +Aphorism +Apocryphal +Apostasy +Apparition +Arduous +Assiduous +Audacious +Austere +Autonomy +Avaricious +Axiomatic +Baleful +Bellicose +Belligerent +Bereft +Bilious +Bombastic +Cacophony +Capricious +Cartography +Castigate +Clandestine +Coalesce +Cogent +Cognizant +Colloquy +Concomitant +Confabulate +Congenial +Conundrum +Copious +Corpulent +Coven +Credulous +Culpable +Dearth +Debilitate +Deleterious +Denigrate +Despondent +Diatribe +Dilapidated +Disparage +Dissemble +Dissonance +Duplicity +Ebullient +Egregious +Ephemeral +Equanimity +Esoteric +Euphemism +Evanescent +Exacerbate +Exhort +Expatriate +Extol +Facetious +Fatuous +Feckless +Felicitous +Feral +Fervent +Fetter +Flummox +Fractious +Garrulous +Hegemony +Iconoclast +Idiosyncrasy +Ignominious +Impecunious +Ineffable +Inexorable +Inscrutable +Insidious +Intrepid +Intransigent +Invective +Irascible +Juxtapose +Kowtow +Languid +Lassitude +Lurid +Malinger +Maudlin +Mawkish +Mendacious +Metaphysical +Antransigent +Inwective +Iracible +Juxtopose +Kovtow +Langued +Lasitude +Larid +Mallinger +Haudlin +Mavkish +Mendocious +Mitaphysical +timeline +rollout +workshopped +deliverables diff --git a/Common/3dParty/hunspell/test/src/en_ZA.txt b/Common/3dParty/hunspell/test/src/en_ZA.txt new file mode 100644 index 0000000000..f509809717 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/en_ZA.txt @@ -0,0 +1,114 @@ +Acceptably +Achievement +administrate +all-day +amount +average +bilayer +blasé +boutique +breezy +byers +cabdriver +carefree +categorised +Chameleon +cheerful +chronology +cliché +cooling-off +courage +crudités +decorates +dooryard +débâcle +electromotive +equalled +Exotica +fellow-traveller +forests +full-timer +graded +habitué +haven't +hide-and-seek +home-building +interaxial +kingdom +largeness +long-distance +Majority +manoeuvre +Matrix +metier +mightn't +multidisciplinary +night-time +officio +old-style +organize +overaggressive +packing +parenthesis +pince-nez +Plaint +play-act +policy-making +Preheat +prohibit +puzzle +queue +quite +re-enact +reason +ready-made +renewal +resize +rooihout +scampi +schoolteacher +sea-green +shop-boy +sidebar +skyscraper +soundless +spelling +stakeout +synchronizing +take-off +Thereof +Trademark +transportable +treatment +tweeness +under-age +unmake +Variate +Visitant +volume +webmaster +well-prepared +window +yesteryear +first-aid +Hydrant +inconstant +network +northernmost +nowhere +souvenir +telecommunicate + +Слова с ошибками +afordable +anthropologie +bagage +comparatif +flammeble +indivizible +jetlag +lettrebox +panoramma +posessor +selfdoubt +abandonner \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/es_ES.txt b/Common/3dParty/hunspell/test/src/es_ES.txt new file mode 100644 index 0000000000..05520c2d2f --- /dev/null +++ b/Common/3dParty/hunspell/test/src/es_ES.txt @@ -0,0 +1,208 @@ +nosotros +vosotros +ellos +ellas +aquí +allí +ahora +antes +después +siempre +nunca +también +solamente +verdad +mentira +bien +mal +grande +pequeño +rápido +lento +nuevo +viejo +bueno +malo +feliz +triste +bonito +feo +caliente +frío +dulce +amargo +fuerte +débil +cerca +lejos +fácil +difícil +cierto +falso +caro +barato +limpio +sucio +fuerte +débil +alto +bajo +claro +oscuro +abierto +cerrado +joven +viejo +corto +largo +alegre +tranquilo +nervioso +amable +grosero +conocido +desconocido +cortés +rudo +agradable +desagradable +sabroso +insípido +difícil +fácil +cansado +descansado +moderno +antiguo +último +primero +posible +imposible +rápido +lento +sencillo +complicado +propio +ajeno +abierto +cerrado +amable +desagradable +seguro +inseguro +correcto +incorrecto +dulce +amargo +Anacoreta +Sobrentender +Embriaguez +Inquebrantable +Empedernido +Derramamiento +Despotricar +Escafandra +Aletargamiento +Estancamiento +Descarado +Exégesis +Contrariedad +Espeluznante +Conspiración +Impedimenta +Deglutir +Engreído +Enmascarado +Exterminio +Embelesar +Permutación +Desesperanza +Impenetrable +Enarbolamiento +Errabundo +Deslinde +Inefable +Soliviantar +Embriaguez +Perdurable +Opulencia +Trémulo +Desembolso +Empedernido +Anquilosar +Enigmático +Inquebrantable +Contrincante +Desmesurado +Vanagloriar +Exasperar +Desvanecer +Perpetuidad +Desbaratar +Ineficaz +Zozobra +Elucubración +Ineludible +Desgarramiento +Atestiguar +Encascarar +Desembozar +Irreverente +Soslayar +Despiadado +Embaucar +Moflete +Endilgar +Desfalco +Embelesamiento +Desestimar +Enajenación +Desavenencia +Inexorable +Atolladero +Egrégoro +Desafiar +Afable +Enervar +Belicoso +Enervar +Descacharrante +Entramado +Inigualable +Perplejidad +Descabellado +Diligencia +Enaltecimiento +Desvergonzado +Arrebato +Empatía +Endiosar +Peripecia +Desidia +Subversión +Desfachatado +Desfalco +Desvirtuar +Errático +Desahuciar +Envilecimiento +Empecinado +Estolidez +Despropósito +Engatusar +Culminante +Sobrentender +Enseñorear +Desacato +segguro +insseguro +correcto +incarrecto +dalce +amergo +Anasoreta +Sobrententter +Embreagues +Inquebranttable +Empidernedo + diff --git a/Common/3dParty/hunspell/test/src/eu_ES.txt b/Common/3dParty/hunspell/test/src/eu_ES.txt new file mode 100644 index 0000000000..9cbd124e59 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/eu_ES.txt @@ -0,0 +1,132 @@ +Abantza +ñabar +abasto +abegikortasun +aberaskeria +aberetzar +abezedario +abialdi +Abiatzaile +abizari +Aboli +abonatu +absenta +absolutibo +accelerando +adabegitsu +adberbio +adiaka +adierazle +adierazkizun +adikuntza +adin +adinaro +adineratu +adin-txikitasun +administratzaile +adoleszentzia +adopzio +adostu +aerolabangailu +Aeroplano +afalordu +agente +agertezin +agiantza +agoran +arradatze +arrakasta +Batata +baterakuntza +baterakor +Bateri +batuar +baud-abiadura +batzuenganako +batzuengandik +batzuengan +batzuengatik +batzuen +baxera +berezi +berezikeria +beritzete +beroa +Beroate +beroatza +berorri +berrabiatu +berra +berresgarri +berripaper +chap +dabilzkidake +dabilzkie +dagitza +dagokik +dagozkieke +erdiondu +galdera +galtzada +garaitiar +garantia +Garaztaketa +garbitasun +gastronomiko +Gaurgero +gaurgoitik +legizkie +legokizue +legozkidake +lehenbizi +nindoakio +publikotasun +publizitate +subsidiario +substantibo +sugestio +superbalorazio +taidun +taldeburu +Talent +Teknografia +xantxa +xerbitor +xerokopia +zabaldura +Zabalkor +Zabaltza +zabilzkieken +zabilzkio +zaharkote +zeneritzeketen +zenerra +zenezagu +zengozkigute +zeniharduke +zenioke +zenioketez +zeniraute +zenizkien +zenizkiguke +Zintut +Zintuzkedan +isiltasun + +Слова с ошибками +abriсot +absenzia +addikzio +administraziozerbizu +bat-bates +bermagari +cataluniar +dakarza +erdemin +garatienetarikoa +ishil +nindezaguane +nintzainaken +summa +technologiko +charmant \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/fr_FR.txt b/Common/3dParty/hunspell/test/src/fr_FR.txt new file mode 100644 index 0000000000..5ab592e094 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/fr_FR.txt @@ -0,0 +1,211 @@ +Bonjour +Merci +Oui +Non +S'il +Excusez-moi +Pardon +Bien +Mal +Grosse +Petit +Beau +Moche +Fort +Faible +Chaud +Froid +Vite +Lent +Haut +Bas +Loin +Près +Heureux +Triste +Facile +Difficile +Simple +Compliqué +Bon +Mauvais +Nouveau +Vieux +Jeune +Âgé +Bienvenue +Amitié +Amour +Famille +Travail +Maison +Voiture +Manger +Boire +Courir +Marcher +Nager +Chanter +Dormir +Jouer +Parler +Écouter +Regarder +Lire +Écrire +Acheter +Vendre +Aller +Venir +Faire +Dire +Voir +Savoir +Apprendre +Aimer +Détester +Partir +Rester +Arriver +Revenir +Partager +Aider +Aimer +Ouvrir +Fermer +Manger +Boire +Avoir +Être +Pouvoir +Vouloir +Devoir +Parler +Écouter +Rire +Pleurer +Danse +Étudier +Travailler +Voyager +Vivre +Connaître +Reconnaître +Voyager +Exister +Choisir +Donner +Recevoir +Aimer +Oser +Phénoménologie +Électroencéphalographie +Parallélépipède +Anticonstitutionnellement +Transsubstantiation +Éclectisme +Anachronisme +Catéchuménat +Démagogie +Fructueux +Ineffable +Hypothèque +Propriété +Procrastination +Complaisance +Réminiscence +Éthique +Équinoxe +Exponentiel +Hétérogénéité +Imbroglio +Incorrigible +Maelström +Métaphysique +Protagoniste +Subliminal +Verrouillage +Volumétrique +Énigmatique +Époustouflant +Immatériel +Infini +Polyglotte +Recrudescence +Prophylactique +Symbiotique +Vestibulaire +Épistémologie +Faramineux +Géopolitique +Hypnotique +Inamovible +Intemporel +Labyrinthe +Pacifiste +Quémandeur +Soporifique +Ubuesque +Volumineux +Effervescence +Électrophorèse +Paradoxe +Prorata +Quadrupède +Sarcophage +Trigonométrie +Vaccinologie +Xenophobe +Zéphyr +Génétique +Labyrintique +Mégalo +Nostalgie +Omniprésent +Pangramme +Périlleux +Quinquennat +Rémunération +Scolopendre +Tautologique +Utopiste +Vexatoire +Wolof +Xanthine +Yacht +Zanzibar +Axiomatique +Chronométrer +Dilettante +Énervement +Facétieux +Générique +Harmonique +Illusoire +Juridique +Kabbaliste +Longetivité +Médiane +Néologisme +Oxygène +Patronymique +Quotidien +Rétorique +Sémantique +Tautologie +Utopique +Vaccinologie +Xénophobie +Yachting +Zoroastrisme +Voager +Exisster +Chaiser +Doner +Resevoir +Aimmer +Osero +Phénoménollogie +Électraencéphallographie +Parallélépepède + diff --git a/Common/3dParty/hunspell/test/src/gl_ES.txt b/Common/3dParty/hunspell/test/src/gl_ES.txt new file mode 100644 index 0000000000..1fa4436b77 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/gl_ES.txt @@ -0,0 +1,120 @@ +ola +tipo +Si +non +nonnr +comida +comidaa +auga +augaa +casa +coche +cochee +un tren +bicicleta +escola +escolaa +niños +pai +paii +nai +naii +irmá +irmán +cachorro +gato +gatoo +peixe +peixee +aves +avess +árbore +flor +herba +o sol +lúa +o ceo +chuvia +neve +vexa +inverno +primavera +outono +noite +noite +día +unha semana +mes +ano +para ler +escribir +fala +ensinar +traballo +durmir +durmir +correr +vai +senta +estado +para escoitar +vexa +escoita +hai +beber +carne +furtas +verduras +queixo +pan +auga +zume +café +té +leite +aceite +ovo +sal +impacienta +azucre +un bocadillo +cociña +sala de estar +dormitorio +baño +batela +sofá +lámpada +fiestra +a porta +piso +teito +parede +sofá +alfombra +baño +afundir +espello +toalla +cama +manta +almofada +reloxo de alarma +escritorio +cadeira +marabilloso +adverbio +obviamente +Dominante +residenciais +convidado +perigo +cuestión +deporte +mina +cordeiro +cabeza +tratar +avogado +intelixente +guapo diff --git a/Common/3dParty/hunspell/test/src/hr_HR.txt b/Common/3dParty/hunspell/test/src/hr_HR.txt new file mode 100644 index 0000000000..6fbcfb98f7 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/hr_HR.txt @@ -0,0 +1,215 @@ +boliestan +jyak +slaby +pameetan +gllup +bezuspješhno +besimeni +bezuzban +blagastanje +bljeskovica +jabuka +sunce +voda +kuća +ptica +kava +kruh +cvijet +knjiga +pas +mačka +grad +zelen +plav +crven +bijel +crn +velik +malen +brz +spor +sretan +tužan +vruć +hladan +nov +star +lijep +ružan +dobar +loš +zdrav +bolestan +jak +slab +pametan +glup +raditi +jesti +piti +spavati +čitati +pisati +govoriti +smijati se +plakati +pjevati +igrati +plesati +učiti se +kupovati +kuhati +telefonirati +gledati +slušati +hodati +trčati +letjeti +plivati +čitati +pisati +raditi +imati +biti +ići +doći +otići +dati +uzeti +reći +vidjeti +čuti +osjetiti +misliti +htjeti +moći +morati +rado +nerado +da +ne +molim +hvala +doviđenja +oprosti +zbogom +zdravo +čau +ej +da +baš +super +glupost +fantastično +jasno +tako +zapravo +možda +lako +teško +prozračnost +usplahirenost +neoblomivost +prezir +proigranost +uznemirenost +besprijekornost +besprizornost +nepredvidivost +beznadnost +promašenost +protivljenje +neizreciv +bezizlaznost +neuspjelost +zbunjenost +neodlučnost +protivština +nepovratnost +bezduhovitost +ravnodušnost +prolaznost +neobaveznost +bezbrižnost +nepovratnost +promašenost +neprepoznatljivost +neukrotivost +bezobzirnost +nevinost +nestalnost +nepostojanost +bezizlaznost +nepovratnost +prolaznost +neodgovornost +bezbrižnost +nevolja +nezadovoljstvo +prolaznost +bezuspješno +bezimeni +bezuzdan +blagostanje +bljeskavica +boren +carovnija +crpeža +dostojanstvo +duhovitost +egzaltacija +gorkoća +histerija +idila +ironija +izdaja +janjetina +kajanje +kavana +krhotina +ljepljivost +lukavstvo +magnutizam +melankolija +misticizam +naivnost +nelagoda +neraspoloženje +obmana +okrutnost +opojenost +prezir +propast +ravnodušnost +sjenka +skitnica +spletka +stid +sudbina +susret +sudbina +šapat +tišina +trepet +utopija +uzaludnost +veličanstvo +zaborav +zanesenost +zanos +zavjera +zbunjenost +zluradost +zloslutnost +žargon +žártva +šaptanje +čarobnost +dileme +hodočasće +lebdjeti +iznimka +preobilje +probuditi se +surov \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/hu_HU.txt b/Common/3dParty/hunspell/test/src/hu_HU.txt new file mode 100644 index 0000000000..aae52a65b7 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/hu_HU.txt @@ -0,0 +1,114 @@ +Szorzótábla +Réges-régen +normálméret +nemeslelkűség +mindegyik +milliós +Mikroflóra +Mezőgazdaságigép +meséskönyv +mennyiség +Memória +kártya +kuráre +Kurzor +jégkorong +jellemesség +Javak +irányzás +iromány +Inkluzíve +hűtőedény +hőmérséklet +hír +hétszázas +hátrány +háromszáz +Hintó +generátor +gavallérság +explozíva +eső +esdeklés +epilógus +Energia +Előélet +előterjesztés +előnézet +elvonás +elszigetelés +ellátmány +Elevátor +egynémelykor +egyenlőség +eddzenek +dzsungel +ananász +akvárium +Szépül +Sztorizik +szobroz +szimbolizál +szemlélődik +sugdolózik +majmol +Macskáz +Létesít +Lokalizálódik +litografál +levelesedik +lepet +közömbösít +kételkedik +kivirágoz +kerekez +kedvez +járkál +jegyzőkönyvez +iskolázik +individualizál +csendesít +borsoz +billentet +bajmolódik +anyagozik +alkonyodik +Aktualizál +színes +szemelt +lassú +hatékony +hasznos +gyúlékony +gyári +abszurd +örökjog +öregkor +ömlő +Zászlaj +Zseblámpa +regényirodalom +realitás +raktárhelyiség +pötty +pótlék +pótdíj +pályafutás +Promóció +Processzus +poloska +pernye +pediáter +parancsnoklás + +Слова с ошибками +sponzorálás +mihamarábiak +idohatár +hypnotizmus +departement +légiesul +kutagat +költségtakkarékos +redukzió +pilanatfelvétel \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/id_ID.txt b/Common/3dParty/hunspell/test/src/id_ID.txt new file mode 100644 index 0000000000..dff2ed986e --- /dev/null +++ b/Common/3dParty/hunspell/test/src/id_ID.txt @@ -0,0 +1,121 @@ +acang-acang +Adiksi +Adventisius +Advokat +afirmatif +agroindustry +agrisilvikultur +akhir-akhir +akomodatif +aksi +aljabar +anggul +anotasi +antusiasme +apoteker +bahagia +bakat +bangkang +Bankir +Barikade +bebaru +belar +beleid +bencana +bentangur +beritawan +besuk +bilingualisme +Cecak +Celempong +cencawan +cengkar +ceremai +cermin +cudang +Dampal +dampan +dansa +datung +debitur +defensi +defisit +demper +dendang +Derivasi +Desember +deskripsi +diskotek +diskusi +distansi +dragon +dramatisasi +Eksamen +Eksistensi +eksperimen +ekstensifikasi +ekuitas +elektron +gelut +Geofisikawan +Gerbang +gerempang +influenza +Informasi +Inisiator +insekta +institusional +instruksional +jelajah +Kamrad +Kapilaritas +kapster +kardiovaskular +karismatik +keranjingan +komunal +Limitatif +Linguistik +lintang +masabodoh +matematikus +medisinal +Melankolia +Memorabilia +nasional +nasionisme +Panen +pangkek +peranti +perian +persekusi +perunjung +regenerasi +reglementer +robotika +runjang +Sabtu +Simbang +simpati +tebing +topi +Unggal +unsuri +urbanisasi +variabel +wahana +warganegara + +Слова с ошибками +Abonement +Abcente +ambivalan +bakteriostatic +cekaw +darmavisata +declarasi +duplex +ecozona +gempur-mengempur +jejengok +transitive \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/it_IT.txt b/Common/3dParty/hunspell/test/src/it_IT.txt new file mode 100644 index 0000000000..02852a870c --- /dev/null +++ b/Common/3dParty/hunspell/test/src/it_IT.txt @@ -0,0 +1,200 @@ +Ciao +Ciaoo +Buongiorno +Buonasera +Buonassera +Grazie +Prego +Arrivederci +Buonanotte +Scusa +Per favore +Amore +Amico +Famiglia +Casa +Città +Strada +Montagna +Montaga +Mare +Sole +Luna +Stelle +Giorno +Notte +Colazione +Clazione +Pranzo +Cena +Acqua +Vino +Caffè +Pane +Formaggio +Pasta +Pizza +Gelato +Dolce +Salato +Frutta +Verdura +Carne +Pesce +Pollo +Uovo +Sale +Pepe +Olio +Burro +Zucchero +Latte +Yogurt +Insalata +Zuppa +Bistecca +Prosciutto +Parmigiano +Biscotti +Cioccolato +Spagggrhetti +Spaghetti +Lasagne +Risotto +Gnocchi +Penne +Ravioli +Cannelloni +Pesto +Caprese +Limoncello +Espresso +Cappuccino +Tiramisù +Panna cotta +Cannoli +Panettone +Brioche +Focaccia +Foacdccia +Crostini +Arancini +Antipasto +Primo piatto +Secondo piatto +Contorno +Pane tostato +Marmellata +Accoglienza +Affascinante +Aggressività +Alleviare +Appassionato +Armonioso +Autonomia +Autovfnomia +Barbarie +Beneficiare +Bizzarro +Burocrazia +Cambiamento +Capriccioso +Cautela +Commemorare +Comportamento +Conseguenza +Controverso +Coraggioso +Debolezza +Decisivo +Delizioso +Desiderare +Destrezza +Determinato +Determin +Difficoltà +Disponibilità +Divertimento +Eccentrico +Efficienza +Elettrizzante +Emergere +Empatia +Energia +Equilibrio +Esperienza +Fantastico +Fenomenale +Generosità +Gratitudine +Immaginazione +Impressionante +Impressiante +Indipendenza +Ingenuità +Innovazione +Intelligenza +Intensità +Intrigante +Ispirazione +Instabilità +Irresistibile +Leggenda +Libertà +Luminoso +Magistrale +Malinconia +Meraviglioso +Metamorfosi +Miracolo +Misterioso +Nostalgia +Opportunità +Originalità +Passione +Pericoloso +Prestigioso +Prodigioso +Prospettiva +Raffinato +Rafinato +Ricchezza +Rispettoso +Sensibilità +Sorprendente +Spontaneità +Spontaneita +Stravagante +Suggestivo +Surreale +Tenerezza +Trasformazione +Unicità +Vibrante +Vittoria +Volontà +Amicizia +Avventura +Bellezza +Calma +Danza +Eleganza +Felicità +Gioia +Incanto +Magia +Natura +Odore +Passatempo +Quotidiano +Relax +Serenità +Tesoro +Umorismo +Vacanza +Zelo +Avventuriero +Speranza +Risate +Armonia +Incanto diff --git a/Common/3dParty/hunspell/test/src/kk_KZ.txt b/Common/3dParty/hunspell/test/src/kk_KZ.txt new file mode 100644 index 0000000000..69010faa9b --- /dev/null +++ b/Common/3dParty/hunspell/test/src/kk_KZ.txt @@ -0,0 +1,209 @@ +сөз +адам +қала +тау +ауа +су +аспан +жер +бала +ата +ана +тамақ +кітап +ұстаз +оқу +тұтыну +тыныш +тұз +ауру +денсаулық +топ +маусым +төс +көз +жүрек +сарғыш +көп +аз +ертең +түн +түс +жас +қара +ақ +көк +қызыл +шай +салт +ыстық +суық +қазақ +жеті +он +жүз +мың +бір +екі +үш +төрт +бес +алты +жеті +сегіз +тоғыз +он +бақша +бұлақ +қиыр +досым +ақша +патша +таң +кеш +тауар +күн +апат +риза +ауырсыну +орман +жаңбыр +бауыр +жел +тұман +үй +бұлақ +көше +айнала +шайыр +тағам +сусын +топ +бас +әрекет +тіл +кеме +сиыр +қой +ешкі +шөп +ит +тұқым +қарындаш +апа +ана +әке +дала +тарлау +дәуір +таңдай +жыл +басқарушылар +басқарушшылар +жауапкер +ерекшеліктерімендерге +тұмылдырықтатқыздан +білімділігінге +білімдарды +алалықсыздар +айырмашылықтарын +тұрақтандырып +сылтауратқандарыңызды +қолдар +байланысқадан +жетілдірілген +зарарсыздандырады +ескеріп +ескеріпп +міндеттемелеріндерге +кезеңдердің +себепсіздік +біреудейлер +беделілерің +кездестіріңіз +шектердің +көңіл +көңл +мол +алайда +мәселе +мәселеу +сендің +келер +келерр +кәне +көпір +күндіз +сана +белгілер +дайын +ез +қайшы +саф +рең +шақ +үміткер +бақыт +бақытт +республика +консервациялау +мемлекеттік +тағатсыздан +адамда +бәрі +бең +беңр +жасағанда +жасағоанда +жабайылық +заманда +көшірдік +мерейі +Мерейій +мөлшерсіздікк +мөлшерсіздік +пенді +тылда +мәртебесімен +аппаратпен +тегінді +кездеме +ересектік +көңілсіздік +тәуекелсіздік +қанағатсыздық +ғаділетсіздік +сайдақы +басым +тәжікеден +тұрғын +қонақ +қауіпсіздік +қадірсіздік +білгішсінбейсіңдер +талқандас +кешікті +қоздырғышы +бас +емдейсіңдер +құқылы +тақылет +әдемі +көткеншектейсіңдер +әжет +қайтар +белсену +түсінбеймін +жағымсыздық +сыздар +мәртебесі +тұрғыны +мезгіл +әлбетте +барысын +оқылған +безге +жаса +аламаңдайсыңдар +кереметті +епетейсіздік diff --git a/Common/3dParty/hunspell/test/src/ko_KR.txt b/Common/3dParty/hunspell/test/src/ko_KR.txt new file mode 100644 index 0000000000..3ef2abd2ce --- /dev/null +++ b/Common/3dParty/hunspell/test/src/ko_KR.txt @@ -0,0 +1,157 @@ +안녕하세요 +감사합니다 +사랑해요 +미안합니다 +음식 +친구 +가방 +집 +학교 +컴퓨터 +물 +밥 +책 +산 +바다 +날씨 +일 +노래 +치킨 +반찬 +꽃 +숙제 +가족 +아이 +게임 +영화 +생일 +시간 +동물 +여행 +차 +쇼핑 +추천 +대화 +전화 +사진 +운동 +잠 +병원 +음료수 +능력 +주말 +전자기기 +고양이 +강아지 +바나나 +가을 +겨울 +봄 +여름 +옷 +신발 +지하철 +택시 +버스 +비행기 +샴푸 +브러시 +삼계탕 +국수 +불고기 +된장 +김치 +먹다 +마시다 +보다 +듣다 +놀다 +하다 +가다 +오다 +서다 +늦다 +일어나다 +자다 +빨갛다 +파랗다 +노랗다 +녹색 +보라색 +맛있다 +시원하다 +덥다 +추운 +기분 +슬프다 +즐겁다 +정신이 +바쁘다 +참새 +나비 +병아리 +돌 +물고기 +향신료 +시장 +기차 +공원 +해변 +지갑 +병원 +대학 +교통 +공항 +천재 +연구 +일본 +중국 +사업 +지식 +성격 +자금 +기술 +정부 +전략 +협력 +혁신 +경제 +철학 +신체 +영감 +현상 +역사 +태양 +설명 +사회 +환경 +자연 +현실 +존경 +정확 +장애 +낙관 +발전 +절망 +일상 +소멸 +도전 +반복 +포기 +파괴 +혁혹 +소외 +식민지 +혐오 +출산 +행복 +불평 +판매 +위험 +안녕하ㅎ요 +감사합ㅅ다 +사랑ㄱ해요 +미안ㅎ합니다 +친ㅔ구 +가ㅎ방 + diff --git a/Common/3dParty/hunspell/test/src/lb_LU.txt b/Common/3dParty/hunspell/test/src/lb_LU.txt new file mode 100644 index 0000000000..e7dd0e3d59 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/lb_LU.txt @@ -0,0 +1,118 @@ +Aarbecht +Aarbechtszäitorganisatioun +Aartgenoss +Abenteuer +abrëll +absence +Abusives +Abzebillercher +Acquéreur +Adjointeë +Affischéiertes +Airbussen +Alldeegleches +Angschtzoustä +Basketballspiller +Baufirme +bauren +bekanntes +Beleg +Berodung +Bewältegung +Datentransfer +Dateschutz +Decisives +Donneschden +Drangsaléiertes +Dränk +Giischtgen +Grondlag +grondreegel +Géies +Handelsdag +hausaufgab +hierschtdag +Häerzi +Industriell +Infrastrukturelles +Interessi +Internetfore +Intervall +Kamell +Kantoner +Karamell +Klenges +Nopeschhaus +Motors +Muer +Muerenter +Musek +Nettoverméige +niess +Protektioun +Prouf +Provisioun +Prozessor +Präis +Präsens +Sanitäres +Schauspiller +Schema +Taxatioun +Telefonsgespréich +termingrë +terrass +Textdatei +Textsprooch +Titulaire +Titel +erausféieren +erausjoe +gëeicht +onglécklecherweis +unzesammelen +unzespille +Approvisionnement + +Сложные слова +Aktiegesellschaft +Aktivitéitsdéclaratioun +Alarmstëmmung +Allgemengverständleches +Bankenoperatioun +Bensinsreserven +Besteierungsofkommes +Diskriminéierungsmoossnam +Dokumentatiounsaarbecht +Haaptrecommandatioun +Héchstgeschwindegkeet +Héichproblematesches +Hëllefsdéngscht +Integratiounsméisseges +Iwwersetzungsprogramm +Kapitaliséierungsdimensioun +Museksinstrument +Publicitéitsmarché +Transportproblem + +Слова с ошибками +Abonnnement +Accomodéiertes +Agrarcenter +Begrennung +Berodunszentren +Deeluung +Dialogue +Dictaten +Inspektor +Iwereileges +Pedagogik +Televisionschaîn +Bechäftegungsméiglechkeet +Gläicheetspolitik +Musekheichschoul +Satelliten +Addressbichelchen +Aarbechtsfield + + diff --git a/Common/3dParty/hunspell/test/src/lt_LT.txt b/Common/3dParty/hunspell/test/src/lt_LT.txt new file mode 100644 index 0000000000..1f04ae6ce1 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/lt_LT.txt @@ -0,0 +1,127 @@ +Abstraktus +šachmatai +žadintoja +agurkas +Aikštė +Akinukai +akmuo +šakoti +aktualinti +aktorius +šalinis +šaltinis +bernystė +beskuo +būgnelis +Bilietas +bilingvizmas +daržavietė +Darbadienis +Darbas +darbuotoja +dargi +daržinė +daugintoja +Daugiaveiksmis +delnė +įdelnis +detalizuoti +šerdelė +erdvėti +šeriškas +šeštadienis +etiketas +Evoliucija +fabrikantė +Fantastika +Fenomenas +fikusas +gaudinėti +gausėja +gūbrinti +geležis +geležtė +gelsvis +geranoris +Gertys +gerviukas +giesmininkė +Gikas +Goža +griaustinis +grįžinys +gėrioja +griozdas +grizijo +gryčia +grožėja +grįžti +grupė +gąstauti +Jaukas +jodinėjo +jodyti +keturnagis +Kiaušina +Kiaurymė +kiausta +kietakaktis +ūkiškas +kilimėlis +kilometrinis +ūkininkaitė +ūkinis +krykti +lapuotis +laukas +laupti +laužtė +Maudulys +Maumedis +mažutėlis +mazgotuvė +mechanikė +medeinė +medikamentinis +meduolinis +Nūdien +nebrendėlė +Negu +neiginys +parudenys +pasakotojas +pasausė +pasieninis +paskyriui +paslapčiom +Pasodas +Pat +Pataikūniškas +patarška +patentinis +proskyna +protekiniais +provizoriškas +rėkčioti +rūmas +rodyklinis +Romanistas +Skylmatis +Skyriklis +skolininkas +skraidžioja +skruzdėda +skėtrus + +Слова с ошибками +Abbreviatūra +alpinismas +amortizacia +daugiamžis +deziderativinis +generazija +keturiasdešimtūkstantas +krivuluoja +Šnaukstai +pazintinis +progresa \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/lv_LV.txt b/Common/3dParty/hunspell/test/src/lv_LV.txt new file mode 100644 index 0000000000..5198404759 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/lv_LV.txt @@ -0,0 +1,205 @@ +Sveiks +Sveikks +Labrīt +Lbrīt +Paldies +Paldiess +Lūdzu +Luzu +Atvainojiet +Atvainvfojiet +Prieks +Perieks +Draugs +Dravfugs +Ģimene +Gimene +Māja +Maja +Pilsēta +Pilseta +Ceļš +Ceļšs +Kalns +Jūra +Sauls +Mēness +Zvaigznes +Diena +Nakts +Brokastis +Pusdienas +Vakariņas +Vīns +Kafija +Maize +Siers +Makaroni +Pica +Saldējums +Deserts +Sāļš +Augļi +Dārzeņi +Gaļa +Zivis +Vistas +Ola +Sāls +Pipari +Eļļa +Sviests +Cukurs +Piens +Jogurts +Salāti +Zupa +Salds +Šokolāde +Spageti +Rīsi +Kakao +Biezpiens +Kūka +Tēja +Karalis +Zelts +Ezis +Tulpe +Lācis +Kaķis +Suns +Putns +Vārna +Zaķis +Pele +Ābols +Aita +Zirgs +Lauva +Pūķis +Lasis +Vilks +Vējš +Uguns +Ūdens +Zeme +Debesis +Saule +Rūpniecība +Aizkustinošs +Izdzīvošana +Nepieciešamība +Atbildība +Lieliski +Apmierināts +Neparasts +Izglītība +Sarežģīts +Atsevišķs +Pamatots +Organizācija +Sadarbība +Efektīvs +Daudzveidīgs +Novērtēt +Pārsteidzošs +Inovatīvs +Vērtība +Aizraujošs +Nopietns +Komunikācija +Māksla +Dzīvība +Ekskluzīvs +Tehnoloģijas +Rezultāts +Atbalsts +Nodrošinātība +Pārbaudīt +Radošs +Sociāls +Izteiksmīgs +Brīvība +Pieredze +Ietekme +Pārmaiņas +Drosmīgs +Racionāls +Empātija +Izpratne +Risinājums +Iespējas +Atklāts +Vadošais +Eksperimentāls +Neatkarība +Tīrība +Samierināšanās +Motivācija +Harmonija +Dinamisks +Iedvesma +Izglītojošs +Komplicēts +Pieejamība +Sadarbība +Tūlītējs +Saprotams +Neizsakāms +Lieliskums +Inovācijas +Aizrautība +Pārdomas +Sapratne +Rezultatīvs +Iespējams +Pārbaude +Sociālais +Izteiksme +Brīvība +Pieredzējis +Ietekmīgs +Pārmaiņu +Racionāla +Izpratni +Risinājumi +Iespējams +Atklāta +Vadošā +Eksperimentāla +Neatkarība +Tīra +Motivējošs +Harmonisks +Dinamika +Iedvesmojošs +Spēks +Mīlestība +Pasaule +Daba +Skaistums +Miers +Sapnis +Prieks +Rītausma +Brīnums +Izcils +Saikne +Dzirksts +Pārmaiņas +Atbalsts +Izcilība +Satriecošs +Dzīvīgums +Pārveidošana +Uzdrīkstēšanās +Uzticamība +Ieguldījums +Vērtība +Līdzsvars +Saskaņa +Izsmalcinātība +Pateicība +Atzinība +Pārsteigums diff --git a/Common/3dParty/hunspell/test/src/mn_MN.txt b/Common/3dParty/hunspell/test/src/mn_MN.txt new file mode 100644 index 0000000000..ac86b087ab --- /dev/null +++ b/Common/3dParty/hunspell/test/src/mn_MN.txt @@ -0,0 +1,103 @@ +Баатар +Багаа +Базар +Барра +Бат-Очир +Баттуул +Батхэсэн +Баярмаа +Билгэх +Бор +Бөөнцагаан +Бүрэнхайрхан +Бямбагар +Бэх +Гарам +Гантиг +Гурвантэс +Гүр +Гэрэлтуяа +Давст +Дангаа +Дансран +Дарь-Эх +Дөргөн +Дундбүрд +Дэмүүл +Дэлгэрцэцэг +Жавзан +Жарантай +Заглул +Зүүнхөвөө +Кир +Корона +Лүн +Лха +Лхаваан +Майхан +Манлай +Мөндөөхөө +Мөнхөт +Мөрөн +Мөнххаан +Мөст +Мэгэд +Мухар +Найдалмаа +Найтингейл +Налайх +Нарантуул +Намтай +Насантогтох +Номин +Нямсамбуу +Нэүдэй +Орог +Очир +Өнөржаргал +Өөдөс +Өргөн +Паган +Пас +Пүрэвдорж +Пүрэвхүү +Сайнаа +Сайхандулаан +Сундуй +Сэлх +Сүүж +Сээр +Тайван +Тарав +Тогтуун +Төрболд +Төхөм +Төмөр +Түргэн +Түшиг +Түгтөмөр +Түшиг +Удвал +Улиастай +Улаандэл +гүедэцгээчих +дэвхэрлүүлсхийчих +дэвхэлцгээчих +дэвшигдүүлгэчих +дэвшилцчих +дэвээ +дэггүйчүүд +наламгардуулалц +налбаруулзна + +Слова с ошибками +Батарчулуун +Баруунхарааа +Даважаргал +Дөрволжин +Мягмараран +Оюунтулхуур +оторчилсхилгэ +Асрамжлулгацгаачих +гүентүүлгэцгэээ +наладаадуулга \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/nb_NO.txt b/Common/3dParty/hunspell/test/src/nb_NO.txt new file mode 100644 index 0000000000..7218490a61 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/nb_NO.txt @@ -0,0 +1,113 @@ +Bahamasøyene +Festarrangement +Festarrangemang +Festival +festligheta +festnummer +forhandlernett +forgylle +fotballstyre +Fotgå +fotoamatørene +Fotogalleri +fotokopiere +generalkostnadene +generaltabbe +generøs +Generell +genmodifisertst +handlingsresymeet +hardhet +Harmfull +hastighetsregulering +havbanke +havforskningsundersøkelsene +informasjonsutveksling +Infrarødest +kaffeautomat +kaldslig +kalenderåra +kjekk +kjendisstoffa +kjærlighetslyrikk +kjøkken +Kontantautomat +kontantlån +kontrahere +kontraheringsplikt +Låskasse +læregutt +læreprosess +Museums +museumssamling +musikkorps +myggstikka +myndighetsaldere +omløpstider +omregn +områdeplan +omriss +omsetningsgjeld +omsjaltning +omsetningsvolumer +omslutning +omslyngning +omsonst +omstendeligheta +Omstart +Omstreifende +Omsyn +omtåketheta +oppdagelse +oppbygning +oppebære +oppfølgingsapparat +oppgjørsbank +oppgjørsblankett +opphøringene +partisipere +randverdi +rapportskriver +rasjonalisering +Rate +selsak +selskapsinntekt +selskapsoverskudd +selvbetjeningene +snabbingene +Snadderene +Sytti +søkekriterium +søkemulighetene +søkeargumenter +søkingen +søkne +sølvlaga +sørlandsk +søtningene +tabellrad +Tabellkolonne +Takhalm +taksene +takseringssystema +tal +trolsk +trosinnholdene +utfoldelsesmuligheta +Utformingsmetode +Utgift +vekstfaktor +vekstforhold + +Слова с ошибками +Arbeidstagerorganisasion +festsprel +forhandlingsdirektor +handlingforløpa +kjempeflinktt +lanetilbud +omraming +omsvøpssfull +raportmateriale +serstilt +taksamst \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/nl_NL.txt b/Common/3dParty/hunspell/test/src/nl_NL.txt new file mode 100644 index 0000000000..3efaf4df40 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/nl_NL.txt @@ -0,0 +1,115 @@ +Advertentie +Advocate +affirmatie +afgevaardigd +afneemster +allerbekendst +alternatieveling +annulering +anticycloon +Backtrackroute +Bearbeiden +becijfer +bediening +bedrag +beduiden +beïnvloeding +benadeling +bepaaldelijk +Catalogiseer +Catering +cellulair +classificator +collaboreren +collectiviteit +comfortabel +complimenteus +contractant +correctionaliseren +daaraanvolgend +dagelijks +deelgenoot +degelijkheid +demarqueren +Denotative +deposant +dergelijken +detail +deugen +diakritisch +Directioneel +dusgenaamd +eendrachtigheid +Eenzaamheid +eersteklascoupé +Eigenschap +felicitatietelegram +centerkanaal +Chargeer +filiaal +klare +Klassikaal +kleinhandel +evolutie +exemplaar +exequiën +familiaal +fauteuil +luister +magistratelijk +perelaar +Permitteren +Perseveratie +persoonlijk +pictogram +pixel +sloten +sluimer +sneltoets +Soldij +Solliciteren +zegepraal +zelfbeeld +zevendaags +aangeslotene +meermaals +expedieert +jaargetijden +kaderleden +Kapitelen + +Сложные слова +avontuurlijkheid +bedrijfsmaatschappelijk +begrotingstechnisch +belangstellingssfeer +concurrentievoordeel +conferentieganger +democratisch-liberaal +discontoverhoging +doctoraatsverhandeling +dubbeldeksbus +economisch-financieel +energiezuinig +erkentelijkheid +evenwichtigheid +klimaatsverandering +koffiezetmachine +koopmansgebruik +maatschapsovereenkomst +personeelsconsulent +sociaalwetenschappelijk +zelfverzekerdheid +fondsenwervende + +Слова с ошибками +afficher +algorithme +beeindiging +client +consnteren +deactivieren +deblockering +electrisch +certificat +sovereiniteit \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/nn_NO.txt b/Common/3dParty/hunspell/test/src/nn_NO.txt new file mode 100644 index 0000000000..6c0c1b48bc --- /dev/null +++ b/Common/3dParty/hunspell/test/src/nn_NO.txt @@ -0,0 +1,116 @@ +Ankeret +Anleggsbedrift +Annandag +annonseavis +annuell +ansats +ansvarsmedviten +Antibiotikai +apal +apoteki +apparattavlor +appetitt +Aprikos +arbeidsdokument +arbeidsmarknad +barndom +bastematte +bautingi +Bedriftsleiar +befolkningi +begynnarkurs +Beheld +belastningi +beredskapsnivå +beredskapsperiode +berglandskapi +berrfrost +beskjedi +beskrivingi +betalingsoppdrag +betalingsplikt +bevismateriale +bildeband +bildebruki +bildespråki +bildeteksti +bilingval +billettlukone +binær +bione +bjørkegreini +bjørnebæri +blenge +blokkeringi +blomsterbordi +blyerts +bogen +bokstavrekningi +bokstavteikni +Borddisk +effektevaluering +elgkalv +Elone +emballer +faktainformasjon +familiebedrifti +familieterapeut +fastbuande +Februar +feili +fisketom +hengelåsi +istandsetjingi +Item +jaguar +jamlig +janen +jarnbanestasjon +kjende +kjentfolki +kjæleri +kjøledisk +kjørety +midli +Mideftnar +midtstrek +multiplikasjonstabell +museumsdirektør +onsdag +operasjon +operasjonskode +opinionsskapingi +opningi +Personalkonsulent +Personligdom +persontryggleik +petroleumspris +redningsaksjon +reduksjon +refusnik +seinst +sekretær +seljande +sendeferd +Standpunkt +støyisolering +støytvis +terminoppgåve +tidløysone +tidsfølgjone +Tilbakebetalingstid +uprofesjonell +upåklageleg + +Слова с ошибками +Anlegsarbeid +anonse +ansversproblematikk +barneforteling +besoksliste +bilophoggingi +effektivitetskontrol +fakturaerklering +miljøbyrad +selskapskat +cement \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/oc_FR.txt b/Common/3dParty/hunspell/test/src/oc_FR.txt new file mode 100644 index 0000000000..23c82dafd0 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/oc_FR.txt @@ -0,0 +1,108 @@ +Ajustaira +alaguiar +alausièr +alberguèri +alcaloïdic +alègrament +alenament +algorisme +Alimentacion +allergologia +alpèstra +amaisament +amorteirar +analista +analogic +atucament +Audicion +auquièr +auscultacion +auscultar +ausèri +autenticament +brilhant +brumós +Burgada +cabelièira +cadeçar +Caducèu +çaicontra +calcièrs +Calmar +camarilha +cambièra +canalhariá +casse +cedar +cendrós +cèrca +cèrtes +cestòdes +chantièr +chartrós +Chassís +dimensionar +diptèrs +dirèctament +discrecionària +discriminar +Distraire +dòler +Enòrme +enqueriái +espicifòrme +esquelèt +Esquèrra +estetic +innocéncia +innocentàs +Maniquèu +mantelejar +Nauchièr +natièr +oxigèn +pacanariá +pagés +pagesiá +Primièirament +requereguèri +requisitòria +saumelèri +S'autodeterminar +sautarèl +scientament +scientologia +secador +secretèri +sècta +sectorial +s'efarcimar +s'endeven +s'engarrar +sentimental +s'entrepausar +shampó +sextant +sòli +Solidament +soquèla +subrejornada +suedés +utilitària +Utilizaire +vacàs +vaisselèri +valiái +validament + +Слова с ошибками +albatros +amistanza +brunonièr +carpentier +centrifugation +estelhad +primaria +s'embractar +sosembrançament +vascularisacion \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/pl_PL.txt b/Common/3dParty/hunspell/test/src/pl_PL.txt new file mode 100644 index 0000000000..81c4afafce --- /dev/null +++ b/Common/3dParty/hunspell/test/src/pl_PL.txt @@ -0,0 +1,225 @@ +dom +pies +kot +auto +drzewo +książka +szkoła +przyjaciel +mama +tata +dziecko +jabłko +czekolada +kawa +herbata +telefon +telewizor +komputer +muzyka +sport +zdrowie +piękno +praca +miłość +szczęście +czas +pieniądze +język +kraj +miasto +zima +lato +jesień +wiosna +morze +góry +jezioro +rzeka +park +zwierzę +ptak +ryba +drewno +złoto +srebro +metal +szkło +buty +sukienka +spodnie +koszula +czapka +płaszcz +ręka +noga +oko +ucho +nos +usta +ząb +głowa +serce +mózg +król +królowa +książę +księżniczka +chłopak +dziewczyna +mężczyzna +kobieta +staruszek +staruszka +lekarz +pielęgniarka +nauczyciel +uczennica +student +studentka +kucharz +kelner +wojna +pokój +mapa +flaga +śmiech +płacz +sen +marzenie +praca +nauka +sztuka +teatr +kino +muzeum +kaplica +kościół +zamek +most +droga + +Сложные слова на польском языке + +1. konstantynopolitańczykowianeczka +2. niezadogłębienieńskujący +3. antykontraatakujący +4. supersamoobsługiwalnymi +5. rozpierduchlanoculka +6. nieodezwawiałobyś +7. przystawieniowy +8. nieprzeżyciowakościami +9. nieprzekazywających +10. przeciwzakwaszeniowych +11. nieszczęściodrapańskiego +12. społeczno-wychowawczyniami +13. seledynowo-fioletowymi +14. przeciwdeszczową +15. mikroelektroniczno-kwalitacyjną +16. nieokreślonościowo-losowo-obiektywnie +17. zagubieniecioburakowatej +18. antyneuroleptyzanckim +19. nieupubliczniającymi +20. splądrowałbyś +21. konserwowano-spożywczymi +22. ożelośćiowo-miłosnej +23. nieprzyzwoitolicjią +24. nieodporowościę +25. rzeszołkofiołkowatymi +26. niezakapiactwuja +27. nieoszczędniewczelnianków +28. przekształconowaczkołępów +29. rozwińczywianiu +30. nieprzeskakiwalnościami +31. modernizująco-rewolucyjnego +32. nadzwyczajnieuzdolnionymi +33. przemocno-wsparciański +34. przepyszno-peltzerowskiego +35. kwestionowano-wzmocnieniami +36. nieodczynieństwującą +37. niezasłużonowypasionego +38. likwidującego/zarządzającego +39. szeszcześtoplutowanych +40. niewpadkowościowi +41. antynazizhownemu +42. nieuchronnieprzekroczeniowym +43. niezatrawialnieprzyjemnego +44. kardiopulmonologiczno-angiologów +45. gorączkowointensywnościowego +46. antykonstytucyjnorozpadowego +47. nieobawiamysię/źródleni +48. prerewolucyjnolphillipsowi +49. szóstkaniewygranych +50. nieupadkokogeneracyjnymi +51. społeczno-humanitarnarządzaniami +52. nieodziewowiędzy +53. przemocnochamować +54. społecznosensacyjnosądowym +55. przerażającorzymskiego +56. nieprzemontowanych/zamuzowych +57. referendumkonstytucyjno-reformujące +58. niezniesłowiałszymi +59. niebohaterystycznymi +60. produktodenarodowomenopauzalem +61. odrywającopierdolca +62. niegotowożywione +63. niepostronnynarodzonemu +64. przedniaautochtonicznym +65. nadciągniono-wchodzących +66. promocjostworczym +67. niezapowiadającychkoalicji +68. bezgłupinczłapie +69. wyomjaził +70. wagotonizacyjno-radiofonizowanego +71. gospodarczo-zasadotwórczej +72. skrupulatno-rzeźniczobardziej +73. samokiedy-konstytucyjnej +74. niedomętnością +75. nieoszustamiwykorzystana +76. przeprowadzonoświeckie +77. nieuniknionaobowiązkowo-plastycznej +78. poduszkowo-nicościowych +79. niepowodzeńbutmizeryjewego +80. skojarzeniowocolorowymi +81. przytułkamiwciągarkowych +82. wchodziłoprzeciwniepowszechny +83. karaublicznociągana +84. przedpolitycznilubelskim +85. niezapowiedziano-date-expanded +86. licznościłodziennej +87. niezawinieniomatołek +88. pakujączwobilardowego +89. rewersdopisek +90. przeprosinoworadosną +91. nieakceptacyjnoprospekcyjnymi +92. jedniżużytym +93. ainikopciksemilitechnikowany +94. motszynopiszącym +95. nieprzerejestrowanasezonowanie +96. słupotartackimoblikiem +97. nieodbieraniemniedostępności +98. dorozwinięcówkobiet +99. szybopojabytesłowickiego +100. przystępnoracjmujacych + +Слова с ошибками + +jedniiżużytym + +wiomjaził + +niezzniesłoowiałszymi + +superrsammoobsługiwalnymi + +przemoocnochamować + +staruszzka + +tiatr + +woina + +teleffon + +zołoto \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/pt_BR.txt b/Common/3dParty/hunspell/test/src/pt_BR.txt new file mode 100644 index 0000000000..6f39dbef64 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/pt_BR.txt @@ -0,0 +1,108 @@ +que +eu +não +de +você +para +ele +se +é +um +sim +por +isso +em +uma +uuma +está +como +com +bem +na +me +mas +do +era +quando +então +tudo +tydo +aqui +disse +estava +esâtava +lá +fazer +vai +sobre +vamos +homem +hollmem +bom +ok +agora +coisa +coissa +quero +foi +meu +seu +só +eles +as +posso +pocso +estou +mais +mim +certo +dizer +dizdizerr +os +no +sei +ela +vocês +sua +todos +sabe +minha +alguma +algyyma +casa +muito +oh +quallquer +qualquer +da +estamos +até +onde +onede +ao +tenho +nós +tem +tinha +tiinha +quê +ir +ou +pode +quer +vou +seus +dia +estão +nos +cabeça +quem +anos +depois +sou +vez +vá +fez +irmão +câmera +câmeara \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/pt_PT.txt b/Common/3dParty/hunspell/test/src/pt_PT.txt new file mode 100644 index 0000000000..ed038092d0 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/pt_PT.txt @@ -0,0 +1,135 @@ +pan +manteiga +menteiga +queijo +salchichón +saуlchichón +óleo +pimenta +pimmenta +sal +baga +mel +geléia +cogumelo +cebola +cóbola +banana +cenoura +pêra +beterraba +frutas +melão +melancia +bolo +chocolate +carne +batatas +salada +salóda +tomate +pepino +pipino +col +mingau +sopa +sanduíche +refrigerante +refrigarante +água +café +chá +leite +suco +scuco +maçã +uvas +laranja +abacaxi +adacaxi +damasco +demasco +açucar +arroz +macarrão +res +porco +frango +costeleta +cãsteleta +limão +ervilha +pão +peixe +caramelo +sorvete +nogueira +ovo +pêssego +xícara +xíícara +vidro +prato +colher +garfo +faca +pires +garrafa +guardanapo +café da manhã +almoço +jantar +avião +carro +bonde +ônibus +trem +bicicleta +janeiro +fevereiro +fevíreiro +março +abril +maio +junho +julho +agosto +setembro +setembra +outubro +novembro +dezembro +desembro +caneta +livro +xadrez +telefone +relógio +pente +televisão +ferro +sabão +rádio +bolsa +cartão +mala +presente +câmera +computador +camputador +filme +flor +vaso +quadro +lenço +bola +balão +brinquedo +brinqueedo +conta +sobre +papel +pepel +jornal +letra +bilhete \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/ro_RO.txt b/Common/3dParty/hunspell/test/src/ro_RO.txt new file mode 100644 index 0000000000..2cd141c941 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/ro_RO.txt @@ -0,0 +1,210 @@ +casă +copil +carte +masă +școală +lumină +apă +munte +soare +lună +pâine +fruct +floare +stradă +mașină +aer +timp +zi +noapte +nor +vânt +ochi +gură +nas +mână +picior +inimă +sânge +cap +ureche +voce +melodie +culoare +formă +linie +cerc +dreptunghi +cercetare +știință +limbă +frază +literă +cifră +număr +sunet +zgomot +telefon +internet +computer +program +ecran +tastatură +mouse +joc +sport +muzică +artă +film +televizor +radio +planetă +stea +univers +galaxie +atom +moleculă +substanță +energie +lumină +căldură +frig +aparat +instrument +mașinărie +unelte +hrană +băutură +haine +pantofi +păr +piele +ochelari +ceas +bijuterie +pământ +apă +aer +foc +metal +lemn +piatră +hârtie +cerneală +pix +carte +cadru +tablou +sculptură +model +formă +anticonstituționalitate +dezvoltare +inexpugnabil +nefast +concomitent +antiseptic +recalcitrant +perseverență +extravagant +inexorabil +colosal +plauzibil +efervescent +perspicacitate +superfluu +subversiv +incoruptibil +inefabil +hiperbolic +indefectibil +peremptoriu +ambivalent +paradoxal +heterogen +indiferent +periferic +subliminal +ultraviolet +indeferent +conglomerație +circumstanțial +contraproducător +conglomerat +insurmontabil +intransigent +insidios +inerent +consternant +ambiguitate +inerție +inconsolabil +oniric +remarcabil +repudiat +subiectiv +periculos +infatigabil +abnegare +exuberant +facet +represiune +implacabil +indiferent +infatigabil +insolit +intempestiv +incandescent +letargic +magistral +magnanim +nefast +oblivial +oportun +periculos +plutitor +propice +reprobabil +risipitor +robust +salutar +simetric +solicitant +stringent +sufocant +superficial +tranzitoriu +tributar +trivial +umilitor +unic +vehement +vernal +vicios +victorios +vindicativ +virtuos +vizibil +volatil +vorace +vulnerabil +xenofob +xerofil +yonder +yang +yodel +zonal +zodiac +zoon +zoomorf +zurbagiu +Caaă +Soaare +Cartr +Appă +Coopil +Frumoss +Feriсire +Prietenn +Muziică +Exeplu diff --git a/Common/3dParty/hunspell/test/src/ru_RU.txt b/Common/3dParty/hunspell/test/src/ru_RU.txt new file mode 100644 index 0000000000..28d99377fc --- /dev/null +++ b/Common/3dParty/hunspell/test/src/ru_RU.txt @@ -0,0 +1,197 @@ +должен +доллжен +наш +думаю +думмаю +свою +сам +всем +ни +нас +пока +этом +этой +ваша +всеми +возьми +моей +сама +вся +день +само +всей +бывает +себе +пойду +куда +ими +твоей +всю +своего +твой +пусть +ним +про +точно +иметь +которые +тогда +сюда +наше +самой +взять +наверное +домой +совсем +те +тобой +наверно +что-то +будто +твои +пути +дома +такие +тех +такое +его +самой +вашей +наверное +мои +например +типа +значит +люблю +минут +пор +случае +искусство +лучше +того +такому +ждать +видеть +мною +ждал +имя +важно +чего-то +самому +обычно +представляет +мечтать +стало +помните +взять +моих +самим +своим +вообще +самими +здесь +обратно +сразу +таким +ежели +наоборот +куда +таков +мечтает +значит +покажи +такими +кстати +почти +всякий +научит +вдоль +тогдашний +толком +занимает +Аквапланирование +Барокамера +Библиографирование +Биосинтез +Взаимодействующий +Вибраторный +Виртуальность +Вооруженность +Господствующий +Десантно-штурмовой +Диагностировать +Дипломатический +Дисгармония +Дискриминационный +Достопримечательный +Жизнеустройство +Интернациональный +Инфицированный +Кальцинировать +Ключичный +Коннотация +Лиловатый +Люминесцентный +Метрополитен +Многоплановый +Модернизировать +Наивысший +Наименее +Неопределенный +Нераскрытый +Неоднократный +Неохотно +Непостижимый +Неусыпный +Обезьяноподобный +Обзавестись +Оптический +Оптимизировать +Осуществиться +Очистительный +Парафинировать +Переключатель +Пограничный +Подготовительный +Подрядчик +Полиморфный +Почитать +Преисполниться +Преподаватель +Преследователь +Прирожденный +Проектирование +Профанация +Разграничительный +Распоряжающийся +Реконструктивный +Революционный +Рентгенологический +Рискованный +Роскошествовать +Самоунижение +Сверхъестественный +Светочувствительный +Семантика +Сингулярность +Совершенствовать +Соединительный +Сосуществование +Спорообразующий +Стационарный +Столовая +Сторицей +Сцепной +Трансформирующий +Триумвират +Укротитель +Универсальный +Федеративный +Хронометраж +Целостность +Криумвират +Укратитель +Универссальный +Фидиративный +Хранометраж +Целосность diff --git a/Common/3dParty/hunspell/test/src/sk_SK.txt b/Common/3dParty/hunspell/test/src/sk_SK.txt new file mode 100644 index 0000000000..1bc44a6dda --- /dev/null +++ b/Common/3dParty/hunspell/test/src/sk_SK.txt @@ -0,0 +1,205 @@ +hiša +pes +mačka +avto +drevo +knjiga +šola +prijatelj +mama +oče +otrok +jabolko +čokolada +kava +čaj +telefon +televizija +računalnik +glasba +šport +zdravje +lepota +delo +ljubezen +sreča +čas +denar +jezik +država +mesto +zima +poletje +jesen +pomlad +morje +gore +jezero +reka +park +žival +ptica +riba +les +zlato +srebro +kovina +steklo +čevlji +obleka +hlače +srajca +kapa +plašč +roka +noga +oko +uho +nos +ustnice +zob +glava +srce +možgani +kralj +kraljica +princ +princesa +fant +dekle +moški +ženska +starec +starka +zdravnik +medicinska sestra +učitelj +učenka +študent +študentka +kuhar +natakar +vojna +mir +zemljevid +zastava +smeh +jok +spanje +sanje +delo +učenje +umetnost +gledališče +kino +muzej +kapela +cerkev +grad +most +cesta + +Сложные слова + +1. Neparlamentarna +2. Samozadosten +3. Nepristranski +4. Pretirano +5. Nepredušno +6. Nesreča +7. Razpršeno +8. Nesprejemljiv +9. Prekomeren +10. Prostovoljstvo +11. Izolirati +12. Trmast +13. Brezpogojno +14. Neodvisnost +15. Skupnost +16. Neizvedljiv +17. Nelegitimen +18. Nevzdržen +19. Preobremenjenost +20. Ogrevalni sistem +21. Preoblikovati +22. Nezaslišano +23. Neugoden +24. Prezasedenost +25. Nesreča +26. Neupravičeno +27. Mednaroden +28. Kompatibilnost +29. Neuspeh +30. Neobvladljiv +31. Neskončen +32. Neprimeren +33. Amortizacija +34. Koncentracija +35. Cirkulacija +36. Obremenitev +37. Gromozanski +38. Simbol +39. Vinjeta +40. Digitalizacija +41. Funkcionalnost +42. Rentabilnost +43. Ekshibicionizem +44. Frustracija +45. Neprilagodljiv +46. Severnoameriški +47. Ekskluzivnost +48. Preverjanje +49. Celoživljenjsko +50. Privlačnost +51. Periferija +52. Sokrivda +53. Kompromis +54. Strpnost +55. Racionalizacija +56. Birokracija +57. Odraslost +58. Stabilnost +59. Nepredvidljivost +60. Razkošje +61. Smrtnost +62. Obveščenost +63. Produktivnost +64. Neugodje +65. Zapletenost +66. Hegemonija +67. Umetnost +68. Tranzicija +69. Individualnost +70. Kontaminacija +71. Inkubacija +72. Prikrito +73. Etnični +74. Sovražnost +75. Atraktivnost +76. Nestrpnost +77. Divergenca +78. Digitalna pismenost +79. Stabilizacija +80. Raznolikost + +Слова с ошибками + + Kontamenacija + + Grommozanski + + Neobvladlliv + + Neparlametarna + + Nevrzdržen + + voina + + muzei + + ryba + + serebro + + televiziia \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/sl_SI.txt b/Common/3dParty/hunspell/test/src/sl_SI.txt new file mode 100644 index 0000000000..3a2674932d --- /dev/null +++ b/Common/3dParty/hunspell/test/src/sl_SI.txt @@ -0,0 +1,210 @@ +Hiša +Sonce +Miza +Stol +Ptica +Trava +Drevo +Noč +Luna +Morje +Gora +Cvet +Riba +Rdeča +Modra +Zelena +Rumena +Bela +Črna +Kamen +Pes +Mačka +Roka +Noga +Glava +Oči +Uho +Nos +Usta +Jabolko +Hruška +Sliva +Jagoda +Malina +Lubenica +Kruh +Mleko +Sir +Mesnica +Sadje +Zelenjava +Voda +Zrak +Ogenj +Sneg +Dež +Oblak +Veter +Zima +Poletje +Jesen +Pomlad +Zajec +Lisica +Volk +Medved +Lev +Tigrica +Slon +Konj +Krava +Ovca +Piščanec +Jajce +Mleko +Kava +Čaj +Sok +Vino +Pivo +Hrana +Pecivo +Testo +Marmelada +Kruh +Sir +Olje +Sol +Poper +Sladkor +Kava +Čaj +Vino +Pivo +Šola +Učitelj +Učenec +Knjiga +Pisarna +Računalnik +Telefon +Glasba +Slika +Film +Gledališče +Mesto +Vas +Trg +Cesta +Reka +Avtomatizacija +Razvoj +Komunikacija +Kompjuter +Programiranje +Elektronski +Inženiring +Elektrifikacija +Kombinacija +Sistem +Informacija +Univerza +Biblioteka +Univerzitetni +Laboratorij +Raziskava +Razvojna +Inovacija +Intelektualni +Integriteta +Izobraževanje +Izvajanje +Preverjanje +Tehnologija +Implementacija +Program +Sodelovanje +Proizvodnja +Industrija +Organizacija +Administracija +Proaktivnost +Kreativnost +Projektni +Razumevanje +Kvaliteta +Upravljanje +Ocenjevanje +Statistika +Kompetentnost +Konsolidacija +Realizacija +Kapaciteta +Distribucija +Kompatibilnost +Konceptualizacija +Povezava +Posodobitev +Fleksibilnost +Ekonomija +Organiziranje +Konkurenca +Stabilnost +Ekologija +Osebnost +Zavzetost +Entuziazem +Motivacija +Avtorizacija +Kreacija +Akumulacija +Monotonija +Diferenciacija +Transformacija +Koncentracija +Inovativnost +Aktivnost +Vzpostavljanje +Reorganizacija +Kategorizacija +Partikularnost +Homogenost +Izjemenost +Generalizacija +Hierarhija +Koordinacija +Inspiracija +Evaluacija +Ustvarjalnost +Oblikovanje +Kompatibilnost +Konkretizacija +Proaktivnost +Identifikacija +Kapaciteta +Intervencija +Konsolidacija +Realizacija +Eksplozivnost +Abstrakcija +Individualnost +Integracija +Segmentacija +Asimilacija +Artikulacija +Kolaboracija +Asociacija +Stabilizacija +Kooperacija +Transformacija +Hšza +Kmojnikacija +Progrramiranjee +Elektornkski +Inženeirrng +Izzobraževanjee +Infomracija +Razvoojnaa +Proizvdonja +Akitvnostt \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/sr_Cyrl_RS.txt b/Common/3dParty/hunspell/test/src/sr_Cyrl_RS.txt new file mode 100644 index 0000000000..9002894db6 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/sr_Cyrl_RS.txt @@ -0,0 +1,227 @@ +кућа +пас +мачка +аутомобил +дрво +књига +школа +пријатељ +мама +тата +дете +јабука +чоколада +кафа +чај +телефон +телевизија +рачунар +музика +спорт +здравље +лепота +посао +љубав +срећа +време +новац +језик +земља +град +зима +лето +јесен +пролеће +море +планине +језеро +река +парк +животиња +птица +риба +дрво +злато +сребро +метал +стакло +ципеле +одећа +панталоне +кошуља +капа +капут +рука +нога +око +уво +нос +усне +зуб +глава +срце +мозак +краљ +краљица +принц +принцеза +дечак +девојчица +мушкарац +жена +старац +старица +доктор +медицинска сестра +наставник +ученик +студент +студенткиња +кувар +конобар +рат +мир +мапа +застава +смех +плач +сан +сањарење +посао +учење +уметност +позориште +биоскоп +музеј +црква +дворац +мост +улица +пут + +Сложные слова + +Конечно! Вот сто сложных слов на сербском языке на кириллице: + +1. Контраст +2. Компликација +3. Конструкција +4. Диспропорција +5. Корелација +6. Колаборација +7. Консервативан +8. Диференцијација +9. Експерименталан +10. Инвалидитет +11. Легитиман +12. Оптимизација +13. Компетентан +14. Документација +15. Персистентан +16. Апроксимација +17. Екстраваганција +18. Катастрафалан +19. Резервација +20. Прогресиван +21. Идентификација +22. Генерација +23. Криминалистички +24. Дестабилизација +25. Корумпиран +26. Конфронтација +27. Експлозиван +28. Функционалан +29. Релевантан +30. Квалификација +31. Акредитација +32. Петиција +33. Каустичан +34. Периодичан +35. Контроверзан +36. Гигантски +37. Принципијалан +38. Управоливост +39. Имунизација +40. Магнетичан +41. Оперативан +42. Десант +43. Хиерархија +44. Феминистички +45. Сегментација +46. Колоритан +47. Деградација +48. Диверзификација +49. Казуистички +50. Реципрочан +51. Манипулативан +52. Екстензиван +53. Колективни +54. Каузалитет +55. Синхронизација +56. Кампања +57. Товарни +58. Хируршки +59. Шампионат +60. Геостационаран +61. Опустошан +62. Клема +63. Стационарни +64. Секуларни +65. Исегментација +66. Дебелина +67. Прецизан +68. Рафиниран +69. Психолошки +70. Турбулентан +71. Интегритет +72. Идеолошки +73. Манифестација +74. Имплицитан +75. Хомогеност +76. Изолација +77. Хетерогеност +78. Спекулативан +79. Вагу +80. Математички +81. Гематолошки +82. Психијатријски +83. Блокада +84. Заплена +85. Монопол +86. Дисидент +87. Екстрадиција +88. Ревизија +89. Ваидан +90. Колонизација +91. Мотивација +92. Просек +93. Ресурс +94. Хуманизам +95. Дравски +96. Коалиција +97. Картеля +98. Резолуција +99. Менталитет +100. Епидемиологија + +С ошибками + + Колонизакаија + + Епидемиогија + + Казуистикаки + + Хуманкзам + + Манитулативан + + сањваење + + утење + + автомобил + + мекицинска сестра + + стукло \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/sr_Latn_RS.txt b/Common/3dParty/hunspell/test/src/sr_Latn_RS.txt new file mode 100644 index 0000000000..48cd99d072 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/sr_Latn_RS.txt @@ -0,0 +1,173 @@ +ananas +anarhistički +antidepresiv +Anđeo +avion +banana +banka +belina +bespomoćnost +bibliotekar +bibliaoteikar +brod +citat +crkva +cvet +cveće +demokratija +demackratija +demokratizacija +Dobrota +dom +Dragi +ekran +eksperimentalni +eksplozija +epidemiologija +farmakologija +filantropija +flaša +frizura +fudbal +garaža +generalitet +geografski +globalizam +gnezdo +grad +građanstvo +grlo +hamburger +Harmonija +himalaji +hiperbola +hipotermija +hleb +Hrabrost +hrana +Hvala +igra +igračka +individualnost +infrastruktura +internet +inmternet +jabuka +jahač +jastuk +jednakost +jubilej +jurisprudencija +kafa +krevet +kriminalisticki +kriminalistika +kuća +kvantitativni +lampa +latiaratura +Lepota +lingvistika +literatura +ljubav +Ljubavi +ljubavnica +Ljubazan +Ljubim +lubenica +majica +majka +mašina +mikroorganizama +mikroskopija +Milost +Mir +Mirno +nacionalizam +nedopustiv +neurologija +novčanik +noć +nož +oktobar +okultizam +optimističan +optimističnost +ormar +Osoba +oči +pas +peškir +planina +poniženje +Porodica +Prijatelj +psihologija +psihoterapija +Radost +računar +reka +rekonvalescencija +reumatologija +revolucija +sendvič +Slatko +Sloboda +Slobodan +Snaga +socijalizacija +socijalizam +Spreman +Sreća +Srećan +Srećno +sunce +superiornost +Svetlost +tata +tehnologija +telefon +telekomunikacije +top +tradicionalni +ulica +univerzalnost +univerzitet +univirzdalnost +Usmena +Znanje +usta +Vedar +vegetarijanstvo +velikodušnost +voda +voz +Zabava +zavisnost +Zdravlje +zemlja +Zima +zjmlja +zločinački +zoološki +Zvezda +ćilim +čarapa +čarobnjak +časopis +čizme +đak +đevrek +đumbir +šešir +šišmiš +škola +šljiva +šuma +žaba +ženskara +žirafa +život +životinjski +žurka + diff --git a/Common/3dParty/hunspell/test/src/sv_SE.txt b/Common/3dParty/hunspell/test/src/sv_SE.txt new file mode 100644 index 0000000000..99b61d1576 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/sv_SE.txt @@ -0,0 +1,210 @@ +Hus +Sol +Mjölk +Vatten +Fisk +Stol +Grön +Blomma +Träd +Katt +Hund +Bok +Cykel +Kaffe +Frukt +Kött +Fönster +Dörr +Säng +Lampa +Bord +Hår +Ögon +Hand +Fötter +Näsa +Mun +Öra +Huvud +Arm +Ben +Kläder +Hatt +Skor +Väska +Papper +Penna +Skrivbord +Telefon +Radio +Musik +Film +Teater +Konst +Sport +Spel +Resa +Bil +Tåg +Buss +Flygplan +Båt +Stad +Land +Hav +Sjö +Flod +Berg +Dal +Park +Skog +Sjukhus +Apotek +Skola +Universitet +Affär +Restaurang +Café +Hotell +Turist +Vän +Familj +Mamma +Pappa +Bror +Syster +Barn +Morfar +Mormor +Vänster +Höger +Framåt +Bakåt +Upp +Ner +Snäll +Osnäll +Glad +Ledsen +Trött +Stark +Svag +Tyst +Bullrig +Ren +Smutsig +Vacker +Ful +Liten +Stor +Komplexitet +Oproportionerlig +Ovillkorlig +Efterklokhet +Komplicerad +Desorientering +Konstellation +Otillgänglighet +Irreversibel +Förlåtelse +Overksamhet +Indifferent +Hierarki +Kombinatorik +Inkompatibilitet +Absorption +Konsekvens +Verklighetsfrånvänd +Retrospektiv +Förändringsbarhet +Ambivalens +Besvikenhet +Ineffektivitet +Intrikat +Dilemma +Hesitation +Absurditet +Kompromisslös +Konsolidering +Föresats +Tillfredsställelse +Delegering +Rekommendation +Detaljrikedom +Oanvändbar +Stagnation +Nostalgi +Hemlighetsfull +Avsaknad +Perseverans +Existentialism +Repetitivitet +Intolerans +Anonymitet +Obetydlig +Paradox +Förvirring +Juxtaposition +Reflektion +Självständighet +Kollision +Kreativitet +Djupgående +Abstraktion +Eufori +Autentisk +Insinuation +Omöjlig +Pessimism +Inkonsekvens +Revisionism +Sensationell +Obeveklig +Subjektivitet +Universalitet +Entropi +Omvälvande +Infiltration +Konservativ +Atypisk +Provokation +Konfrontation +Anarki +Konkurrenskraft +Defensivitet +Nihilism +Konklusion +Apori +Korrespondens +Prioritering +Exponentiell +Fragmentering +Aversion +Harmoni +Vanmakt +Signifikans +Katalysator +Förlust +Enhällighet +Ambition +Tendens +Alienation +Artificiell +Uppfyllelse +Psykosomatisk +Virtuos +Egensinnig +Anpassning +Hållbarhet +Konstitution +Kompleksitet +Oproporsjonerlig +Uvilkorlig +Etterklokhed +Komplisert +Desorientering +Konstelasjon +Utilgjengelighet +Irreversibel +Forlatelse diff --git a/Common/3dParty/hunspell/test/src/tr_TR.txt b/Common/3dParty/hunspell/test/src/tr_TR.txt new file mode 100644 index 0000000000..9ad60f3664 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/tr_TR.txt @@ -0,0 +1,205 @@ +Akşam +Almak +Altın +Anahtar +Anlamak +Araba +Atmak +Ayakkabı +Açmak +Ağaç +Bahçe +Bakır +Bakkal +Bakmak +Balık +Beyaz +Bilgisayar +Bilmek +Binmek +Bulmak +Ceket +Cevaplamak +Deniz +Dinlemek +Doktor +Duyurulmamış +Düzenleştirme +Düşmek +Düşünmek +Ekmek +Elbise +Eldiven +Elma +Erkek +Etek +Etmek +Ev +Eşarp +Gelgit +Geliştiricilikle +Geliştirilebilir +Geliştirme +Gerçekleştirme +Gezmek +Geçmek +Gitar +Gitmek +Giymek +Gri +Gömlek +Görülebilirlik +Görünümlü +Görünüşlü +Gözlük +Gümüş +Günaydın +Hareketlendi +Hareketlilik +Hava +Hayalperest +Hüzün +Kahve +Kahverengi +Kalabalıklar +Kalem +Kalkmak +Kalmak +Kapatmak +Kararlılık +Kararlılıkla +Kararsızlık +Kararsızlıkla +Karpuz +Kedi +Kemer +Kemdkcer +Kırmızı +Kitap +Kız +Kızgınmak +Koklamak +Koalye +Kolye +Konservatuvar +Konuşmak +Korkmak +Koymak +Koşmak +Kravat +Kullanılabilir +Kullanılmış +Kullanılmışlık +Kullanışlılık +Kurumsallaşma +Köpek +Küpe +Kütüphane +Mavi +Mazbut +Melankoli +Merdiven +Merhaba +Merhabalar +Meurhaba +Meydan +Meyhane +Meyve +Mor +Muhafazakar +Muhteşem +Mukadderatlarınızdanmışçasına +Muvaffak +Muzaffer +Muzafferiyet +Muzip +Mükemmeldik +Münasebet +Münzevi +Müsrif +Mütevazi +Müteessir +Mütercim +Mütereddit +Mütevazı +Müzmin +Okul +Okumak +Otobüs +Otoriterlik +Oynamak +Pantolon +Pasta +Pembe +Pembei +Plaj +Platin +Saat +Sandalye +Sarı +Satmak +Sevinmek +Sevmek +Sıcak +Sıradaymışız +Siyah +Sormak +Soymak +Soğuk +Su +Sükûnet +Sürrealist +Süt +Tabak +Tadına bakmak +Tatlı +Tavuk +Telefoncu +Televizyon +Temizlemek +Teşekkürler +Türkuaz +Tuirkuazu +Turuncu +Tutmak +Ulaştırılabilir +Uygulanabilir +Uyumak +Uçak +Yapmak +Yatak +Yazmak +Yemek +Yeşil +Yıkanmak +Yıldız +Yol +Yöneltilmezken +Yüzme +Yüzük +Zenginleştirmek +Çalışamamıştı +Çalışmak +Çalışmamıştır +Çanta +Çay +Çıkarmak +Çiçek +Çorap +Özelleştirilmiş +Özelleştirme +Özgürleştirme +Üzülmek +İnmek +İsteksizlik +İsteksizlikle +İstikrarlı +İstikrarlılık +İstisnai +İslamiyetle +İzlemek +İçmek +İşbirliği +İşitmek +Şapka +Şemsiye diff --git a/Common/3dParty/hunspell/test/src/uk_UA.txt b/Common/3dParty/hunspell/test/src/uk_UA.txt new file mode 100644 index 0000000000..b139dedfbd --- /dev/null +++ b/Common/3dParty/hunspell/test/src/uk_UA.txt @@ -0,0 +1,210 @@ +абдукція +абіогенез +амбівалентнасть +амбівалентність +анахранізм +анахронізм +антропогенез +антропологія +антропоморфізм +апатія +археологія +архетип +аскетизм +астрономія +афект +бачити +бігти +білий +біллий +біологія +бувай +будинок +будь ласка +бути +важко +велиикий +великий +веселка +взяти +вибачте +відчувати +вода +волюнтаризм +втаємниченість +вчитися +гарний +гарячий +гегемонія +географія +герменевтика +герменевтика +гештальт +говорити +гойдалка +готувати +грати +дати +дедукція +деконструктивізм +деконструкція +демаркація +детермінізм +дзвіночок +дивитися +дисгарммонія +дисгармонія +дисфункція +дисфункця +дихотомія +до побачення +добрий +доктрина +думати +дурний +дурня +дякую +евфемізм +езотерика +ей +екзистенціалізм +екзистенціалізм +екзистенцілізм +екзистенція +економіка +емерджентність +ентелехія +епістемологія +ефемерність +ефемерність +занепадництво +звісно +здоровий +зелений +йти +ілюзорність +ілюзорність +імплікація +інвектива +індукція +інтроспекціїя +їсти +історія +каблучка +кава +казус +калюжа +катарсис +каченя +каштани +квітка +кішка +класно +книга +когнітивістика +комаха +консенсус +космогенез +купувати +легко +лінгвістика +літати +маленький +марнослів'я +математика +мати +метаморфоза +метелик +метелиця +містифікація +місто +могти +можливо +мусити +насправді +не радий +незворушність +ні +нігілізм +новий +нонсенс +ностальгія +павучок +парадокс +пес +писати +пити +піти +плавати +плакати +повільний +поганий +політологія +постмодернізм +потворний +працювати +привіт +прийти +психоаналіз +птах +радий +ремінісценція +рефлексія +робити +розбурхання +розумний +сильний +сингулярність +синестезія +синій +синішй +синкретизм +сказати +скатертина +слабкий +слухати +сміятися +сніг +соліпсизм +соломинка +сонечко +сонце +соціологія +спати +співати +справді +старий +структуралізм +сумний +так +так +танцювати +телефонувати +тож +трансцендентність +фантастично +фаталізм +фемінізм +феномен +феноменологія +фізика +філософія +фрактал +хворий +хімія +хліб +хліб +ходити +холодний +хотіти +чао +червонй +червоний +черевики +читати +чорнй +чорний +чути +швидкий +щасливий +яблуко diff --git a/Common/3dParty/hunspell/test/src/uz_Cyrl_UZ.txt b/Common/3dParty/hunspell/test/src/uz_Cyrl_UZ.txt new file mode 100644 index 0000000000..b92bea172f --- /dev/null +++ b/Common/3dParty/hunspell/test/src/uz_Cyrl_UZ.txt @@ -0,0 +1,262 @@ +Mарт +Ёз +Ём +Ёхуд +Август +Адвакат +Адреси +айтган-лирангиз +айқин +амалга +анча +Апрел +арзонроқ +аҳамият +аҳднома +бажарилади +бажарилди +баланд +ихтисослан +банкрот +баҳона +Баҳор +бераман +берасизми +беринг +бериш +бешинчи +биз +Бизга +Бизнинг +билан +Бирор +Бозорнинг +бор +бошқа +Бу +Бугун +будингиз +бунга +бундай +Бухгалтерлик +бўлади +бўладими +бўлиши +бўлмаган +бўлса +бўш +бўшайди +бўшатасиз +вазифасига +вазият +вариант +вақт +газетадаги +газетадан +даромад +Декабрь +Душанба +Эрталаб +Етказиб +Жисмоний +Жуда +Жума +зарур +зиёфат +Ижара +ижарага +икки +Илтимос +Индинга +информатизациялари +Иситгич +иши +ишлатсак +Ишхона +Июль +Июнь +Йўқ +йил +йилдан +кам +Шинамгина +кампанияси +келдим +келишимдан +келмоқчи +келсам +келтириш +керак +керакдир +керакми +кета-ди +кеч +Кеча +кечага +Кечаси +Кечир +Кечирдинг +кирла +кирадими +кондиционер +коррупциядир +кран +Куз +Кун +куни +кўрмоқчи +кўчиб +лойиҳа +Май +маълумоти +маълумотларни +Маъмурият +маъруза +Мен +музлатгич +мумкин +муфмкин +мутахассис +мушовир +муҳим +нарса +нархи +Нархини +нақд +ўшанақасини +неча +Номардлик +Ноябри +интернетдаги +ойнаси +ойнинг +Октябри +олдин +олдиндан +олмаймиз +олмоқчи +орқали +шоти +шорти +Оқшом +пайдо +Панжшанба +пулини +Раҳмат +резюме +реклама +Салом +Сармоядор +Сентябрь +Сешанба +Сиз +сизга +сизда +Сизнинг +синган +сифатида +совуқ +софвуқ +Солиқларни +Статистик +сўм +тажрибали +тайёргарлик +тайёрладик +тайёрладингизми +таклиф +талафот +талафоти +таъминловчилардан +танишинг +таржимон +тарржимон +тахминан +ташкил +Телефонни +технология +Безантирани +тозалан +тозалигига +Тонгда +топширишимиз +топшириқ +турли +турмоқчи +тутсак +Тушлик +ўладиганингиз +тўлай +тўлаймиз +тилдиришинг +тўлиқ +уйингиз +уйни +уч +учун +ўқидим +фақат +Феврал +хабар +Хайрли кун +Мотамхонаси +хонлик +Чек +Чоршанба +Шанба +шарт-номани +шартини +шартлар +шартлари +шартни +шартнома +шахс +шовқин +Шом +Шу +эди +Эртага +Эртадан сўнг +Эшитишимга +эълон +эълонингиз +эълонингизни +эътироф +Юклаш +Якшанба +Январи +Ярим кеча +яхши +қабул +қаерда +Қанақа +қаноатманда +қанча +қачон +қизиқарлидир +қиламиз +қилганим +қилдим +қилинг +қилинди +қилишди +қиммат +қиммати +Қимматидан +қирқ +Қиш +қувонарлими +қўнғироқ +Қўшимча +ҳайвонини +ҳам +ҳамза +Ҳар +ҳафтага +ҳақиқатан +ҳисоблаб +Ҳозир +ҳужжатни +Ўтган кун + + diff --git a/Common/3dParty/hunspell/test/src/uz_Latn_UZ.txt b/Common/3dParty/hunspell/test/src/uz_Latn_UZ.txt new file mode 100644 index 0000000000..ee6a1d9356 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/uz_Latn_UZ.txt @@ -0,0 +1,200 @@ +Salom +Sallom +Rahmat +Rhmat +Iltimos +Iltimo +Kattalar +Kattalarvf +Yaxshi +Yashi +Kelajak +Keljajak +Oilaviy +Oilaaviy +Qarindosh +Qarinndosh +Shahar +Shaha +Dengiz +Dengizzz +Quyosh +Quyyosh +Yulduz +Oyim +Kechqurun +Tushun +Suvchi +Sharob +Choyxona +Nonushta +Tushlik +Muzqaymoq +Desert +Tuzluq +Mevalar +Sabzavot +Baliq +Tuxumli +Sabza +Sariq +Salatlar +Shirinlik +Shokolad +Rishta +Kakao +Pishloq +Tort +Qaymoq +Sutli +Qatiq +Salomatlik +Temir +Zahar +Oqimli +Shamol +Olov +Yer +Osmon +Shanba +Dushanba +Seshanba +Chorshanba +Payshanba +Juma +Yakshanba +Oltin +Tong +Bomdod +Asr +Shom +Kun +Oqsoqol +Shoshqaloq +Kulgili +Muxlislilar +Tavsiflash +Tuzilishga +Mustaqillik +Tushuntirish +Boshqarish +Mashhurlik +Tarkibiy +Tahlil +Ishchi +Xalqaro +Tarjima +Mustahkamlik +Chaqaloq +Istiqbol +Tasvir +Taklif +Tasavvur +Jiddiy +Majburiyat +Asosiy +Tahdid +Tushunmovchilik +Ishonch +Maqomi +Ijodkor +Tadbirkor +Hayotiy +Mashhur +Bemorlik +Tadbir +Jismoniy +Madaniyat +Xavfsizlik +Sifatli +Suvli +Sotuvchi +Chetel +Tashqi +Sotuv +Tarbiyalanish +Murabbo +Sariqcha +Qovun +Shaharlik +Muhimlik +Tarbiyachilik +Xatolik +Balandlik +Yuzaki +Kuyov +Qiziquvchan +Orzular +Mashq +Qalampir +Muammo +Sadoqatli +Yovuzlik +Fikr-mulohaza +Boylik +Tushuncha +Zanjir +Eslatma +Tabassum +Ishonuvchi +Chidamlilik +Ilova +Birodarlik +Oqilona +Ijodiyot +Tayanch +Hurmat +Baxtli +Tajriba +Samimiylik +Shifokor +Ishrat +Baho +Namoyish +Qiyinchilik +Bolalar +Ishonchli +Taqdir +Shovqinli +Xalqaro +Baxt +Fursat +Hurmatli +Qulaylik +Zamonaviy +Sadoqat +Sabr +Nikoh +Jasorat +Barkamollik +Dunyoqarash +Omadli +Foydali +Yorqin +Mehribonlik +Fazilatli +Kutubxona +Istiqomatli +Fido +Bahor +Shafqatsizlik +Tafakkur +Fazilat +Qochish +Laziz +Uzoq +Ilhom +Omad +Hurmatli +Tandir +Sherzod +Bahoriy +Dilshod +Baxtli +Shonli +Nurli +Shafqatsizlik +Oqqush +Boylik +Toza +Sabrli diff --git a/Common/3dParty/hunspell/test/src/vi_VN.txt b/Common/3dParty/hunspell/test/src/vi_VN.txt new file mode 100644 index 0000000000..2982e9eb45 --- /dev/null +++ b/Common/3dParty/hunspell/test/src/vi_VN.txt @@ -0,0 +1,128 @@ +Bánh +Bang +bênh +bướng +bậy +Chanh +chum +chuyện +chép +Chùng +chắp +chệnh +chới +chữ +công +cạc +cột +cứu +Doanh +duyên +dùng +dể +dọng +gia +giày +giêng +Giảng +giềng +hon +Hoẳn +Hài +hôm +hước +hấu +hớt +hữu +Khiển +Khoào +khuya +khuyến +khách +khén +khẩn +khắp +khựng +kẻo +lang +liền +Loàng +Luỗng +lình +lương +lấp +lệnh +lịnh +lốn +lời +lựng +Muộn +Mãnh +mại +mạn +mổ +mởn +nghiễm +nghều +Ngoáy +Nguyên +ngóp +người +ngỏ +ngớp +ngụa +ngửng +nhiếp +nhu +nhà +nhân +Nhóm +nhưỡng +nhắm +nhổn +nhứt +ninh +noi +nãy +nạn +nốt +ong +pao +phiên +phiêu +Phên +Phương tiện +phẩm chất +phố đi bộ +quan trọng +quyền lợi +quán cà phê +quảng cáo +Quốc +Quốc tế +riêng biệt +rưỡi +Rải +Rẻng +rộng rãi +siễn +sum +Sõng +Sưu +sưu tập +sử dụng +Thiệt thòi +Thuộc về +thuộc tính + +Слова с ошибками +thiệte +quốq tế +nguên +khoao +chenh +chhùng +man +doah +khien +ngoay \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/test.pro b/Common/3dParty/hunspell/test/test.pro new file mode 100644 index 0000000000..2dee3f6970 --- /dev/null +++ b/Common/3dParty/hunspell/test/test.pro @@ -0,0 +1,29 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2015-07-21T18:28:42 +# +#------------------------------------------------- + +QT -= core gui + +TARGET = test +CONFIG += console +CONFIG -= app_bundle + +DEFINES += KERNEL_USE_DYNAMIC_LIBRARY + +TEMPLATE = app + +CORE_ROOT_DIR = $$PWD/../../../.. +PWD_ROOT_DIR = $$PWD +include($$CORE_ROOT_DIR/Common/base.pri) +include($$CORE_ROOT_DIR/Common/3dParty/icu/icu.pri) + +ADD_DEPENDENCY(UnicodeConverter kernel hunspell) + +core_windows:LIBS += -lgdi32 -ladvapi32 -luser32 -lshell32 +core_linux:LIBS += -lz + +SOURCES += main.cpp + +DESTDIR = $$PWD/build diff --git a/Common/3dParty/icu/icu.pri b/Common/3dParty/icu/icu.pri index d63020fa5c..c5ae929f8a 100644 --- a/Common/3dParty/icu/icu.pri +++ b/Common/3dParty/icu/icu.pri @@ -43,8 +43,7 @@ core_ios { core_android { INCLUDEPATH += $$PWD/android/build/include - ICU_LIBS_PATH = $$replace(CORE_BUILDS_PLATFORM_PREFIX, "android_", "") - LIBS += $$PWD/android/build/$$ICU_LIBS_PATH/libicuuc.a - LIBS += $$PWD/android/build/$$ICU_LIBS_PATH/libicudata.a + LIBS += $$PWD/android/build/$$CORE_BUILDS_PLATFORM_PREFIX_DST/libicuuc.a + LIBS += $$PWD/android/build/$$CORE_BUILDS_PLATFORM_PREFIX_DST/libicudata.a } diff --git a/Common/3dParty/openssl/build-android-common.sh b/Common/3dParty/openssl/build-android-common.sh deleted file mode 100755 index d1b069c047..0000000000 --- a/Common/3dParty/openssl/build-android-common.sh +++ /dev/null @@ -1,220 +0,0 @@ -#!/bin/bash -# -# Copyright 2016 leenjewel -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -source ./build-common.sh - -export PLATFORM_TYPE="Android" -export ARCHS=("arm" "arm64" "x86" "x86_64") -export ABIS=("armeabi-v7a" "arm64-v8a" "x86" "x86_64") -export ABI_TRIPLES=("arm-linux-androideabi" "aarch64-linux-android" "i686-linux-android" "x86_64-linux-android") -export ANDROID_API=21 - -# for test -# export ARCHS=("x86_64") -# export ABIS=("x86_64") -# export ABI_TRIPLES=("x86_64-linux-android") - -if [[ -z ${ANDROID_NDK_ROOT} ]]; then - echo "ANDROID_NDK_ROOT not defined" - exit 1 -fi - -function get_toolchain() { - HOST_OS=$(uname -s) - case ${HOST_OS} in - Darwin) HOST_OS=darwin ;; - Linux) HOST_OS=linux ;; - FreeBsd) HOST_OS=freebsd ;; - CYGWIN* | *_NT-*) HOST_OS=cygwin ;; - esac - - HOST_ARCH=$(uname -m) - case ${HOST_ARCH} in - i?86) HOST_ARCH=x86 ;; - x86_64 | amd64) HOST_ARCH=x86_64 ;; - esac - - echo "${HOST_OS}-${HOST_ARCH}" -} - -function get_android_arch() { - local common_arch=$1 - case ${common_arch} in - arm) - echo "arm-v7a" - ;; - arm64) - echo "arm64-v8a" - ;; - x86) - echo "x86" - ;; - x86_64) - echo "x86-64" - ;; - esac -} - -function get_target_build() { - local arch=$1 - case ${arch} in - arm-v7a) - echo "arm" - ;; - arm64-v8a) - echo "arm64" - ;; - x86) - echo "x86" - ;; - x86-64) - echo "x86_64" - ;; - esac -} - -function get_build_host_internal() { - local arch=$1 - case ${arch} in - arm-v7a | arm-v7a-neon) - echo "arm-linux-androideabi" - ;; - arm64-v8a) - echo "aarch64-linux-android" - ;; - x86) - echo "i686-linux-android" - ;; - x86-64) - echo "x86_64-linux-android" - ;; - esac -} - -function android_get_build_host() { - local arch=$(get_android_arch $1) - get_build_host_internal $arch -} - -function get_clang_target_host() { - local arch=$1 - local api=$2 - case ${arch} in - arm-v7a | arm-v7a-neon) - echo "armv7a-linux-androideabi${api}" - ;; - arm64-v8a) - echo "aarch64-linux-android${api}" - ;; - x86) - echo "i686-linux-android${api}" - ;; - x86-64) - echo "x86_64-linux-android${api}" - ;; - esac -} - -function set_android_toolchain_bin() { - export PATH=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/$(get_toolchain)/bin:$PATH - echo PATH=$PATH -} - -function set_android_toolchain() { - local name=$1 - local arch=$(get_android_arch $2) - local api=$3 - local build_host=$(get_build_host_internal "$arch") - local clang_target_host=$(get_clang_target_host "$arch" "$api") - - export AR=${build_host}-ar - export CC=${clang_target_host}-clang - export CXX=${clang_target_host}-clang++ - export AS=${build_host}-as - export LD=${build_host}-ld - export RANLIB=${build_host}-ranlib - export STRIP=${build_host}-strip -} - -function get_common_includes() { - local toolchain=$(get_toolchain) - echo "-I${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/sysroot/usr/include -I${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/sysroot/usr/local/include" -} -function get_common_linked_libraries() { - local api=$1 - local arch=$2 - local toolchain=$(get_toolchain) - local build_host=$(get_build_host_internal "$arch") - echo "-L${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/${build_host}/lib -L${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/sysroot/usr/lib/${build_host}/${api} -L${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/${toolchain}/lib" -} - -function set_android_cpu_feature() { - local name=$1 - local arch=$(get_android_arch $2) - local api=$3 - case ${arch} in - arm-v7a | arm-v7a-neon) - export CFLAGS="-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wno-unused-function -fno-integrated-as -fstrict-aliasing -fPIC -DANDROID -D__ANDROID_API__=${api} -Os -ffunction-sections -fdata-sections $(get_common_includes)" - export CXXFLAGS="-std=c++11 -Os -ffunction-sections -fdata-sections" - export LDFLAGS="-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wl,--fix-cortex-a8 -Wl,--gc-sections -Os -ffunction-sections -fdata-sections $(get_common_linked_libraries ${api} ${arch})" - export CPPFLAGS=${CFLAGS} - ;; - arm64-v8a) - export CFLAGS="-march=armv8-a -Wno-unused-function -fno-integrated-as -fstrict-aliasing -fPIC -DANDROID -D__ANDROID_API__=${api} -Os -ffunction-sections -fdata-sections $(get_common_includes)" - export CXXFLAGS="-std=c++11 -Os -ffunction-sections -fdata-sections" - export LDFLAGS="-march=armv8-a -Wl,--gc-sections -Os -ffunction-sections -fdata-sections $(get_common_linked_libraries ${api} ${arch})" - export CPPFLAGS=${CFLAGS} - ;; - x86) - export CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32 -Wno-unused-function -fno-integrated-as -fstrict-aliasing -fPIC -DANDROID -D__ANDROID_API__=${api} -Os -ffunction-sections -fdata-sections $(get_common_includes)" - export CXXFLAGS="-std=c++11 -Os -ffunction-sections -fdata-sections" - export LDFLAGS="-march=i686 -Wl,--gc-sections -Os -ffunction-sections -fdata-sections $(get_common_linked_libraries ${api} ${arch})" - export CPPFLAGS=${CFLAGS} - ;; - x86-64) - export CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel -Wno-unused-function -fno-integrated-as -fstrict-aliasing -fPIC -DANDROID -D__ANDROID_API__=${api} -Os -ffunction-sections -fdata-sections $(get_common_includes)" - export CXXFLAGS="-std=c++11 -Os -ffunction-sections -fdata-sections" - export LDFLAGS="-march=x86-64 -Wl,--gc-sections -Os -ffunction-sections -fdata-sections $(get_common_linked_libraries ${api} ${arch})" - export CPPFLAGS=${CFLAGS} - ;; - esac -} - -function android_printf_global_params() { - local arch=$1 - local abi=$2 - local abi_triple=$3 - local in_dir=$4 - local out_dir=$5 - echo -e "arch = $arch" - echo -e "abi = $abi" - echo -e "abi_triple = $abi_triple" - echo -e "PLATFORM_TYPE = $PLATFORM_TYPE" - echo -e "ANDROID_API = $ANDROID_API" - echo -e "in_dir = $in_dir" - echo -e "out_dir = $out_dir" - echo -e "AR = $AR" - echo -e "CC = $CC" - echo -e "CXX = $CXX" - echo -e "AS = $AS" - echo -e "LD = $LD" - echo -e "RANLIB = $RANLIB" - echo -e "STRIP = $STRIP" - echo -e "CFLAGS = $CFLAGS" - echo -e "CXXFLAGS = $CXXFLAGS" - echo -e "LDFLAGS = $LDFLAGS" - echo -e "CPPFLAGS = $CPPFLAGS" -} diff --git a/Common/3dParty/openssl/build-android-openssl.sh b/Common/3dParty/openssl/build-android-openssl.sh deleted file mode 100755 index e710b6fb6e..0000000000 --- a/Common/3dParty/openssl/build-android-openssl.sh +++ /dev/null @@ -1,126 +0,0 @@ -#!/bin/bash -# -# Copyright 2016 leenjewel -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# # read -n1 -p "Press any key to continue..." - -set -u - -source ./build-android-common.sh - -init_log_color - -TOOLS_ROOT=$(pwd) - -SOURCE="$0" -while [ -h "$SOURCE" ]; do - DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)" - SOURCE="$(readlink "$SOURCE")" - [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" -done -pwd_path="$(cd -P "$(dirname "$SOURCE")" && pwd)" - -echo pwd_path=${pwd_path} -echo TOOLS_ROOT=${TOOLS_ROOT} - -# openssl-1.1.0f has a configure bug -# openssl-1.1.1d has fix configure bug -LIB_VERSION="OpenSSL_1_1_1i" -LIB_NAME="openssl-1.1.1i" - -echo "https://www.openssl.org/source/${LIB_NAME}.tar.gz" - -# https://github.com/openssl/openssl/archive/OpenSSL_1_1_1d.tar.gz -# https://github.com/openssl/openssl/archive/OpenSSL_1_1_1f.tar.gz -[ -f "${LIB_NAME}.tar.gz" ] || curl -L -o ${LIB_NAME}.tar.gz https://www.openssl.org/source/${LIB_NAME}.tar.gz -s -[ -f "${LIB_NAME}.tar.gz" ] || log_error "openssl download error!" - -set_android_toolchain_bin - -function configure_make() { - - ARCH=$1 - ABI=$2 - ABI_TRIPLE=$3 - - log_info "configure $ABI start..." - - if [ -d "${LIB_NAME}" ]; then - rm -fr "${LIB_NAME}" - fi - tar xfz "${LIB_NAME}.tar.gz" - pushd . - cd "${LIB_NAME}" - - PREFIX_DIR="${pwd_path}/build/android/${ABI}" - if [ -d "${PREFIX_DIR}" ]; then - rm -fr "${PREFIX_DIR}" - fi - mkdir -p "${PREFIX_DIR}" - - OUTPUT_ROOT=${TOOLS_ROOT}/build/android/${ABI} - mkdir -p ${OUTPUT_ROOT}/log - - set_android_toolchain "openssl" "${ARCH}" "${ANDROID_API}" - set_android_cpu_feature "openssl" "${ARCH}" "${ANDROID_API}" - - export ANDROID_NDK_HOME=${ANDROID_NDK_ROOT} - echo ANDROID_NDK_HOME=${ANDROID_NDK_HOME} - - android_printf_global_params "$ARCH" "$ABI" "$ABI_TRIPLE" "$PREFIX_DIR" "$OUTPUT_ROOT" - - if [[ "${ARCH}" == "x86_64" ]]; then - - ./Configure android-x86_64 --prefix="${PREFIX_DIR}" no-shared no-tests enable-ssl3 enable-ssl3-method enable-md2 no-asm - - elif [[ "${ARCH}" == "x86" ]]; then - - ./Configure android-x86 --prefix="${PREFIX_DIR}" no-shared no-tests enable-ssl3 enable-ssl3-method enable-md2 no-asm - - elif [[ "${ARCH}" == "arm" ]]; then - - ./Configure android-arm --prefix="${PREFIX_DIR}" no-shared no-tests enable-ssl3 enable-ssl3-method enable-md2 no-asm - - elif [[ "${ARCH}" == "arm64" ]]; then - - ./Configure android-arm64 --prefix="${PREFIX_DIR}" no-shared no-tests enable-ssl3 enable-ssl3-method enable-md2 no-asm - - else - log_error "not support" && exit 1 - fi - - log_info "make $ABI start..." - - sed -ie 's/LIB_CFLAGS=/LIB_CFLAGS=-fvisibility=hidden /g' ./Makefile - sed -ie 's/LIB_CXXFLAGS=/LIB_CXXFLAGS=-fvisibility=hidden /g' ./Makefile - - make clean >"${OUTPUT_ROOT}/log/${ABI}.log" - if make -j$(get_cpu_count) >>"${OUTPUT_ROOT}/log/${ABI}.log" 2>&1; then - make install_sw >>"${OUTPUT_ROOT}/log/${ABI}.log" 2>&1 - make install_ssldirs >>"${OUTPUT_ROOT}/log/${ABI}.log" 2>&1 - fi - - popd -} - -log_info "${PLATFORM_TYPE} ${LIB_NAME} start..." - -for ((i = 0; i < ${#ARCHS[@]}; i++)); do - if [[ $# -eq 0 || "$1" == "${ARCHS[i]}" ]]; then - configure_make "${ARCHS[i]}" "${ABIS[i]}" "${ABI_TRIPLES[i]}" - fi -done - -log_info "${PLATFORM_TYPE} ${LIB_NAME} end..." diff --git a/Common/3dParty/openssl/openssl.pri b/Common/3dParty/openssl/openssl.pri index 861eb4d343..cb565d4621 100644 --- a/Common/3dParty/openssl/openssl.pri +++ b/Common/3dParty/openssl/openssl.pri @@ -11,16 +11,7 @@ open_ssl_common { OPENSSL_LIBS_DIRECTORY = $$PWD/build/$$OPEN_SSL_PLATFORM/lib core_android { - - OPENSSL_ABI_PATH = $$replace(CORE_BUILDS_PLATFORM_PREFIX, "android_", "") - contains(OPENSSL_ABI_PATH, "armv7" ) { - OPENSSL_ABI_PATH = $$replace(OPENSSL_ABI_PATH, "armv7", "armeabi-v7a") - } - contains(OPENSSL_ABI_PATH, "arm64_v8a" ) { - OPENSSL_ABI_PATH = $$replace(OPENSSL_ABI_PATH, "arm64_v8a", "arm64-v8a") - } - - OPENSSL_LIBS_DIRECTORY = $$PWD/build/android/$$OPENSSL_ABI_PATH/lib + OPENSSL_LIBS_DIRECTORY = $$PWD/build/android/$$CORE_BUILDS_PLATFORM_PREFIX_DST/lib } core_ios { diff --git a/Common/3dParty/v8/android/howto.txt b/Common/3dParty/v8/android/howto.txt new file mode 100644 index 0000000000..099db5a4a7 --- /dev/null +++ b/Common/3dParty/v8/android/howto.txt @@ -0,0 +1,46 @@ +Fixes for build 12.1 version for android with use_custom_libcxx: + +1) src/build/config/BUILD.gn + +group("common_deps") { ... } + +if (use_custom_libcxx) { + public_deps += [ "//buildtools/third_party/libc++" ] +} + +=> + +if (use_custom_libcxx) { + public_deps += [ "//buildtools/third_party/libc++" ] +} else { + # ONLYOFFICE-HACK + public_deps += [ "//buildtools/third_party/libunwind" ] +} + +2) src/buildtools/third_party/libunbind/BUILD.gn + +visibility = [ "//buildtools/third_party/libc++abi" ] + +=> +visibility = [ "//buildtools/third_party/libc++abi" ] +# ONLYOFFICE-HACK +visibility += ["//build/config:common_deps"] + +3) src/zone/zone.h + +all records: +static_assert(alignof(T) <= kAlignmentInBytes); + +=> + +// ONLYOFFICE-HACK +//static_assert(alignof(T) <= kAlignmentInBytes); + +Fixes for link static library WITH custom libc++: + +v8.pri: +v8_custom_libcxx { + LIBS += $$CORE_V8_PATH_LIBS/third_party/libc++/libc++/*.o + LIBS += $$CORE_V8_PATH_LIBS/third_party/libc++abi/libc++abi/*.o + LIBS += $$CORE_V8_PATH_LIBS/third_party/libunwind/libunwind/*.o +} diff --git a/Common/OfficeFileFormatChecker2.cpp b/Common/OfficeFileFormatChecker2.cpp index 1fdb6b6f34..79b51dee73 100644 --- a/Common/OfficeFileFormatChecker2.cpp +++ b/Common/OfficeFileFormatChecker2.cpp @@ -236,6 +236,15 @@ bool COfficeFileFormatChecker::isPdfFormatFile(unsigned char *pBuffer, int dwByt char *pFirst = strstr((char *)pBuffer, "%PDF-"); + if (NULL == pFirst) + { + //skip special + _UINT16 sz = pBuffer[0] + (pBuffer[1] << 8); + if (sz < dwBytes - 8) + { + pFirst = strstr((char*)(pBuffer + sz), "%PDF-"); + } + } if (NULL != pFirst) { pFirst = strstr((char *)pBuffer, "%DocumentID "); @@ -299,7 +308,7 @@ bool COfficeFileFormatChecker::isOleObjectFile(POLE::Storage *storage) std::string UserType, ClipboardFormat, Program; POLE::Stream streamCompObject(storage, L"CompObj"); - if (false == streamCompObject.fail()) + if (false == streamCompObject.fail() && streamCompObject.size() >= 28) { streamCompObject.seek(28); // skip Header diff --git a/Common/base.pri b/Common/base.pri index 59a3bb0e2a..eb6a1ec793 100644 --- a/Common/base.pri +++ b/Common/base.pri @@ -19,6 +19,11 @@ isEmpty(PUBLISHER_NAME){ PUBLISHER_NAME = $$cat(copyright.txt) } +DEST_MAKEFILE_NAME = $$(DEST_MAKEFILE_NAME) +!isEmpty(DEST_MAKEFILE_NAME){ + MAKEFILE = $${DEST_MAKEFILE_NAME} +} + APPLICATION_NAME_DEFAULT = $$(APPLICATION_NAME_DEFAULT) !isEmpty(APPLICATION_NAME_DEFAULT){ DEFINES += "APPLICATION_NAME_DEFAULT=$${APPLICATION_NAME_DEFAULT}" @@ -366,6 +371,7 @@ core_android { CORE_BUILDS_PLATFORM_PREFIX = $$replace(CORE_BUILDS_PLATFORM_PREFIX, "-", "_") CORE_BUILDS_PLATFORM_PREFIX = $$replace(CORE_BUILDS_PLATFORM_PREFIX, "armeabi_v7", "armv7") CORE_BUILDS_PLATFORM_PREFIX = $$replace(CORE_BUILDS_PLATFORM_PREFIX, "armv7a", "armv7") + CORE_BUILDS_PLATFORM_PREFIX_DST = $$replace(CORE_BUILDS_PLATFORM_PREFIX, "android_", "") !isEmpty(OO_DESTDIR_BUILD_OVERRIDE) { isEqual(CORE_BUILDS_PLATFORM_PREFIX, android_arm64_v8a):OO_DESTDIR_BUILD_OVERRIDE=$$OO_DESTDIR_BUILD_OVERRIDE/arm64-v8a diff --git a/DesktopEditor/common/Directory.cpp b/DesktopEditor/common/Directory.cpp index 338a52f75a..ad4d9f8bbe 100644 --- a/DesktopEditor/common/Directory.cpp +++ b/DesktopEditor/common/Directory.cpp @@ -60,6 +60,10 @@ namespace NSDirectory #if !defined(_WIN32) && !defined (_WIN64) static bool is_directory_exist(char* dir) { +#ifdef __ANDROID__ + if (0 == strcmp("/storage/emulated", dir)) + return true; +#endif struct stat st; bool bRes = (0 == stat(dir, &st)) && S_ISDIR(st.st_mode); return bRes; diff --git a/DesktopEditor/cximage/raw/libdcr.h b/DesktopEditor/cximage/raw/libdcr.h index 0b828454aa..6d74732a87 100644 --- a/DesktopEditor/cximage/raw/libdcr.h +++ b/DesktopEditor/cximage/raw/libdcr.h @@ -58,7 +58,7 @@ #ifdef __ANDROID__ #include -#if __ANDROID_API__ < 28 +#if __ANDROID_API__ < 22 static void swab(const char* __src, char* __dst, ssize_t __byte_count) { ssize_t len = __byte_count; diff --git a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h index 01c6d1bc37..a6b5e332c3 100644 --- a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h +++ b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h @@ -52,8 +52,18 @@ v8::Local CreateV8String(v8::Isolate* i, const char* str, const int& len = -1); v8::Local CreateV8String(v8::Isolate* i, const std::string& str); +#ifdef __ANDROID__ + +#ifdef _DEBUG +#define ANDROID_LOGS +#endif + #ifdef ANDROID_LOGS -#include +#include +#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, "js", __VA_ARGS__) +#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, "js", __VA_ARGS__) +#endif + #endif #ifdef V8_OS_XP @@ -144,7 +154,11 @@ public: #endif v8::V8::Dispose(); + #ifdef V8_VERSION_121_PLUS + v8::V8::DisposePlatform(); + #else v8::V8::ShutdownPlatform(); + #endif if (m_pAllocator) delete m_pAllocator; @@ -483,7 +497,7 @@ namespace NSJSBase LOGGER_START - v8::Local _name = CreateV8String(CV8Worker::GetCurrent(), name); + v8::Local _name = CreateV8String(CV8Worker::GetCurrent(), name); v8::Handle _func = value->Get(V8ContextFirstArg _name).ToLocalChecked(); CJSValueV8* _return = new CJSValueV8(); @@ -514,7 +528,7 @@ namespace NSJSBase LOGGER_LAP_NAME(name) - JSSmart _ret = _return; + JSSmart _ret = _return; return _ret; } @@ -804,10 +818,8 @@ namespace NSJSBase #endif #ifdef ANDROID_LOGS - LOGE("NSJSBase::CV8TryCatch::Check() - error:"); - LOGE(std::to_string(nLineNumber).c_str()); - LOGE(strCode.c_str()); - LOGE(strException.c_str()); + std::string sLog = "[JS (" + std::to_string(nLineNumber) + ")]: " + strCode + ", " + strException; + LOGE(sLog.c_str()); #endif return true; } diff --git a/DesktopEditor/doctrenderer/json/json.cpp b/DesktopEditor/doctrenderer/json/json.cpp index 4639bab11a..88b4825f60 100644 --- a/DesktopEditor/doctrenderer/json/json.cpp +++ b/DesktopEditor/doctrenderer/json/json.cpp @@ -66,16 +66,13 @@ namespace NSJSON static_cast(m_internal->m_value.get())->isDouble()); } - bool IValue::IsStringA() const + bool IValue::IsString() const { - return (m_internal->m_type == CTypedValue::vtPrimitive && - static_cast(m_internal->m_value.get())->isStringA()); - } + if (m_internal->m_type != CTypedValue::vtPrimitive) + return false; - bool IValue::IsStringW() const - { - return (m_internal->m_type == CTypedValue::vtPrimitive && - static_cast(m_internal->m_value.get())->isStringW()); + CPrimitive* pPrimitive = static_cast(m_internal->m_value.get()); + return (pPrimitive->isStringA() || pPrimitive->isStringW()); } bool IValue::IsArray() const diff --git a/DesktopEditor/doctrenderer/json/json.h b/DesktopEditor/doctrenderer/json/json.h index e2de0b4e43..179fb2b3a5 100644 --- a/DesktopEditor/doctrenderer/json/json.h +++ b/DesktopEditor/doctrenderer/json/json.h @@ -73,11 +73,7 @@ namespace NSJSON /** * Returns true if the value is a string. */ - bool IsStringA() const; - /** - * Returns true if the value is a wstring. - */ - bool IsStringW() const; + bool IsString() const; /** * Returns true if the value is an array. */ diff --git a/DesktopEditor/doctrenderer/json/json_values.cpp b/DesktopEditor/doctrenderer/json/json_values.cpp index 8b15705622..049ef75531 100644 --- a/DesktopEditor/doctrenderer/json/json_values.cpp +++ b/DesktopEditor/doctrenderer/json/json_values.cpp @@ -1,5 +1,8 @@ #include "json_values.h" +// for string <=> wstring conversion +#include "../../common/File.h" + namespace NSJSON { IBaseValue::IBaseValue() @@ -113,6 +116,12 @@ namespace NSJSON { if (m_type == ptStringA) return m_string; + + if (m_type == ptStringW) + { + return U_TO_UTF8(m_wstring); + } + #ifdef JSON_DEBUG throw std::bad_cast(); #endif @@ -123,6 +132,12 @@ namespace NSJSON { if (m_type == ptStringW) return m_wstring; + + if (m_type == ptStringA) + { + return UTF8_TO_U(m_string); + } + #ifdef JSON_DEBUG throw std::bad_cast(); #endif diff --git a/DesktopEditor/doctrenderer/json/serialization.h b/DesktopEditor/doctrenderer/json/serialization.h index 844d625633..d7a8a11f38 100644 --- a/DesktopEditor/doctrenderer/json/serialization.h +++ b/DesktopEditor/doctrenderer/json/serialization.h @@ -29,13 +29,9 @@ namespace NSJSON { ret = NSJSBase::CJSContext::createDouble((double)value); } - else if (value.IsStringA()) + else if (value.IsString()) { - ret = NSJSBase::CJSContext::createString((std::string)value); - } - else if (value.IsStringW()) - { - ret = NSJSBase::CJSContext::createString((std::wstring)value); + ret = NSJSBase::CJSContext::createString(value.ToStringA()); } // arrays else if (value.IsArray()) diff --git a/DesktopEditor/doctrenderer/test/json/main.cpp b/DesktopEditor/doctrenderer/test/json/main.cpp index e527566b62..021e7341d9 100644 --- a/DesktopEditor/doctrenderer/test/json/main.cpp +++ b/DesktopEditor/doctrenderer/test/json/main.cpp @@ -180,32 +180,18 @@ public: return false; } } - else if (value.IsStringA()) - { - if (makeExpects) - EXPECT_TRUE(jsValue->isString()); - if (!jsValue->isString()) - return false; - - std::string val = value.ToStringA(); - std::string jsVal = jsValue->toStringA(); - if (makeExpects) - EXPECT_EQ(val, jsVal); - if (val != jsVal) - return false; - } else { if (makeExpects) { - EXPECT_TRUE(value.IsStringW()); + EXPECT_TRUE(value.IsString()); EXPECT_TRUE(jsValue->isString()); } if (!jsValue->isString()) return false; - std::wstring val = value.ToStringW(); - std::wstring jsVal = jsValue->toStringW(); + std::string val = value.ToStringA(); + std::string jsVal = jsValue->toStringA(); if (makeExpects) EXPECT_EQ(val, jsVal); if (val != jsVal) @@ -564,26 +550,24 @@ TEST_F(CJSONTest, wrong_usage) EXPECT_THROW((bool)val, std::bad_cast); EXPECT_THROW((int)val, std::bad_cast); EXPECT_THROW((double)val, std::bad_cast); - EXPECT_THROW((std::wstring)val, std::bad_cast); #else EXPECT_EQ((bool)val, false); EXPECT_EQ((int)val, 0); EXPECT_EQ((double)val, 0.0); - EXPECT_EQ((std::wstring)val, L""); #endif + EXPECT_EQ((std::wstring)val, L"test"); - val = L"тест"; + val = L"test"; #ifdef JSON_DEBUG EXPECT_THROW((bool)val, std::bad_cast); EXPECT_THROW((int)val, std::bad_cast); EXPECT_THROW((double)val, std::bad_cast); - EXPECT_THROW((std::string)val, std::bad_cast); #else EXPECT_EQ((bool)val, false); EXPECT_EQ((int)val, 0); EXPECT_EQ((double)val, 0.0); - EXPECT_EQ((std::string)val, ""); #endif + EXPECT_EQ((std::string)val, "test"); val = CValue::CreateObject(); #ifdef JSON_DEBUG diff --git a/DesktopEditor/graphics/Timer.cpp b/DesktopEditor/graphics/Timer.cpp index 832c591009..a81bbdad8c 100644 --- a/DesktopEditor/graphics/Timer.cpp +++ b/DesktopEditor/graphics/Timer.cpp @@ -39,8 +39,8 @@ namespace NSTimers { - // CLOCK_MONOTONIC defined ONLY since macOS 10.12!!! (crash on earlier version) - DWORD GetTickCount() + // CLOCK_MONOTONIC defined ONLY since macOS 10.12!!! (crash on earlier version) + DWORD GetTickCount() { #if defined(_WIN32) || defined(_WIN64) || defined(_WIN32_WCE) return ::GetTickCount(); @@ -49,55 +49,55 @@ namespace NSTimers struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); - return (ts.tv_sec * 1000 + (DWORD)(ts.tv_nsec / 1000000)); + return (ts.tv_sec * 1000 + (DWORD)(ts.tv_nsec / 1000000)); #else - //uint64_t nano = mach_absolute_time(); - //return nano / 1000000; - return getUptimeInMilliseconds(); + //uint64_t nano = mach_absolute_time(); + //return nano / 1000000; + return getUptimeInMilliseconds(); #endif #endif } - CTimer::CTimer() : NSThreads::CBaseThread() - { - m_dwInterval = 40; - m_bIsCOMNeed = FALSE; - } - CTimer::~CTimer() - { - } + CTimer::CTimer() : NSThreads::CBaseThread() + { + m_dwInterval = 40; + m_bIsCOMNeed = FALSE; + } + CTimer::~CTimer() + { + } - void CTimer::SetInterval(const DWORD& dwInterval) { m_dwInterval = dwInterval; } - void CTimer::SetCOMNeed(const INT& bIsCOM) { m_bIsCOMNeed = bIsCOM; } + void CTimer::SetInterval(const DWORD& dwInterval) { m_dwInterval = dwInterval; } + void CTimer::SetCOMNeed(const INT& bIsCOM) { m_bIsCOMNeed = bIsCOM; } - DWORD CTimer::ThreadProc() - { + DWORD CTimer::ThreadProc() + { #ifdef _CAN_USE_COM_THREADS - if (m_bIsCOMNeed) - CoInitialize(NULL); + if (m_bIsCOMNeed) + CoInitialize(NULL); #endif - DWORD m_startTime, m_curTime; - m_startTime = NSTimers::GetTickCount(); + DWORD m_startTime, m_curTime; + m_startTime = NSTimers::GetTickCount(); - while (m_bRunThread) - { - m_curTime = NSTimers::GetTickCount(); - while (m_curTime - m_startTime < m_dwInterval) - { - NSThreads::Sleep(10); - if (!m_bRunThread) - break; - m_curTime = NSTimers::GetTickCount(); - } + while (m_bRunThread) + { + m_curTime = NSTimers::GetTickCount(); + while (m_curTime - m_startTime < m_dwInterval) + { + NSThreads::Sleep(10); + if (!m_bRunThread) + break; + m_curTime = NSTimers::GetTickCount(); + } - m_startTime = NSTimers::GetTickCount(); - OnTimer(); - } + m_startTime = NSTimers::GetTickCount(); + OnTimer(); + } #ifdef _CAN_USE_COM_THREADS - if (m_bIsCOMNeed) - CoUninitialize(); + if (m_bIsCOMNeed) + CoUninitialize(); #endif - return 0; - } + return 0; + } } diff --git a/DesktopEditor/graphics/Timer.h b/DesktopEditor/graphics/Timer.h index 5e21823599..62ef2ba626 100644 --- a/DesktopEditor/graphics/Timer.h +++ b/DesktopEditor/graphics/Timer.h @@ -41,51 +41,51 @@ namespace NSTimers { - KERNEL_DECL DWORD GetTickCount(); + KERNEL_DECL DWORD GetTickCount(); - class KERNEL_DECL CTimer : public NSThreads::CBaseThread + class KERNEL_DECL CTimer : public NSThreads::CBaseThread { private: DWORD m_dwInterval; - INT m_bIsCOMNeed; + INT m_bIsCOMNeed; public: - CTimer(); - virtual ~CTimer(); + CTimer(); + virtual ~CTimer(); - void SetInterval(const DWORD& dwInterval); - void SetCOMNeed(const INT& bIsCOM); + void SetInterval(const DWORD& dwInterval); + void SetCOMNeed(const INT& bIsCOM); protected: - virtual DWORD ThreadProc(); + virtual DWORD ThreadProc(); virtual void OnTimer() = 0; }; - - inline static unsigned long getUptimeInMilliseconds() - { + + inline static unsigned long getUptimeInMilliseconds() + { #if defined(_IOS) || defined(_MAC) - const int64_t kOneMillion = 1000 * 1000; - static mach_timebase_info_data_t s_timebase_info; - - if (s_timebase_info.denom == 0) { - (void) mach_timebase_info(&s_timebase_info); - } - - // mach_absolute_time() returns billionth of seconds, - // so divide by one million to get milliseconds - return (unsigned long)((mach_absolute_time() * s_timebase_info.numer) / (kOneMillion * s_timebase_info.denom)); + const int64_t kOneMillion = 1000 * 1000; + static mach_timebase_info_data_t s_timebase_info; + + if (s_timebase_info.denom == 0) { + (void) mach_timebase_info(&s_timebase_info); + } + + // mach_absolute_time() returns billionth of seconds, + // so divide by one million to get milliseconds + return (unsigned long)((mach_absolute_time() * s_timebase_info.numer) / (kOneMillion * s_timebase_info.denom)); #endif - + #ifdef __ANDROID__ - struct timespec ts; - clock_gettime(CLOCK_MONOTONIC, &ts); - - return (ts.tv_sec * 1000 + (DWORD)(ts.tv_nsec / 1000000)); + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + + return (ts.tv_sec * 1000 + (DWORD)(ts.tv_nsec / 1000000)); #endif - - return 0; - } + + return 0; + } } #endif diff --git a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp index a6ac75ea29..ae2ae85d88 100644 --- a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp +++ b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.cpp @@ -74,9 +74,15 @@ WASM_EXPORT int GetType(BYTE* data, LONG size) // 0 - PDF // 1 - DJVU // 2 - XPS - char* pFirst = strstr((char*)data, "%PDF-" ); - if (pFirst) - return 0; + LONG nHeaderSearchSize = 1024; + LONG nSize = size < nHeaderSearchSize ? size : nHeaderSearchSize; + char* pData = (char*)data; + for (int i = 0; i < nSize - 5; ++i) + { + int nPDF = strncmp(&pData[i], "%PDF-", 5); + if (!nPDF) + return 0; + } if ( (8 <= size) && (0x41 == data[0] && 0x54 == data[1] && 0x26 == data[2] && 0x54 == data[3] && 0x46 == data[4] && 0x4f == data[5] && 0x52 == data[6] && 0x4d == data[7])) return 1; diff --git a/DesktopEditor/graphics/pro/js/wasm/src/pdfwriter.cpp b/DesktopEditor/graphics/pro/js/wasm/src/pdfwriter.cpp index 30c491d690..87e1c4d213 100644 --- a/DesktopEditor/graphics/pro/js/wasm/src/pdfwriter.cpp +++ b/DesktopEditor/graphics/pro/js/wasm/src/pdfwriter.cpp @@ -148,8 +148,8 @@ void CPdfWriter::Sign(const double& dX, const double& dY, const double& dW, cons HRESULT CPdfWriter::EditWidgetParents(NSFonts::IApplicationFonts* pAppFonts, CWidgetsInfo* pFieldInfo, const std::wstring& wsTempDirectory) { return 0; } PdfWriter::CDocument* CPdfWriter::GetDocument() { return NULL; } PdfWriter::CPage* CPdfWriter::GetPage() { return NULL; } -PdfWriter::CImageDict* CPdfWriter::LoadImage(Aggplus::CImage* pImage, const BYTE& nAlpha) { return NULL; } -bool CPdfWriter::DrawImage(Aggplus::CImage* pImage, const double& dX, const double& dY, const double& dW, const double& dH, const BYTE& nAlpha) { return false; } +PdfWriter::CImageDict* CPdfWriter::LoadImage(Aggplus::CImage* pImage, BYTE nAlpha) { return NULL; } +PdfWriter::CImageDict* CPdfWriter::DrawImage(Aggplus::CImage* pImage, const double& dX, const double& dY, const double& dW, const double& dH, const BYTE& nAlpha) { return NULL; } bool CPdfWriter::DrawText(unsigned char* pCodes, const unsigned int& unLen, const double& dX, const double& dY) { return false; } bool CPdfWriter::DrawTextToRenderer(const unsigned int* unGid, const unsigned int& unLen, const double& dX, const double& dY) { return false; } bool CPdfWriter::PathCommandDrawText(unsigned int* pUnicodes, unsigned int unLen, const double& dX, const double& dY, const unsigned int* pGids) { return false; } diff --git a/DesktopEditor/graphics/pro/raster.pri b/DesktopEditor/graphics/pro/raster.pri index feaaad1e2d..f5e54810fc 100644 --- a/DesktopEditor/graphics/pro/raster.pri +++ b/DesktopEditor/graphics/pro/raster.pri @@ -28,6 +28,10 @@ core_windows { LIBS += -lUser32 } +core_android { + QMAKE_CFLAGS += -Wno-incompatible-function-pointer-types +} + INCLUDEPATH += \ $$LIB_GRAPHICS_PRI_PATH/cximage/jasper/include \ $$LIB_GRAPHICS_PRI_PATH/cximage/jpeg \ diff --git a/MsBinaryFile/Common/Vml/PPTShape/Ppt2PptxShapeConverter.cpp b/MsBinaryFile/Common/Vml/PPTShape/Ppt2PptxShapeConverter.cpp index 110e92af9f..c6c4fa7db8 100644 --- a/MsBinaryFile/Common/Vml/PPTShape/Ppt2PptxShapeConverter.cpp +++ b/MsBinaryFile/Common/Vml/PPTShape/Ppt2PptxShapeConverter.cpp @@ -49,7 +49,7 @@ namespace NSGuidesVML point.x = lParam; if (m_eRuler != rtRMoveTo && m_eRuler != rtRLineTo && m_eRuler != rtRCurveTo) { - //point.x -= m_lX; + point.x -= m_lX; } point.y = 0; pointType.x = eParType; @@ -62,7 +62,7 @@ namespace NSGuidesVML m_arPoints.back().y = lParam; if (m_eRuler != rtRMoveTo && m_eRuler != rtRLineTo && m_eRuler != rtRCurveTo) { - //m_arPoints.back().y -= m_lY; + m_arPoints.back().y -= m_lY; } m_arPointsType.back().y = eParType; @@ -272,8 +272,8 @@ namespace NSGuidesVML m_lWidth = oPart.width; m_lHeight = oPart.height; - //m_lX = oPart.x; - //m_lY = oPart.y; + m_lX = oPart.x; + m_lY = oPart.y; } bool bFill = false; diff --git a/MsBinaryFile/Common/Vml/VmlPath.cpp b/MsBinaryFile/Common/Vml/VmlPath.cpp index a093071b19..868d598814 100644 --- a/MsBinaryFile/Common/Vml/VmlPath.cpp +++ b/MsBinaryFile/Common/Vml/VmlPath.cpp @@ -852,6 +852,8 @@ namespace ODRAW for (size_t nIndex = 0; nIndex < oArray.size(); ++nIndex) { + if (oArray[nIndex].empty()) continue; + CPartPath part; part.x = m_lX; diff --git a/MsBinaryFile/PptFile/PPTXWriter/BulletsConverter.cpp b/MsBinaryFile/PptFile/PPTXWriter/BulletsConverter.cpp index 29bf29e884..036ac05124 100644 --- a/MsBinaryFile/PptFile/PPTXWriter/BulletsConverter.cpp +++ b/MsBinaryFile/PptFile/PPTXWriter/BulletsConverter.cpp @@ -111,7 +111,7 @@ void BulletsConverter::ConvertPFRun(PPTX::Logic::TextParagraphPr &oPPr, CTextPFR pLnSpc->m_name = L"a:lnSpc"; if (val > 0) - pLnSpc->spcPct = val * 12.5; + pLnSpc->spcPts = val * 12.5; else if (val < 0 && val > -13200) pLnSpc->spcPct = val * -1000; diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp index 54e0eb5f52..8814c00b2e 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp @@ -109,6 +109,34 @@ bool CPPTDocumentInfo::ReadFromStream(CRecordCurrentUserAtom *pCurrentUser, POLE return true; } +std::wstring CPPTDocumentInfo::GetBinFromStg(const std::wstring& name, _UINT32 nRef) +{ + for (size_t i = 0; i < m_arUsers.size(); ++i) + { + std::map<_UINT32, _UINT32>::iterator nIndexPsrRef = m_arUsers[i]->m_mapOffsetInPIDs.find(nRef); + if (m_arUsers[i]->m_mapOffsetInPIDs.end() != nIndexPsrRef) + { + std::wstring result; + _UINT32 offset_stream = nIndexPsrRef->second; + StreamUtils::StreamSeek(offset_stream, m_pStream); + + SRecordHeader oHeader; + oHeader.ReadFromStream(m_pStream); + + CRecordExObjStg* pExObjStg = new CRecordExObjStg(name, m_pCommonInfo->tempPath); + + if (pExObjStg) + { + pExObjStg->ReadFromStream(oHeader, m_pStream); + result = pExObjStg->m_sFileName; + + RELEASEOBJECT(pExObjStg); + } + return result; + } + } + return L""; +} bool CPPTDocumentInfo::LoadDocument() { @@ -116,7 +144,7 @@ bool CPPTDocumentInfo::LoadDocument() try { - m_arUsers[0]->ReadExtenalObjects(); + m_arUsers[0]->ReadExtenalObjects(); // todooo ???? прочитать по всем (см 66864) m_arUsers[0]->FromDocument(); } catch(int) //error code diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h index 880447f4ee..40dde44c55 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h @@ -59,7 +59,8 @@ public: bool ReadFromStream(CRecordCurrentUserAtom* pCurrentUser, POLE::Stream* pStream); bool LoadDocument(); - + + std::wstring GetBinFromStg(const std::wstring& name, _UINT32 nRef); private: POLE::Stream* m_pStream; }; diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp index 39c18081a2..bb3ed69f99 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp @@ -423,7 +423,7 @@ bool CPPTUserInfo::ReadDocumentPersists(POLE::Stream* pStream) { if (pVbaAtom->m_nHasMacros) { - m_sVbaProjectFile = GetBinFromStg(L"vbaProject.bin", pVbaAtom->m_nObjStgDataRef); + m_sVbaProjectFile = m_pDocumentInfo->GetBinFromStg(L"vbaProject.bin", pVbaAtom->m_nObjStgDataRef); m_bMacros = (false == m_sVbaProjectFile.empty()); } @@ -431,39 +431,6 @@ bool CPPTUserInfo::ReadDocumentPersists(POLE::Stream* pStream) } return true; } -std::wstring CPPTUserInfo::GetBinFromStg(const std::wstring& name, _UINT32 nRef) -{ - POLE::Stream* pStream = m_pDocumentInfo->m_pStream; - - std::map<_UINT32, _UINT32>::iterator nIndexPsrRef = m_mapOffsetInPIDs.find(nRef); - - std::wstring result; - if (m_mapOffsetInPIDs.end() != nIndexPsrRef) - { - _UINT32 offset_stream = nIndexPsrRef->second; - StreamUtils::StreamSeek(offset_stream, pStream); - - POLE::Stream* pStreamTmp = pStream; - if (m_pDecryptor) - { - DecryptStream(pStream, nRef); - pStreamTmp = m_arStreamDecrypt.back()->stream_; - } - SRecordHeader oHeader; - oHeader.ReadFromStream(pStreamTmp); - - CRecordExObjStg *pExObjStg = new CRecordExObjStg(name, m_pDocumentInfo->m_pCommonInfo->tempPath); - - if (pExObjStg) - { - pExObjStg->ReadFromStream(oHeader, pStreamTmp); - result = pExObjStg->m_sFileName; - - RELEASEOBJECT(pExObjStg); - } - } - return result; -} //-------------------------------------------------------------------------------------------- void CPPTUserInfo::ReadExtenalObjects() { @@ -2570,7 +2537,7 @@ void CPPTUserInfo::LoadExOleObject(CRecordsContainer* pExObject) if (oArrayCString.size() > 1) oInfo.m_progName = oArrayCString[1]->m_strText; - oInfo.m_strFilePath = GetBinFromStg(L"", oArrayExOleObj[0]->m_nPersistID); // ExOleObjStg || ExControlStg + oInfo.m_strFilePath = m_pDocumentInfo->GetBinFromStg(L"", oArrayExOleObj[0]->m_nPersistID); // ExOleObjStg || ExControlStg m_oExMedia.m_arOleObjects.push_back(oInfo); } diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.h b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.h index d8c584403a..3812682dff 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.h +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.h @@ -132,8 +132,6 @@ public: bool ReadDocumentPersists(POLE::Stream* pStream); void ReadExtenalObjects(); - std::wstring GetBinFromStg(const std::wstring& name, _UINT32 nRef); - void DecryptStream(POLE::Stream *pStream, int block); void FromDocument(); diff --git a/MsBinaryFile/XlsFile/Converter/xlsx_drawing_context.cpp b/MsBinaryFile/XlsFile/Converter/xlsx_drawing_context.cpp index 98d5f9a8f6..7ecadb8da0 100644 --- a/MsBinaryFile/XlsFile/Converter/xlsx_drawing_context.cpp +++ b/MsBinaryFile/XlsFile/Converter/xlsx_drawing_context.cpp @@ -997,7 +997,7 @@ void xlsx_drawing_context::serialize_group() if (!drawing_state->description.empty()) { - CP_XML_ATTR(L"descr", drawing_state->description); + CP_XML_ATTR(L"descr", XmlUtils::EncodeXmlString(drawing_state->description)); } if (drawing_state->hidden) { @@ -1373,7 +1373,7 @@ void xlsx_drawing_context::serialize_pic(_drawing_state_ptr & drawing_state) if (!drawing_state->description.empty()) { - CP_XML_ATTR(L"descr", drawing_state->description); + CP_XML_ATTR(L"descr", XmlUtils::EncodeXmlString(drawing_state->description)); } if (drawing_state->hidden) { @@ -1448,7 +1448,7 @@ void xlsx_drawing_context::serialize_chart(_drawing_state_ptr & drawing_state) CP_XML_ATTR(L"name", drawing_state->name); if (!drawing_state->description.empty()) { - CP_XML_ATTR(L"descr", drawing_state->description); + CP_XML_ATTR(L"descr", XmlUtils::EncodeXmlString(drawing_state->description)); } if (drawing_state->hidden) { @@ -1500,7 +1500,7 @@ void xlsx_drawing_context::serialize_control(_drawing_state_ptr & drawing_state) if (!drawing_state->description.empty()) { - CP_XML_ATTR(L"descr", drawing_state->description); + CP_XML_ATTR(L"descr", XmlUtils::EncodeXmlString(drawing_state->description)); } CP_XML_ATTR(L"hidden", 1); @@ -1601,7 +1601,7 @@ void xlsx_drawing_context::serialize_shape(_drawing_state_ptr & drawing_state) if (!drawing_state->description.empty()) { - CP_XML_ATTR(L"descr", drawing_state->description); + CP_XML_ATTR(L"descr", XmlUtils::EncodeXmlString(drawing_state->description)); } if (drawing_state->hidden) { diff --git a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp index d1b3cbb4e7..49cd1496ec 100644 --- a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp +++ b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp @@ -130,9 +130,9 @@ const int str2column(std::wstring::const_iterator& str_begin, std::wstring::cons column = (column + 1) * radix + (symb - L'A'); } - if(column > 255) + if(column > 16384) { - column = 255; + column = 16384; } return column; @@ -152,9 +152,9 @@ const int str2row(std::wstring::const_iterator& str_begin, std::wstring::const_i row = row * 10 + (symb - L'0'); } --row; - if(row > 65535) + if(row > 1048576) { - row = 65535; + row = 1048576; } return row; } @@ -692,6 +692,28 @@ unsigned short sheetsnames2ixti(std::wstring name) return 0xFFFF; } + unsigned short AddMultysheetXti(const std::wstring& name, const _INT32& firstIxti, const _INT32& secondIxti) + { + auto pos1 = std::find_if(XLS::GlobalWorkbookInfo::arXti_External_static.cbegin(), XLS::GlobalWorkbookInfo::arXti_External_static.cend(), + [&](XLS::GlobalWorkbookInfo::_xti i) { + return i.iSup == firstIxti; + }); + + auto pos2 = std::find_if(XLS::GlobalWorkbookInfo::arXti_External_static.cbegin(), XLS::GlobalWorkbookInfo::arXti_External_static.cend(), + [&](XLS::GlobalWorkbookInfo::_xti i) { + return i.iSup == secondIxti; + }); + if (pos1 == XLS::GlobalWorkbookInfo::arXti_External_static.cend() || pos2 == XLS::GlobalWorkbookInfo::arXti_External_static.cend()) + return 0; + XLS::GlobalWorkbookInfo::_xti newXti; + newXti.iSup = XLS::GlobalWorkbookInfo::arXti_External_static.size(); + newXti.itabFirst = pos1->itabFirst; + newXti.itabLast = pos2->itabFirst; + newXti.link = name; + XLS::GlobalWorkbookInfo::arXti_External_static.push_back(newXti); + return newXti.iSup; + } + unsigned int definenames2index(std::wstring name) { unsigned int index; diff --git a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h index a7a06f1e93..f839fa0f1f 100644 --- a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h +++ b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h @@ -96,5 +96,6 @@ unsigned int definenames2index(std::wstring name); bool isTableFmla(const std::wstring& tableName, _UINT32& listIndex); bool isColumn(const std::wstring& columnName, _UINT32 listIndex, _UINT16& indexColumn); unsigned int getColumnsCount(_UINT32 listIndex); +unsigned short AddMultysheetXti(const std::wstring& name, const _INT32& firstIxti, const _INT32& secondIxti); } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/DVal.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/DVal.cpp index c65c93fd14..c44852c18d 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/DVal.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/DVal.cpp @@ -62,9 +62,13 @@ void DVal::readFields(CFRecord& record) void DVal::writeFields(CFRecord& record) { _UINT16 flags = 0; + _UINT32 reserved = 0; SETBIT(flags, 0, fWnClosed); - record << flags << xLeft << yTop << idObj << idvMac; + if(record.getGlobalWorkbookInfo()->Version < 0x0800) + record << flags << xLeft << yTop << idObj << idvMac; + else + record << flags << xLeft << yTop << reserved << idvMac; } } // namespace XLS diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Dv.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Dv.cpp index e55f2caebf..825d8c5af4 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Dv.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Dv.cpp @@ -142,20 +142,33 @@ void Dv::writeFields(CFRecord& record) record << FRTheader; _UINT32 flags = 0; + if(record.getGlobalWorkbookInfo()->Version < 0x0800) + { + SETBITS(flags, 0, 3, valType) + SETBITS(flags, 4, 6, errStyle) - SETBITS(flags, 0, 3, valType) - SETBITS(flags, 4, 6, errStyle) - - SETBIT(flags, 7, fStrLookup) - SETBIT(flags, 8, fAllowBlank) - SETBIT(flags, 9, fSuppressCombo) - SETBITS(flags, 10, 17, mdImeMode) - SETBIT(flags, 18, fShowInputMsg) - SETBIT(flags, 19, fShowErrorMsg) - SETBITS(flags, 20, 23, typOperator) - SETBIT(flags, 24, fDVMinFmla) - SETBIT(flags, 25, fDVMaxFmla) + SETBIT(flags, 7, fStrLookup) + SETBIT(flags, 8, fAllowBlank) + SETBIT(flags, 9, fSuppressCombo) + SETBITS(flags, 10, 17, mdImeMode) + SETBIT(flags, 18, fShowInputMsg) + SETBIT(flags, 19, fShowErrorMsg) + SETBITS(flags, 20, 23, typOperator) + SETBIT(flags, 24, fDVMinFmla) + SETBIT(flags, 25, fDVMaxFmla) + } + else + { + SETBITS(flags, 0, 3, valType) + SETBITS(flags, 4, 6, errStyle) + SETBIT(flags, 8, fAllowBlank) + SETBIT(flags, 9, fSuppressCombo) + SETBITS(flags, 10, 17, mdImeMode) + SETBIT(flags, 18, fShowInputMsg) + SETBIT(flags, 19, fShowErrorMsg) + SETBITS(flags, 20, 23, typOperator) + } record << flags; if (record.getGlobalWorkbookInfo()->Version < 0x0800) @@ -174,10 +187,17 @@ void Dv::writeFields(CFRecord& record) XLSB::DValStrings dvalstr; dvalstr.strPromptTitle = PromptTitle; - dvalstr.strErrorTitle = ErrorTitle; + if(!PromptTitle.size()) + dvalstr.strPromptTitle.setSize(0xFFFFFFFF); + dvalstr.strErrorTitle = ErrorTitle; + if(!ErrorTitle.size()) + dvalstr.strErrorTitle.setSize(0xFFFFFFFF); dvalstr.strPrompt = Prompt; + if(!Prompt.size()) + dvalstr.strPrompt.setSize(0xFFFFFFFF); dvalstr.strError = Error; - + if(!Error.size()) + dvalstr.strError.setSize(0xFFFFFFFF); record << dvalstr; } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.cpp index dd5354f3ce..4de86dbffc 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.cpp @@ -186,12 +186,16 @@ void CellRangeRef::fromString(const std::wstring& str) } rowFirst = 0; - rowLast = 65535; + rowLast = 1048576; + rowFirstRelative = false; + rowLastRelative = false; } if(-1 == columnFirst || -1 == columnLast) // no column specified - means whole row or range of rows { columnFirst = 0; - columnLast = 255; + columnLast = 16384; + columnFirstRelative = false; + columnLastRelative = false; } to_string_cache.clear(); } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/DVParsedFormula.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/DVParsedFormula.cpp index ca52fba9e9..447b0e0b83 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/DVParsedFormula.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/DVParsedFormula.cpp @@ -93,31 +93,51 @@ void DVParsedFormula::save(CFRecord& record, bool bSave) else { cce = 0; - record << cce; + auto cb = 0; + record << cce << cb; } } void DVParsedFormula::save(CFRecord& record) { - auto saving = [&](BiffStructure& rgceORrgb) + if (record.getGlobalWorkbookInfo()->Version < 0x0800) { - record << cce; + auto saving = [&](BiffStructure& rgceORrgb) + { + record << cce; - auto rdPtr = record.getRdPtr(); + auto rdPtr = record.getRdPtr(); - rgceORrgb.save(record); + rgceORrgb.save(record); - cce = record.getRdPtr() - rdPtr; + cce = record.getRdPtr() - rdPtr; - record.RollRdPtrBack(cce + 4); - record << cce; - record.skipNunBytes(cce); - }; + record.RollRdPtrBack(cce + 4); + record << cce; + record.skipNunBytes(cce); + }; - saving(rgce); - - if (record.getGlobalWorkbookInfo()->Version == 0x0800) + saving(rgce); + } + else { + _UINT32 size = 0; + auto saving = [&](BiffStructure& rgceORrgb) + { + record << size; + + auto rdPtr = record.getRdPtr(); + + rgceORrgb.save(record); + + size = record.getRdPtr() - rdPtr; + + record.RollRdPtrBack(size + 4); + record << size; + record.skipNunBytes(size); + }; + + saving(rgce); saving(rgcb); } } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgName.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgName.cpp index 6bf66b4a28..cc3fad865b 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgName.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgName.cpp @@ -80,7 +80,7 @@ void PtgName::writeFields(CFRecord& record) { record.reserveNunBytes(12); } - else + else if(record.getGlobalWorkbookInfo()->Version < 0x0800 ) { record.reserveNunBytes(2); } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SharedParsedFormula.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SharedParsedFormula.cpp index 066752eb2a..14d90b2532 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SharedParsedFormula.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SharedParsedFormula.cpp @@ -44,7 +44,7 @@ SharedParsedFormula::SharedParsedFormula(const bool is_part_of_a_revision, const SharedParsedFormula& SharedParsedFormula::operator=(const std::wstring& value) { - ParsedFormula::operator = (value); + parseStringFormula(value, L"SharedParsedFormula"); return *this; } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp index 1245cd1c0f..1f3544d4d8 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp @@ -281,6 +281,7 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R unsigned int number; unsigned short ixti; PtgList ptgList(PtgList::fixed_id); + ptgList.type_ = 0x00; if(SyntaxPtg::extract_PtgBool(it, itEnd, operand_str)) { @@ -306,7 +307,14 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R } else if(SyntaxPtg::extract_PtgRef(it, itEnd, operand_str)) { - rgce.addPtg(found_operand = OperandPtgPtr(new PtgRef3d(ixti, operand_str, OperandPtg::ptg_VALUE, rgce.getLocation()))); + auto pos = std::find_if(XLS::GlobalWorkbookInfo::arXti_External_static.cbegin(), XLS::GlobalWorkbookInfo::arXti_External_static.cend(), + [&](XLS::GlobalWorkbookInfo::_xti i) { + return i.iSup == ixti; + }); + if(pos->itabFirst == pos->itabLast) + rgce.addPtg(found_operand = OperandPtgPtr(new PtgRef3d(ixti, operand_str, OperandPtg::ptg_VALUE, rgce.getLocation()))); + else + rgce.addPtg(found_operand = OperandPtgPtr(new PtgRef3d(ixti, operand_str, OperandPtg::ptg_REFERENCE, rgce.getLocation()))); } else if(SyntaxPtg::extract_PtgRefErr(it, itEnd)) { @@ -331,13 +339,16 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R } else if (SyntaxPtg::extract_PtgList(it, itEnd, ptgList))// Shall be placed strongly before PtgArea and PtgRef { + if((ptgList.rowType == 0x10 || ptgList.rowType == 0x08 || ptgList.rowType == 0x02) + && ptgList.columns == 0x01) + ptgList.type_ = 0x01; rgce.addPtg(found_operand = OperandPtgPtr(new PtgList(ptgList))); } else if(SyntaxPtg::extract_PtgArea(it, itEnd, operand_str)) // Sequence is important (in pair with PtgRef) { if(L"SharedParsedFormula" == tag_name || L"CFParsedFormulaNoCCE" == tag_name) { - found_operand = OperandPtgPtr(new PtgAreaN(operand_str, OperandPtg::ptg_VALUE, rgce.getLocation())); + found_operand = OperandPtgPtr(new PtgAreaN(operand_str, OperandPtg::ptg_REFERENCE, rgce.getLocation())); } else { @@ -397,6 +408,10 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R else { + //add error name to prevent endless formula conversion + rgce.sequence.clear(); + rgce.addPtg(found_operand = OperandPtgPtr(new PtgErr(L"#NAME?"))); + break; // EXCEPT::RT::WrongFormulaString("Unknown operand format in formula.", assembled_formula); } last_ptg = found_operand; diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp index fdd9920eec..f24f5e7ad2 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp @@ -427,7 +427,7 @@ const bool SyntaxPtg::extract_PtgStr(std::wstring::const_iterator& first, std::w // static const bool SyntaxPtg::extract_PtgName(std::wstring::const_iterator& first, std::wstring::const_iterator last, unsigned int& out_num) { - static boost::wregex reg_name(L"^(\\w[\\w\\d.]*)([-+*/^&%<=>: ;),]|$)"); + static boost::wregex reg_name(L"^([\\w[:Unicode:]][\\w[:Unicode:]\\d.]*)([-+*/^&%<=>: ;),]|$)"); boost::match_results results; if(boost::regex_search(first, last, results, reg_name)) @@ -447,7 +447,7 @@ const bool SyntaxPtg::extract_PtgName(std::wstring::const_iterator& first, std:: // static const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std::wstring::const_iterator last, PtgList& ptgList, unsigned short ixti) { - static boost::wregex reg_table_name(L"^(\\w[\\w\\d.]*)\\["); //tableName '=SUM(tblName[Total])' + static boost::wregex reg_table_name(L"^([\\w[:Unicode:]][[:Unicode:]\\w\\d.]*)\\["); //tableName '=SUM(tblName[Total])' boost::match_results results; if (boost::regex_search(first, last, results, reg_table_name)) @@ -464,9 +464,9 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: ptgList.invalid = false; ptgList.nonresident = false; ptgList.ixti = ixti; - static boost::wregex reg_inside_table1(L"\\[#?[\\s\\w\\d.]+\\]"); - static boost::wregex reg_inside_table2(L"\\[#\\w[\\s\\w\\d.]*\\],\\[#\\w[\\s\\w\\d.]*\\]"); - static boost::wregex reg_inside_table3(L"^[,;:]?\\[#?[\\s\\w\\d.]+\\]"); + static boost::wregex reg_inside_table1(L"\\[#?[\\s\\w[:Unicode:]\\d.]+\\]"); + static boost::wregex reg_inside_table2(L"\\[#[\\w[:Unicode:]][\\s\\w[:Unicode:]\\d.]*\\],\\[#[\\w[:Unicode:]][[:Unicode:]\\s\\w\\d.]*\\]"); + static boost::wregex reg_inside_table3(L"^[,;:]?\\[#?[[:Unicode:]\\s\\w\\d.]+\\]"); static boost::wregex reg_inside_table4(L"\\[#?(\\[.+?\\]\\,)?(\\[.+?\\])?.+?\\]"); static boost::wregex reg_inside_table5(L"^[,;:]?\\[.+?\\]"); static boost::wregex reg_inside_table6(L"\\[\\]"); @@ -713,30 +713,47 @@ const bool SyntaxPtg::extract_PtgRef(std::wstring::const_iterator& first, std::w // static const bool SyntaxPtg::extract_3D_part(std::wstring::const_iterator& first, std::wstring::const_iterator last, unsigned short& ixti) { - static boost::wregex reg_sheets(L"^(\\w[\\w\\d.]*(:\\w[\\w\\d.]*)?)!"); - static boost::wregex reg_quoted(L"^'((''|[^]['\\/*?])*)'!"); - boost::match_results results; - if (boost::regex_search(first, last, results, reg_sheets) || - boost::regex_search(first, last, results, reg_quoted)) - { + static boost::wregex reg_sheets(L"^([\\w[:Unicode:]][[:Unicode:]\\w\\d.]*(:[\\w[:Unicode:]][[:Unicode:]\\w\\d.]*)?)!"); + static boost::wregex reg_sheet(L"^([^:]+):(.*)$"); + static boost::wregex reg_quoted(L"^'((''|[^]['\\/*?])*)'!"); + boost::match_results results; + if (boost::regex_search(first, last, results, reg_sheets) || + boost::regex_search(first, last, results, reg_quoted)) + { - std::wstring sheets_names = results.str(1); + std::wstring sheets_names = results.str(1); - ixti = XMLSTUFF::sheetsnames2ixti(boost::algorithm::replace_all_copy(sheets_names, L"''", L"'")); - if(0xFFFF != ixti) - { - first = results[0].second; - return true; - } - } - return false; + ixti = XMLSTUFF::sheetsnames2ixti(boost::algorithm::replace_all_copy(sheets_names, L"''", L"'")); + if(0xFFFF != ixti) + { + first = results[0].second; + return true; + } + boost::match_results results2; + if (boost::regex_search(sheets_names, results2, reg_sheet)) + { + auto firstSheetName = results2.str(1); + auto secondSheetName = results2.str(2); + auto xti1 = XMLSTUFF::sheetsnames2ixti(boost::algorithm::replace_all_copy(firstSheetName, L"''", L"'")); + auto xti2 = XMLSTUFF::sheetsnames2ixti(boost::algorithm::replace_all_copy(secondSheetName, L"''", L"'")); + if(0xFFFF != xti1 && 0xFFFF != xti2) + { + ixti = XMLSTUFF::AddMultysheetXti(sheets_names, xti1, xti2); + if(!ixti) + return false; + first = results[0].second; + return true; + } + } + } + return false; } // static const bool SyntaxPtg::extract_UndefinedName(std::wstring::const_iterator& first, std::wstring::const_iterator last) { - static boost::wregex reg_undef(L"^([\\w\\d.]+)([-+*/^&%<=>: ;),]|$)"); + static boost::wregex reg_undef(L"^([[:Unicode:]\\w\\d.]+)([-+*/^&%<=>: ;),]|$)"); boost::match_results results; if(boost::regex_search(first, last, results, reg_undef)) { diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp index 4fa7de73c5..fe040d36be 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp @@ -85,7 +85,6 @@ void XFProp::load(CFRecord& record) case 0x000F: case 0x0010: case 0x0011: // XFPropTextRotation - case 0x0012: // indent case 0x0013: // ReadingOrder case 0x0014: case 0x0015: @@ -112,6 +111,7 @@ void XFProp::load(CFRecord& record) xfPropDataBlob = str; return; } + case 0x0012: // indent case 0x0019: case 0x001A: case 0x001B: @@ -141,6 +141,7 @@ void XFProp::load(CFRecord& record) } void XFProp::save(CFRecord& record) { + LPWideString* strData; if (xfPropDataBlob) { cb = sizeof(cb) + sizeof(xfPropType); @@ -152,7 +153,6 @@ void XFProp::save(CFRecord& record) case 0x000F: case 0x0010: case 0x0011: // XFPropTextRotation - case 0x0012: // indent case 0x0013: // ReadingOrder case 0x0014: case 0x0015: @@ -196,9 +196,12 @@ void XFProp::save(CFRecord& record) case 0x0026: case 0x0018: { - blobSize = sizeof(*xfPropDataBlob.get()); + strData = dynamic_cast(xfPropDataBlob.get()); + if(strData) + blobSize = (strData->getSize() * 2) + 2; } break; + case 0x0012: // indent case 0x0019: case 0x001A: case 0x001B: @@ -218,9 +221,8 @@ void XFProp::save(CFRecord& record) if (xfPropType == 0x0026 || xfPropType == 0x0018) { - LPWideString* string = dynamic_cast(xfPropDataBlob.get()); - if (string) - record << *string; + if (strData) + record << *strData; } else record << *xfPropDataBlob; @@ -345,6 +347,37 @@ static void deserialize_val_prop(XmlUtils::CXmlLiteReader& oReader, const std::w } } +static void deserialize_default_val(XmlUtils::CXmlLiteReader& oReader, const std::wstring & typeName, const _UINT32& value, BiffStructurePtr & val) +{ + BiffStructurePtr biffref; + deserialize_val_prop(oReader, typeName, biffref); + if (typeName == L"BIFF_WORD") + { + auto word = new BIFF_WORD; + if(biffref.get()) + { + *word = *(reinterpret_cast(biffref.get())); + } + else + { + *word = value; + } + val.reset(word); + } + else if(typeName == L"BIFF_BYTE") + { + auto word = new BIFF_BYTE; + if(biffref.get()) + { + *word = *(reinterpret_cast(biffref.get())); + } + else + { + *word = value; + } + val.reset(word); + } +} static void deserialize_prop(XmlUtils::CXmlLiteReader& oReader, const std::wstring & typeName, BiffStructurePtr & val) { auto value = oReader.GetText(); @@ -468,10 +501,46 @@ static XFPropBorder* deserialize_border_prop(XmlUtils::CXmlLiteReader& oReader) border->color.deserialize(oReader); } } + else + { + border->color.xclrType = 0; + border->color.fValidRGBA = false; + border->color.nTintShade = 0; + } return border; } - + static void deserialize_alignment(XmlUtils::CXmlLiteReader& oReader, const unsigned short & typeName, BiffStructurePtr & val) + { + BIFF_BYTE* byte_ = new BIFF_BYTE; + if (!byte_) return; + + auto value = oReader.GetText(); + if(typeName == 0x000F) + { + if (value == L"general") *byte_ = 0; + else if (value == L"left") *byte_ = 1; + else if (value == L"center") *byte_ = 2; + else if (value == L"right") *byte_ = 3; + else if (value == L"fill") *byte_ = 4; + else if (value == L"justify") *byte_ = 5; + else if (value == L"center-across-selection") *byte_ = 6; + else if (value == L"distributed") *byte_ = 7; + else *byte_ = 0xFF; + } + else if(typeName == 0x0010) + { + if (value == L"top") *byte_ = 0; + else if (value == L"center") *byte_ = 1; + else if (value == L"bottom") *byte_ = 2; + else if (value == L"justify") *byte_ = 3; + else if (value == L"distributed") *byte_ = 4; + else *byte_ = 0; + } + else + *byte_ = 0; + val.reset(byte_); + } void XFProp::serialize_attr(CP_ATTR_NODE) { switch(xfPropType) @@ -536,7 +605,8 @@ void XFProp::deserialize_attr(XmlUtils::CXmlLiteReader& oReader) if (value == L"none") *byte_ = 0; else if (value == L"solid") *byte_ = 1; else if (value == L"pct50") *byte_ = 2; - else if (value == L"pct75") *byte_ = 3; + else if (value == L"pct75" || value == L"darkGray") + *byte_ = 3; else if (value == L"pct25") *byte_ = 4; else if (value == L"horzStripe") *byte_ = 5; else if (value == L"vertStripe") *byte_ = 6; @@ -552,7 +622,8 @@ void XFProp::deserialize_attr(XmlUtils::CXmlLiteReader& oReader) else if (value == L"thinDiagCross") *byte_ = 16; else if (value == L"gray125") *byte_ = 17; else if (value == L"gray0625") *byte_ = 18; - + else *byte_ = 1; + xfPropDataBlob.reset(byte_); }break; @@ -585,25 +656,34 @@ void XFProp::deserialize_attr(XmlUtils::CXmlLiteReader& oReader) case 0x000C: xfPropDataBlob.reset(deserialize_border_prop(oReader)); break; + case 0x000F: + case 0x0010: + deserialize_alignment(oReader, xfPropType, xfPropDataBlob); + break; case 0x000D: case 0x000E: - case 0x000F: - case 0x0010: case 0x0011: // XFPropTextRotation - case 0x0012: // indent case 0x0013: // ReadingOrder case 0x0014: case 0x0015: case 0x0016: //case 0x0017: - xfPropDataBlob.reset(new BIFF_BYTE(XmlUtils::GetInteger(oReader.GetText()))); + xfPropDataBlob.reset(new BIFF_BYTE(XmlUtils::GetInteger(oReader.GetText()))); + break;// + case 0x0018: + deserialize_val_prop(oReader, L"LPWideString", xfPropDataBlob); break; - case 0x001C: - case 0x001D: - case 0x001E: - case 0x001F: - case 0x0020: - case 0x0021: + case 0x0019: + deserialize_default_val(oReader, L"BIFF_WORD", 0x02BC, xfPropDataBlob); + break; + case 0x0020: + case 0x0021: + case 0x001C: + case 0x001D: + case 0x001E: + case 0x001F: + deserialize_default_val(oReader, L"BIFF_BYTE", 0x01, xfPropDataBlob); + break; case 0x0022: case 0x0023: xfPropDataBlob.reset(new BIFF_BYTE(1)); @@ -614,24 +694,18 @@ void XFProp::deserialize_attr(XmlUtils::CXmlLiteReader& oReader) case 0x002C: deserialize_prop(oReader, L"BIFF_BYTE", xfPropDataBlob); break; - case 0x0018: - deserialize_val_prop(oReader, L"LPWideString", xfPropDataBlob); - break; + case 0x0012: // indent case 0x0029: + case 0x002A: xfPropDataBlob.reset(new BIFF_WORD(XmlUtils::GetInteger(oReader.GetText()))); break; - case 0x0019: - xfPropDataBlob.reset(new BIFF_WORD(0x02BC1)); - deserialize_val_prop(oReader, L"BIFF_WORD", xfPropDataBlob); - break; case 0x001A: - xfPropDataBlob.reset(new BIFF_WORD(1)); + //xfPropDataBlob.reset(new BIFF_WORD(1)); case 0x001B: - case 0x002A: deserialize_val_prop(oReader, L"BIFF_WORD", xfPropDataBlob); break; case 0x0024: - xfPropDataBlob.reset(new BIFF_DWORD(XmlUtils::GetInteger(oReader.GetText()))); + deserialize_val_prop(oReader, L"BIFF_DWORD", xfPropDataBlob); break; case 0x0026: xfPropDataBlob.reset(new LPWideString(oReader.GetText())); @@ -640,7 +714,7 @@ void XFProp::deserialize_attr(XmlUtils::CXmlLiteReader& oReader) } int XFProp::serialize(std::wostream & stream) { - CP_XML_WRITER(stream) + CP_XML_WRITER(stream) { switch(xfPropType) { diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFPropColor.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFPropColor.cpp index 2d4075c68f..a505a8d8d5 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFPropColor.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFPropColor.cpp @@ -120,11 +120,14 @@ int XFPropColor::deserialize(XmlUtils::CXmlLiteReader& oReader) dwRgba.Parse(oReader.GetText()); fValidRGBA = true; } - else if (wsPropName == L"tint") + if (wsPropName == L"tint") { nTintShade = XmlUtils::GetDouble(oReader.GetText()) * 32767.0; } - + else + { + nTintShade = 0; + } if (!oReader.MoveToNextAttribute()) break; diff --git a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp index 71ec17e991..cbec1638f2 100644 --- a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp +++ b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp @@ -5867,7 +5867,7 @@ void BinaryWorksheetTableWriter::WriteOleObjects(const OOX::Spreadsheet::CWorksh } } } - if (pImageFileCache.IsInit() && pOleObject->m_oObjectPr.IsInit() && pOleObject->m_oObjectPr->m_oRid.IsInit()) + if (false == pImageFileCache.IsInit() && pOleObject->m_oObjectPr.IsInit() && pOleObject->m_oObjectPr->m_oRid.IsInit()) { sIdImageFileCache = pOleObject->m_oObjectPr->m_oRid->GetValue(); @@ -8020,26 +8020,26 @@ void BinaryWorksheetTableWriter::WriteUserProtectedRange(const OOX::Spreadsheet: if (oUserProtectedRange.m_oName.IsInit()) { int nCurPos = m_oBcw.WriteItemStart(c_oSer_UserProtectedRange::Name); - m_oBcw.m_oStream.WriteStringW(*oUserProtectedRange.m_oName); + m_oBcw.m_oStream.WriteStringW3(*oUserProtectedRange.m_oName); m_oBcw.WriteItemEnd(nCurPos); } if (oUserProtectedRange.m_oSqref.IsInit()) { int nCurPos = m_oBcw.WriteItemStart(c_oSer_UserProtectedRange::Sqref); - m_oBcw.m_oStream.WriteStringW(*oUserProtectedRange.m_oSqref); + m_oBcw.m_oStream.WriteStringW3(*oUserProtectedRange.m_oSqref); m_oBcw.WriteItemEnd(nCurPos); } if (oUserProtectedRange.m_oText.IsInit()) { int nCurPos = m_oBcw.WriteItemStart(c_oSer_UserProtectedRange::Text); - m_oBcw.m_oStream.WriteStringW(*oUserProtectedRange.m_oText); + m_oBcw.m_oStream.WriteStringW3(*oUserProtectedRange.m_oText); m_oBcw.WriteItemEnd(nCurPos); } if (oUserProtectedRange.m_oType.IsInit()) { - m_oBcw.m_oStream.WriteBYTE(c_oSer_UserProtectedRange::Type); - m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte); + int nCurPos = m_oBcw.WriteItemStart(c_oSer_UserProtectedRange::Type); m_oBcw.m_oStream.WriteBYTE(oUserProtectedRange.m_oType->GetValue()); + m_oBcw.WriteItemEnd(nCurPos); } for (size_t i = 0; i < oUserProtectedRange.m_arUsers.size(); ++i) { diff --git a/OOXML/Binary/Sheets/Reader/CSVReader.cpp b/OOXML/Binary/Sheets/Reader/CSVReader.cpp index e9f32647fc..29aba988e6 100644 --- a/OOXML/Binary/Sheets/Reader/CSVReader.cpp +++ b/OOXML/Binary/Sheets/Reader/CSVReader.cpp @@ -219,6 +219,8 @@ _UINT32 CSVReader::Impl::Read(const std::wstring &sFileName, OOX::Spreadsheet::C smart_ptr pWorksheet(new OOX::Spreadsheet::CWorksheet(NULL)); pWorksheet->m_oSheetData.Init(); + pWorksheet->m_oSheetFormatPr.Init(); + pWorksheet->m_oSheetFormatPr->m_oBaseColWidth = 9; //----------------------------------------------------------------------------------- DWORD nFileSize = 0; @@ -311,6 +313,7 @@ _UINT32 CSVReader::Impl::Read(const std::wstring &sFileName, OOX::Spreadsheet::C INT nIndexRow = 0; INT nIndexCol = 0; OOX::Spreadsheet::CRow *pRow = new OOX::Spreadsheet::CRow(); + pRow->m_oR.Init(); pRow->m_oR->SetValue(nIndexRow + 1); diff --git a/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.cpp b/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.cpp index 265c6ae7f8..353c032162 100644 --- a/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.cpp +++ b/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.cpp @@ -42,10 +42,21 @@ #include #include + const std::wstring DefaultDateFormat = L"dd.mm.yyyy"; const std::wstring DefaultPercentFormat = L"0.0%"; const std::wstring DefaultDollarFormat = L"#,##0.00$"; +std::map defaultDataFormats +{ + {DefaultDateFormat, 14}, + {L"d-mmm-yy", 15}, + {L"d-mmm", 16}, + {L"mmm-yy", 17}, + {L"m/d/yy h:mm", 22}, + {L"h:mm", 20} +}; + CellFormatController::CellFormatController(OOX::Spreadsheet::CStyles *styles): m_pStyles{styles} { @@ -170,23 +181,29 @@ void CellFormatController::ProcessCellType(OOX::Spreadsheet::CCell *pCell, const void CellFormatController::createFormatStyle(const std::wstring &format) { - if (!m_pStyles->m_oNumFmts.IsInit()) + auto prepareFormat = defaultDataFormats.find(format); + if(prepareFormat == defaultDataFormats.end()) { - m_pStyles->m_oNumFmts.Init(); + if (!m_pStyles->m_oNumFmts.IsInit()) + { + m_pStyles->m_oNumFmts.Init(); + } + m_pStyles->m_oNumFmts->m_arrItems.push_back(new OOX::Spreadsheet::CNumFmt()); + m_pStyles->m_oNumFmts->m_arrItems.back()->m_oFormatCode = format; + m_pStyles->m_oNumFmts->m_arrItems.back()->m_oNumFmtId.Init(); + m_pStyles->m_oNumFmts->m_arrItems.back()->m_oNumFmtId->SetValue(164 + m_pStyles->m_oNumFmts->m_arrItems.size()); } - m_pStyles->m_oNumFmts->m_arrItems.push_back(new OOX::Spreadsheet::CNumFmt()); - m_pStyles->m_oNumFmts->m_arrItems.back()->m_oFormatCode = format; - m_pStyles->m_oNumFmts->m_arrItems.back()->m_oNumFmtId.Init(); - m_pStyles->m_oNumFmts->m_arrItems.back()->m_oNumFmtId->SetValue(164 + m_pStyles->m_oNumFmts->m_arrItems.size()); - // Normal + data format OOX::Spreadsheet::CXfs* pXfs = new OOX::Spreadsheet::CXfs(); pXfs->m_oBorderId.Init(); pXfs->m_oBorderId->SetValue(0); pXfs->m_oFillId.Init(); pXfs->m_oFillId->SetValue(0); pXfs->m_oFontId.Init(); pXfs->m_oFontId->SetValue(0); - pXfs->m_oNumFmtId.Init(); pXfs->m_oNumFmtId->SetValue(m_pStyles->m_oNumFmts->m_arrItems.back()->m_oNumFmtId->GetValue()); - + pXfs->m_oNumFmtId.Init(); + if(prepareFormat == defaultDataFormats.end()) + pXfs->m_oNumFmtId->SetValue(m_pStyles->m_oNumFmts->m_arrItems.back()->m_oNumFmtId->GetValue()); + else + pXfs->m_oNumFmtId->SetValue(prepareFormat->second); m_pStyles->m_oCellXfs->m_arrItems.push_back(pXfs); auto styleNum = (unsigned int)(m_pStyles->m_oCellXfs->m_arrItems.size() - 1); diff --git a/OOXML/Common/SimpleTypes_Spreadsheet.h b/OOXML/Common/SimpleTypes_Spreadsheet.h index 97c7808f93..70de28e593 100644 --- a/OOXML/Common/SimpleTypes_Spreadsheet.h +++ b/OOXML/Common/SimpleTypes_Spreadsheet.h @@ -808,18 +808,18 @@ namespace SimpleTypes //---------------------------------------------------- // 18.18.82 ST_TimePeriod (Conditional Format Value Object Type) //---------------------------------------------------- - enum ETimePeriod + enum ETimePeriod { - last7Days = 0, - lastMonth = 1, - lastWeek = 2, - nextMonth = 3, - nextWeek = 4, - thisMonth = 5, - thisWeek = 6, - today = 7, - tomorrow = 8, - yesterday = 9 + last7Days = 0, + lastMonth = 1, + lastWeek = 2, + nextMonth = 3, + nextWeek = 4, + thisMonth = 5, + thisWeek = 6, + today = 7, + tomorrow = 8, + yesterday = 9 }; DEFINE_SIMPLE_TYPE(ST_TimePeriod, ETimePeriod, last7Days) diff --git a/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp b/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp index 6fd1940e89..07ef977c65 100644 --- a/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp +++ b/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp @@ -2297,7 +2297,7 @@ void CDrawingConverter::ConvertDrawing(PPTX::Logic::SpTreeElem *elem, XmlUtils:: } } } -void CDrawingConverter::ConvertShape(PPTX::Logic::SpTreeElem *elem, XmlUtils::CXmlNode& oNodeShape, std::wstring**& pMainProps,bool bIsTop) +void CDrawingConverter::ConvertShape(PPTX::Logic::SpTreeElem *elem, XmlUtils::CXmlNode& oNodeShape, std::wstring**& pMainProps, bool bIsTop) { if (!elem) return; @@ -3436,11 +3436,11 @@ void CDrawingConverter::ConvertWordArtShape(PPTX::Logic::SpTreeElem* elem, XmlUt strRPr += L""; nullable_string sStrokeColor; - nullable_string sStrokeWeight; + nullable oStrokeWeight; nullable_string sStroked; XmlMacroReadAttributeBase(oNodeShape, L"strokecolor", sStrokeColor); - XmlMacroReadAttributeBase(oNodeShape, L"strokeweight", sStrokeWeight); + XmlMacroReadAttributeBase(oNodeShape, L"strokeweight", oStrokeWeight); XmlMacroReadAttributeBase(oNodeShape, L"stroked", sStroked); XmlUtils::CXmlNode oNodeStroke = oNodeShape.ReadNode(L"v:stroke"); @@ -3580,18 +3580,13 @@ void CDrawingConverter::ConvertWordArtShape(PPTX::Logic::SpTreeElem* elem, XmlUt strRPr += L""; //textOutline - double m_dValue = 1; - if (sStrokeWeight.is_init()) + double m_dValuePt = 1; + if (oStrokeWeight.is_init()) { - std::wstring strW(*sStrokeWeight); - int p = (int)strW.find(L"pt"); - if (p >= 0) - strW.erase(p); - - m_dValue = XmlUtils::GetDouble(strW); + m_dValuePt = oStrokeWeight->GetValue(); } - std::wstring strStrokeW = std::to_wstring((int)Pt_To_Emu(m_dValue)); + std::wstring strStrokeW = std::to_wstring((int)Pt_To_Emu(m_dValuePt)); strRPr += L""; smart_ptr pSolid = new PPTX::Logic::SolidFill(); @@ -3909,7 +3904,6 @@ void CDrawingConverter::LoadCoordPos(XmlUtils::CXmlNode& oNode, CShapePtr pShape } } } - pShape->getBaseShape()->m_oPath.SetCoordpos((LONG)pShape->m_dXLogic, (LONG)pShape->m_dYLogic); } @@ -5381,22 +5375,16 @@ void CDrawingConverter::CheckPenShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils:: } } - nullable_string sStrokeWeight; - XmlMacroReadAttributeBase(oNode, L"strokeweight", sStrokeWeight); - if (sStrokeWeight.is_init()) + nullable oStrokeWeight; + XmlMacroReadAttributeBase(oNode, L"strokeweight", oStrokeWeight); + if (oStrokeWeight.is_init()) { pPPTShape->m_bIsStroked = true; if (!pSpPr->ln.is_init()) pSpPr->ln = new PPTX::Logic::Ln(); - if (sStrokeWeight->length() > 0 && sStrokeWeight->at(0) == wchar_t('.')) - { - sStrokeWeight = (L"0" + *sStrokeWeight); - } - - SimpleTypes::CPoint oPoint; - int size = (int)(g_emu_koef * oPoint.FromString(*sStrokeWeight)); + int size = oStrokeWeight->ToEmu(); pSpPr->ln->w = size; pPPTShape->m_bIsStroked = true; diff --git a/OOXML/Projects/Windows/BinaryFormatLib/BinaryFormatLib.vcxproj b/OOXML/Projects/Windows/BinaryFormatLib/BinaryFormatLib.vcxproj index 71e929716b..b016c3bc60 100644 --- a/OOXML/Projects/Windows/BinaryFormatLib/BinaryFormatLib.vcxproj +++ b/OOXML/Projects/Windows/BinaryFormatLib/BinaryFormatLib.vcxproj @@ -82,7 +82,6 @@ - diff --git a/OOXML/Projects/Windows/BinaryFormatLib/BinaryFormatLib.vcxproj.filters b/OOXML/Projects/Windows/BinaryFormatLib/BinaryFormatLib.vcxproj.filters index 1ac5444aa8..eb22134e16 100644 --- a/OOXML/Projects/Windows/BinaryFormatLib/BinaryFormatLib.vcxproj.filters +++ b/OOXML/Projects/Windows/BinaryFormatLib/BinaryFormatLib.vcxproj.filters @@ -161,9 +161,6 @@ - - Document - Document diff --git a/OOXML/XlsbFormat/Biff12_records/BeginExtConnection.cpp b/OOXML/XlsbFormat/Biff12_records/BeginExtConnection.cpp index d3382ca305..02040d7c56 100644 --- a/OOXML/XlsbFormat/Biff12_records/BeginExtConnection.cpp +++ b/OOXML/XlsbFormat/Biff12_records/BeginExtConnection.cpp @@ -107,6 +107,7 @@ namespace XLSB SETBIT(flags, 16, fLoadSourceDataFile) SETBIT(flags, 17, fLoadSourceConnectionFile) SETBIT(flags, 18, fLoadConnectionDesc) + SETBIT(flags, 19, 1) SETBIT(flags, 20, fLoadSSOApplicationID) record << wInterval << flags; diff --git a/OOXML/XlsbFormat/Xlsb.cpp b/OOXML/XlsbFormat/Xlsb.cpp index 74a9c26ce7..3aa80e3b93 100644 --- a/OOXML/XlsbFormat/Xlsb.cpp +++ b/OOXML/XlsbFormat/Xlsb.cpp @@ -101,6 +101,10 @@ bool OOX::Spreadsheet::CXlsb::WriteBin(const CPath& oDirPath, OOX::CContentTypes return false; m_bWriteToXlsb = true; + if(!m_oContentTypes.m_mapDefaults.empty() && !m_oContentTypes.m_mapOverrides.empty()) + { + oContentTypes.Merge(&m_oContentTypes); + } IFileContainer::Write(oDirPath / L"", OOX::CPath(_T("")), oContentTypes); @@ -122,6 +126,22 @@ bool OOX::Spreadsheet::CXlsb::WriteBin(const CPath& oFilePath, XLS::BaseObject* return true; } +void OOX::Spreadsheet::CXlsb::WriteSheetData() +{ + for(auto &worksheet : m_arWorksheets) + { + + //для оптимизации по памяти сразу записываем в файл все листы + if(m_bWriteToXlsb) + { + WriteSheet(worksheet); + }// + + //cell_table_temlate.reset(); + //reader.reset(); + } +} + XLS::GlobalWorkbookInfo* OOX::Spreadsheet::CXlsb::GetGlobalinfo() { return xls_global_info.get(); diff --git a/OOXML/XlsbFormat/Xlsb.h b/OOXML/XlsbFormat/Xlsb.h index 065dc60d28..40a8689541 100644 --- a/OOXML/XlsbFormat/Xlsb.h +++ b/OOXML/XlsbFormat/Xlsb.h @@ -70,6 +70,7 @@ namespace OOX void PrepareSi(); void PrepareTableFormula(); void ReadSheetData(); + void WriteSheetData(); void SetPropForWriteSheet(const std::wstring &sPath, OOX::CContentTypes& oContentTypes); void WriteSheet(CWorksheet* worksheet); diff --git a/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.cpp b/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.cpp index 22d57d25a4..4b13e626f4 100644 --- a/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.cpp +++ b/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.cpp @@ -59,9 +59,27 @@ XLS::BaseObjectPtr CPivotCacheDefinitionExt::toBin() auto ptr(new XLSB::PCD14); XLS::BaseObjectPtr objectPtr(ptr); auto ptr1(new XLSB::BeginPCD14); + if(m_oSlicerData.IsInit()) + ptr1->fSlicerData = m_oSlicerData.get(); + else + ptr1->fSlicerData = false; + if(m_oSrvSupportAddCalcMems.IsInit()) + ptr1->fSrvSupportAddCalcMems = m_oSrvSupportAddCalcMems.get(); + else + ptr1->fSrvSupportAddCalcMems = false; + if(m_oSrvSupportSubQueryCalcMem.IsInit()) + ptr1->fSrvSupportSubQueryCalcMem = m_oSrvSupportSubQueryCalcMem.get(); + else + ptr1->fSrvSupportSubQueryCalcMem = false; + if(m_oSrvSupportSubQueryNonVisual.IsInit()) + ptr1->fSrvSupportSubQueryNonVisual = m_oSrvSupportSubQueryNonVisual.get(); + else + ptr1->fSrvSupportSubQueryNonVisual = false; ptr->m_BrtBeginPCD14 = XLS::BaseObjectPtr{ptr1}; if(m_oPivotCacheId.IsInit()) ptr1->icacheId = m_oPivotCacheId.get(); + else + ptr1->icacheId = 0; return objectPtr; } void CPivotCacheDefinitionExt::fromBin(XLS::BaseObjectPtr& obj) diff --git a/OOXML/XlsxFormat/Pivot/Pivots.cpp b/OOXML/XlsxFormat/Pivot/Pivots.cpp index 684274ac5b..b9a3d456c7 100644 --- a/OOXML/XlsxFormat/Pivot/Pivots.cpp +++ b/OOXML/XlsxFormat/Pivot/Pivots.cpp @@ -400,25 +400,25 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->m_BrtBeginSXView = writeAttributes(); if(m_oLocation.IsInit()) ptr->m_SXLOCATION = m_oLocation->toBin(); - if(m_oPivotFields.IsInit()) - ptr->m_SXVDS = m_oPivotFields->toBin(); - if(m_oRowFields.IsInit()) + if(m_oPivotFields.IsInit()) + ptr->m_SXVDS = m_oPivotFields->toBin(); + if(m_oRowFields.IsInit()) ptr->m_ISXVDRWS = m_oRowFields->toBinRows(); - if(m_oColFields.IsInit()) - ptr->m_ISXVDCOLS = m_oColFields->toBinCols(); + if(m_oColFields.IsInit()) + ptr->m_ISXVDCOLS = m_oColFields->toBinCols(); if(m_oRowItems.IsInit()) ptr->m_SXLIRWS = m_oRowItems->toBinRows(); if(m_oColItems.IsInit()) ptr->m_SXLICOLS = m_oColItems->toBinCols(); - if(m_oDataFields.IsInit()) - ptr->m_SXDIS = m_oDataFields->toBin(); - if(m_oFormats.IsInit()) - ptr->m_SXFORMATS = m_oFormats->toBin(); - if(m_oPivotTableStyleInfo.IsInit()) - ptr->m_BrtTableStyleClient = m_oPivotTableStyleInfo->toBin(); - if(m_oPageFields.IsInit()) - ptr->m_SXPIS = m_oPageFields->toBin(); + if(m_oDataFields.IsInit()) + ptr->m_SXDIS = m_oDataFields->toBin(); + if(m_oFormats.IsInit()) + ptr->m_SXFORMATS = m_oFormats->toBin(); + if(m_oPivotTableStyleInfo.IsInit()) + ptr->m_BrtTableStyleClient = m_oPivotTableStyleInfo->toBin(); + if(m_oPageFields.IsInit()) + ptr->m_SXPIS = m_oPageFields->toBin(); /*auto frt(new XLSB::FRTSXVIEW); auto sxview14(new XLSB::SXVIEW14); @@ -1143,18 +1143,10 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr CColumnRowItem::toBin() { auto ptr(new XLSB::SXLI); - auto size = 0; - - for(auto i:m_arrItems) - { - if(i->m_oV.IsInit()) - size++; - - } XLS::BaseObjectPtr objectPtr(ptr); auto ptr1(new XLSB::BeginSXLI); - ptr1->cisxvis = size; + ptr1->cisxvis = m_arrItems.size(); ptr->m_BrtBeginSXLI = XLS::BaseObjectPtr{ptr1}; if(m_oI.IsInit()) ptr1->iData = m_oI->GetValue(); @@ -1199,18 +1191,17 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } else { - ptr1->itmtype = XLSB::PivotItemType::PITDATA; + ptr1->itmtype = XLSB::PivotItemType::PITDEFAULT; } if(ptr1->cisxvis > 0) { - auto ptr2(new XLSB::ISXVIS(size)); - ptr2->_cisxvis = size; + auto ptr2(new XLSB::ISXVIS(ptr1->cisxvis)); + ptr2->_cisxvis = ptr1->cisxvis; ptr->m_ISXVIS = XLS::BaseObjectPtr{ptr2}; - auto ptr3(new XLSB::BeginISXVIs(size)); - ptr3->_cisxvis = size; + auto ptr3(new XLSB::BeginISXVIs(ptr1->cisxvis)); ptr2->m_BrtBeginISXVIs = XLS::BaseObjectPtr{ptr3}; for(auto i:m_arrItems) @@ -1423,10 +1414,16 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oBaseField.IsInit()) ptr->isxvd = m_oBaseField.get(); + else + ptr->isxvd = 0; if(m_oBaseItem.IsInit()) ptr->isxvi = m_oBaseItem->GetValue(); + else + ptr->isxvi = 0; if(m_oFld.IsInit()) ptr->isxvdData = m_oFld->GetValue(); + else + ptr->isxvdData = false; if(m_oNumFmtId.IsInit()) ptr->ifmt.ifmt = m_oNumFmtId->GetValue(); else @@ -1859,16 +1856,28 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oChild.IsInit()) ptr->fHasChildrenEst = m_oChild.get(); + else + ptr->fHasChildrenEst = false; if(m_oExpanded.IsInit()) ptr->fDrilledMember = m_oExpanded.get(); + else + ptr->fDrilledMember = false; if(m_oDrillAcross.IsInit()) ptr->fCollapsedMember = m_oDrillAcross.get(); + else + ptr->fCollapsedMember = false; if(m_oCalculated.IsInit()) ptr->fFormula = m_oCalculated.get(); + else + ptr->fFormula = false; if(m_oHidden.IsInit()) ptr->fHidden = m_oHidden.get(); + else + ptr->fHidden = false; if(m_oMissing.IsInit()) ptr->fMissing = m_oMissing.get(); + else + ptr->fMissing = false; if(m_oUserCaption.IsInit()) { ptr->displayName = m_oUserCaption.get(); @@ -1880,10 +1889,16 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } if(m_oCharacter.IsInit()) ptr->fOlapFilterSelected = m_oCharacter.get(); + else + ptr->fOlapFilterSelected = false; if(m_oHideDetails.IsInit()) ptr->fHideDetail = m_oHideDetails.get(); + else + ptr->fHideDetail = false; if(m_oItemIndex.IsInit()) ptr->iCache = m_oItemIndex->GetValue(); + else + ptr->iCache = 0; if(m_oItemType.IsInit()) { if(m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeData) @@ -1917,6 +1932,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeBlank) ptr->itmtype = XLSB::PivotItemType::PITBLANK; } + else + ptr->itmtype = XLSB::PivotItemType::PITDATA; return objectPtr; } void CFieldItem::fromBin(XLS::BaseObjectPtr& obj) @@ -2244,12 +2261,10 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisValues) ptr->sxaxis.bData = true; } - else - ptr->sxaxis.bData = true; if(m_oCompact.IsInit()) ptr->fCompact = m_oCompact.get(); else - ptr->fCompact = false; + ptr->fCompact = true; if(m_oCountASubtotal.IsInit()) ptr->fCounta = m_oCountASubtotal.get(); @@ -2261,9 +2276,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else ptr->fCount = false; if(m_oDataField.IsInit()) - ptr->fDrilledLevel = m_oDataField.get(); - else - ptr->fDrilledLevel = false; + ptr->sxaxis.bData = m_oDataField.get(); + if(m_oDataSourceSort.IsInit()) ptr->fTensorSort = m_oDataSourceSort.get(); else @@ -2279,24 +2293,24 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oDragOff.IsInit()) ptr->fDragToHide = m_oDragOff.get(); else - ptr->fDragToHide = false; + ptr->fDragToHide = true; if (m_oDragToCol.IsInit()) ptr->fDragToColumn = m_oDragToCol.get(); else - ptr->fDragToColumn = false; + ptr->fDragToColumn = true; if (m_oDragToData.IsInit()) ptr->fDragToData = m_oDragToData.get(); else - ptr->fDragToData = false; + ptr->fDragToData = true; if (m_oDragToPage.IsInit()) ptr->fDragToPage = m_oDragToPage.get(); else - ptr->fDragToPage = false; + ptr->fDragToPage = true; if (m_oDragToRow.IsInit()) ptr->fDragToRow = m_oDragToRow.get(); else - ptr->fDragToRow = false; + ptr->fDragToRow = true; if (m_oHiddenLevel.IsInit()) ptr->fHiddenLvl = m_oHiddenLevel.get(); else @@ -2308,7 +2322,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oIncludeNewItemsInFilter.IsInit()) ptr->fFilterInclusive = m_oIncludeNewItemsInFilter.get(); else - ptr->fFilterInclusive = false; + ptr->fFilterInclusive = true; if (m_oInsertBlankRow.IsInit()) ptr->fInsertBlankRow = m_oInsertBlankRow.get(); else @@ -2321,7 +2335,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oItemPageCount.IsInit()) ptr->citmAutoShow = m_oItemPageCount->GetValue(); else - ptr->citmAutoShow = 0; + ptr->citmAutoShow = 10; if(m_oMaxSubtotal.IsInit()) ptr->fMax = m_oMaxSubtotal.get(); @@ -2331,7 +2345,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oMeasureFilter.IsInit()) ptr->fHasAdvFilter = m_oMeasureFilter.get(); else - ptr->fHasAdvFilter = false; + ptr->fHasAdvFilter = false; if(m_oMinSubtotal.IsInit()) ptr->fMin = m_oMinSubtotal.get(); @@ -2362,7 +2376,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oOutline.IsInit()) ptr->fOutline = m_oOutline.get(); else - ptr->fOutline = false; + ptr->fOutline = true; if (m_oProductSubtotal.IsInit()) ptr->fProduct = m_oProductSubtotal.get(); @@ -2372,7 +2386,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oRankBy.IsInit()) ptr->isxdiAutoShow = m_oRankBy->GetValue(); else - ptr->isxdiAutoShow = 0; + ptr->isxdiAutoShow = -1; if (m_oServerField.IsInit()) ptr->fServerBased = m_oServerField.get(); @@ -2403,15 +2417,19 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->fMemPropDisplayInTip = m_oShowPropTip.get(); else ptr->fMemPropDisplayInTip = false; + if(m_oNonAutoSortDefault.IsInit()) + ptr->fAutoSort = !m_oNonAutoSortDefault.get(); + else + ptr->fAutoSort = false; if(m_oSortType.IsInit()) { - if(m_oSortType->GetValue() != SimpleTypes::Spreadsheet::EFieldSortType::sortManual) - ptr->fAutoSort = true; if(m_oSortType->GetValue() == SimpleTypes::Spreadsheet::EFieldSortType::sortAscending) ptr->fAscendSort = true; else ptr->fAscendSort = false; } + else + ptr->fAscendSort = false; if (m_oStdDevPSubtotal.IsInit()) ptr->fStdevp = m_oStdDevPSubtotal.get(); @@ -2431,7 +2449,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oSubtotalTop.IsInit()) ptr->fSubtotalAtTop = !m_oSubtotalTop.get(); else - ptr->fSubtotalAtTop = false; + ptr->fSubtotalAtTop = true; if (m_oSumSubtotal.IsInit()) ptr->fSum = m_oSumSubtotal.get(); @@ -2441,7 +2459,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oTopAutoShow.IsInit()) ptr->fTopAutoShow = !m_oTopAutoShow.get(); else - ptr->fTopAutoShow = false; + ptr->fTopAutoShow = true; if (m_oUniqueMemberProperty.IsInit()) ptr->irstMemberPropertyCaption = m_oUniqueMemberProperty.get(); @@ -2456,7 +2474,13 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oVarSubtotal.IsInit()) ptr->fVar = m_oVarSubtotal.get(); else - ptr->fVar = false; + ptr->fVar = false; + if(!ptr->fVar && !ptr->fVarp && !ptr->fStdevp && !ptr->fStdevp + && !ptr->fCount && !ptr->fMin && !ptr->fMax && !ptr->fAverage + && !ptr->fCounta && !ptr->fSum ) + ptr->fDefault = true; + else + ptr->fDefault = false; return objectPtr; } @@ -2817,54 +2841,83 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr objectPtr(ptr); if (m_oAvgSubtotal.IsInit()) ptr->prFilter.itmtypeAVERAGE = m_oAvgSubtotal.get(); - - if (m_oByPosition.IsInit()) - ptr->prFilter.itmtypeAVERAGE = m_oByPosition.get(); + else + ptr->prFilter.itmtypeAVERAGE = false; if (m_oCountASubtotal.IsInit()) ptr->prFilter.itmtypeCOUNTA = m_oCountASubtotal.get(); + else + ptr->prFilter.itmtypeCOUNTA = false; if (m_oCountSubtotal.IsInit()) ptr->prFilter.itmtypeCOUNT = m_oCountSubtotal.get(); + else + ptr->prFilter.itmtypeCOUNT = false; if (m_oDefaultSubtotal.IsInit()) ptr->prFilter.itmtypeDEFAULT = m_oDefaultSubtotal.get(); + else + ptr->prFilter.itmtypeDEFAULT = false; if (m_oMaxSubtotal.IsInit()) ptr->prFilter.itmtypeMAX = m_oMaxSubtotal.get(); + else + ptr->prFilter.itmtypeMAX = false; if (m_oMinSubtotal.IsInit()) ptr->prFilter.itmtypeMIN = m_oMinSubtotal.get(); + else + ptr->prFilter.itmtypeMIN = false; if (m_oProductSubtotal.IsInit()) ptr->prFilter.itmtypePRODUCT = m_oProductSubtotal.get(); + else + ptr->prFilter.itmtypePRODUCT = false; if (m_oRelative.IsInit()) ptr->prFilter.itmtypeAVERAGE = m_oRelative.get(); + else + ptr->prFilter.itmtypeAVERAGE = false; if (m_oSelected.IsInit()) ptr->prFilter.fSelected = m_oSelected.get(); + else + ptr->prFilter.fSelected = false; if (m_oStdDevPSubtotal.IsInit()) ptr->prFilter.itmtypeSTDEVP = m_oStdDevPSubtotal.get(); + else + ptr->prFilter.itmtypeSTDEVP = false; if (m_oStdDevSubtotal.IsInit()) ptr->prFilter.itmtypeSTDEV = m_oStdDevSubtotal.get(); + else + ptr->prFilter.itmtypeSTDEV = false; if (m_oSumSubtotal.IsInit()) ptr->prFilter.itmtypeSUM = m_oSumSubtotal.get(); + else + ptr->prFilter.itmtypeSUM = false; if (m_oVarPSubtotal.IsInit()) ptr->prFilter.itmtypeVARP = m_oVarPSubtotal.get(); + else + ptr->prFilter.itmtypeVARP = false; if (m_oVarSubtotal.IsInit()) ptr->prFilter.itmtypeVAR = m_oVarSubtotal.get(); + else + ptr->prFilter.itmtypeVAR = false; if (m_oField.IsInit()) ptr->prFilter.isxvd = m_oField->GetValue(); + else + ptr->prFilter.isxvd = 0; if (m_oCount.IsInit()) ptr->prFilter.cItems = m_oCount->GetValue(); + else + ptr->prFilter.cItems = 0; return objectPtr; } void CReference::ReadAttributes(XLS::BaseObjectPtr& obj) @@ -3017,14 +3070,18 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { auto ptr(new XLSB::SXFORMAT); XLS::BaseObjectPtr objectPtr(ptr); - if(m_oDxfId.IsInit()) - { - auto ptr1(new XLSB::BeginSXFormat); - ptr->m_BrtBeginSXFormat = XLS::BaseObjectPtr{ptr1}; - ptr1->dxfid = m_oDxfId->GetValue(); - if(m_oAction.IsInit()) - ptr1->rlType = m_oAction->GetValue(); - } + + auto ptr1(new XLSB::BeginSXFormat); + ptr->m_BrtBeginSXFormat = XLS::BaseObjectPtr{ptr1}; + if(m_oDxfId.IsInit()) + ptr1->dxfid = m_oDxfId->GetValue(); + else + ptr1->dxfid = 0; + if(m_oAction.IsInit()) + ptr1->rlType = m_oAction->GetValue(); + else + ptr1->rlType = 0; + if(m_oPivotArea.IsInit()) ptr->m_PIVOTRULE = m_oPivotArea->toBin(); return objectPtr; @@ -3156,6 +3213,10 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { auto ptr(new XLSB::BeginPRule); XLS::BaseObjectPtr objectPtr(ptr); + ptr->pruleheaderdata.sxaxis.bCol = false; + ptr->pruleheaderdata.sxaxis.bPage = false; + ptr->pruleheaderdata.sxaxis.bRw = false; + ptr->pruleheaderdata.sxaxis.bData = false; if(m_oAxis.IsInit()) { if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisCol) @@ -3169,24 +3230,43 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } if(m_oCacheIndex.IsInit()) ptr->pruleheaderdata.fCacheBased = m_oCacheIndex.get(); + else + ptr->pruleheaderdata.fCacheBased = false; if(m_oCollapsedLevelsAreSubtotals.IsInit()) ptr->pruleheaderdata.fFuzzy = m_oCollapsedLevelsAreSubtotals.get(); + else + ptr->pruleheaderdata.fFuzzy = false; if(m_oDataOnly.IsInit()) ptr->pruleheaderdata.fDataOnly = m_oDataOnly.get(); + else + ptr->pruleheaderdata.fDataOnly = true; if(m_oField.IsInit()) ptr->pruleheaderdata.isxvd = m_oField.get(); + else + ptr->pruleheaderdata.isxvd = -1; if(m_oFieldPosition.IsInit()) ptr->pruleheaderdata.iDim = m_oFieldPosition->GetValue(); + else + ptr->pruleheaderdata.iDim = 0; if(m_oGrandCol.IsInit()) ptr->pruleheaderdata.fGrandCol = m_oGrandCol.get(); + else + ptr->pruleheaderdata.fGrandCol = false; if(m_oGrandRow.IsInit()) ptr->pruleheaderdata.fGrandRw = m_oGrandRow.get(); + else + ptr->pruleheaderdata.fGrandRw = false; if(m_oLabelOnly.IsInit()) ptr->pruleheaderdata.fLabelOnly = m_oLabelOnly.get(); + else + ptr->pruleheaderdata.fLabelOnly = false; if(m_oOffsetRef.IsInit()) ptr->pruleheaderdata.rfxLoc = m_oOffsetRef.get(); if(m_oOutline.IsInit()) ptr->pruleheaderdata.fLineMode = m_oOutline.get(); + else + ptr->pruleheaderdata.fLineMode = false; + ptr->pruleheaderdata.fPart = false; if(m_oType.IsInit()) { if (m_oType == SimpleTypes::Spreadsheet::EPivotAreaType::areaNone) @@ -3204,6 +3284,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else if (m_oType == SimpleTypes::Spreadsheet::EPivotAreaType::areaTopEnd) ptr->pruleheaderdata.isxrtype = 0x06; } + else + ptr->pruleheaderdata.isxrtype = 0x01; return objectPtr; } void CPivotArea::fromBin(XLS::BaseObjectPtr& obj) @@ -3601,8 +3683,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" auto ptr(new XLSB::PivotCacheDefStream); XLS::BaseObjectPtr objectPtr(ptr); ptr->m_BrtBeginPivotCacheDef = writeAttributes(); - if(m_oCacheFields.IsInit()) - ptr->m_PCDFIELDS = m_oCacheFields->toBin(); + if(m_oCacheFields.IsInit()) + ptr->m_PCDFIELDS = m_oCacheFields->toBin(); if(m_oCacheSource.IsInit()) ptr->m_PCDSOURCE = m_oCacheSource->toBin(); if(m_oExtLst.IsInit()) @@ -3933,7 +4015,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr objectPtr(ptr); ptr->m_BrtBeginPCDField = writeAttributes(); - if(m_oSharedItems.IsInit()) + if(m_oSharedItems.IsInit() && !m_oSharedItems->m_arrItems.empty()) ptr->m_PCDFATBL = m_oSharedItems->toBin(); if(m_oFieldGroup.IsInit()) ptr->m_PCDFGROUP = m_oFieldGroup->toBin(); @@ -4006,7 +4088,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oNumFmtId.IsInit()) ptr->ifmt = m_oNumFmtId->GetValue(); else - ptr->ifmt = 0xFFFFFFFF; + ptr->ifmt = 0; ptr->cbRgisxtmp = 0; @@ -5363,7 +5445,11 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr objectPtr(ptr1); if(m_oValue.IsInit()) ptr->xnum.data.value = m_oValue.get(); - if(m_oBold.IsInit()) + if(m_oBold.IsInit() || m_oItalic.IsInit() || m_oStrike.IsInit() + || m_oUnderline.IsInit() || m_oFormatIndex.IsInit() || m_oForeColor.IsInit() ||m_oBackColor.IsInit()) + { + ptr->sxvcellextra.reset(new XLSB::PCDISrvFmt); + if(m_oBold.IsInit()) ptr->sxvcellextra->fSrvFmtBold = m_oBold.get(); if(m_oItalic.IsInit()) ptr->sxvcellextra->fSrvFmtItalic = m_oItalic.get(); @@ -5377,6 +5463,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->sxvcellextra->cvBack.fromHex(m_oBackColor->GetValue()); if(m_oForeColor.IsInit()) ptr->sxvcellextra->cvFore.fromHex(m_oForeColor->GetValue()); + } return objectPtr; } } diff --git a/OOXML/XlsxFormat/Styles/Borders.cpp b/OOXML/XlsxFormat/Styles/Borders.cpp index 5350fe6b44..f3d7e40e97 100644 --- a/OOXML/XlsxFormat/Styles/Borders.cpp +++ b/OOXML/XlsxFormat/Styles/Borders.cpp @@ -140,6 +140,13 @@ namespace OOX void CBorderProp::toBin(XLS::BiffStructure* obj) { auto ptr = static_cast(obj); + if(this == nullptr) + { + CColor color; + ptr->brtColor = color.GetDefaultColor(); + ptr->dg = 0x00; + return; + } if(m_oColor.IsInit()) ptr->brtColor = m_oColor->toColor(); else @@ -356,17 +363,21 @@ namespace OOX { auto ptr(new XLSB::Border); XLS::BaseObjectPtr objectPtr(ptr); - if(m_oBottom.IsInit()) - m_oBottom->toBin(&ptr->blxfBottom); - if(m_oDiagonal.IsInit()) - m_oDiagonal->toBin(&ptr->blxfDiag); - if(m_oTop.IsInit()) - m_oTop->toBin(&ptr->blxfTop); - if(m_oStart.IsInit()) - m_oStart->toBin(&ptr->blxfLeft); - if(m_oEnd.IsInit()) - m_oEnd->toBin(&ptr->blxfRight); + + m_oBottom->toBin(&ptr->blxfBottom); + m_oDiagonal->toBin(&ptr->blxfDiag); + m_oTop->toBin(&ptr->blxfTop); + m_oStart->toBin(&ptr->blxfLeft); + m_oEnd->toBin(&ptr->blxfRight); + if(m_oDiagonalDown.IsInit()) + ptr->fBdrDiagDown = m_oDiagonalDown->GetValue(); + else + ptr->fBdrDiagDown = false; + if(m_oDiagonalUp.IsInit()) + ptr->fBdrDiagUp = m_oDiagonalUp->GetValue(); + else + ptr->fBdrDiagUp = false; return objectPtr; } EElementType CBorder::getType () const diff --git a/OOXML/XlsxFormat/Styles/Fills.cpp b/OOXML/XlsxFormat/Styles/Fills.cpp index 1d8f16f533..7b123660f5 100644 --- a/OOXML/XlsxFormat/Styles/Fills.cpp +++ b/OOXML/XlsxFormat/Styles/Fills.cpp @@ -154,31 +154,24 @@ namespace OOX ptr->fls = 0x11; else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeGray0625) ptr->fls = 0x12; + else + ptr->fls = 0x00; } + else + ptr->fls = 0x00; if(m_oBgColor.IsInit()) ptr->brtColorBack = m_oBgColor->toColor(); else - { - ptr->brtColorBack.bAlpha = 255; - ptr->brtColorBack.bBlue = 0; - ptr->brtColorBack.bGreen = 0; - ptr->brtColorBack.bRed = 0; - ptr->brtColorBack.index = 64; - ptr->brtColorBack.nTintAndShade = 0; - ptr->brtColorBack.xColorType = 0; + { m_oBgColor.Init(); + ptr->brtColorBack = m_oBgColor->GetDefaultColor(); } if(m_oFgColor.IsInit()) ptr->brtColorFore = m_oFgColor->toColor(); else { - ptr->brtColorFore.bAlpha = 255; - ptr->brtColorFore.bBlue = 255; - ptr->brtColorFore.bGreen = 255; - ptr->brtColorFore.bRed = 255; - ptr->brtColorFore.index = 64; - ptr->brtColorFore.nTintAndShade = 0; - ptr->brtColorFore.xColorType = 0; + m_oFgColor.Init(); + ptr->brtColorFore = m_oFgColor->GetDefaultColor(); } } EElementType CPatternFill::getType () const @@ -526,6 +519,13 @@ namespace OOX { m_oPatternFill->toBin(objectPtr); } + else + { + CColor color; + ptr->fls = 0; + ptr->brtColorBack = color.GetDefaultColor(); + ptr->brtColorFore = color.GetDefaultColor(); + } if(m_oGradientFill.IsInit()) { diff --git a/OOXML/XlsxFormat/Styles/Fonts.cpp b/OOXML/XlsxFormat/Styles/Fonts.cpp index fd18d078e3..0eb205ecf3 100644 --- a/OOXML/XlsxFormat/Styles/Fonts.cpp +++ b/OOXML/XlsxFormat/Styles/Fonts.cpp @@ -241,6 +241,8 @@ namespace OOX ptr->uls = 34; } } + else + ptr->uls = 0; if(m_oFamily.IsInit()) ptr->bFamily = m_oFamily->m_oFontFamily->GetValue(); @@ -252,6 +254,7 @@ namespace OOX ptr->brtColor = m_oColor->toColor(); else { + m_oColor.Init(); ptr->brtColor = m_oColor->GetDefaultColor(); } diff --git a/OOXML/XlsxFormat/Styles/NumFmts.cpp b/OOXML/XlsxFormat/Styles/NumFmts.cpp index 9109cf6fe9..77a1f6b0b7 100644 --- a/OOXML/XlsxFormat/Styles/NumFmts.cpp +++ b/OOXML/XlsxFormat/Styles/NumFmts.cpp @@ -37,6 +37,7 @@ #include "../../Common/SimpleTypes_Shared.h" #include "../../XlsbFormat/Biff12_unions/FMTS.h" +#include "../../XlsbFormat/Biff12_records/BeginFmts.h" namespace OOX { @@ -202,12 +203,15 @@ namespace OOX XLS::BaseObjectPtr CNumFmts::toBin() { auto fmts(new XLSB::FMTS); + auto beginfmt(new XLSB::BeginFmts); + fmts->m_BrtBeginFmts = XLS::BaseObjectPtr{beginfmt}; XLS::BaseObjectPtr objectPtr(fmts); std::vector objectVector; for(auto i:m_arrItems) { fmts->m_arBrtFmt.push_back(i->toBin()); } + beginfmt->cfmts = fmts->m_arBrtFmt.size(); return objectPtr; } EElementType CNumFmts::getType () const diff --git a/OOXML/XlsxFormat/Styles/TableStyles.cpp b/OOXML/XlsxFormat/Styles/TableStyles.cpp index 7e99b76c8f..19d128b637 100644 --- a/OOXML/XlsxFormat/Styles/TableStyles.cpp +++ b/OOXML/XlsxFormat/Styles/TableStyles.cpp @@ -91,7 +91,7 @@ namespace OOX if(m_oSize.IsInit()) ptr->size = m_oSize->GetValue(); else - ptr->size = 0; + ptr->size = 1; if(m_oType.IsInit()) { @@ -330,7 +330,7 @@ namespace OOX if(m_oTable.IsInit()) beginStyle->fIsTable = m_oTable->GetValue(); else - beginStyle->fIsTable = false; + beginStyle->fIsTable = true; if(m_oName.IsInit()) beginStyle->rgchName = m_oName.get(); else if(m_oDisplayName.IsInit()) diff --git a/OOXML/XlsxFormat/Styles/rPr.cpp b/OOXML/XlsxFormat/Styles/rPr.cpp index 6c99fa3e12..63be11df16 100644 --- a/OOXML/XlsxFormat/Styles/rPr.cpp +++ b/OOXML/XlsxFormat/Styles/rPr.cpp @@ -460,7 +460,7 @@ namespace OOX ptr.xColorType = 0; ptr.nTintAndShade = 0; ptr.index = 0; - ptr.fValidRGB = true; + ptr.fValidRGB = 0; return ptr; } @@ -472,6 +472,7 @@ namespace OOX ptr.bBlue = 0; ptr.bGreen = 0; ptr.bRed = 0; + ptr.fValidRGB = false; if(m_oAuto.IsInit()) { @@ -494,7 +495,11 @@ namespace OOX ptr.bBlue = m_oRgb->Get_B(); ptr.bGreen = m_oRgb->Get_G(); ptr.bRed = m_oRgb->Get_R(); + ptr.xColorType = 2; + ptr.fValidRGB = true; } + else + ptr.xColorType = 0; if ( m_oTint.IsInit()) diff --git a/OOXML/XlsxFormat/Table/Connections.cpp b/OOXML/XlsxFormat/Table/Connections.cpp index f1211d7066..9230e71979 100644 --- a/OOXML/XlsxFormat/Table/Connections.cpp +++ b/OOXML/XlsxFormat/Table/Connections.cpp @@ -604,28 +604,52 @@ namespace OOX if(m_oUrl.IsInit()) ptr->stURL = m_oUrl.get(); + else + ptr->fLoadURL = false; if(m_oPost.IsInit()) ptr->stWebPost = m_oPost.get(); + else + ptr->fLoadWebPost = false; if(m_oEditPage.IsInit()) ptr->stEditWebPage = m_oEditPage.get(); + else + ptr->fLoadEditWebPage = false; if(m_oXml.IsInit()) ptr->fSrcIsXML = m_oXml.get(); + else + ptr->fSrcIsXML = false; if(m_oSourceData.IsInit()) ptr->fImportSourceData = m_oSourceData.get(); + else + ptr->fImportSourceData = false; if(m_oConsecutive.IsInit()) ptr->fConsecDelim = m_oConsecutive.get(); + else + ptr->fConsecDelim = false; if(m_oFirstRow.IsInit()) ptr->fSameSettings = m_oFirstRow.get(); + else + ptr->fSameSettings = false; if(m_oXl97.IsInit()) ptr->fXL97Format = m_oXl97.get(); + else + ptr->fXL97Format = false; if(m_oTextDates.IsInit()) ptr->fNoDateRecog = m_oTextDates.get(); + else + ptr->fNoDateRecog = false; if(m_oXl2000.IsInit()) ptr->fRefreshedInXL9 = m_oXl2000.get(); + else + ptr->fRefreshedInXL9 = false; if(m_oHtmlTables.IsInit()) ptr->fTablesOnlyHTML = m_oHtmlTables.get(); + else + ptr->fRefreshedInXL9 = false; if(m_oHtmlFormat.IsInit()) ptr->wHTMLFmt = m_oHtmlFormat->GetValue(); + else + ptr->wHTMLFmt = false; return XLS::BaseObjectPtr{ptr1}; } EElementType CWebPr::getType() const @@ -1005,24 +1029,38 @@ namespace OOX ptr1->dwConnID = m_oId->GetValue(); if(m_oCredentials.IsInit()) ptr1->iCredMethod = m_oCredentials->GetValue(); + else + ptr1->iCredMethod = 0; if(m_oBackground.IsInit()) ptr1->fBackgroundQuery = m_oBackground.get(); else ptr1->fBackgroundQuery = false; if(m_oDeleted.IsInit()) ptr1->fDeleted = m_oDeleted.get(); + else + ptr1->fDeleted = false; if(m_oDescription.IsInit()) ptr1->stConnDesc = m_oDescription.get(); else ptr1->fLoadConnectionDesc = false; if(m_oInterval.IsInit()) ptr1->wInterval = m_oInterval.get(); + else + ptr1->wInterval = 0; if(m_oKeepAlive.IsInit()) ptr1->fMaintain = m_oKeepAlive.get(); + else + ptr1->fMaintain = false; if(m_oMinRefreshableVersion.IsInit()) ptr1->bVerRefreshableMin = m_oMinRefreshableVersion.get(); + else if(m_oRefreshedVersion.IsInit()) + ptr1->bVerRefreshableMin = m_oRefreshedVersion.get(); + else + ptr1->bVerRefreshableMin = 0; if(m_oNew.IsInit()) ptr1->fNewQuery = m_oNew.get(); + else + ptr1->fNewQuery = false; if(m_oOdcFile.IsInit()) ptr1->stConnectionFile = m_oOdcFile.get(); else @@ -1033,16 +1071,20 @@ namespace OOX ptr1->fAlwaysUseConnectionFile = false; if(m_oReconnectionMethod.IsInit()) ptr1->irecontype = m_oReconnectionMethod.get(); + else + ptr1->irecontype = 1; if(m_oRefreshedVersion.IsInit()) ptr1->bVerRefreshed = m_oRefreshedVersion.get(); if(m_oRefreshOnLoad.IsInit()) ptr1->fRefreshOnLoad = m_oRefreshOnLoad.get(); + else + ptr1->fRefreshOnLoad = false; if(m_oSaveData.IsInit()) ptr1->fSaveData = m_oSaveData.get(); if(m_oSavePassword.IsInit()) - { ptr1->pc = m_oSavePassword.get(); - } + else + ptr1->pc = 0; if(m_oSingleSignOnId.IsInit()) ptr1->stSso = m_oSingleSignOnId.get(); else @@ -1293,6 +1335,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr object = WriteBin(); xlsb->WriteBin(oPath, object.get()); } + else { NSStringUtils::CStringBuilder sXml; diff --git a/OOXML/XlsxFormat/Table/Tables.cpp b/OOXML/XlsxFormat/Table/Tables.cpp index aaa15cc6ff..b278fd6203 100644 --- a/OOXML/XlsxFormat/Table/Tables.cpp +++ b/OOXML/XlsxFormat/Table/Tables.cpp @@ -356,12 +356,14 @@ namespace Spreadsheet if(m_oCalculatedColumnFormula.IsInit()) { auto fmla(new XLSB::ListCCFmla); + fmla->fArray = false; fmla->formula = m_oCalculatedColumnFormula.get(); ptr->m_BrtListCCFmla = XLS::BaseObjectPtr{fmla}; } if(m_oTotalsRowFormula.IsInit()) { auto fmla(new XLSB::ListTrFmla); + fmla->fArray = false; fmla->formula = m_oTotalsRowFormula.get(); ptr->m_BrtListTrFmla = XLS::BaseObjectPtr{fmla}; } @@ -616,15 +618,24 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") if(m_oTableColumns.IsInit() && !m_oTableColumns->m_arrItems.empty()) { XLS::GlobalWorkbookInfo::mapTableColumnNames_static.emplace(m_oId->GetValue(), - std::vector(m_oTableColumns->m_arrItems.size()+1, L"")); + std::vector(m_oTableColumns->m_arrItems.size())); + auto colInd = 0; for(auto i:m_oTableColumns->m_arrItems) - if(i->m_oName.IsInit() && i->m_oId.IsInit()) + { + if(i->m_oName.IsInit()) { - if(i->m_oId->GetValue()+1 > XLS::GlobalWorkbookInfo::mapTableColumnNames_static.at(m_oId->GetValue()).size()) - XLS::GlobalWorkbookInfo::mapTableColumnNames_static.at(m_oId->GetValue()).resize(i->m_oId->GetValue()+1); i->m_oName = boost::algorithm::erase_all_copy(i->m_oName.get(), L"_x000a_"); - XLS::GlobalWorkbookInfo::mapTableColumnNames_static.at(m_oId->GetValue()).at(i->m_oId->GetValue()) = i->m_oName.get(); + std::unordered_map>::iterator pFind = XLS::GlobalWorkbookInfo::mapTableColumnNames_static.find(m_oId->GetValue()); + if (pFind != XLS::GlobalWorkbookInfo::mapTableColumnNames_static.end()) + { + if (colInd < pFind->second.size()) + { + pFind->second[colInd] = i->m_oName.get(); + } + } } + colInd++; + } } XLS::GlobalWorkbookInfo::mapTableNames_static.emplace(m_oId->GetValue(), m_oName.get()); } @@ -768,6 +779,8 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") if(m_oTotalsRowShown.IsInit()) ptr1->fShownTotalRow = m_oTotalsRowShown.get(); + else if(m_oTotalsRowCount.IsInit() && m_oTotalsRowCount->GetValue() > 0) + ptr1->fShownTotalRow = true; else ptr1->fShownTotalRow = false; ptr1->fSingleCell = false; @@ -1136,18 +1149,28 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") if(m_oId.IsInit()) ptr->idField = m_oId->GetValue(); + else + ptr->idField = 0; if(m_oTableColumnId.IsInit()) ptr->idList = m_oTableColumnId->GetValue(); + else + ptr->idList = 0; if(m_oName.IsInit()) ptr->name = m_oName.get(); if(m_oRowNumbers.IsInit()) ptr->fRowNums = m_oRowNumbers.get(); if(m_oFillFormulas.IsInit()) ptr->fFillDown = m_oFillFormulas.get(); + else + ptr->fFillDown = false; if(m_oDataBound.IsInit()) ptr->fUserIns = m_oDataBound.get(); + else + ptr->fUserIns = false; if(m_oClipped.IsInit()) ptr->fClipped = m_oClipped.get(); + else + ptr->fClipped = false; return XLS::BaseObjectPtr{ptr1}; } @@ -1431,6 +1454,8 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") ptr->wVerBeforeRefreshAlert = m_oMinimumVersion->GetValue(); if(m_FieldIdWrapped.IsInit()) ptr->fidWrapped = m_FieldIdWrapped.get(); + else + ptr->fidWrapped = false; if(m_HeadersInLastRefresh.IsInit()) ptr->fTitlesOld = m_HeadersInLastRefresh.get(); if(m_PreserveSortFilterLayout.IsInit()) @@ -1567,33 +1592,61 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oAdjustColumnWidth.IsInit()) ptr->fAutoFit = m_oAdjustColumnWidth.get(); + else + ptr->fAutoFit = true; if(m_oApplyAlignmentFormats.IsInit()) ptr->fibitAtrAlc = m_oApplyAlignmentFormats.get(); + else + ptr->fibitAtrAlc = false; if(m_oApplyBorderFormats.IsInit()) ptr->fibitAtrBdr = m_oApplyBorderFormats.get(); + else + ptr->fibitAtrBdr = false; if(m_oApplyFontFormats.IsInit()) ptr->fibitAtrFnt = m_oApplyFontFormats.get(); + else + ptr->fibitAtrFnt = false; if(m_oApplyNumberFormats.IsInit()) ptr->fibitAtrNum = m_oApplyNumberFormats.get(); + else + ptr->fibitAtrNum = false; if(m_oApplyPatternFormats.IsInit()) ptr->fibitAtrPat = m_oApplyPatternFormats.get(); + else + ptr->fibitAtrPat = false; if(m_oApplyWidthHeightFormats.IsInit()) ptr->fibitAtrProt = m_oApplyWidthHeightFormats.get(); + else + ptr->fibitAtrProt = false; if(m_oBackgroundRefresh.IsInit()) ptr->fAsync = m_oBackgroundRefresh.get(); + else + ptr->fAsync = true; if(m_oAutoFormatId.IsInit()) ptr->itblAutoFmt = m_oAutoFormatId->GetValue(); + else + ptr->itblAutoFmt = 0; if(m_oConnectionId.IsInit()) ptr->dwConnID = m_oConnectionId->GetValue(); + else + ptr->dwConnID = 0; if(m_oDisableEdit.IsInit()) ptr->fDisableEdit = m_oDisableEdit.get(); + else + ptr->fDisableEdit = false; if(m_oDisableRefresh.IsInit()) ptr->fDisableRefresh = m_oDisableRefresh.get(); + else + ptr->fDisableRefresh = false; if(m_oFillFormulas.IsInit()) ptr->fFill = m_oFillFormulas.get(); + else + ptr->fFill = false; if(m_oFirstBackgroundRefresh.IsInit()) ptr->fNewAsync = m_oFirstBackgroundRefresh.get(); + else + ptr->fNewAsync = true; ptr->fOverwrite = false; ptr->fShrink = false; @@ -1605,17 +1658,25 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->fTitles = m_oHeaders.get(); if(m_oIntermediate.IsInit()) ptr->fDummyList = m_oIntermediate.get(); + else + ptr->fDummyList = 0; - if(!ptr->name.empty()) - m_oName = ptr->name; + if(m_oName.IsInit()) + ptr->name = m_oName.get(); if(m_oPreserveFormatting.IsInit()) ptr->fPreserveFmt = m_oPreserveFormatting.get(); if(m_oRefreshOnLoad.IsInit()) ptr->fAutoRefresh = m_oRefreshOnLoad.get(); + else + ptr->fAutoRefresh = false; if(m_oRemoveDataOnSave.IsInit()) ptr->fSaveData = !m_oRemoveDataOnSave.get(); + else + ptr->fSaveData = true; if(m_oRowNumbers.IsInit()) ptr->fRowNums = m_oRowNumbers.get(); + else + ptr->fRowNums = false; if(m_oQueryTableRefresh.IsInit()) ptr1->m_QSIR = m_oQueryTableRefresh->toBin(); @@ -1765,6 +1826,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr object = WriteBin(); xlsb->WriteBin(oPath, object.get()); } + else { NSStringUtils::CStringBuilder sXml; diff --git a/OOXML/XlsxFormat/Workbook/BookViews.cpp b/OOXML/XlsxFormat/Workbook/BookViews.cpp index cc2cc8a740..77c8a1a9ae 100644 --- a/OOXML/XlsxFormat/Workbook/BookViews.cpp +++ b/OOXML/XlsxFormat/Workbook/BookViews.cpp @@ -76,18 +76,16 @@ namespace OOX } XLS::BaseObjectPtr CWorkbookView::toBin() { - auto ptr(new XLS::Window1); + auto ptr(new XLSB::BookView); XLS::BaseObjectPtr objectPtr(ptr); if (m_oActiveTab.IsInit()) { ptr->itabCur = m_oActiveTab->GetValue(); - ptr->ctabSel = m_oActiveTab->GetValue(); } else { ptr->itabCur = 0; - ptr->ctabSel = 0; } if (m_oAutoFilterDateGrouping.IsInit()) diff --git a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp index e5e1ce607f..bb0287e391 100644 --- a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp +++ b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp @@ -73,6 +73,8 @@ namespace OOX return; m_oRef = oReader.GetText3(); + if(m_oName.IsInit()) + XLS::GlobalWorkbookInfo::arDefineNames_static.push_back(m_oName.get()); } XLS::BaseObjectPtr CDefinedName::toBin() { diff --git a/OOXML/XlsxFormat/Workbook/Metadata.cpp b/OOXML/XlsxFormat/Workbook/Metadata.cpp index 7da7a64c2c..74cf59e79c 100644 --- a/OOXML/XlsxFormat/Workbook/Metadata.cpp +++ b/OOXML/XlsxFormat/Workbook/Metadata.cpp @@ -824,7 +824,7 @@ namespace OOX writer.WriteString(L""); for (size_t i = 0; i < m_arrItems.size(); ++i) diff --git a/OOXML/XlsxFormat/Workbook/Sheets.cpp b/OOXML/XlsxFormat/Workbook/Sheets.cpp index 6fc2a4616d..e4309a7c55 100644 --- a/OOXML/XlsxFormat/Workbook/Sheets.cpp +++ b/OOXML/XlsxFormat/Workbook/Sheets.cpp @@ -178,6 +178,12 @@ namespace OOX } } + auto sheetIndex = 0; + for(auto i:m_arrItems) + { if(i->m_oName.IsInit()) + AddSheetRef(i->m_oName.get(), sheetIndex); + sheetIndex++; + } } void CSheets::fromBin(std::vector& obj) { @@ -205,6 +211,16 @@ namespace OOX void CSheets::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { } + void CSheets::AddSheetRef(const std::wstring& link, const _INT32& sheetIndex) + { + XLS::GlobalWorkbookInfo::_xti val_1; + val_1.iSup = sheetIndex; + val_1.itabFirst = sheetIndex; + val_1.itabLast = sheetIndex; + val_1.link = link; + + XLS::GlobalWorkbookInfo::arXti_External_static.push_back(val_1); + } } //Spreadsheet } // namespace OOX diff --git a/OOXML/XlsxFormat/Workbook/Sheets.h b/OOXML/XlsxFormat/Workbook/Sheets.h index fc1956be6a..fcb5b5af0a 100644 --- a/OOXML/XlsxFormat/Workbook/Sheets.h +++ b/OOXML/XlsxFormat/Workbook/Sheets.h @@ -100,6 +100,7 @@ namespace OOX virtual EElementType getType () const; private: + void AddSheetRef(const std::wstring& link, const _INT32& sheetIndex); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); }; diff --git a/OOXML/XlsxFormat/Workbook/Workbook.cpp b/OOXML/XlsxFormat/Workbook/Workbook.cpp index 9342b0ac08..38f7695e6c 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.cpp +++ b/OOXML/XlsxFormat/Workbook/Workbook.cpp @@ -297,36 +297,6 @@ namespace OOX auto ptr(new XLSB::BUNDLESHS); ptr->m_arBrtBundleSh = m_oSheets->toBin(); workBookStream->m_BUNDLESHS = XLS::BaseObjectPtr{ptr}; - - auto ptr1(new XLSB::EXTERNALS); - workBookStream->m_EXTERNALS = XLS::BaseObjectPtr{ptr1}; - auto externSheet(new XLSB::ExternSheet); - ptr1->m_BrtExternSheet = XLS::BaseObjectPtr{externSheet}; - externSheet->cXTI = ptr->m_arBrtBundleSh.size(); - for(auto i = 0; i < ptr->m_arBrtBundleSh.size(); i++) - { - auto sup(new XLSB::SUP); - auto supSelf(new XLSB::SupSelf); - sup->m_source = XLS::BaseObjectPtr{supSelf}; - ptr1->m_arSUP.push_back(XLS::BaseObjectPtr{sup}); - auto xti(new XLS::XTI); - xti->iSupBook = i; - xti->itabFirst = i; - xti->itabLast = i; - - auto biffStructPtr = XLS::BiffStructurePtr(xti); - externSheet->rgXTI.push_back(biffStructPtr); - - XLS::GlobalWorkbookInfo::_xti val_1; - val_1.iSup = xti->iSupBook; - val_1.itabFirst = i; - val_1.itabLast = i; - auto sheet = static_cast(ptr->m_arBrtBundleSh[i].get()); - val_1.link = sheet->strName; - - XLS::GlobalWorkbookInfo::arXti_External_static.push_back(val_1); - - } } if (m_oWorkbookPr.IsInit()) workBookStream->m_BrtWbProp = m_oWorkbookPr->toBin(); @@ -339,13 +309,13 @@ namespace OOX if (m_oWorkbookProtection.IsInit()) workBookStream->m_BrtBookProtection = m_oWorkbookProtection->toBin(); + workBookStream->m_EXTERNALS = WriteXtiRefs(); if (m_oExternalReferences.IsInit()) { auto ptr = static_cast(workBookStream->m_EXTERNALS.get()); auto sups = m_oExternalReferences->toBin(); if(!sups.empty()) ptr->m_arSUP.insert(ptr->m_arSUP.end(), sups.begin(), sups.end()); - } @@ -632,6 +602,33 @@ xmlns:xr2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/revision2\"\ return lActiveSheet; } + XLS::BaseObjectPtr CWorkbook::WriteXtiRefs() const + { + auto ptr(new XLSB::EXTERNALS); + + + auto externSheet(new XLSB::ExternSheet); + ptr->m_BrtExternSheet = XLS::BaseObjectPtr{externSheet}; + + for(auto i:XLS::GlobalWorkbookInfo::arXti_External_static) + { + auto sup(new XLSB::SUP); + auto supSelf(new XLSB::SupSelf); + sup->m_source = XLS::BaseObjectPtr{supSelf}; + ptr->m_arSUP.push_back(XLS::BaseObjectPtr{sup}); + + auto xti(new XLS::XTI); + xti->iSupBook = i.iSup; + xti->itabFirst = i.itabFirst; + xti->itabLast = i.itabLast; + + auto biffStructPtr = XLS::BiffStructurePtr(xti); + externSheet->rgXTI.push_back(biffStructPtr); + } + externSheet->cXTI = externSheet->rgXTI.size(); + return XLS::BaseObjectPtr{ptr}; + } + } //Spreadsheet } // namespace OOX diff --git a/OOXML/XlsxFormat/Workbook/Workbook.h b/OOXML/XlsxFormat/Workbook/Workbook.h index a3b31d97db..a5046deada 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.h +++ b/OOXML/XlsxFormat/Workbook/Workbook.h @@ -141,6 +141,7 @@ namespace OOX void PrepareToWrite(); LONG GetActiveSheetIndex(); + XLS::BaseObjectPtr WriteXtiRefs() const; CPath m_oReadPath; diff --git a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp index 954ac25be5..169bac34e4 100644 --- a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp +++ b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp @@ -2642,7 +2642,7 @@ XLS::BaseObjectPtr CConditionalFormatting::toBin() XLS::CellRef formatingfirstCell; if(m_oSqRef.IsInit()) { - auto conditionPtr(new XLSB::BeginConditionalFormatting);// + auto conditionPtr(new XLSB::BeginConditionalFormatting); ptr->m_BrtBeginConditionalFormatting = XLS::BaseObjectPtr{conditionPtr}; conditionPtr->ccf = m_arrItems.size(); conditionPtr->sqrfx.strValue = m_oSqRef.get(); diff --git a/OOXML/XlsxFormat/Worksheets/DataValidation.cpp b/OOXML/XlsxFormat/Worksheets/DataValidation.cpp index fb9b99a69e..c5b4acd5c6 100644 --- a/OOXML/XlsxFormat/Worksheets/DataValidation.cpp +++ b/OOXML/XlsxFormat/Worksheets/DataValidation.cpp @@ -290,7 +290,11 @@ xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\">"); ptr->typOperator = XLS::_typOperatorDv::operatorDvGreaterThanOrEqual; else if (m_oOperator->GetValue() == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorLessThanOrEqual) ptr->typOperator = XLS::_typOperatorDv::operatorDvLessThanOrEqual; + else + ptr->typOperator = XLS::_typOperatorDv::operatorDvBetween; } + else + ptr->typOperator = XLS::_typOperatorDv::operatorDvBetween; if(m_oShowDropDown.IsInit()) ptr->fSuppressCombo = m_oShowDropDown->GetValue(); diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index 5bb3bc109e..76225939f1 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -2141,6 +2141,26 @@ namespace OOX pSource = str; } } + else if(m_oRichText.IsInit()) + { + if(m_oFormula.IsInit()) + { + auto str(new XLSB::FmlaString); + if(m_oValue.IsInit()) + str->value = m_oRichText->ToString(); + oCell = &str->cell; + + pSource = str; + + } + else + { + auto str(new XLSB::CellSt); + str->value = m_oRichText->ToString(); + oCell = &str->cell; + pSource = str; + } + } else { auto pCellblank = new(XLSB::CellBlank); @@ -2189,53 +2209,34 @@ namespace OOX if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::cellformulatypeShared) { - m_oFormula->m_oT = SimpleTypes::Spreadsheet::cellformulatypeNormal; - ptr->m_source = XLS::BaseObjectPtr{pFMLACELL}; + pSHRFMLACELL = new XLSB::SHRFMLACELL(0,0, refs); + ptr->m_source = XLS::BaseObjectPtr{pSHRFMLACELL}; pFMLACELL->m_source = XLS::BaseObjectPtr{pSource}; + pSHRFMLACELL->_fmlacell = XLS::BaseObjectPtr{pFMLACELL}; if(!m_oFormula->m_sText.empty()) { - m_oFormula->toBin(pFMLACELL->m_source); + auto shrFmla(new XLSB::ShrFmla(cellref)); + pSHRFMLACELL->m_source = XLS::BaseObjectPtr{shrFmla}; + m_oFormula->toBin(pSHRFMLACELL->m_source); - sharedFormulas.shrFmla.push_back(std::make_pair(cellref, m_oFormula->m_sText)); + sharedFormulas.shrFmla.push_back(cellref); } - else if(m_oFormula->m_oSi.IsInit() && sharedFormulas.shrFmla.size() > m_oFormula->m_oSi->GetValue() ) + if(m_oFormula->m_oSi.IsInit() && sharedFormulas.shrFmla.size() > m_oFormula->m_oSi->GetValue() ) { - - auto fmla = dynamic_cast(pSource); - - auto dataPair = sharedFormulas.shrFmla[m_oFormula->m_oSi->GetValue()]; - sourceCellRef = dataPair.first; - int coldiff = 0; - if(sourceCellRef.colRelative) - coldiff = cellref.column - dataPair.first.column; - int rowdiff = 0; - if(sourceCellRef.rowRelative) - rowdiff = cellref.row - dataPair.first.row; - fmla->formula = dataPair.second; - if(rowdiff || coldiff) - { - for(auto i:fmla->formula.rgce.sequence) - { - if(i->ptg_id.is_initialized() && i->ptg_id.get() == 37) - { - auto area(static_cast(i.get())); - area->areaXlsb.columnFirst += coldiff; - area->areaXlsb.columnLast += coldiff; - area->areaXlsb.rowFirst += rowdiff; - area->areaXlsb.rowLast += rowdiff; - } - else if(i->ptg_id.is_initialized() && i->ptg_id.get() == 36) - { - auto area(static_cast(i.get())); - area->loc_xlsb.column += coldiff; - area->loc_xlsb.row += rowdiff; - } - } - } - + sourceCellRef = sharedFormulas.shrFmla[m_oFormula->m_oSi->GetValue()]; } + + auto rowPos = new XLS::PtgExp; + rowPos->rowXlsb = sourceCellRef.row; + auto colPos = new XLS::PtgExtraCol; + colPos->col = sourceCellRef.column; + auto cellFmla = dynamic_cast(pSource); + cellFmla->formula.rgce.addPtg(PtgPtr{rowPos}); + cellFmla->formula.rgcb.addPtg(PtgPtr{colPos}); + + } else if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::cellformulatypeArray) { diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.h b/OOXML/XlsxFormat/Worksheets/SheetData.h index 1b18f455f1..ea9e1f145b 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.h +++ b/OOXML/XlsxFormat/Worksheets/SheetData.h @@ -128,7 +128,7 @@ namespace OOX struct sharedFormula { - std::vector> shrFmla; + std::vector shrFmla; std::vector> arrfmla; }; class CFormula : public WritingElement diff --git a/OdfFile/DataTypes/custom_shape_types_convert.h b/OdfFile/DataTypes/custom_shape_types_convert.h index b61cb44710..97b7e0e436 100644 --- a/OdfFile/DataTypes/custom_shape_types_convert.h +++ b/OdfFile/DataTypes/custom_shape_types_convert.h @@ -30,6 +30,7 @@ * */ #pragma once +#include struct _shape_converter { diff --git a/OdfFile/DataTypes/iconset_type.cpp b/OdfFile/DataTypes/iconset_type.cpp index e33365eb07..8239ab3a77 100644 --- a/OdfFile/DataTypes/iconset_type.cpp +++ b/OdfFile/DataTypes/iconset_type.cpp @@ -92,8 +92,18 @@ std::wostream & operator << (std::wostream & _Wostream, const iconset_type & _Va case iconset_type::Rating5: _Wostream << L"5Rating"; break; - default: + case iconset_type::Boxes5: + _Wostream << L"5Boxes"; break; + case iconset_type::Triangles3: + _Wostream << L"3Triangles"; + break; + case iconset_type::Stars3: + _Wostream << L"3Stars"; + break; + default: + _Wostream << L"3Arrows"; + break; } return _Wostream; } @@ -137,6 +147,12 @@ iconset_type iconset_type::parse(const std::wstring & Str) return iconset_type( Quarters5 ); else if (tmp == L"5rating") return iconset_type( Rating5 ); + else if (tmp == L"5Boxes") + return iconset_type( Boxes5 ); + else if (tmp == L"3Stars") + return iconset_type(Stars3); + else if (tmp == L"3Triangles") + return iconset_type(Triangles3); else { return iconset_type( Arrows3 ); diff --git a/OdfFile/DataTypes/iconset_type.h b/OdfFile/DataTypes/iconset_type.h index 71f4dfd20c..cfee13fb15 100644 --- a/OdfFile/DataTypes/iconset_type.h +++ b/OdfFile/DataTypes/iconset_type.h @@ -59,7 +59,10 @@ public: Arrows5, Arrows5Gray, Quarters5, - Rating5 + Rating5, + Triangles3, + Stars3, + Boxes5 }; iconset_type() {} diff --git a/OdfFile/DataTypes/referenceformat.cpp b/OdfFile/DataTypes/referenceformat.cpp new file mode 100644 index 0000000000..c5795d8b19 --- /dev/null +++ b/OdfFile/DataTypes/referenceformat.cpp @@ -0,0 +1,104 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ + +#include "referenceformat.h" +#include +#include + +namespace cpdoccore { +namespace odf_types { +std::wostream & operator << (std::wostream & _Wostream, const reference_format & _Val) +{ + switch(_Val.get_type()) + { + case reference_format::chapter: + _Wostream << L"chapter"; + break; + case reference_format::direction: + _Wostream << L"direction"; + break; + case reference_format::caption: + _Wostream << L"caption"; + break; + case reference_format::category_and_value: + _Wostream << L"category-and-value"; + break; + case reference_format::value: + _Wostream << L"value"; + break; + case reference_format::number: + _Wostream << L"number"; + break; + case reference_format::number_all_superior: + _Wostream << L"number-all-superior"; + break; + case reference_format::number_no_superior: + _Wostream << L"number-no-superior"; + break; + default: + case reference_format::text: + _Wostream << L"text"; + break; + } + return _Wostream; +} + +reference_format reference_format::parse(const std::wstring & Str) +{ + std::wstring tmp = Str; + boost::algorithm::to_lower(tmp); + + if (tmp == L"chapter") + return reference_format(chapter); + else if (tmp == L"direction") + return reference_format(direction); + else if (tmp == L"text") + return reference_format(text); + else if (tmp == L"caption") + return reference_format(caption); + else if (tmp == L"category-and-value") + return reference_format(category_and_value); + else if (tmp == L"value") + return reference_format(value); + else if (tmp == L"number") + return reference_format(number); + else if (tmp == L"number-all-superior") + return reference_format(number_all_superior); + else if (tmp == L"number-no-superior") + return reference_format(number_no_superior); + else + { + return reference_format(text); + } +} +} +} diff --git a/OdfFile/DataTypes/referenceformat.h b/OdfFile/DataTypes/referenceformat.h new file mode 100644 index 0000000000..54e679f516 --- /dev/null +++ b/OdfFile/DataTypes/referenceformat.h @@ -0,0 +1,76 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ +#pragma once + +#include +#include +#include "odfattributes.h" + + +namespace cpdoccore { +namespace odf_types { + +class reference_format +{ +public: + enum type + { + chapter, + direction, + text, + caption, + category_and_value, + value, + number, + number_all_superior, + number_no_superior + }; + + reference_format() {} + reference_format(type _Type) : type_(_Type) + {} + + type get_type() const + { + return type_; + }; + static reference_format parse(const std::wstring & Str); + +private: + type type_; + +}; +std::wostream & operator << (std::wostream & _Wostream, const reference_format& _Val); +} +APPLY_PARSE_XML_ATTRIBUTES(odf_types::reference_format); + +} diff --git a/OdfFile/Projects/Linux/OdfFormatLib.pro b/OdfFile/Projects/Linux/OdfFormatLib.pro index 45e696350e..78d1303310 100644 --- a/OdfFile/Projects/Linux/OdfFormatLib.pro +++ b/OdfFile/Projects/Linux/OdfFormatLib.pro @@ -19,6 +19,8 @@ include(../../../Common/base.pri) #BOOST include($$PWD/../../../Common/3dParty/boost/boost.pri) +include($$PWD/../../Reader/Converter/StarMath2OOXML/StarMath2OOXML.pri) + DEFINES += UNICODE \ _UNICODE \ DONT_WRITE_EMBEDDED_FONTS @@ -40,7 +42,8 @@ SOURCES += \ core_debug { SOURCES += \ - ../../DataTypes/mathvariant.cpp \ + ../../DataTypes/referenceformat.cpp \ + ../../DataTypes/mathvariant.cpp \ ../../DataTypes/anchortype.cpp \ ../../DataTypes/animation_attlists.cpp \ ../../DataTypes/backgroundcolor.cpp \ @@ -445,7 +448,8 @@ HEADERS += \ ../../Common/xml/xmlchar.h \ ../../Common/xml/xmlelement.h \ \ - ../../DataTypes/mathvariant.h \ + ../../DataTypes/referenceformat.h \ + ../../DataTypes/mathvariant.h \ ../../DataTypes/anchortype.h \ ../../DataTypes/animation_attlists.h \ ../../DataTypes/backgroundcolor.h \ diff --git a/OdfFile/Projects/Linux/odf_datatypes.cpp b/OdfFile/Projects/Linux/odf_datatypes.cpp index b13da53e57..ca12641c14 100644 --- a/OdfFile/Projects/Linux/odf_datatypes.cpp +++ b/OdfFile/Projects/Linux/odf_datatypes.cpp @@ -153,3 +153,4 @@ #include "../../DataTypes/sparklines.cpp" #include "../../DataTypes/tabledatatype.cpp" #include "../../DataTypes/tableoperator.cpp" +#include "../../DataTypes/referenceformat.cpp" diff --git a/OdfFile/Projects/Windows/cpcommon.vcxproj b/OdfFile/Projects/Windows/cpcommon.vcxproj index 55607999e5..e4890c3f57 100644 --- a/OdfFile/Projects/Windows/cpcommon.vcxproj +++ b/OdfFile/Projects/Windows/cpcommon.vcxproj @@ -253,6 +253,7 @@ + @@ -383,6 +384,7 @@ + diff --git a/OdfFile/Projects/Windows/cpcommon.vcxproj.filters b/OdfFile/Projects/Windows/cpcommon.vcxproj.filters index 41ae74406d..909e9e65ba 100644 --- a/OdfFile/Projects/Windows/cpcommon.vcxproj.filters +++ b/OdfFile/Projects/Windows/cpcommon.vcxproj.filters @@ -126,6 +126,10 @@ + + + + @@ -143,15 +147,133 @@ - - datatypes odf - - - datatypes odf - - - datatypes odf - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -489,11 +611,5 @@ datatypes odf - - datatypes odf - - - datatypes odf - \ No newline at end of file diff --git a/OdfFile/Projects/Windows/cpodf.vcxproj b/OdfFile/Projects/Windows/cpodf.vcxproj index 9261997573..11770cba04 100644 --- a/OdfFile/Projects/Windows/cpodf.vcxproj +++ b/OdfFile/Projects/Windows/cpodf.vcxproj @@ -282,6 +282,8 @@ /bigobj %(AdditionalOptions) + + /bigobj %(AdditionalOptions) @@ -551,6 +553,7 @@ /bigobj %(AdditionalOptions) + /bigobj %(AdditionalOptions) /bigobj %(AdditionalOptions) @@ -675,6 +678,9 @@ + + + diff --git a/OdfFile/Projects/Windows/cpodf.vcxproj.filters b/OdfFile/Projects/Windows/cpodf.vcxproj.filters index 7ab9701d63..9fca4cac95 100644 --- a/OdfFile/Projects/Windows/cpodf.vcxproj.filters +++ b/OdfFile/Projects/Windows/cpodf.vcxproj.filters @@ -25,6 +25,9 @@ {67b2bf43-5673-4a6f-82cb-fe4be01aee5f} + + {7d3e34d2-a224-4d68-9144-4889bbcc3698} + @@ -481,6 +484,12 @@ oox\pptx + + starmath + + + starmath + @@ -934,5 +943,14 @@ oox\pptx + + starmath + + + starmath + + + starmath + \ No newline at end of file diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/.gitignore b/OdfFile/Reader/Converter/StarMath2OOXML/.gitignore new file mode 100644 index 0000000000..4a0b530afd --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/.gitignore @@ -0,0 +1,74 @@ +# This file is used to ignore files which are generated +# ---------------------------------------------------------------------------- + +*~ +*.autosave +*.a +*.core +*.moc +*.o +*.obj +*.orig +*.rej +*.so +*.so.* +*_pch.h.cpp +*_resource.rc +*.qm +.#* +*.*# +core +!core/ +tags +.DS_Store +.directory +*.debug +Makefile* +*.prl +*.app +moc_*.cpp +ui_*.h +qrc_*.cpp +Thumbs.db +*.res +*.rc +/.qmake.cache +/.qmake.stash + +# qtcreator generated files +*.pro.user* +CMakeLists.txt.user* + +# xemacs temporary files +*.flc + +# Vim temporary files +.*.swp + +# Visual Studio generated files +*.ib_pdb_index +*.idb +*.ilk +*.pdb +*.sln +*.suo +*.vcproj +*vcproj.*.*.user +*.ncb +*.sdf +*.opensdf +*.vcxproj +*vcxproj.* + +# MinGW generated files +*.Debug +*.Release + +# Python byte code +*.pyc + +# Binaries +# -------- +*.dll +*.exe + diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pri b/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pri new file mode 100644 index 0000000000..fe88c40eb8 --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pri @@ -0,0 +1,16 @@ + +CORE_ROOT_DIR = $$PWD/../../../.. +PWD_ROOT_DIR = $$PWD + +include($$CORE_ROOT_DIR/Common/base.pri) + +ADD_DEPENDENCY(UnicodeConverter, kernel) + +SOURCES += $$PWD/cconversionsmtoooxml.cpp \ + $$PWD/cstarmathpars.cpp + +HEADERS += \ + $$PWD/cconversionsmtoooxml.h \ + $$PWD/cstarmathpars.h \ + $$PWD/typeselements.h + diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp new file mode 100644 index 0000000000..4f9a843b9c --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/Test.cpp @@ -0,0 +1,11 @@ +#include "cstarmathpars.h" +#include "cconversionsmtoooxml.h" + +//int main() +//{ +// std::wstring Temp = L"1 + 2 over 3"; +// StarMath::CStarMathPars TempO; +// TempO.Pars(Temp); +// StarMath::CConversionSMtoOOXML m_oTest; +// m_oTest.StartConversion(TempO.GetVector()); +//} diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/TestSMConverter.pro b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/TestSMConverter.pro new file mode 100644 index 0000000000..788618500b --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/TestSMConverter.pro @@ -0,0 +1,18 @@ +QT -= core gui + +TARGET = test +CONFIG += console +CONFIG -= app_bundle +TEMPLATE = app + +CORE_ROOT_DIR = $$PWD/../../../../.. +PWD_ROOT_DIR = $$PWD + +include($$CORE_ROOT_DIR/OdfFile/Reader/Converter/StarMath2OOXML/StarMath2OOXML.pri) +include($$CORE_ROOT_DIR/Common/3dParty/googletest/googletest.pri) + + + +SOURCES += main.cpp + +DESTDIR = $$PWD/build diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp new file mode 100644 index 0000000000..75ec83fbc7 --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/TestSMConverter/main.cpp @@ -0,0 +1,1310 @@ +#include "../cstarmathpars.h" +#include "../cconversionsmtoooxml.h" +#include "gtest/gtest.h" + + + +TEST(SMConvectorTest, BinOperatorPlus) +{ + std::wstring wsBinOperator = L"2 + 3"; + StarMath::CParserStarMathString m_oTempO; + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); + std::wstring XmlString = L"2+3"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,BinOperatorOver) +{ + std::wstring wsBinOperator = L"2 over 3"; + StarMath::CParserStarMathString m_oTempO; + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); + std::wstring XmlString = L"23"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,BinOperatorCdot) +{ + std::wstring wsBinOperator = L"5 cdot 8"; + StarMath::CParserStarMathString m_oTempO; + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); + std::wstring XmlString = L"5\u00B78"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,BinOperatorTimes) +{ + std::wstring wsBinOperator = L"5 times 8"; + StarMath::CParserStarMathString m_oTempO; + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); + std::wstring XmlString = L"5\u00D78"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,BinOperatorMultipl) +{ + std::wstring wsBinOperator = L"4 * 2"; + StarMath::CParserStarMathString m_oTempO; + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); + std::wstring XmlString = L"4*2"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,BinOperatorDiv) +{ + std::wstring wsBinOperator = L"4div2"; + StarMath::CParserStarMathString m_oTempO; + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); + std::wstring XmlString = L"4\u00F72"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,BinOperatorDivision) +{ + std::wstring wsBinOperator = L"4/2"; + StarMath::CParserStarMathString m_oTempO; + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); + std::wstring XmlString = L"42"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,BinOperatorOplus) +{ + std::wstring wsBinOperator = L"226oplus179"; + StarMath::CParserStarMathString m_oTempO; + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); + std::wstring XmlString = L"226\u2295179"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,BinOperatorOdot) +{ + std::wstring wsBinOperator = L"226 odot 179"; + StarMath::CParserStarMathString m_oTempO; + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); + std::wstring XmlString = L"226\u2299179"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,BinOperatorOtimes) +{ + std::wstring wsBinOperator = L"226 otimes 179"; + StarMath::CParserStarMathString m_oTempO; + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.Parse(wsBinOperator)); + std::wstring XmlString = L"226\u2297179"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,OperatorSum) +{ + std::wstring wsOperator = L"sum 5"; + StarMath::CParserStarMathString m_oTempO; + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); + std::wstring XmlString = L"5"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,OperatorSumFrom) +{ + std::wstring wsOperator = L"sum from 10 5"; + StarMath::CParserStarMathString m_oTempO; + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); + std::wstring XmlString = L"105"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,OperatorSumTo) +{ + std::wstring wsOperator = L"sum to 10 5"; + StarMath::CParserStarMathString m_oTempO; + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); + std::wstring XmlString = L"105"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,OperatorSumFromTo) +{ + std::wstring wsOperator = L"sum from 666 to 777 567"; + StarMath::CParserStarMathString m_oTempO; + StarMath::CConversionSMtoOOXML m_oTest; + m_oTest.StartConversion(m_oTempO.Parse(wsOperator)); + std::wstring XmlString = L"666777567"; + EXPECT_EQ(m_oTest.GetOOXML(),XmlString); +} + +TEST(SMConvectorTest,SetOperationUnion) +{ + std::wstring wsString = L"23 union 45"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"23\u22C345"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationIntersection) +{ + std::wstring wsString = L"15 intersection 1234"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"15\u22C21234"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationSetminus) +{ + std::wstring wsString = L"7 setminus 15745"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"7\u221615745"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationSetquotient) +{ + std::wstring wsString = L"91 setquotient 45"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"91\u221545"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationSubset) +{ + std::wstring wsString = L"1 subset 2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"1\u22822"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationSubseteq) +{ + std::wstring wsString = L"77subseteq66"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"77\u228666"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationSupset) +{ + std::wstring wsString = L"11supset22"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"11\u228322"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationSupseteq) +{ + std::wstring wsString = L"1 supseteq 2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"1\u22872"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationNsubset) +{ + std::wstring wsString = L"21nsubset2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"21\u22842"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationNsubseteq) +{ + std::wstring wsString = L"782nsubseteq250"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"782\u2288250"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationNsupset) +{ + std::wstring wsString = L"1nsupset2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"1\u22852"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationNsupseteq) +{ + std::wstring wsString = L"1nsupseteq2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"1\u22892"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationIn) +{ + std::wstring wsString = L"1 in 2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"1\u22082"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationNotin) +{ + std::wstring wsString = L"3 notin 4"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"3\u22094"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SetOperationOwns) +{ + std::wstring wsString = L"5owns6"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"5\u220B6"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionDlarrow) +{ + std::wstring wsString = L"7 dlarrow 8"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"7\u21D08"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionDlrarrow) +{ + std::wstring wsString = L"9 dlrarrow 10"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"9\u21D410"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionDrarrow) +{ + std::wstring wsString = L"11drarrow12"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"11\u21D212"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionEquals) +{ + std::wstring wsString = L"13=14"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"13=14"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionNotequals) +{ + std::wstring wsString = L"15 <> 16"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"15\u226016"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionLearrow) +{ + std::wstring wsString = L"17<18"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"17<18"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionLearrowequals) +{ + std::wstring wsString = L"19<= 20"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"19\u226420"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionRiarrow) +{ + std::wstring wsString = L"21 >22"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"21>22"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionRiarrowequals) +{ + std::wstring wsString = L"23 >=24"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"23\u226524"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionDllearrow) +{ + std::wstring wsString = L"25 <<26"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"25\u226A26"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionDlriarrow) +{ + std::wstring wsString = L"27 >> 28"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"27\u226B28"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionApprox) +{ + std::wstring wsString = L"29 approx30"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"29\u224830"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionSim) +{ + std::wstring wsString = L"31sim 32"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"31\u223C32"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionSimeq) +{ + std::wstring wsString = L"33 simeq 34"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"33\u224334"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionEquiv) +{ + std::wstring wsString = L"35 equiv 36"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"35\u226136"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionProp) +{ + std::wstring wsString = L"37 prop 38"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"37\u221D38"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionParallel) +{ + std::wstring wsString = L"39 parallel 40"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"39\u222540"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionOrtho) +{ + std::wstring wsString = L"41ortho42"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"41\u22A542"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionDivides) +{ + std::wstring wsString = L"43 divides 44"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"43\u222344"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionNdivides) +{ + std::wstring wsString = L"45 ndivides 46"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"45\u222446"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionToward) +{ + std::wstring wsString = L"47 toward 48"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"47\u219248"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionTransl) +{ + std::wstring wsString = L"49 transl 50"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"49\u22B750"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionTransr) +{ + std::wstring wsString = L"51 transr 52"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"51\u22B652"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionDef) +{ + std::wstring wsString = L"53def54"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"53\u225D54"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionPrec) +{ + std::wstring wsString = L"55prec56"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"55\u227A56"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionSucc) +{ + std::wstring wsString = L"57 succ 58"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"57\u227B58"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionPreccurlyeq) +{ + std::wstring wsString = L"59 preccurlyeq 60"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"59\u227C60"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionSucccurlyeq) +{ + std::wstring wsString = L"61 succcurlyeq 62"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"61\u227D62"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionPrecsim) +{ + std::wstring wsString = L"63 precsim 64"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"63\u227E64"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionSuccsim) +{ + std::wstring wsString = L"65 succsim 66"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"65\u227F66"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionNprec) +{ + std::wstring wsString = L"67nprec68"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"67\u228068"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,ConnectionNsucc) +{ + std::wstring wsString = L"69nsucc70"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"69\u228170"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketRound) +{ + std::wstring wsString = L"(2+3)"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"2+3"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketSquare) +{ + std::wstring wsString = L"[4-5]"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"4-5"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketLdbracket) +{ + std::wstring wsString = L"ldbracket 6+7 rdbracket"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"6+7"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketLbrace) +{ + std::wstring wsString = L"lbrace 8 - 9 rbrace"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"8-9"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketLangle) +{ + std::wstring wsString = L"langle 10 over 11 rangle"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"1011"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketLceil) +{ + std::wstring wsString = L"lceil 12 ominus 13 rceil"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"12\u229613"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketLfloor) +{ + std::wstring wsString = L"lfloor 14 union 15 rfloor"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"14\u22C315"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketLline) +{ + std::wstring wsString = L"lline 16 / 17 rline"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"1617"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketLdline) +{ + std::wstring wsString = L"ldline 18 oplus 19 rdline"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"18\u229519"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionCos) +{ + std::wstring wsString = L"cos{2+3}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"cos2+3"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionSin) +{ + std::wstring wsString = L"sin 4 over 5"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"sin45"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionTan) +{ + std::wstring wsString = L"tan{6 / 7}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"tan67"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionCot) +{ + std::wstring wsString = L"cot(8 over 9)"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"cot89"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionSinh) +{ + std::wstring wsString = L"sinh 2 supset 3"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"sinh2\u22833"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionCosh) +{ + std::wstring wsString = L"cosh 2 + 3"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"cosh2+3"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionTanh) +{ + std::wstring wsString = L"tanh(11otimes12)"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"tanh11\u229712"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionCoth222) +{ + std::wstring wsString = L"coth222"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"coth222"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionArcsin) +{ + std::wstring wsString = L"arcsin{13 ominus 14}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"arcsin13\u229614"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionArccos) +{ + std::wstring wsString = L"arccos{15 - 16}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"arccos15-16"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionArctan) +{ + std::wstring wsString = L"arctan 17 over 18"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"arctan1718"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionArccot) +{ + std::wstring wsString = L"arccot 20 + 30"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"arccot20+30"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionArsinh) +{ + std::wstring wsString = L"{arsinh{2/3}} over sum from 1 to 5 10"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"arsinh231510"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionArcosh) +{ + std::wstring wsString = L"35 + 27 over {arcosh binom 23 78}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"35+27arcosh2378"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionArtanhArcoth) +{ + std::wstring wsString = L"arcoth 30 subset {artanh 27}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"arcoth30\u2282artanh27"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,MatrixBinom) +{ + std::wstring wsString = L"binom{2 over 7 supset 277}{arcoth 89}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"27\u2283277arcoth89"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,MatrixMatrix) +{ + std::wstring wsString = L"matrix{2 / 8 -5 # sum from 2 over 10 union 3 to 10*10 100 ## cosh(10) # 2 oplus 10over100 }"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"28-5210\u22C3310*10100cosh102\u229510100"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,MatrixStack) +{ + std::wstring wsString = L"stack{2 over 10 # binom 2 3 # matrix{1 # 2 ## 3 # 4}}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"210231234"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,IndexLower) +{ + std::wstring wsString = L"25 over 1 _ 2 "; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"2512"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,IndexUpper) +{ + std::wstring wsString = L"{binom {cos 5} 2 over 4 }^ 10"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"cos52410"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,IndexLsup) +{ + std::wstring wsString = L"{2 over 7} lsup binom 2+3 {cos 15}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"2+3cos1527"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,IndexLsub) +{ + std::wstring wsString = L"2222^10 lsub 2 over 3"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"22222103"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketWithIndexOverbrace) +{ + std::wstring wsString = L"color red size 16 {2/3} overbrace color navy size 18 stack{10 # 100 # 10 }"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"231010010"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,OperatorLllint) +{ + std::wstring wsString = L"color red bold lllint from color navy bold 2 over color crimson 10 to color green (2 color orange bold + 3) 100"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"2102+3100"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketLdlineAttribute) +{ + std::wstring wsString = L"color green left ldline color navy bold 10 over color purple dot underline 100 color orange bold ital + 3 right rdline + ital bold 10"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"10100+3+10"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example11) +{ + std::wstring wsString = L"f(x) = sum from { n=0 } to { infinity } { {f^{(n)}(x_0) } over { fact{n} } (x-x_0)^n }"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"fx=n=0\u221Efnx0n\u0021x-x0n"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,AttributeGrade) +{ + std::wstring wsString = L"color green bold evaluate {E = color black m c^ color yellow 2} from {color crimson b over color teal a} to color navy overstrike infinity"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"E=mc2ba\u221E"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example2) +{ + std::wstring wsString = L"C = %pi cdot d = 2 cdot %pi cdot r"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"C=\u03C0\u00B7d=2\u00B7\u03C0\u00B7r"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example3) +{ + std::wstring wsString = L"c = sqrt{ a^2 + b^2 }"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"c=a2+b2"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example4) +{ + std::wstring wsString = L"vec F = m times vec a"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"F=m\u00D7a"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example5) +{ + std::wstring wsString = L"E = m c^2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"E=mc2"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example6) +{ + std::wstring wsString = L"G_{%mu %nu} + %LAMBDA g_{%mu %nu}= frac{8 %pi G}{c^4} T_{%mu %nu}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"G\u03BC\u03BD+\u039Bg\u03BC\u03BD=8\u03C0Gc4T\u03BC\u03BD"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example8) +{ + std::wstring wsString = L"d over dt left( {partial L}over{partial dot q} right) = {partial L}over{partial q}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"ddt\u2202L\u2202q=\u2202L\u2202q"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example9) +{ + std::wstring wsString = L"int from a to b f'(x) dx = f(b) - f(a)"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"abf'xdx=fb-fa"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example10) +{ + std::wstring wsString = L"ldline %delta bold{r}(t) rdline approx e^{%lambda t} ldline %delta { bold{r} }_0 rdline"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"\u03B4rt\u2248e\u03BBt\u03B4r0"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,LimAndCsub) +{ + std::wstring wsString = L"{lim from 2 over 10 to 1 5} csub 244"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"lim21015244"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,LimSupAndCsup) +{ + std::wstring wsString = L"limsup from 10 to 2 csup 10 100"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"lim sup10210100"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,OverWithoutLeft) +{ + std::wstring wsString = L"over +- 2_10 5"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString =L"\u00B12105"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Newline) +{ + std::wstring wsString = L"2 over 3 newline 10 csup 2 "; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"23102"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,IndexAndBinOp) +{ + std::wstring wsString = L"2 union 3^4 over 10"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"2\u22C33410"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example7) +{ + std::wstring wsString = L" %DELTA t' = { %DELTA t } over sqrt{ 1 - v^2 over c^2 }"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"\u0394t'=\u0394t1-v2c2"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,UnarySign) +{ + std::wstring wsString = L"3+6 over 9 newline -+5 over 10"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"3+69\u2213510"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example13) +{ + std::wstring wsString = L"nroot{3}{x^3-7x^2+14x-8}+sqrt{7/8+4/9+nroot{3}{sqrt{7/8+4/9}}}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"3x3-7x2+14x-8+78+49+378+49"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example14) +{ + std::wstring wsString = L"sum_{i=0}^{infinity} {(-1)^i over (2i+1)} x^{2i+1} = sin(x)"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"i=0\u221E-1i2i+1x2i+1=sinx"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example15) +{ + std::wstring wsString = L"lim_{x->0} {sin(x) over x} = 1"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"limx->0sinxx=1"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example16) +{ + std::wstring wsString = L"int_0^{infinity} x^2 e^{-x} dx = 2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"0\u221Ex2e-xdx=2"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example17) +{ + std::wstring wsString = L"{a^{2} over b} + {b^{2} over a} >= 2 sqrt{a b}"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"a2b+b2a\u22652ab"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Example18) +{ + std::wstring wsString = L"10^1_2lsub5lsup4"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"541021"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,IndexWithColor) +{ + std::wstring wsString = L"bold 2 ^ 3 _4 lsup color blue 5 csub color red 6 csup 7 lsub 8"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"5867243"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,FunctionWithColor) +{ + std::wstring wsString = L"func e^ 7_2 lsup 10 2over3"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"10e2723"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,IncorrectSizeAndFontInput) +{ + std::wstring wsString = L"size font bolt ital 2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"bolt2"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,IncorrectRGBColorInput) +{ + std::wstring wsString = L"color rgb 255 0 257 2 color rgb 10"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"2550257210"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,IncorrectHexColorInput) +{ + std::wstring wsString = L"color hex 161616FF RGB color hex 66 RGB color hex RGB color hex FFAACCFF RGB color hex 99112288FF0000 RGB "; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"RGBRGBRGBRGBRGB"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,IndexWithoutElement) +{ + std::wstring wsString = L"2^_3 "; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"23"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Neg) +{ + std::wstring wsString = L"-1 neg 10 over 5 or 7"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"-1\u00AC105\u22287"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Frac) +{ + std::wstring wsString = L"sum_{n=1}^{ infty} frac{1}{n^2} + frac{1}{n^3} = frac{ pi^2}{6} + zeta(3)"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"n=1\u221E1n2+1n3=pi26+zeta3"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,BracketIndexOnTopAndOperationOnSet) +{ + std::wstring wsString = L"3 + 10 over 5 setminus 1 overbrace 2"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"3+105\u221612"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,SqrtWithIndex) +{ + std::wstring wsString = L"sqrt{2}^{ log_2{8}} = 4"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"2log28=4"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +TEST(SMConvectorTest,Binom) +{ + std::wstring wsString = L"binom 2 = 4 3 binom 2+1abc 5"; + StarMath::CParserStarMathString oTemp; + StarMath::CConversionSMtoOOXML oTest; + oTest.StartConversion(oTemp.Parse(wsString)); + std::wstring wsXmlString = L"2=432+1abc5"; + EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +} + +//TEST(SMConvectorTest,AttributeMatrix) +//{ +// std::wstring wsString = L""; +// StarMath::CParserStarMathString oTemp; +// StarMath::CConversionSMtoOOXML oTest; +// oTest.StartConversion(oTemp.Parse(wsString)); +// std::wstring wsXmlString = L""; +// EXPECT_EQ(oTest.GetOOXML(),wsXmlString); +//} + + + + + diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp new file mode 100644 index 0000000000..1ce1665b91 --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.cpp @@ -0,0 +1,452 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ +#include "cconversionsmtoooxml.h" +#include "../../../../DesktopEditor/common/File.h" +#include +namespace StarMath { + CConversionSMtoOOXML::CConversionSMtoOOXML(): m_pXmlWrite(nullptr) + { + } + //check XMLWrite(if not nullptr == delete) + void CConversionSMtoOOXML::StartConversion(std::vector arPars, const unsigned int& iAlignment) + { + m_pXmlWrite = new XmlUtils::CXmlWriter; +// m_pXmlWrite->WriteNodeBegin(L"m:oMathPara",false); +// if(iAlignment>= 0 && iAlignment <= 2) +// { +// std::wstring wsAlignment; +// switch(iAlignment) +// { +// case 0: +// wsAlignment = L"center"; +// break; +// case 1: +// wsAlignment = L"left"; +// break; +// case 2: +// wsAlignment = L"right"; +// break; +// default: +// wsAlignment = L"center"; +// break; +// } +// m_pXmlWrite->WriteNodeBegin(L"m:oMathParaPr",false); +// m_pXmlWrite->WriteNodeBegin(L"m:jc",true); +// m_pXmlWrite->WriteAttribute(L"m:val",wsAlignment); +// m_pXmlWrite->WriteNodeEnd(L"",true,true); +// m_pXmlWrite->WriteNodeEnd(L"m:oMathParaPr",false,false); +// } +// m_pXmlWrite->WriteNodeBegin(L"m:oMath",false); + for(CElement* oTempElement:arPars) + { + if(oTempElement != nullptr) + { + if(CParserStarMathString::CheckNewline(oTempElement)) + { + m_pXmlWrite->WriteNodeBegin(L"m:r",false); + m_pXmlWrite->WriteNodeBegin(L"a:br",true); + m_pXmlWrite->WriteNodeEnd(L"",true,true); + m_pXmlWrite->WriteNodeEnd(L"m:r",false,false); + m_pXmlWrite->WriteNodeEnd(L"m:oMath",false,false); + m_pXmlWrite->WriteNodeBegin(L"m:oMath",false); + } + else + oTempElement->ConversionToOOXML(m_pXmlWrite); + } + } +// EndConversion(); + } + void CConversionSMtoOOXML::StandartProperties(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute) + { + if(pAttribute == nullptr) + { + //тут должны быть базовые свойства шрифта, задаваемые выше + + pXmlWrite->WriteNodeBegin(L"a:rPr",false); + pXmlWrite->WriteNodeBegin(L"a:rFonts",true); + pXmlWrite->WriteAttribute(L"a:hAnsi",L"Cambria Math"); + pXmlWrite->WriteAttribute(L"a:ascii",L"Cambria Math"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"a:sz",true); + pXmlWrite->WriteAttribute(L"a:val",L"40"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"a:szCs",true); + pXmlWrite->WriteAttribute(L"a:val",L"40"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeEnd(L"a:rPr",false,false); + } + else + { + std::wstring wsNameFont = pAttribute->GetFontName(); + pXmlWrite->WriteNodeBegin(L"a:rPr",false); + pXmlWrite->WriteNodeBegin(L"a:rFonts",true); + if(!wsNameFont.empty()) + { + pXmlWrite->WriteAttribute(L"a:hAnsi",wsNameFont); + pXmlWrite->WriteAttribute(L"a:ascii",wsNameFont); + } + else + { + pXmlWrite->WriteAttribute(L"a:hAnsi",L"Cambria Math"); + pXmlWrite->WriteAttribute(L"a:ascii",L"Cambria Math"); + } + pXmlWrite->WriteNodeEnd(L"w",true,true); + if(pAttribute->GetSize() == 0) + { + //тут должны быть базовые свойства шрифта, задаваемые выше - далее везде где не задано - аналогично + pXmlWrite->WriteNodeBegin(L"a:sz",true); + pXmlWrite->WriteAttribute(L"a:val",L"40"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"a:szCs",true); + pXmlWrite->WriteAttribute(L"a:val",L"40"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + else if(pAttribute->GetSize() != 0) + { + pXmlWrite->WriteNodeBegin(L"a:sz",true); + pXmlWrite->WriteAttribute(L"a:val",std::to_wstring(pAttribute->GetSize())); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"a:szCs",true); + pXmlWrite->WriteAttribute(L"a:val",std::to_wstring(pAttribute->GetSize())); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + if(!pAttribute->EmptyColor()) + { + pXmlWrite->WriteNodeBegin(L"a:color",true); + pXmlWrite->WriteAttribute(L"a:val",pAttribute->GetColor()); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + if(pAttribute->GetBold() && pAttribute->GetItal()) + { + WriteStyNode(pXmlWrite,L"bi"); + } + else if(pAttribute->GetBold()) + { + pXmlWrite->WriteNodeBegin(L"m:sty", true); + pXmlWrite->WriteAttribute(L"m:val",L"b"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"a:b",true); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"a:bCs",true); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + else if(pAttribute->GetItal()) + { + pXmlWrite->WriteNodeBegin(L"a:i",true); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + if(pAttribute->GetStrike()) + { + pXmlWrite->WriteNodeBegin(L"a:strike",true); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + pXmlWrite->WriteNodeEnd(L"a:rPr",false,false); + } + } + void CConversionSMtoOOXML::PropertiesMFPR(bool bType, XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute) + { + pXmlWrite->WriteNodeBegin(L"m:fPr",false); + if(bType) + { + pXmlWrite->WriteNodeBegin(L"m:type",true); + pXmlWrite->WriteAttribute(L"m:val",L"lin"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + WriteCtrlPrNode(pXmlWrite,pAttribute); + pXmlWrite->WriteNodeEnd(L"m:fPr",false,false); + } + void CConversionSMtoOOXML::PropertiesNaryPr(const TypeElement& enTypeOp,bool bEmptySub,bool bEmptySup,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute) + { + pXmlWrite->WriteNodeBegin(L"m:naryPr",false); + switch(enTypeOp) + { + case TypeElement::sum: + { + WriteChrNode(L"\u2211",pXmlWrite); + break; + } + case TypeElement::prod: + WriteChrNode(L"\u220F",pXmlWrite); + break; + case TypeElement::coprod: + WriteChrNode(L"\u2210",pXmlWrite); + break; + case TypeElement::iint: + WriteChrNode(L"\u222C",pXmlWrite); + break; + case TypeElement::iiint: + WriteChrNode(L"\u222D",pXmlWrite); + break; + case TypeElement::lint: + WriteChrNode(L"\u222E",pXmlWrite); + break; + case TypeElement::llint: + WriteChrNode(L"\u222F",pXmlWrite); + break; + case TypeElement::lllint: + WriteChrNode(L"\u2230",pXmlWrite); + break; + default: + break; + } + WriteLimLocNode(L"undOvr",pXmlWrite); + if(bEmptySub) + { + pXmlWrite->WriteNodeBegin(L"m:subHide",true); + pXmlWrite->WriteAttribute(L"m:val",L"1"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + if(bEmptySup) + { + pXmlWrite->WriteNodeBegin(L"m:supHide",true); + pXmlWrite->WriteAttribute(L"m:val",L"1"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + WriteCtrlPrNode(pXmlWrite,pAttribute); + pXmlWrite->WriteNodeEnd(L"m:naryPr",false,false); + } + void CConversionSMtoOOXML::WriteNodeConversion(const std::wstring &wsNameBlock, CElement *pValueBlock,XmlUtils::CXmlWriter* pXmlWrite) + { + if(pValueBlock != nullptr) + { + pXmlWrite->WriteNodeBegin(wsNameBlock,false); + pValueBlock->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(wsNameBlock,false,false); + } + else + { + pXmlWrite->WriteNodeBegin(wsNameBlock,true); + pXmlWrite->WriteNodeEnd(L"",true,true); + } + } + std::wstring CConversionSMtoOOXML::GetOOXML() + { + return m_pXmlWrite->GetXmlString(); + } + void CConversionSMtoOOXML::EndConversion() + { + m_pXmlWrite->WriteNodeEnd(L"m:oMath",false,false); + m_pXmlWrite->WriteNodeEnd(L"m:oMathPara",false,false); + } + void CConversionSMtoOOXML::PropertiesFuncPr(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute) + { + pXmlWrite->WriteNodeBegin(L"m:funcPr", false); + pXmlWrite->WriteNodeBegin(L"m:ctrlPr", false); + StandartProperties(pXmlWrite,pAttribute); + pXmlWrite->WriteNodeEnd(L"m:ctrlPr", false,false); + pXmlWrite->WriteNodeEnd(L"m:funcPr",false,false); + } + + void CConversionSMtoOOXML::PropertiesDPr(XmlUtils::CXmlWriter *pXmlWrite, const TypeElement &enTypeBracket,CAttribute* pAttribute) + { + pXmlWrite->WriteNodeBegin(L"m:dPr",false); + switch(enTypeBracket) + { + case TypeElement::langle: + BracketTypeNotation(L"\u2329",L"\u232A",pXmlWrite); + break; + case TypeElement::square: + BracketTypeNotation(L"\u005B",L"\u005D",pXmlWrite); + break; + case TypeElement::ldbracket: + BracketTypeNotation(L"\u27E6",L"\u27E7",pXmlWrite); + break; + case TypeElement::lbrace: + BracketTypeNotation(L"\u007B",L"\u007D",pXmlWrite); + break; + case TypeElement::lceil: + BracketTypeNotation(L"\u23A1",L"\u23A4",pXmlWrite); + break; + case TypeElement::lfloor: + BracketTypeNotation(L"\u23A3",L"\u23A6",pXmlWrite); + break; + case TypeElement::lline: + BracketTypeNotation(L"\u23AA",L"\u23AA",pXmlWrite); + break; + case TypeElement::ldline: + BracketTypeNotation(L"\u2016",L"\u2016",pXmlWrite); + break; + } + pXmlWrite->WriteNodeBegin(L"m:ctrlPr"); + StandartProperties(pXmlWrite,pAttribute); + pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); + pXmlWrite->WriteNodeEnd(L"m:dPr",false,false); + } + void CConversionSMtoOOXML::BracketTypeNotation(const std::wstring &wsOpenBracket, const std::wstring &wsCloseBracket, XmlUtils::CXmlWriter *pXmlWrite) + { + pXmlWrite->WriteNodeBegin(L"m:begChr", true); + pXmlWrite->WriteAttribute(L"m:val",wsOpenBracket); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"m:endChr", true); + pXmlWrite->WriteAttribute(L"m:val", wsCloseBracket); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + void CConversionSMtoOOXML::PropertiesMPr(XmlUtils::CXmlWriter *pXmlWrite, const TypeElement &enTypeMatrix,CAttribute* pAttribute) + { + pXmlWrite->WriteNodeBegin(L"m:mPr",false); + pXmlWrite->WriteNodeBegin(L"m:mcs",false); + pXmlWrite->WriteNodeBegin(L"m:mc",false); + pXmlWrite->WriteNodeBegin(L"m:mcPr",false); + pXmlWrite->WriteNodeBegin(L"m:count",true); + switch(enTypeMatrix) + { + case TypeElement::matrix: + pXmlWrite->WriteAttribute(L"m:val",L"2"); + break; + default: + pXmlWrite->WriteAttribute(L"m:val",L"1"); + break; + } + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"m:mcJc",true); + pXmlWrite->WriteAttribute(L"m:val",L"center"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeEnd(L"m:mcPr",false,false); + pXmlWrite->WriteNodeEnd(L"m:mc",false,false); + pXmlWrite->WriteNodeEnd(L"m:mcs",false,false); + pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); + StandartProperties(pXmlWrite,pAttribute); + pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); + pXmlWrite->WriteNodeEnd(L"m:mPr",false,false); + } + void CConversionSMtoOOXML::NodeGrade(XmlUtils::CXmlWriter *pXmlWrite,CElement* pValueGrade,CAttribute* pAttribute) + { + pXmlWrite->WriteNodeBegin(L"m:d",false); + pXmlWrite->WriteNodeBegin(L"m:dPr",false); + pXmlWrite->WriteNodeBegin(L"m:begChr",true); + pXmlWrite->WriteAttribute(L"m:val",L""); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"m:endChr",true); + pXmlWrite->WriteAttribute(L"m:val",L"\u23AA"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); + StandartProperties(pXmlWrite,pAttribute); + pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false); + pXmlWrite->WriteNodeEnd(L"m:dPr",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + pValueGrade->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + pXmlWrite->WriteNodeEnd(L"m:d",false,false); + } + void CConversionSMtoOOXML::WriteCtrlPrNode(XmlUtils::CXmlWriter *pXmlWrite, CAttribute *pAttribute) + { + pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); + StandartProperties(pXmlWrite,pAttribute); + pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); + } + void CConversionSMtoOOXML::WriteChrNode(const std::wstring &wsTypeOp,XmlUtils::CXmlWriter* pXmlWrite) + { + pXmlWrite->WriteNodeBegin(L"m:chr",true); + pXmlWrite->WriteAttribute(L"m:val",wsTypeOp); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + void CConversionSMtoOOXML::WriteLimLocNode(const std::wstring &wsTypeLimLock,XmlUtils::CXmlWriter* pXmlWrite) + { + pXmlWrite->WriteNodeBegin(L"m:limLoc",true); + pXmlWrite->WriteAttribute(L"m:val",wsTypeLimLock); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + void CConversionSMtoOOXML::WriteRPrFName(const TypeElement &enTypeOp, XmlUtils::CXmlWriter *pXmlWrite,CAttribute* pAttribute,const std::wstring& wsNameOp) + { + pXmlWrite->WriteNodeBegin(L"m:r",false); + pXmlWrite->WriteNodeBegin(L"m:rPr",false); + pXmlWrite->WriteNodeBegin(L"m:sty",true); + pXmlWrite->WriteAttribute(L"m:val",L"p"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeEnd(L"m:rPr",false,false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,pAttribute); + pXmlWrite->WriteNodeBegin(L"m:t",false); + switch(enTypeOp) + { + case TypeElement::lim: + pXmlWrite->WriteString(L"lim"); + break; + case TypeElement::liminf: + pXmlWrite->WriteString(L"lim inf"); + break; + case TypeElement::limsup: + pXmlWrite->WriteString(L"lim sup"); + break; + case TypeElement::oper: + pXmlWrite->WriteString(wsNameOp); + break; + default: + break; + } + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + } + void CConversionSMtoOOXML::WriteStyNode(XmlUtils::CXmlWriter *pXmlWrite, const std::wstring &wsAttributeNode) + { + pXmlWrite->WriteNodeBegin(L"m:sty", true); + pXmlWrite->WriteAttribute(L"m:val",wsAttributeNode); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + void CConversionSMtoOOXML::WritePreserveBlock(XmlUtils::CXmlWriter *pXmlWrite,CAttribute* pAttribute) + { + pXmlWrite->WriteNodeBegin(L"m:r",false); + StandartProperties(pXmlWrite,pAttribute); + pXmlWrite->WriteNodeBegin(L"m:t",true); + pXmlWrite->WriteAttribute(L"xml:space",L"preserve"); + pXmlWrite->WriteNodeEnd(L"w",true,false); + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + } + void CConversionSMtoOOXML::WriteLimUpOrLowNode(XmlUtils::CXmlWriter *pXmlWrite,const std::wstring& wsNameNode,CElement* pValue, const TypeElement& enType,CAttribute* pAttribute,const std::wstring& wsName,CElement* pIndex) + { + pXmlWrite->WriteNodeBegin(wsNameNode,false); + pXmlWrite->WriteNodeBegin(wsNameNode+L"Pr",false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,nullptr); + pXmlWrite->WriteNodeEnd(wsNameNode+L"Pr",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + CConversionSMtoOOXML::WriteRPrFName(enType,pXmlWrite,pAttribute,wsName); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + if(pValue!= nullptr && pIndex != nullptr) + { + pXmlWrite->WriteNodeBegin(L"m:lim",false); + pIndex->ConversionToOOXML(pXmlWrite); + pValue->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:lim",false,false); + } + else if(pValue!=nullptr && pIndex == nullptr) + WriteNodeConversion(L"m:lim",pValue,pXmlWrite); + else if(pValue == nullptr && pIndex !=nullptr) + WriteNodeConversion(L"m:lim",pIndex,pXmlWrite); + pXmlWrite->WriteNodeEnd(wsNameNode,false,false); + } + void CConversionSMtoOOXML::ElementConversion(XmlUtils::CXmlWriter *pXmlWrite, CElement *pElement) + { + if(pElement!= nullptr) + pElement->ConversionToOOXML(pXmlWrite); + } +} + diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h new file mode 100644 index 0000000000..05d61d0b83 --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cconversionsmtoooxml.h @@ -0,0 +1,68 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ + +#ifndef CCONVERSIONSMTOOOXML_H +#define CCONVERSIONSMTOOOXML_H +#include "cstarmathpars.h" +#include "../../../../DesktopEditor/xml/include/xmlwriter.h" + +namespace StarMath { +//delete XmlWrite + class CConversionSMtoOOXML + { + public: + CConversionSMtoOOXML(); + void StartConversion(std::vector arPars, const unsigned int& iAlignment = -1); + static void StandartProperties(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); + static void PropertiesMFPR(bool bType,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); + static void PropertiesNaryPr(const TypeElement& enTypeOp,bool bEmptySub,bool bEmptySup,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); + static void PropertiesFuncPr(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); + static void WriteNodeConversion(const std::wstring& wsNameBlock,CElement* pValueBlock,XmlUtils::CXmlWriter* pXmlWrite); + static void PropertiesDPr(XmlUtils::CXmlWriter* pXmlWrite,const TypeElement& enTypeBracket,CAttribute* pAttribute); + static void PropertiesMPr(XmlUtils::CXmlWriter* pXmlWrite,const TypeElement& enTypeMatrix,CAttribute* pAttribute); + static void NodeGrade(XmlUtils::CXmlWriter* pXmlWrite,CElement* pValueGrade,CAttribute* pAttribute); + static void WriteCtrlPrNode(XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute); + static void WriteChrNode(const std::wstring& wsTypeOp,XmlUtils::CXmlWriter* pXmlWrite); + static void WriteLimLocNode(const std::wstring& wsTypeLimLock,XmlUtils::CXmlWriter* pXmlWrite); + static void WriteRPrFName(const TypeElement& enTypeOp,XmlUtils::CXmlWriter* pXmlWrite,CAttribute* pAttribute,const std::wstring& wsNameOp); + static void WriteStyNode(XmlUtils::CXmlWriter* pXmlWrite,const std::wstring& wsAttributeNode); + static void WritePreserveBlock(XmlUtils::CXmlWriter* pXmlWrite, CAttribute *pAttribute); + static void WriteLimUpOrLowNode(XmlUtils::CXmlWriter* pXmlWrite,const std::wstring& wsNameNode,CElement* pValue,const TypeElement& enType,CAttribute* pAttribute, const std::wstring& wsName = L"oper",CElement* pIndex = nullptr); + static void ElementConversion(XmlUtils::CXmlWriter* pXmlWrite,CElement* pElement); + void EndConversion(); + std::wstring GetOOXML(); + private: + static void BracketTypeNotation(const std::wstring& wsOpenBracket,const std::wstring& wsCloseBracket, XmlUtils::CXmlWriter* pXmlWrite); + XmlUtils::CXmlWriter* m_pXmlWrite; + }; +} +#endif // CCONVERSIONSMTOOOXML_H diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp new file mode 100644 index 0000000000..fa84192c54 --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.cpp @@ -0,0 +1,3350 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ + +#include "cstarmathpars.h" +#include "cconversionsmtoooxml.h" +namespace StarMath +{ +//class methods CParsStarMath + std::vector CParserStarMathString::Parse(std::wstring& wsParseString,const TBaseAttribute* pBaseAttribute) + { + std::wstring::iterator itStart = wsParseString.begin(),itEnd = wsParseString.end(); + CStarMathReader* pReader = new CStarMathReader(itStart,itEnd); + pReader->SetBaseAttribute(pBaseAttribute); + if(pBaseAttribute != nullptr && (pBaseAttribute->base_alignment >= 0 && pBaseAttribute->base_alignment <= 2)) + SetAlignment(pBaseAttribute->base_alignment); + while(pReader->CheckIteratorPosition()) + { + if(!m_arEquation.empty()) + CElementBinOperator::UnaryCheck(pReader,m_arEquation.back()); + CElement* pTempElement = ParseElement(pReader); + AddingAnElementToAnArray(m_arEquation,pTempElement); + } + if(!pReader->EmptyString()) + { + if(pReader->GetLocalType() == TypeElement::newline) + { + m_arEquation.push_back(new CElementSpecialSymbol(pReader->GetLocalType())); + pReader->ClearReader(); + } + CElement* pTempElement = ParseElement(pReader); + if(nullptr != pTempElement) + m_arEquation.push_back(pTempElement); + } + return m_arEquation; + } + + CElement* CParserStarMathString::ParseElement(CStarMathReader* pReader) + { + CElement* pElement; + pReader->ReadingTheNextToken(); + pElement = CElement::CreateElement(pReader); + if(pElement != nullptr) + { + + if(pReader->GetAttribute() != nullptr && !CheckForLeftArgument(pReader->GetGlobalType())) + pElement->SetBaseAttribute(pReader->GetAttribute()); + else if(pReader->GetAttribute() != nullptr && (pReader->GetLocalType() == TypeElement::plus || TypeElement::minus == pReader->GetLocalType())) + pElement->SetBaseAttribute(pReader->GetAttribute()); + pReader->ClearReader(); + pElement->Parse(pReader); + if(pReader->GetBaseAttribute()!=nullptr) + pElement->SetBaseAttribute(pReader->GetBaseAttribute()); + if(pElement->GetAttribute() != nullptr && TypeElement::Function != pElement->GetBaseType()) + pElement->SetAttribute(pElement->GetAttribute()); + return pElement; + } + else + { + pReader->ClearReader(); + return pElement; + } + } + template + bool SetLeft(CElement *pLeftArg, CElement *pElementWhichAdd) + { + T* pTempElement = dynamic_cast(pElementWhichAdd); + if(pTempElement->GetLeftArg() == nullptr) + { + if(CParserStarMathString::CheckNewline(pLeftArg)) + return false; + pTempElement->SetLeftArg(pLeftArg); + pElementWhichAdd = pTempElement; + if(pElementWhichAdd->GetBaseType() == TypeElement::Index) + pElementWhichAdd->SetAttribute(nullptr); + return true; + } + else return false; + } + + bool CParserStarMathString::AddLeftArgument(CElement *pLeftArg, CElement *pElementWhichAdd) + { + if(pElementWhichAdd!=nullptr) + { + switch(pElementWhichAdd->GetBaseType()) + { + case TypeElement::BinOperator: + { + CElementBinOperator* pBinOp = dynamic_cast(pElementWhichAdd); + if(pBinOp->GetType() == TypeElement::neg) + return false; + else + return SetLeft(pLeftArg, pElementWhichAdd); + } + case TypeElement::SetOperations: + { + return SetLeft(pLeftArg, pElementWhichAdd); + } + case TypeElement::Connection: + { + return SetLeft(pLeftArg,pElementWhichAdd); + } + case TypeElement::BracketWithIndex: + { + return SetLeft(pLeftArg,pElementWhichAdd); + } + case TypeElement::Index: + { + return SetLeft(pLeftArg,pElementWhichAdd); + } + default: + break; + } + } + else + return false; + } + CElement* CParserStarMathString::ReadingWithoutBracket(CStarMathReader *pReader, const bool& bConnection) + { + CElement* pFirstTempElement = CParserStarMathString::ParseElement(pReader); + pReader->ReadingTheNextToken(); + while(CheckForLeftArgument(pReader->GetGlobalType(),bConnection) && (pReader->GetLocalType() != TypeElement::frac && pReader->GetLocalType()!=TypeElement::nroot && pReader->GetLocalType()!=TypeElement::sqrt)) + { + CParserStarMathString::ReadingElementsWithPriorities(pReader,pFirstTempElement); + } + return pFirstTempElement; + } + bool CParserStarMathString::CheckForLeftArgument(const TypeElement &enType,const bool& bConnection) + { + switch(enType) + { + case TypeElement::BinOperator: + case TypeElement::SetOperations: + case TypeElement::BracketWithIndex: + case TypeElement::Index: + return true; + case TypeElement::Connection: + return bConnection; + default: + return false; + } + } + bool CParserStarMathString::CheckNewline(CElement* pElement) + { + if(pElement == nullptr) + return false; + if(pElement->GetBaseType() == TypeElement::SpecialSymbol) + { + CElementSpecialSymbol* pSpecial = dynamic_cast(pElement); + return (pSpecial->GetType() == TypeElement::newline); + } + else + return false; + } + void CParserStarMathString::AddingAnElementToAnArray(std::vector &arrEquation, CElement *pAddElement) + { + if(pAddElement !=nullptr) + { + if(!arrEquation.empty() && CheckForLeftArgument(pAddElement->GetBaseType())) + { + if(AddLeftArgument(arrEquation.back(),pAddElement)) + arrEquation.pop_back(); + } + arrEquation.push_back(pAddElement); + } + } + void CParserStarMathString::ReadingElementsWithPriorities(CStarMathReader *pReader, CElement *&pLeftElement) + { + CElement* pNextElement = ParseElement(pReader); + if(pLeftElement != nullptr) + AddLeftArgument(pLeftElement,pNextElement); + pLeftElement = pNextElement; + pReader->ReadingTheNextToken(); + } + void CParserStarMathString::ReadingElementsWithAttributes(CStarMathReader *pReader, CElement*& pSavingElement) + { + CElement* pElement = CParserStarMathString::ParseElement(pReader); + if(pElement->GetAttribute() != nullptr) + { + pReader->ReadingTheNextToken(); + if(CElementIndex::GetLowerIndex(pReader->GetLocalType()) || CElementIndex::GetUpperIndex(pReader->GetLocalType())) + { + CElement* pIndex = new CElementIndex(pReader->GetLocalType()); + pReader->ClearReader(); + pIndex->Parse(pReader); + AddLeftArgument(pElement,pIndex); + pSavingElement = pIndex; + } + else + pSavingElement = pElement; + } + else + pSavingElement = pElement; + } + void CParserStarMathString::SetAlignment(const unsigned int &iAlignment) + { + m_iAlignment = iAlignment; + } + const unsigned int& CParserStarMathString::GetAlignment() + { + return m_iAlignment; + } +//class methods CAttribute + CAttribute::CAttribute(): m_bBold(false),m_bItal(false),m_bPhantom(false),m_bStrike(false),m_iSize(0),m_iAlignment(0) + { + } + CAttribute::~CAttribute() + {} + void CAttribute::SetSize(const unsigned int &iSize) + { + m_iSize = iSize; + } + void CAttribute::SetAlignment(const unsigned int &iAlignment) + { + m_iAlignment = iAlignment; + } + void CAttribute::SetBold() + { + m_bBold = true; + } + void CAttribute::SetItal() + { + m_bItal = true; + } + void CAttribute::SetPhantom() + { + m_bPhantom = true; + } + void CAttribute::SetStrike() + { + m_bStrike = true; + } + bool CAttribute::SetColor(const TypeElement &enColor) + { + if(enColor != TypeElement::undefine) + { + switch (enColor) { + case TypeElement::black: + m_wsColor = L"000000"; + return true; + case TypeElement::blue: + m_wsColor = L"0400ff"; + return true; + case TypeElement::green: + m_wsColor =L"00FF00"; + return true; + case TypeElement::red: + m_wsColor =L"FF0000"; + return true; + case TypeElement::fuchsia: + m_wsColor =L"ED0DD9"; + return true; + case TypeElement::aqua: + m_wsColor =L"30D5C8"; + return true; + case TypeElement::yellow: + m_wsColor =L"FFFF00"; + return true; + case TypeElement::gray: + m_wsColor =L"808080"; + return true; + case TypeElement::lime: + m_wsColor =L"00FF00"; + return true; + case TypeElement::maroon: + m_wsColor =L"800000"; + return true; + case TypeElement::navy: + m_wsColor =L"000080"; + return true; + case TypeElement::olive: + m_wsColor =L"808000"; + return true; + case TypeElement::purple: + m_wsColor =L"800080"; + return true; + case TypeElement::silver: + m_wsColor =L"C0C0C0"; + return true; + case TypeElement::teal: + m_wsColor =L"008080"; + return true; + case TypeElement::coral: + m_wsColor =L"FF7F50"; + return true; + case TypeElement::midnightblue: + m_wsColor =L"191970"; + return true; + case TypeElement::crimson: + m_wsColor =L"DC143C"; + return true; + case TypeElement::violet: + m_wsColor =L"EE82EE"; + return true; + case TypeElement::orange: + m_wsColor =L"FFA500"; + return true; + case TypeElement::orangered: + m_wsColor =L"FF4500"; + return true; + case TypeElement::seagreen: + m_wsColor =L"2E8B57"; + return true; + case TypeElement::indigo: + m_wsColor =L"4B0082"; + return true; + case TypeElement::hotpink: + m_wsColor =L"FF69B4"; + return true; + case TypeElement::lavender: + m_wsColor =L"FFF0F5"; + return true; + default: + return false; + } + } + else return false; + } + void CAttribute::SetColor(const std::wstring &wsColor) + { + m_wsColor = wsColor; + } + bool CAttribute::SetFont(const TypeElement &enFont) + { + switch (enFont) { + case TypeElement::ital: + m_bItal = true; + return true; + case TypeElement::bold: + m_bBold = true; + return true; + case TypeElement::phantom: + m_bPhantom = true; + return true; + case TypeElement::overstrike: + m_bStrike = true; + return true; + default: + return false; + } + } + void CAttribute::SetFontName(const std::wstring &wsNameFont) + { + m_wsNameFont = wsNameFont; + } + bool CAttribute::GetBold() + { + return m_bBold; + } + bool CAttribute::GetItal() + { + return m_bItal; + } + bool CAttribute::GetPhantom() + { + return m_bPhantom; + } + bool CAttribute::GetStrike() + { + return m_bStrike; + } + std::wstring CAttribute::GetColor() + { + return m_wsColor; + } + const std::wstring& CAttribute::GetFontName() + { + return m_wsNameFont; + } + unsigned int CAttribute::GetSize() + { + return m_iSize; + } + unsigned int CAttribute::GetAlignment() + { + return m_iAlignment; + } + bool CAttribute::EmptyColor() + { + return m_wsColor.empty(); + } + //hex current + bool CAttribute::ParseColorAttribute(const std::wstring &wsToken,CStarMathReader* pReader) + { + TypeElement enTempColor = GetTypeColorAttribute(wsToken); + switch(enTempColor) + { + case TypeElement::hex: + { + pReader->SetString(L""); + std::wstring wsTempToken; + wsTempToken = pReader->TakingElementForHex(); + if(wsTempToken.empty()) + return false; + if(!m_wsColor.empty()) + m_wsColor.clear(); + if(wsTempToken.size()< 6) + { + int iZero = 6 - wsTempToken.size(); + for(int i = 0;i 6) + { + m_wsColor += wsTempToken.substr(wsTempToken.size()-6); + return true; + } + } + case TypeElement::rgb: + { + pReader->SetString(L""); + const int iTempLen = 7; + wchar_t arTemp[iTempLen]; + int iRed(-1),iGreen(-1),iBlue(-1); + iRed = pReader->TakingElementForRGB(); + if(iRed == -1) + return false; + iGreen = pReader->TakingElementForRGB(); + if(iGreen == -1) + { + RefundOfTheAmountRGB(pReader,iRed,iGreen,iBlue); + return false; + } + iBlue = pReader->TakingElementForRGB(); + if(iBlue == -1) + { + RefundOfTheAmountRGB(pReader,iRed,iGreen,iBlue); + return false; + } +// std::wstring wsColorNumber = pReader->GetElement(); +// if(TypeElement::undefine != CElementString::GetDigit(wsColorNumber)) +// iRed = std::stoi(wsColorNumber); +// else +// { +// RefundOfTheAmountRGB(pReader,iRed,iGreen,iBlue); +// return false; +// } +// if(iRed > 255 || iRed < 0) +// return false; +// wsColorNumber = pReader->GetElement(); +// if(TypeElement::undefine != CElementString::GetDigit(wsColorNumber)) +// iGreen = std::stoi(wsColorNumber); +// else +// { +// RefundOfTheAmountRGB(pReader,iRed,iGreen,iBlue); +// return false; +// } +// wsColorNumber = pReader->GetElement(); +// if(TypeElement::undefine != CElementString::GetDigit(wsColorNumber)) +// iBlue = std::stoi(wsColorNumber); +// else +// { +// RefundOfTheAmountRGB(pReader,iRed,iGreen,iBlue); +// return false; +// } + if(iRed > 255 || iGreen > 255 || iBlue > 255) + m_wsColor = L"000000"; + else + { + swprintf(arTemp,iTempLen,L"%02X%02X%02X",iRed,iGreen,iBlue); + m_wsColor = std::wstring(arTemp,6); + } + return true; + } + default: + return(SetColor(enTempColor)); + } + } + bool CAttribute::ParseFontAttribute(const TypeElement& enTypeFont, CStarMathReader *pReader) + { + switch(enTypeFont) + { + case TypeElement::size: + { + std::wstring wsSize = pReader->GetElement(); + pReader->SetString(wsSize); + int iTemp; + if(CElementString::GetDigit(wsSize) != TypeElement::undefine) + iTemp = std::stoi(wsSize); + else + { + return false; + } + if (iTemp > 0 && iTemp < 127) + m_iSize = iTemp*2; + else + m_iSize = 24; + return true; + } + case TypeElement::font: + { + pReader->SetString(pReader->GetElement()); + if(pReader->GetString() == L"sans") + m_wsNameFont = L"Liberation Sans"; + else if(pReader->GetString() == L"serif") + m_wsNameFont = L"Liberation Serif"; + else if(pReader->GetString() == L"fixed") + m_wsNameFont = L"Liberation Mono"; + else + return false; + return true; + } + case TypeElement::alignl: + case TypeElement::alignr: + case TypeElement::alignc: + return true; + default: + return SetFont(enTypeFont); + } + } + +//нет phantom, rgb, 16 , гарнитуры и кегля + TypeElement CAttribute::GetTypeColorAttribute(const std::wstring &wsToken) + { + if(L"hex"==wsToken) return TypeElement::hex; + else if(L"rgb" == wsToken) return TypeElement::rgb; + else if(L"black" == wsToken) return TypeElement::black; + else if(L"green" == wsToken) return TypeElement::green; + else if(L"aqua" == wsToken) return TypeElement::aqua; + else if(L"yellow" == wsToken) return TypeElement::yellow; + else if(L"lime" == wsToken) return TypeElement::lime; + else if(L"navy" == wsToken) return TypeElement::navy; + else if(L"purple" == wsToken) return TypeElement::purple; + else if(L"teal" == wsToken) return TypeElement::teal; + else if(L"blue" == wsToken) return TypeElement::blue; + else if(L"red" == wsToken) return TypeElement::red; + else if(L"fuchsia" == wsToken) return TypeElement::fuchsia; + else if(L"gray" == wsToken) return TypeElement::gray; + else if(L"maroon" == wsToken) return TypeElement::maroon; + else if(L"olive" == wsToken) return TypeElement::olive; + else if(L"silver" == wsToken) return TypeElement::silver; + else if(L"coral" == wsToken) return TypeElement::coral; + else if(L"midnightblue" == wsToken) return TypeElement::midnightblue; + else if(L"crimson" == wsToken) return TypeElement::crimson; + else if(L"violet" == wsToken) return TypeElement::violet; + else if(L"orange" == wsToken) return TypeElement::orange; + else if(L"seagreen" == wsToken) return TypeElement::seagreen; + else if(L"hotpink" == wsToken) return TypeElement::hotpink; + else if(L"orangered" == wsToken) return TypeElement::orangered; + else if(L"indigo" == wsToken) return TypeElement::indigo; + else if(L"lavender" == wsToken) return TypeElement::lavender; + else return TypeElement::undefine; + } + TypeElement CAttribute::GetTypeFontAttribute(const std::wstring &wsToken) + { + if(L"bold" == wsToken) return TypeElement::bold; + else if(L"size" == wsToken) return TypeElement::size; + else if(L"font" == wsToken) return TypeElement::font; + else if(L"ital" == wsToken) return TypeElement::ital; + else if(L"phantom" == wsToken ) return TypeElement::phantom; + else if(L"overstrike" == wsToken) return TypeElement::overstrike; + else if(L"alignl" == wsToken) return TypeElement::alignl; + else if(L"alignr" == wsToken) return TypeElement::alignr; + else if(L"alignc" == wsToken) return TypeElement::alignc; + else return TypeElement::undefine; + } + bool CAttribute::CheckHexPosition(const wchar_t &cToken) + { + if(isdigit(cToken)) + return true; + if( L'A' == cToken) return true; + else if(L'B' == cToken) return true; + else if(L'C' == cToken) return true; + else if(L'D' == cToken) return true; + else if(L'E' == cToken) return true; + else if(L'F' == cToken) return true; + else + return false; + } + bool CAttribute::CheckAttribute() + { + if(m_bBold == true || m_bItal == true || m_bStrike == true || m_bPhantom == true) + return true; + else if(!m_wsColor.empty() || !m_wsNameFont.empty()) + return true; + else if(m_iSize != 0 || (m_iAlignment == 1 || m_iAlignment == 2)) + return true; + return false; + } + void CAttribute::RefundOfTheAmountRGB(CStarMathReader *pReader, const int &iRed, const int &iGreen, const int &iBlue) + { + std::wstring wsSum; + if(iRed != -1) + wsSum += std::to_wstring(iRed); + if(iGreen != -1) + wsSum += std::to_wstring(iGreen); + if(iBlue != -1) + wsSum += std::to_wstring(iBlue); + pReader->SetString(wsSum); + } +//class methods CElement + CElement::~CElement() + { + delete m_pAttribute; + } + CElement::CElement(): m_pAttribute(nullptr) + {} + CElement::CElement(const TypeElement &enTypeBase): m_pAttribute(nullptr),m_enBaseType(enTypeBase) + { + } + CElement* CElement::CreateElement(CStarMathReader* pReader) + { + switch (pReader->GetGlobalType()) { + case TypeElement::String: + return new CElementString(pReader->GetString()); + case TypeElement::BinOperator: + return new CElementBinOperator(pReader->GetLocalType()); + case TypeElement::SetOperations: + return new CElementSetOperations(pReader->GetLocalType()); + case TypeElement::Connection: + return new CElementConnection(pReader->GetLocalType()); + case TypeElement::Function: + { + if(pReader->GetLocalType() == TypeElement::func) + { + pReader->GetToken(); + return new CElementFunction(pReader->GetLocalType(),pReader->GetString()); + } + else + return new CElementFunction(pReader->GetLocalType()); + } + case TypeElement::Bracket: + return new CElementBracket(pReader->GetLocalType()); + case TypeElement::Operation: + { + if(pReader->GetLocalType() == TypeElement::oper) + { + pReader->GetToken(); + return new CElementOperator(pReader->GetLocalType(),pReader->GetString()); + } + else + return new CElementOperator(pReader->GetLocalType()); + } + case TypeElement::BracketWithIndex: + return new CElementBracketWithIndex(pReader->GetLocalType()); + case TypeElement::Grade: + return new CElementGrade(); + case TypeElement::Matrix: + return new CElementMatrix(pReader->GetLocalType()); + case TypeElement::SpecialSymbol: + return new CElementSpecialSymbol(pReader->GetLocalType()); + case TypeElement::Index: + return new CElementIndex(pReader->GetLocalType()); + case TypeElement::Mark: + return new CElementDiacriticalMark(pReader->GetLocalType()); + default: + return nullptr; + } + } + const TypeElement& CElement::GetBaseType() + { + return m_enBaseType; + } + void CElement::SetBaseType(const TypeElement &enType) + { + m_enBaseType = enType; + } + void CElement::SetBaseAttribute(CAttribute *pAttribute) + { + if(m_pAttribute == nullptr && pAttribute != nullptr) + m_pAttribute = pAttribute; + else if(pAttribute != nullptr && pAttribute != m_pAttribute) + { + if(!m_pAttribute->GetBold() && pAttribute->GetBold()) + m_pAttribute->SetBold(); + if(!m_pAttribute->GetItal() && pAttribute->GetItal()) + m_pAttribute->SetItal(); + if(!m_pAttribute->GetPhantom() && pAttribute->GetPhantom()) + m_pAttribute->SetPhantom(); + if(!m_pAttribute->GetStrike() && pAttribute->GetStrike()) + m_pAttribute->SetStrike(); + if(m_pAttribute->EmptyColor() && !pAttribute->EmptyColor()) + m_pAttribute->SetColor(pAttribute->GetColor()); + if(m_pAttribute->GetSize() == 0 && pAttribute->GetSize() != 0) + m_pAttribute->SetSize(pAttribute->GetSize()); + } + } + CAttribute* CElement::GetAttribute() + { + return m_pAttribute; + } +//class methods CElementString + CElementString::CElementString(const std::wstring& wsTokenString) + :CElement(TypeElement::String),m_wsString(wsTokenString) + { + } + CElementString::~CElementString() + {} + void CElementString::SetString(const std::wstring& wsTokenString) + { + m_wsString = wsTokenString; + } + void CElementString::Parse(CStarMathReader* pReader) + { + pReader->ClearReader(); + } + void CElementString::ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) + { + pXmlWrite->WriteNodeBegin(L"m:r",false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:t",false); + pXmlWrite->WriteString(m_wsString); + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + } + std::wstring CElementString::GetString() + { + return m_wsString; + } + TypeElement CElementString::GetDigit(const std::wstring &wsToken) + { + if(wsToken.empty()) return TypeElement::undefine; + + for(wchar_t cOneElement: wsToken) + { + if(!isdigit(cOneElement) || L'\0' == cOneElement) return TypeElement::undefine; + } + return TypeElement::String; + } + TypeElement CElementString::GetWord(const std::wstring &wsToken) + { + if(wsToken.empty()) return TypeElement::undefine; + + for(wchar_t cOneElement: wsToken) + { + if(!isalpha(cOneElement)) return TypeElement::undefine; + } + return TypeElement::String; + } + void CElementString::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + } +//class methods CElementBinOperator + CElementBinOperator::CElementBinOperator(const TypeElement& enType) + :CElement(TypeElement::BinOperator),m_pLeftArgument(nullptr) , m_pRightArgument(nullptr),m_enTypeBinOp(enType) + { + } + CElementBinOperator::~CElementBinOperator() + { + delete m_pLeftArgument; + delete m_pRightArgument; + } + void CElementBinOperator::SetLeftArg(CElement *pElement) + { + m_pLeftArgument = pElement; + } + void CElementBinOperator::SetRightArg(CElement *pElement) + { + m_pRightArgument = pElement; + } + void CElementBinOperator::Parse(CStarMathReader* pReader) + { + if(m_enTypeBinOp == TypeElement::frac) + { + SetLeftArg(CParserStarMathString::ReadingWithoutBracket(pReader,false)); + SetRightArg(CParserStarMathString::ReadingWithoutBracket(pReader,false)); + } + else if(m_enTypeBinOp == TypeElement::neg) + SetRightArg(CParserStarMathString::ParseElement(pReader)); + else if(pReader->GetMarkForUnar() && MixedOperators(m_enTypeBinOp)) + { + SetRightArg(CParserStarMathString::ParseElement(pReader)); + } + else + { + pReader->SetMarkForUnar(true); + CElement* pTempElement = CParserStarMathString::ParseElement(pReader); + pReader->ReadingTheNextToken(); + while((IsBinOperatorLowPrior() && (pReader->GetGlobalType() == TypeElement::BinOperator || pReader->GetLocalType() == TypeElement::intersection || pReader->GetLocalType() == TypeElement::setminus || pReader->GetLocalType() == TypeElement::setquotient)) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType() != TypeElement::nroot && pReader->GetLocalType() != TypeElement::sqrt))) + { + CParserStarMathString::ReadingElementsWithPriorities(pReader,pTempElement); + } + SetRightArg(pTempElement); + } + } + void CElementBinOperator::ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) + { + if(m_enTypeBinOp == TypeElement::over || m_enTypeBinOp ==TypeElement::division || TypeElement::frac == m_enTypeBinOp) + { + pXmlWrite->WriteNodeBegin(L"m:f",false); + if(m_enTypeBinOp == TypeElement::division) + CConversionSMtoOOXML::PropertiesMFPR(true,pXmlWrite,GetAttribute()); + else + CConversionSMtoOOXML::PropertiesMFPR(false,pXmlWrite,GetAttribute()); + CConversionSMtoOOXML::WriteNodeConversion(L"m:num",m_pLeftArgument,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:den",m_pRightArgument,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:f",false,false); + } + else + { + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pLeftArgument); + pXmlWrite->WriteNodeBegin(L"m:r",false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:t",false); + switch (m_enTypeBinOp) + { + case TypeElement::plus: + pXmlWrite->WriteString(L"+"); + break; + case TypeElement::minus: + pXmlWrite->WriteString(L"-"); + break; + case TypeElement::multipl: + pXmlWrite->WriteString(L"*"); + break; + case TypeElement::cdot: + pXmlWrite->WriteString(L"\u00B7"); + break; + case TypeElement::times: + pXmlWrite->WriteString(L"\u00D7"); + break; + case TypeElement::div: + pXmlWrite->WriteString(L"\u00F7"); + break; + case TypeElement::odivide: + pXmlWrite->WriteString(L"\u2298"); + break; + case TypeElement::oplus: + pXmlWrite->WriteString(L"\u2295"); + break; + case TypeElement::ominus: + pXmlWrite->WriteString(L"\u2296"); + break; + case TypeElement::odot: + pXmlWrite->WriteString(L"\u2299"); + break; + case TypeElement::otimes: + pXmlWrite->WriteString(L"\u2297"); + break; + case TypeElement::plus_minus: + pXmlWrite->WriteString(L"\u00B1"); + break; + case TypeElement::minus_plus: + pXmlWrite->WriteString(L"\u2213"); + break; + case TypeElement::Or: + pXmlWrite->WriteString(L"\u2228"); + break; + case TypeElement::And: + pXmlWrite->WriteString(L"\u2227"); + break; + case TypeElement::neg: + pXmlWrite->WriteString(L"\u00AC"); + break; + default: + break; + } + if(m_pRightArgument!=nullptr && m_pRightArgument->GetBaseType() == TypeElement::String && GetAttribute() == m_pRightArgument->GetAttribute()) + { + CElementString* oNumber = dynamic_cast (m_pRightArgument); + pXmlWrite->WriteString(oNumber->GetString()); + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + } + else + { + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pRightArgument); + } + + } + } + void CElementBinOperator::SetTypeBinOP(const TypeElement &enType) + { + m_enTypeBinOp = enType; + } + TypeElement CElementBinOperator::GetBinOperator(const std::wstring& wsToken) + { + if(L"cdot" == wsToken) return TypeElement::cdot; + else if(L"+" == wsToken) return TypeElement::plus; + else if(L"-" == wsToken) return TypeElement::minus; + else if(L"oplus" == wsToken) return TypeElement::oplus; + else if(L"ominus" == wsToken) return TypeElement::ominus; + else if(L"circ" == wsToken) return TypeElement::circ; + else if(L"times" == wsToken) return TypeElement::times; + else if(L"over" == wsToken) return TypeElement::over; + else if(L"frac" == wsToken) return TypeElement::frac; + else if(L"div" == wsToken) return TypeElement::div; + else if(L"*" == wsToken) return TypeElement::multipl; + else if(L"/" == wsToken) return TypeElement::division; + else if(L"odot" == wsToken) return TypeElement::odot; + else if(L"otimes" == wsToken) return TypeElement::otimes; + else if(L"odivide" == wsToken) return TypeElement::odivide; + else if(L"wideslash" == wsToken) return TypeElement::wideslash; + else if(L"widebslash" == wsToken) return TypeElement::widebslash; + else if(L"+-" == wsToken) return TypeElement::plus_minus; + else if(L"-+" == wsToken) return TypeElement::minus_plus; + else if(L"neg" == wsToken) return TypeElement::neg; + else if(L"or" == wsToken) return TypeElement::Or; + else if(L"and" == wsToken) return TypeElement::And; + else if(L"&" == wsToken) return TypeElement::And; + else return TypeElement::undefine; + } + bool CElementBinOperator::MixedOperators(const TypeElement &enType) + { + switch (enType) + { + case TypeElement::plus: + return true; + case TypeElement::plus_minus: + return true; + case TypeElement::minus_plus: + return true; + case TypeElement::minus: + return true; + default: + return false; + } + } + void CElementBinOperator::UnaryCheck(CStarMathReader *pReader, CElement *pLastElement) + { + pReader->ReadingTheNextToken(); + pReader->SetMarkForUnar(!(!CParserStarMathString::CheckNewline(pLastElement) && MixedOperators(pReader->GetLocalType()))); + } + bool CElementBinOperator::IsBinOperatorLowPrior() + { + switch (m_enTypeBinOp) { + case TypeElement::oplus: + return true; + case TypeElement::ominus: + return true; + case TypeElement::circ: + return true; + case TypeElement::Or: + return true; + default: + return MixedOperators(m_enTypeBinOp); + } + } + void CElementBinOperator::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pLeftArgument !=nullptr) + m_pLeftArgument->SetAttribute(pAttribute); + if(m_pRightArgument!=nullptr) + m_pRightArgument->SetAttribute(pAttribute); + } + CElement* CElementBinOperator::GetLeftArg() + { + return m_pLeftArgument; + } + CElement* CElementBinOperator::GetRightArg() + { + return m_pRightArgument; + } + const TypeElement& CElementBinOperator::GetType() + { + return m_enTypeBinOp; + } +//class methods CElementBracket + CElementBracket::CElementBracket(const TypeElement& enType) + :CElement(TypeElement::Bracket),m_enTypeBracket(enType) + { + } + CElementBracket::~CElementBracket() + { + for(CElement* pTemp:m_arBrecketValue) delete pTemp; + } + void CElementBracket::SetBracketValue(const std::vector &arValue) + { + m_arBrecketValue = arValue; + } + TypeElement CElementBracket::GetBracketOpen(const std::wstring &wsToken) + { + if(L"{" == wsToken) return TypeElement::brace; + else if(L"(" == wsToken) return TypeElement::round; + else if(L"[" == wsToken) return TypeElement::square; + else if(L"ldbracket" == wsToken) return TypeElement::ldbracket; + else if(L"lbrace" == wsToken) return TypeElement::lbrace; + else if(L"langle" == wsToken) return TypeElement::langle; + else if(L"lceil" == wsToken) return TypeElement::lceil; + else if(L"lfloor" == wsToken) return TypeElement::lfloor; + else if(L"lline" == wsToken) return TypeElement::lline; + else if(L"ldline" == wsToken) return TypeElement::ldline; + else return TypeElement::undefine; + } + TypeElement CElementBracket::GetBracketClose(const std::wstring &wsToken) + { + if(L"}" == wsToken) return TypeElement::rwbrace; + else if(L")" == wsToken) return TypeElement::rround; + else if(L"]" == wsToken) return TypeElement::rsquare; + else if(L"rdbracket" == wsToken) return TypeElement::rdbracket; + else if(L"rbrace" == wsToken) return TypeElement::rbrace; + else if(L"rangle" == wsToken) return TypeElement::rangle; + else if(L"rceil" == wsToken) return TypeElement::rceil; + else if(L"rfloor" == wsToken) return TypeElement::rfloor; + else if(L"rline" == wsToken) return TypeElement::rline; + else if(L"rdline" == wsToken) return TypeElement::rdline; + else if(L"right" == wsToken) return TypeElement::right; + else return TypeElement::undefine; + } + std::vector CElementBracket::GetBracketValue() + { + return m_arBrecketValue; + } + void CElementBracket::Parse(CStarMathReader* pReader) + { + pReader->FindingTheEndOfParentheses(); + while(pReader->CheckIteratorPosition()) + { + if(!m_arBrecketValue.empty()) + CElementBinOperator::UnaryCheck(pReader,m_arBrecketValue.back()); + CElement* pTempElement = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddingAnElementToAnArray(m_arBrecketValue,pTempElement); + } + if(!pReader->EmptyString()) + { + if(pReader->GetLocalType() == TypeElement::newline) + { + m_arBrecketValue.push_back(new CElementSpecialSymbol(pReader->GetLocalType())); + pReader->ClearReader(); + } + CElement* pTempElement =CParserStarMathString::ParseElement(pReader); + if(nullptr != pTempElement) + m_arBrecketValue.push_back(pTempElement); + } + pReader->IteratorNullification(); + } + void CElementBracket::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) + { + if(m_enTypeBracket != TypeElement::brace) + { + pXmlWrite->WriteNodeBegin(L"m:d",false); + CConversionSMtoOOXML::PropertiesDPr(pXmlWrite,m_enTypeBracket,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:e",false); + for(CElement* pTemp:m_arBrecketValue) + { + if(CParserStarMathString::CheckNewline(pTemp)) + continue; + if(CheckMline(pTemp)) + { + pXmlWrite->WriteNodeBegin(L"m:r",false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:t",false); + pXmlWrite->WriteString(L"\u007C"); + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + continue; + } + CConversionSMtoOOXML::ElementConversion(pXmlWrite,pTemp); + } + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + pXmlWrite->WriteNodeEnd(L"m:d",false,false); + } + else + { + for(CElement* pTemp:m_arBrecketValue) + { + if(CParserStarMathString::CheckNewline(pTemp)) + continue; + CConversionSMtoOOXML::ElementConversion(pXmlWrite,pTemp); + } + } + + } + bool CElementBracket::CheckMline(CElement *pElement) + { + if(pElement == nullptr) + return false; + if(pElement->GetBaseType() == TypeElement::SpecialSymbol) + { + CElementSpecialSymbol* pSpecial = dynamic_cast(pElement); + return(pSpecial->GetType() == TypeElement::mline); + } + else + return false; + } + void CElementBracket::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + for(CElement* pTempElement:m_arBrecketValue) + { + if(pTempElement!=nullptr) + pTempElement->SetAttribute(pAttribute); + } + } +//class methods CElementSpecialSymbol + CElementSpecialSymbol::CElementSpecialSymbol(const TypeElement &enType) + :CElement(TypeElement::SpecialSymbol),m_pValue(nullptr),m_enTypeSpecial(enType),m_wsType(L"") + { + } + CElementSpecialSymbol::~CElementSpecialSymbol() + { + delete m_pValue; + } + void CElementSpecialSymbol::Parse(CStarMathReader* pReader) + { + switch(m_enTypeSpecial) + { + case TypeElement::fact: + { + SetValue(CParserStarMathString::ParseElement(pReader)); + break; + } + default: + break; + } + } + void CElementSpecialSymbol::SetValue(CElement* pValue) + { + m_pValue = pValue; + } + const TypeElement CElementSpecialSymbol::GetType() + { + return m_enTypeSpecial; + } + TypeElement CElementSpecialSymbol::GetSpecialSymbol(std::wstring &wsToken) + { + if(wsToken[0] != L'%') + { + if(L"#" == wsToken) return TypeElement::grid; + else if(L"mline" == wsToken) return TypeElement::mline; + else if(L"##" == wsToken) return TypeElement::transition; + else if(L"emptyset" == wsToken) return TypeElement::emptyset; + else if(L"aleph" == wsToken) return TypeElement::aleph; + else if(L"setN" == wsToken) return TypeElement::setN; + else if(L"setZ" == wsToken) return TypeElement::setZ; + else if(L"setQ" == wsToken) return TypeElement::setQ; + else if(L"setR" == wsToken) return TypeElement::setR; + else if(L"setc" == wsToken) return TypeElement::setC; + else if(L"infinity" == wsToken) return TypeElement::infinity; + else if(L"infty" == wsToken) return TypeElement::infinity; + else if(L"fact" == wsToken) return TypeElement::fact; + else if(L"abs" == wsToken) return TypeElement::abs; + else if(L"`" == wsToken) return TypeElement::interval; + else if(L"~" == wsToken) return TypeElement::emptiness; + else if(L"partial" == wsToken) return TypeElement::partial; + else if(L"nabla" == wsToken) return TypeElement::nabla; + else if(L"exists" == wsToken) return TypeElement::exists; + else if(L"notexists" == wsToken) return TypeElement::notexists; + else if(L"forall" == wsToken) return TypeElement::forall; + else if(L"hbar" == wsToken) return TypeElement::hbar; + else if(L"lambdabar" == wsToken) return TypeElement::lambdabar; + else if(L"Re" == wsToken) return TypeElement::Re; + else if(L"Im" == wsToken) return TypeElement::Im; + else if(L"wp" == wsToken) return TypeElement::wp; + else if(L"laplace" == wsToken) return TypeElement::laplace; + else if(L"fourier" == wsToken) return TypeElement::fourier; + else if(L"backepsilon" == wsToken) return TypeElement::backepsilon; + else if(L"leftarrow" == wsToken) return TypeElement::leftarrow; + else if(L"rightarrow" == wsToken) return TypeElement::rightarrow; + else if(L"uparrow" == wsToken) return TypeElement::uparrow; + else if(L"downarrow" == wsToken) return TypeElement::downarrow; + else if(L"dotslow" == wsToken) return TypeElement::dotslow; + else if(L"dotsaxis" == wsToken) return TypeElement::dotsaxis; + else if(L"dotsvert" == wsToken) return TypeElement::dotsvert; + else if(L"dotsup" == wsToken) return TypeElement::dotsup; + else if(L"dotsdown" == wsToken) return TypeElement::dotsdown; + else if(L"newline" == wsToken) return TypeElement::newline; + } + else if(wsToken[0] == L'%') + { + wsToken = wsToken.substr(1,wsToken.size()-1); + if(L"ALPHA" == wsToken) return TypeElement::alpha; + else if(L"ZETA" == wsToken) return TypeElement::zeta; + else if(L"LAMBDA" == wsToken) return TypeElement::lambda; + else if(L"PI" == wsToken) return TypeElement::pi; + else if(L"PHI" == wsToken) return TypeElement::phi; + else if(L"alpha" == wsToken) return TypeElement::alpha_small; + else if(L"varepsilon" == wsToken) return TypeElement::varepsilon; + else if(L"iota" == wsToken) return TypeElement::iota_small; + else if(L"xi" == wsToken) return TypeElement::xi_small; + else if(L"varrho" == wsToken) return TypeElement::varrho; + else if(L"phi" == wsToken) return TypeElement::phi_small; + else if(L"BETA" == wsToken) return TypeElement::beta; + else if(L"ETA" == wsToken) return TypeElement::eta; + else if(L"MU" == wsToken) return TypeElement::mu; + else if(L"RHO" == wsToken) return TypeElement::rho; + else if(L"CHI" == wsToken) return TypeElement::chi; + else if(L"beta" == wsToken) return TypeElement::beta_small; + else if(L"zeta" == wsToken) return TypeElement::zeta_small; + else if(L"kappa" == wsToken) return TypeElement::kappa_small; + else if(L"omicron" == wsToken) return TypeElement::omicron_small; + else if(L"sigma" == wsToken) return TypeElement::sigma_small; + else if(L"varphi" == wsToken) return TypeElement::varphi; + else if(L"GAMMA" == wsToken) return TypeElement::gamma; + else if(L"THETA" == wsToken) return TypeElement::theta; + else if(L"NU" == wsToken) return TypeElement::nu; + else if(L"SIGMA" == wsToken) return TypeElement::sigma; + else if(L"PSI" == wsToken) return TypeElement::psi; + else if(L"gamma" == wsToken) return TypeElement::gamma_small; + else if(L"eta" == wsToken) return TypeElement::eta_small; + else if(L"lambda" == wsToken) return TypeElement::lambda_small; + else if(L"pi" == wsToken) return TypeElement::pi_small; + else if(L"varsigma" == wsToken) return TypeElement::varsigma; + else if(L"chi" == wsToken) return TypeElement::chi_small; + else if(L"DELTA" == wsToken) return TypeElement::delta; + else if(L"IOTA" == wsToken) return TypeElement::iota; + else if(L"XI" == wsToken) return TypeElement::xi; + else if(L"TAU" == wsToken) return TypeElement::tau; + else if(L"OMEGA" == wsToken) return TypeElement::omega; + else if(L"delta" == wsToken) return TypeElement::delta_small; + else if(L"theta" == wsToken) return TypeElement::theta_small; + else if(L"mu" == wsToken) return TypeElement::mu_small; + else if(L"varpi" == wsToken) return TypeElement::varpi; + else if(L"tau" == wsToken) return TypeElement::tau_small; + else if(L"psi" == wsToken) return TypeElement::psi_small; + else if(L"EPSILON" == wsToken) return TypeElement::epsilon; + else if(L"KAPPA" == wsToken) return TypeElement::kappa; + else if(L"OMICRON" == wsToken) return TypeElement::omicron; + else if(L"UPSILON" == wsToken) return TypeElement::upsilon; + else if(L"epsilon" == wsToken) return TypeElement::epsilon_small; + else if(L"vartheta" == wsToken) return TypeElement::vartheta; + else if(L"nu" == wsToken) return TypeElement::nu_small; + else if(L"rho" == wsToken) return TypeElement::rho_small; + else if(L"upsilon" == wsToken) return TypeElement::upsilon_small; + else if(L"omega" == wsToken) return TypeElement::omega_small; + else if(L"and" == wsToken) return TypeElement::And; + else if(L"infinite" == wsToken) return TypeElement::infinity; + else if(L"perthousand" == wsToken) return TypeElement::perthousand; + else if(L"angle" == wsToken) return TypeElement::notin; + else if(L"strictlygreaterthan" == wsToken) return TypeElement::dlriarrow; + else if(L"element" == wsToken) return TypeElement::in; + else if(L"notequal" == wsToken) return TypeElement::notequals; + else if(L"strictlylessthan" == wsToken) return TypeElement::dllearrow; + else if(L"identical" == wsToken) return TypeElement::equiv; + else if(L"or" == wsToken) return TypeElement::Or; + else if(L"tendto" == wsToken) return TypeElement::rightarrow; + } + return TypeElement::undefine; + } + void CElementSpecialSymbol::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) + { + SetTypeSymbol(); + switch(m_enTypeSpecial) + { + case TypeElement::fact: + { + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pValue); + pXmlWrite->WriteNodeBegin(L"m:r",false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:t",false); + pXmlWrite->WriteString(L"\u0021"); + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + break; + } + case TypeElement::interval: + { + CConversionSMtoOOXML::WritePreserveBlock(pXmlWrite,GetAttribute()); + break; + } + case TypeElement::emptiness: + { + CConversionSMtoOOXML::WritePreserveBlock(pXmlWrite,GetAttribute()); + CConversionSMtoOOXML::WritePreserveBlock(pXmlWrite,GetAttribute()); + CConversionSMtoOOXML::WritePreserveBlock(pXmlWrite,GetAttribute()); + CConversionSMtoOOXML::WritePreserveBlock(pXmlWrite,GetAttribute()); + break; + } + case TypeElement::newline: + { +// pXmlWrite->WriteNodeBegin(L"m:r",false); +// pXmlWrite->WriteNodeBegin(L"w:br",true); +// pXmlWrite->WriteNodeEnd(L"",true,true); +// pXmlWrite->WriteNodeEnd(L"m:r",false,false); +// pXmlWrite->WriteNodeEnd(L"m:oMath",false,false); +// pXmlWrite->WriteNodeBegin(L"m:oMath",false); + break; + } + default: + { + if(!m_wsType.empty()) + { + pXmlWrite->WriteNodeBegin(L"m:r",false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:t",false); + pXmlWrite->WriteString(m_wsType); + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + } + break; + } + } + } + void CElementSpecialSymbol::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + } + void CElementSpecialSymbol::SetTypeSymbol() + { + switch(m_enTypeSpecial) + { + case TypeElement::infinity: + m_wsType = L"\u221E"; + break; + case TypeElement::partial: + m_wsType = L"\u2202"; + break; + case TypeElement::nabla: + m_wsType = L"\u2207"; + break; + case TypeElement::exists: + m_wsType = L"\u2203"; + break; + case TypeElement::notexists: + m_wsType = L"\u2204"; + break; + case TypeElement::forall: + m_wsType = L"\u2200"; + break; + case TypeElement::hbar: + m_wsType = L"\u0127"; + break; + case TypeElement::lambdabar: + m_wsType = L"\u019B"; + break; + case TypeElement::Re: + m_wsType = L"\u211C"; + break; + case TypeElement::Im: + m_wsType = L"\u2111"; + break; + case TypeElement::wp: + m_wsType = L"\u2118"; + break; + case TypeElement::laplace: + m_wsType = L"\u2112"; + break; + case TypeElement::fourier: + m_wsType = L"\u2131"; + break; + case TypeElement::backepsilon: + m_wsType = L"\u03F6"; + break; + case TypeElement::alpha: + m_wsType = L"\u0391"; + break; + case TypeElement::alpha_small: + m_wsType = L"\u03B1"; + break; + case TypeElement::zeta: + m_wsType = L"\u0396"; + break; + case TypeElement::zeta_small: + m_wsType = L"\u03B6"; + break; + case TypeElement::lambda: + m_wsType = L"\u039B"; + break; + case TypeElement::lambda_small: + m_wsType = L"\u03BB"; + break; + case TypeElement::pi: + m_wsType = L"\u03A0"; + break; + case TypeElement::pi_small: + m_wsType = L"\u03C0"; + break; + case TypeElement::phi: + m_wsType = L"\u03A6"; + break; + case TypeElement::phi_small: + m_wsType = L"\u03C6"; + break; + case TypeElement::varepsilon: + m_wsType = L"\u03B5"; + break; + case TypeElement::iota_small: + m_wsType = L"\u03B9"; + break; + case TypeElement::iota: + m_wsType = L"\u0399"; + break; + case TypeElement::xi_small: + m_wsType = L"\u03BE"; + break; + case TypeElement::xi: + m_wsType = L"\u039E"; + break; + case TypeElement::varrho: + m_wsType = L"\u03F1"; + break; + case TypeElement::beta: + m_wsType = L"\u0392"; + break; + case TypeElement::beta_small: + m_wsType = L"\u03B2"; + break; + case TypeElement::eta: + m_wsType = L"\u0397"; + break; + case TypeElement::eta_small: + m_wsType = L"\u03B7"; + break; + case TypeElement::mu: + m_wsType = L"\u039C"; + break; + case TypeElement::mu_small: + m_wsType = L"\u03BC"; + break; + case TypeElement::rho: + m_wsType = L"\u03A1"; + break; + case TypeElement::rho_small: + m_wsType = L"\u03C1"; + break; + case TypeElement::chi: + m_wsType = L"\u03A7"; + break; + case TypeElement::chi_small: + m_wsType = L"\u03C7"; + break; + case TypeElement::kappa_small: + m_wsType = L"\u03BA"; + break; + case TypeElement::kappa: + m_wsType = L"\u039A"; + break; + case TypeElement::omicron: + m_wsType = L"\u039F"; + break; + case TypeElement::omicron_small: + m_wsType = L"\u03BF"; + break; + case TypeElement::sigma: + m_wsType = L"\u03A3"; + break; + case TypeElement::sigma_small: + m_wsType = L"\u03C3"; + break; + case TypeElement::varphi: + m_wsType = L"\u03C6"; + break; + case TypeElement::gamma: + m_wsType = L"\u0393"; + break; + case TypeElement::gamma_small: + m_wsType = L"\u03B3"; + break; + case TypeElement::theta: + m_wsType = L"\u0398"; + break; + case TypeElement::theta_small: + m_wsType = L"\u03B8"; + break; + case TypeElement::nu: + m_wsType = L"\u039D"; + break; + case TypeElement::nu_small: + m_wsType = L"\u03BD"; + break; + case TypeElement::psi: + m_wsType = L"\u03A8"; + break; + case TypeElement::psi_small: + m_wsType = L"\u03C8"; + break; + case TypeElement::varsigma: + m_wsType = L"\u03DB"; + break; + case TypeElement::delta: + m_wsType = L"\u0394"; + break; + case TypeElement::delta_small: + m_wsType = L"\u03B4"; + break; + case TypeElement::tau: + m_wsType = L"\u03A4"; + break; + case TypeElement::tau_small: + m_wsType = L"\u03C4"; + break; + case TypeElement::omega: + m_wsType = L"\u03A9"; + break; + case TypeElement::omega_small: + m_wsType = L"\u03C9"; + break; + case TypeElement::varpi: + m_wsType = L"\u03D6"; + break; + case TypeElement::epsilon: + m_wsType = L"\u0395"; + break; + case TypeElement::epsilon_small: + m_wsType = L"\u03B5"; + break; + case TypeElement::upsilon: + m_wsType = L"\u03A5"; + break; + case TypeElement::upsilon_small: + m_wsType = L"\u03C5"; + break; + case TypeElement::vartheta: + m_wsType = L"\u03D1"; + break; + case TypeElement::And: + m_wsType = L"\u2227"; + break; + case TypeElement::Or: + m_wsType = L"\u2228"; + break; + case TypeElement::perthousand: + m_wsType = L"\u2030"; + break; + case TypeElement::angle: + m_wsType = L"\u2222"; + break; + case TypeElement::notin: + m_wsType = L"\u2209"; + break; + case TypeElement::dlriarrow: + m_wsType = L"\u226B"; + break; + case TypeElement::dllearrow: + m_wsType = L"\u226A"; + break; + case TypeElement::in: + m_wsType = L"\u2208"; + break; + case TypeElement::notequals: + m_wsType = L"\u2260"; + break; + case TypeElement::equiv: + m_wsType = L"\u2261"; + break; + case TypeElement::rightarrow: + m_wsType = L"\u1F872"; + break; + case TypeElement::leftarrow: + m_wsType = L"\u1F870"; + break; + case TypeElement::uparrow: + m_wsType = L"\u1F871"; + break; + case TypeElement::downarrow: + m_wsType = L"\u1F873"; + break; + case TypeElement::dotsaxis: + m_wsType = L"\u22EF"; + break; + case TypeElement::dotsup: + m_wsType = L"\u22F0"; + break; + case TypeElement::dotsdown: + m_wsType = L"\u22F1"; + break; + case TypeElement::dotsvert: + m_wsType = L"\u22EE"; + break; + case TypeElement::dotslow: + m_wsType = L"\u2026"; + break; + default: + break; + } + } +//class methods CElementSetOperations + CElementSetOperations::CElementSetOperations(const TypeElement &enType) + :CElement(TypeElement::SetOperations),m_pLeftArgument(nullptr), m_pRightArgument(nullptr),m_enTypeSet(enType) + { + } + CElementSetOperations::~CElementSetOperations() + { + delete m_pLeftArgument; + delete m_pRightArgument; + } + void CElementSetOperations::SetLeftArg(CElement *pElement) + { + m_pLeftArgument = pElement; + } + CElement* CElementSetOperations::GetLeftArg() + { + return m_pLeftArgument; + } + void CElementSetOperations::SetRightArg(CElement *pElement) + { + m_pRightArgument = pElement; + } + CElement* CElementSetOperations::GetRightArg() + { + return m_pRightArgument; + } + void CElementSetOperations::Parse(CStarMathReader* pReader) + { + CElement* pTempElement = CParserStarMathString::ParseElement(pReader); + pReader->ReadingTheNextToken(); + while((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || (pReader->GetGlobalType() == TypeElement::BracketWithIndex && !(TypeElement::intersection == m_enTypeSet || TypeElement::setminus == m_enTypeSet || TypeElement::setquotient == m_enTypeSet)) || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot && pReader->GetLocalType() != TypeElement::sqrt))) + { + CParserStarMathString::ReadingElementsWithPriorities(pReader,pTempElement); + } + SetRightArg(pTempElement); + } + void CElementSetOperations::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) + { + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pLeftArgument); + pXmlWrite->WriteNodeBegin(L"m:r", false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:t",false); + switch(m_enTypeSet) + { + case TypeElement::Union: + pXmlWrite->WriteString(L"\u22C3"); + break; + case TypeElement::intersection: + pXmlWrite->WriteString(L"\u22C2"); + break; + case TypeElement::setminus: + pXmlWrite->WriteString(L"\u2216"); + break; + case TypeElement::setquotient: + pXmlWrite->WriteString(L"\u2215"); + break; + case TypeElement::subset: + pXmlWrite->WriteString(L"\u2282"); + break; + case TypeElement::subseteq: + pXmlWrite->WriteString(L"\u2286"); + break; + case TypeElement::supset: + pXmlWrite->WriteString(L"\u2283"); + break; + case TypeElement::supseteq: + pXmlWrite->WriteString(L"\u2287"); + break; + case TypeElement::nsubset: + pXmlWrite->WriteString(L"\u2284"); + break; + case TypeElement::nsubseteq: + pXmlWrite->WriteString(L"\u2288"); + break; + case TypeElement::nsupset: + pXmlWrite->WriteString(L"\u2285"); + break; + case TypeElement::nsupseteq: + pXmlWrite->WriteString(L"\u2289"); + break; + case TypeElement::in: + pXmlWrite->WriteString(L"\u2208"); + break; + case TypeElement::owns: + pXmlWrite->WriteString(L"\u220B"); + break; + case TypeElement::notin: + pXmlWrite->WriteString(L"\u2209"); + break; + default: + break; + } + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pRightArgument); + } + TypeElement CElementSetOperations::GetSetOperation(const std::wstring &wsToken) + { + if(L"intersection" == wsToken) return TypeElement::intersection; + else if(L"union" == wsToken) return TypeElement::Union; + else if(L"setminus" == wsToken) return TypeElement::setminus; + else if(L"setquotient" == wsToken) return TypeElement::setquotient; + else if(L"subseteq" == wsToken) return TypeElement::subseteq; + else if(L"subset" == wsToken) return TypeElement::subset; + else if(L"supset" == wsToken) return TypeElement::supset; + else if(L"supseteq" == wsToken) return TypeElement::supseteq; + else if(L"nsubset" == wsToken) return TypeElement::nsubset; + else if(L"nsubseteq" == wsToken) return TypeElement::nsubseteq; + else if(L"nsupset" == wsToken) return TypeElement::nsupset; + else if(L"nsupseteq" == wsToken) return TypeElement::nsupseteq; + else if(L"in" == wsToken) return TypeElement::in; + else if(L"notin" == wsToken) return TypeElement::notin; + else if(L"owns" == wsToken) return TypeElement::owns; + else return TypeElement::undefine; + } + void CElementSetOperations::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pLeftArgument!= nullptr) + m_pLeftArgument->SetAttribute(pAttribute); + if(m_pRightArgument != nullptr) + m_pRightArgument->SetAttribute(pAttribute); + } + const TypeElement& CElementSetOperations::GetType() + { + return m_enTypeSet; + } +//class methods CElementConnection + CElementConnection::CElementConnection(const TypeElement& enType) + :CElement(TypeElement::Connection),m_pLeftArgument(nullptr), m_pRightArgument(nullptr),m_enTypeCon(enType) + { + } + CElementConnection::~CElementConnection() + { + delete m_pLeftArgument; + delete m_pRightArgument; + } + void CElementConnection::SetRightArg(CElement *pElement) + { + m_pRightArgument = pElement; + } + CElement* CElementConnection::GetRightArg() + { + return m_pRightArgument; + } + void CElementConnection::SetLeftArg(CElement *pElement) + { + m_pLeftArgument = pElement; + } + CElement* CElementConnection::GetLeftArg() + { + return m_pLeftArgument; + } + void CElementConnection::Parse(CStarMathReader *pReader) + { + CElement* pTempElement = CParserStarMathString::ParseElement(pReader); + pReader->ReadingTheNextToken(); + while((pReader->GetGlobalType() == TypeElement::BinOperator && pReader->GetLocalType()!=TypeElement::frac) || pReader->GetGlobalType() == TypeElement::BracketWithIndex || (pReader->GetGlobalType() == TypeElement::Index && (pReader->GetLocalType()!=TypeElement::nroot && pReader->GetLocalType()!=TypeElement::sqrt))) + { + + CParserStarMathString::ReadingElementsWithPriorities(pReader,pTempElement); + } + SetRightArg(pTempElement); + } + void CElementConnection::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) + { + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pLeftArgument); + pXmlWrite->WriteNodeBegin(L"m:r",false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:t",false); + switch(m_enTypeCon) + { + case TypeElement::equals: + pXmlWrite->WriteString(L"="); + break; + case TypeElement::notequals: + pXmlWrite->WriteString(L"\u2260"); + break; + case TypeElement::learrow: + pXmlWrite->WriteString(L"<"); + break; + case TypeElement::learrowequals: + pXmlWrite->WriteString(L"\u2264"); + break; + case TypeElement::riarrow: + pXmlWrite->WriteString(L">"); + break; + case TypeElement::riarrowequals: + pXmlWrite->WriteString(L"\u2265"); + break; + case TypeElement::dllearrow: + pXmlWrite->WriteString(L"\u226A"); + break; + case TypeElement::dlriarrow: + pXmlWrite->WriteString(L"\u226B"); + break; + case TypeElement::dlrarrow: + pXmlWrite->WriteString(L"\u21D4"); + break; + case TypeElement::drarrow: + pXmlWrite->WriteString(L"\u21D2"); + break; + case TypeElement::dlarrow: + pXmlWrite->WriteString(L"\u21D0"); + break; + case TypeElement::prec: + pXmlWrite->WriteString(L"\u227A"); + break; + case TypeElement::succ: + pXmlWrite->WriteString(L"\u227B"); + break; + case TypeElement::preccurlyeq: + pXmlWrite->WriteString(L"\u227C"); + break; + case TypeElement::succcurlyeq: + pXmlWrite->WriteString(L"\u227D"); + break; + case TypeElement::precsim: + pXmlWrite->WriteString(L"\u227E"); + break; + case TypeElement::succsim: + pXmlWrite->WriteString(L"\u227F"); + break; + case TypeElement::nprec: + pXmlWrite->WriteString(L"\u2280"); + break; + case TypeElement::nsucc: + pXmlWrite->WriteString(L"\u2281"); + break; + case TypeElement::approx: + pXmlWrite->WriteString(L"\u2248"); + break; + case TypeElement::sim: + pXmlWrite->WriteString(L"\u223C"); + break; + case TypeElement::simeq: + pXmlWrite->WriteString(L"\u2243"); + break; + case TypeElement::equiv: + pXmlWrite->WriteString(L"\u2261"); + break; + case TypeElement::prop: + pXmlWrite->WriteString(L"\u221D"); + break; + case TypeElement::parallel: + pXmlWrite->WriteString(L"\u2225"); + break; + case TypeElement::ortho: + pXmlWrite->WriteString(L"\u22A5"); + break; + case TypeElement::divides: + pXmlWrite->WriteString(L"\u2223"); + break; + case TypeElement::ndivides: + pXmlWrite->WriteString(L"\u2224"); + break; + case TypeElement::toward: + pXmlWrite->WriteString(L"\u2192"); + break; + case TypeElement::transl: + pXmlWrite->WriteString(L"\u22B7"); + break; + case TypeElement::transr: + pXmlWrite->WriteString(L"\u22B6"); + break; + case TypeElement::def: + pXmlWrite->WriteString(L"\u225D"); + break; + default: + break; + } + pXmlWrite->WriteNodeEnd(L"m:t", false, false); + pXmlWrite->WriteNodeEnd(L"m:r",false ,false); + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pRightArgument); + } + TypeElement CElementConnection::GetConnection(const std::wstring& wsToken) + { + if(L"approx" == wsToken) return TypeElement::approx; + else if(L"sim" == wsToken) return TypeElement::sim; + else if(L"simeq" == wsToken) return TypeElement::simeq; + else if(L"equiv" == wsToken) return TypeElement::equiv; + else if(L"prop" == wsToken) return TypeElement::prop; + else if(L"parallel" == wsToken) return TypeElement::parallel; + else if(L"ortho" == wsToken) return TypeElement::ortho; + else if(L"divides" == wsToken) return TypeElement::divides; + else if(L"ndivides" == wsToken) return TypeElement::ndivides; + else if(L"toward" == wsToken) return TypeElement::toward; + else if(L"transl" == wsToken) return TypeElement::transl; + else if(L"transr" == wsToken) return TypeElement::transr; + else if(L"def" == wsToken) return TypeElement::def; + else if(L"=" == wsToken) return TypeElement::equals; + else if(L"<>" == wsToken) return TypeElement::notequals; + else if(L"<" == wsToken) return TypeElement::learrow; + else if(L"<=" == wsToken) return TypeElement::learrowequals; + else if(L"leslant" == wsToken) return TypeElement::leslant; + else if(L">" == wsToken) return TypeElement::riarrow; + else if(L">=" == wsToken) return TypeElement::riarrowequals; + else if(L"geslant" == wsToken) return TypeElement::geslant; + else if(L"<<" == wsToken) return TypeElement::dllearrow; + else if(L">>" == wsToken) return TypeElement::dlriarrow; + else if(L"prec" == wsToken) return TypeElement::prec; + else if(L"succ" == wsToken) return TypeElement::succ; + else if(L"preccurlyeq" == wsToken) return TypeElement::preccurlyeq; + else if(L"succcurlyeq" == wsToken) return TypeElement::succcurlyeq; + else if(L"precsim" == wsToken) return TypeElement::precsim; + else if(L"succsim" == wsToken) return TypeElement::succsim; + else if(L"nprec" == wsToken) return TypeElement::nprec; + else if(L"nsucc" == wsToken) return TypeElement::nsucc; + else if(L"dlarrow" == wsToken) return TypeElement::dlarrow; + else if(L"dlrarrow" == wsToken) return TypeElement::dlrarrow; + else if(L"drarrow" == wsToken) return TypeElement::drarrow; + else return TypeElement::undefine; +} + void CElementConnection::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pLeftArgument!= nullptr) + m_pLeftArgument->SetAttribute(pAttribute); + if(m_pRightArgument != nullptr) + m_pRightArgument->SetAttribute(pAttribute); + } + const TypeElement& CElementConnection::GetType() + { + return m_enTypeCon; + } +//class methods CIndex + CElementIndex::CElementIndex(const TypeElement& enType) + : CElement(TypeElement::Index),m_pValueIndex(nullptr),m_pUpperIndex(nullptr),m_pLowerIndex(nullptr),m_pLsubIndex(nullptr),m_pLsupIndex(nullptr),m_pCsubIndex(nullptr),m_pCsupIndex(nullptr),m_pLeftArg(nullptr),m_enTypeIndex(enType) + { + } + CElementIndex::~CElementIndex() + { + delete m_pValueIndex; + delete m_pLeftArg; + delete m_pUpperIndex; + delete m_pLowerIndex; + delete m_pLsubIndex; + delete m_pLsupIndex; + delete m_pCsubIndex; + delete m_pCsupIndex; + } + void CElementIndex::SetValueIndex(CElement *pElement) + { + m_pValueIndex = pElement; + } + void CElementIndex::SetLeftArg(CElement *pElement) + { + if(m_pLeftArg == nullptr) + m_pLeftArg = pElement; + } + CElement* CElementIndex::GetValueIndex() + { + return m_pValueIndex; + } + CElement* CElementIndex::GetLeftArg() + { + return m_pLeftArg; + } + TypeElement CElementIndex::GetIndex(const std::wstring &wsCheckToken) + { + if(L"^" == wsCheckToken) return TypeElement::upper; + else if(L"_" == wsCheckToken) return TypeElement::lower; + else if(L"lsup" == wsCheckToken) return TypeElement::lsup; + else if(L"lsub" == wsCheckToken) return TypeElement::lsub; + else if(L"csup" == wsCheckToken) return TypeElement::csup; + else if(L"csub" == wsCheckToken) return TypeElement::csub; + else if(L"nroot" == wsCheckToken) return TypeElement::nroot; + else if(L"sqrt" == wsCheckToken) return TypeElement::sqrt; + else return TypeElement::undefine; + } + bool CElementIndex::GetUpperIndex(const TypeElement &enType) + { + switch(enType) + { + case TypeElement::upper: + case TypeElement::csup: + case TypeElement::lsup: + return true; + default: + return false; + } + } + bool CElementIndex::GetLowerIndex(const TypeElement &enType) + { + switch(enType) + { + case TypeElement::lower: + case TypeElement::lsub: + case TypeElement::csub: + return true; + default: + return false; + } + } + void CElementIndex::Parse(CStarMathReader *pReader) + { + if(m_enTypeIndex == TypeElement::nroot) + { + m_pLeftArg = CParserStarMathString::ParseElement(pReader); + pReader->ReadingTheNextToken(); + if(CElementIndex::GetLowerIndex(pReader->GetLocalType()) || CElementIndex::GetUpperIndex(pReader->GetLocalType())) + { + CElement* pElement = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddLeftArgument(m_pLeftArg,pElement); + m_pLeftArg = pElement; + } + m_pValueIndex = CParserStarMathString::ParseElement(pReader); + pReader->ReadingTheNextToken(); + if(CElementIndex::GetLowerIndex(pReader->GetLocalType()) || CElementIndex::GetUpperIndex(pReader->GetLocalType())) + { + CElement* pElement = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddLeftArgument(m_pValueIndex,pElement); + m_pValueIndex = pElement; + } + } + else if(m_enTypeIndex == TypeElement::sqrt) + { + m_pValueIndex = CParserStarMathString::ParseElement(pReader); + pReader->ReadingTheNextToken(); + if(CElementIndex::GetLowerIndex(pReader->GetLocalType()) || CElementIndex::GetUpperIndex(pReader->GetLocalType())) + { + CElement* pElement = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddLeftArgument(m_pValueIndex,pElement); + m_pValueIndex = pElement; + } + m_pLeftArg = m_pValueIndex; + } + else + { + do + { + pReader->ClearReader(); + switch(m_enTypeIndex) + { + case TypeElement::upper: + CParserStarMathString::ReadingElementsWithAttributes(pReader,m_pUpperIndex); + break; + case TypeElement::lower: + CParserStarMathString::ReadingElementsWithAttributes(pReader,m_pLowerIndex); + break; + case TypeElement::lsub: + CParserStarMathString::ReadingElementsWithAttributes(pReader,m_pLsubIndex); + break; + case TypeElement::lsup: + CParserStarMathString::ReadingElementsWithAttributes(pReader,m_pLsupIndex); + break; + case TypeElement::csub: + CParserStarMathString::ReadingElementsWithAttributes(pReader,m_pCsubIndex); + break; + case TypeElement::csup: + CParserStarMathString::ReadingElementsWithAttributes(pReader,m_pCsupIndex); + break; + } + pReader->ReadingTheNextToken(); + m_enTypeIndex = pReader->GetLocalType(); + }while(GetUpperIndex(pReader->GetLocalType()) || GetLowerIndex(pReader->GetLocalType())); + } + } + void CElementIndex::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) + { + if(TypeElement::sqrt == m_enTypeIndex || TypeElement::nroot == m_enTypeIndex) + { + pXmlWrite->WriteNodeBegin(L"m:rad",false); + pXmlWrite->WriteNodeBegin(L"m:radPr",false); + if(TypeElement::sqrt == m_enTypeIndex) + { + pXmlWrite->WriteNodeBegin(L"m:degHide",true); + pXmlWrite->WriteAttribute(L"m:val",1); + pXmlWrite->WriteNodeEnd(L"",true,true); + } + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeEnd(L"m:radPr",false,false); + if(m_pLeftArg != nullptr && m_enTypeIndex == TypeElement::nroot) + { + pXmlWrite->WriteNodeBegin(L"m:deg",false); + m_pLeftArg->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:deg",false,false); + } + else + { + pXmlWrite->WriteNodeBegin(L"m:deg",true); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pValueIndex,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:rad",false,false); + } + else if(m_pCsubIndex != nullptr || m_pCsupIndex != nullptr) + { + if(m_pCsubIndex != nullptr && m_pCsupIndex != nullptr) + { + pXmlWrite->WriteNodeBegin(L"m:limLow",false); + pXmlWrite->WriteNodeBegin(L"m:limLowPr",false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,m_pCsubIndex->GetAttribute()); + pXmlWrite->WriteNodeEnd(L"m:limLowPr",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + pXmlWrite->WriteNodeBegin(L"m:limUpp",false); + pXmlWrite->WriteNodeBegin(L"m:limUppPr",false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,m_pCsupIndex->GetAttribute()); + pXmlWrite->WriteNodeEnd(L"m:limUppPr",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + ConversionOfIndicesToValue(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:lim",m_pCsupIndex,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:limUpp",false,false); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:lim",m_pCsubIndex,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:limLow",false,false); + } + else + { + std::wstring wsNameLim; + if(m_pCsubIndex!= nullptr) + wsNameLim = L"m:limLow"; + else + wsNameLim = L"m:limUpp"; + pXmlWrite->WriteNodeBegin(wsNameLim,false); + pXmlWrite->WriteNodeBegin(wsNameLim+L"Pr",false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeEnd(wsNameLim+L"Pr",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + ConversionOfIndicesToValue(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + if(m_pCsubIndex != nullptr) + CConversionSMtoOOXML::WriteNodeConversion(L"m:lim",m_pCsubIndex,pXmlWrite); + else + CConversionSMtoOOXML::WriteNodeConversion(L"m:lim",m_pCsupIndex,pXmlWrite); + pXmlWrite->WriteNodeEnd(wsNameLim,false,false); + } + } + else + ConversionOfIndicesToValue(pXmlWrite); + } + void CElementIndex::SetAttribute(CAttribute *pAttribute) + { + if(m_pLeftArg != nullptr && m_pLeftArg->GetAttribute() == nullptr && pAttribute != nullptr) + m_pLeftArg->SetAttribute(pAttribute); + if(m_pLeftArg != nullptr && m_pLeftArg->GetAttribute() != nullptr) + SetBaseAttribute(m_pLeftArg->GetAttribute()); + if(m_pValueIndex != nullptr) + m_pValueIndex->SetAttribute(pAttribute); + if(m_pLeftArg != nullptr) + { + if(m_pLowerIndex != nullptr) + m_pLowerIndex->SetAttribute(m_pLeftArg->GetAttribute()); + if(m_pUpperIndex != nullptr) + m_pUpperIndex->SetAttribute(m_pLeftArg->GetAttribute()); + if(m_pLsubIndex != nullptr) + m_pLsubIndex->SetAttribute(m_pLeftArg->GetAttribute()); + if(m_pLsupIndex != nullptr) + m_pLsupIndex->SetAttribute(m_pLeftArg->GetAttribute()); + if(m_pCsubIndex != nullptr) + m_pCsubIndex->SetAttribute(m_pLeftArg->GetAttribute()); + if(m_pCsupIndex != nullptr) + m_pCsupIndex->SetAttribute(m_pLeftArg->GetAttribute()); + } + } + void CElementIndex::ConversionOfIndicesToValue(XmlUtils::CXmlWriter *pXmlWrite) + { + if(m_pLsubIndex != nullptr || m_pLsupIndex != nullptr) + { + pXmlWrite->WriteNodeBegin(L"m:sPre",false); + pXmlWrite->WriteNodeBegin(L"m:sPrePr",false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeEnd(L"m:sPrePr",false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pLsubIndex,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pLsupIndex,pXmlWrite); + pXmlWrite->WriteNodeBegin(L"m:e",false); + ConversionOfIndicesAfterValue(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + pXmlWrite->WriteNodeEnd(L"m:sPre",false,false); + } + else + ConversionOfIndicesAfterValue(pXmlWrite); + } + void CElementIndex::ConversionOfIndicesAfterValue(XmlUtils::CXmlWriter *pXmlWrite) + { + if(m_pUpperIndex !=nullptr || m_pLowerIndex != nullptr) + { + std::wstring wsNameNodeIndex; + if(m_pUpperIndex != nullptr && m_pLowerIndex != nullptr) + wsNameNodeIndex = L"m:sSubSup"; + else if(m_pLowerIndex != nullptr && m_pUpperIndex == nullptr) + wsNameNodeIndex = L"m:sSub"; + else if(m_pLowerIndex == nullptr && m_pUpperIndex != nullptr) + wsNameNodeIndex = L"m:sSup"; + pXmlWrite->WriteNodeBegin(wsNameNodeIndex,false); + pXmlWrite->WriteNodeBegin(wsNameNodeIndex+L"Pr",false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeEnd(wsNameNodeIndex+L"Pr",false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pLeftArg,pXmlWrite); + if(m_pUpperIndex!=nullptr && m_pLowerIndex != nullptr) + { + CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pLowerIndex,pXmlWrite); + CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pUpperIndex,pXmlWrite); + } + else if(m_pLowerIndex!= nullptr) + CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pLowerIndex,pXmlWrite); + else if(m_pUpperIndex != nullptr) + CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pUpperIndex,pXmlWrite); + pXmlWrite->WriteNodeEnd(wsNameNodeIndex,false,false); + } + else + m_pLeftArg->ConversionToOOXML(pXmlWrite); + } + const TypeElement& CElementIndex::GetType() + { + return m_enTypeIndex; + } +//class methods CElementFunction + CElementFunction::CElementFunction(const TypeElement &enType, const std::wstring &wsNameFunc) + :CElement(TypeElement::Function), m_pValue(nullptr),m_pIndex(nullptr),m_enTypeFunction(enType) + { + switch (m_enTypeFunction) { + case TypeElement::cos: + m_wsNameFunc = L"cos"; + break; + case TypeElement::sin: + m_wsNameFunc = L"sin"; + break; + case TypeElement::tan: + m_wsNameFunc = L"tan"; + break; + case TypeElement::cot: + m_wsNameFunc = L"cot"; + break; + case TypeElement::sinh: + m_wsNameFunc = L"sinh"; + break; + case TypeElement::cosh: + m_wsNameFunc = L"cosh"; + break; + case TypeElement::tanh: + m_wsNameFunc = L"tanh"; + break; + case TypeElement::coth: + m_wsNameFunc = L"coth"; + break; + case TypeElement::arcsin: + m_wsNameFunc = L"arcsin"; + break; + case TypeElement::arccos: + m_wsNameFunc = L"arccos"; + break; + case TypeElement::arctan: + m_wsNameFunc = L"arctan"; + break; + case TypeElement::arccot: + m_wsNameFunc = L"arccot"; + break; + case TypeElement::arsinh: + m_wsNameFunc = L"arsinh"; + break; + case TypeElement::arcosh: + m_wsNameFunc = L"arcosh"; + break; + case TypeElement::artanh: + m_wsNameFunc = L"artanh"; + break; + case TypeElement::arcoth: + m_wsNameFunc = L"arcoth"; + break; + case TypeElement::log: + m_wsNameFunc = L"log"; + break; + case TypeElement::ln: + m_wsNameFunc = L"ln"; + break; + case TypeElement::exp: + m_wsNameFunc = L"exp"; + break; + case TypeElement::func: + { + m_wsNameFunc = wsNameFunc; + break; + } + default: + break; + } + } + CElementFunction::~CElementFunction() + { + delete m_pValue; + delete m_pIndex; + } + void CElementFunction::SetValueFunction(CElement *pElement) + { + m_pValue = pElement; + } + CElement* CElementFunction::GetValueFunction() + { + return m_pValue; + } + void CElementFunction::SetNameFunc(const std::wstring &wsNameFunc) + { + m_wsNameFunc = wsNameFunc; + } + std::wstring CElementFunction::GetNameFuncInString() + { + return m_wsNameFunc; + } + void CElementFunction::Parse(CStarMathReader* pReader) + { + pReader->ReadingTheNextToken(); + if(CElementIndex::GetUpperIndex(pReader->GetLocalType()) || CElementIndex::GetLowerIndex(pReader->GetLocalType())) + { + m_pIndex = CParserStarMathString::ParseElement(pReader); + CParserStarMathString::AddLeftArgument(new CElementString(m_wsNameFunc),m_pIndex); + return ; + } + CElement* pTempElement = CParserStarMathString::ParseElement(pReader); + pReader->ReadingTheNextToken(); + while(CParserStarMathString::CheckForLeftArgument(pReader->GetGlobalType())) + { + CParserStarMathString::ReadingElementsWithPriorities(pReader,pTempElement); + } + SetValueFunction(pTempElement); + } + void CElementFunction::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) + { + if(m_pIndex !=nullptr) + m_pIndex->ConversionToOOXML(pXmlWrite); + else + { + pXmlWrite->WriteNodeBegin(L"m:func",false); + CConversionSMtoOOXML::PropertiesFuncPr(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:fName",false); + pXmlWrite->WriteNodeBegin(L"m:r",false); + pXmlWrite->WriteNodeBegin(L"m:rPr",false); + pXmlWrite->WriteNodeBegin(L"m:sty",true); + pXmlWrite->WriteAttribute(L"m:val",L"p"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeEnd(L"m:rPr",false,false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:t",false); + if(!m_wsNameFunc.empty()) + pXmlWrite->WriteString(m_wsNameFunc); + pXmlWrite->WriteNodeEnd(L"m:t",false,false); + pXmlWrite->WriteNodeEnd(L"m:r",false,false); + pXmlWrite->WriteNodeEnd(L"m:fName",false,false); + if(m_pValue!=nullptr) + { + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pValue,pXmlWrite); + } + else + { + pXmlWrite->WriteNodeBegin(L"m:e",true); + pXmlWrite->WriteNodeEnd(L"",true,true); + } + pXmlWrite->WriteNodeEnd(L"m:func",false,false); + } + } + TypeElement CElementFunction::GetFunction(const std::wstring &wsToken) + { + if(L"sin" == wsToken) return TypeElement::sin; + else if(L"cos" == wsToken) return TypeElement::cos; + else if(L"tan" == wsToken) return TypeElement::tan; + else if(L"cot" == wsToken) return TypeElement::cot; + else if(L"sinh" == wsToken) return TypeElement::sinh; + else if(L"cosh" == wsToken) return TypeElement::cosh; + else if(L"tanh" == wsToken) return TypeElement::tanh; + else if(L"coth" == wsToken) return TypeElement::coth; + else if(L"arcsin" == wsToken) return TypeElement::arcsin; + else if(L"arccos" == wsToken) return TypeElement::arccos; + else if(L"arctan" == wsToken) return TypeElement::arctan; + else if(L"arccot" == wsToken) return TypeElement::arccot; + else if(L"arsinh" == wsToken) return TypeElement::arsinh; + else if(L"arcosh" == wsToken) return TypeElement::arcosh; + else if(L"artanh" == wsToken) return TypeElement::artanh; + else if(L"arcoth" == wsToken) return TypeElement::arcoth; + else if(L"ln" == wsToken) return TypeElement::ln; + else if(L"exp" == wsToken) return TypeElement::exp; + else if(L"log" == wsToken) return TypeElement::log; + else if(L"func" == wsToken) return TypeElement::func; + else return TypeElement::undefine; + } + void CElementFunction::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pValue != nullptr) + m_pValue->SetAttribute(pAttribute); + } +//class methods CElementOperation + CElementOperator::CElementOperator(const TypeElement &enType, const std::wstring& wsNameOp) + :CElement(TypeElement::Operator), m_pValueFrom(nullptr), m_pValueTo(nullptr), m_pValueOperator(nullptr),m_pUpperIndex(nullptr),m_pLowerIndex(nullptr),m_enTypeOperator(enType),m_wsName(wsNameOp) + { + } + CElementOperator::~CElementOperator() + { + delete m_pValueOperator; + delete m_pValueFrom; + delete m_pValueTo; + delete m_pLowerIndex; + delete m_pUpperIndex; + } + void CElementOperator::SetValueOperator(CElement *pElement) + { + m_pValueOperator = pElement; + } + CElement* CElementOperator::GetValueOperator() + { + return m_pValueOperator; + } + void CElementOperator::SetFromValue(CElement *pElement) + { + m_pValueFrom = pElement; + } + CElement* CElementOperator::GetFromValue() + { + return m_pValueFrom; + } + void CElementOperator::SetToValue(CElement *pElement) + { + m_pValueTo = pElement; + } + CElement* CElementOperator::GetToValue() + { + return m_pValueTo; + } + void CElementOperator::SetName(const std::wstring &wsNameOp) + { + m_wsName = wsNameOp; + } + std::wstring CElementOperator::GetName() + { + return m_wsName; + } + TypeElement CElementOperator::GetFromOrTo(const std::wstring &wsToken) + { + if(L"from" == wsToken) return TypeElement::from; + else if(L"to" == wsToken) return TypeElement::to; + else return TypeElement::undefine; + } + TypeElement CElementOperator::GetOperator(const std::wstring &wsToken) + { + if(L"lim" == wsToken) return TypeElement::lim; + else if(L"sum" == wsToken) return TypeElement::sum; + else if(L"liminf" == wsToken) return TypeElement::liminf; + else if(L"limsup" == wsToken) return TypeElement::limsup; + else if(L"prod" == wsToken) return TypeElement::prod; + else if(L"coprod" == wsToken) return TypeElement::coprod; + else if(L"int" == wsToken) return TypeElement::Int; + else if(L"iint" == wsToken) return TypeElement::iint; + else if(L"iiint" == wsToken) return TypeElement::iiint; + else if(L"lint" == wsToken) return TypeElement::lint; + else if(L"llint" == wsToken) return TypeElement::llint; + else if(L"lllint" == wsToken) return TypeElement::lllint; + else if(L"oper" == wsToken) return TypeElement::oper; + else return TypeElement::undefine; + } + void CElementOperator::Parse(CStarMathReader* pReader) + { + pReader->ReadingTheNextToken(); + while(CElementIndex::GetUpperIndex(pReader->GetLocalType()) || CElementIndex::GetLowerIndex(pReader->GetLocalType())) + { + if(CElementIndex::GetUpperIndex(pReader->GetLocalType())) + { + pReader->ClearReader(); + m_pUpperIndex = CParserStarMathString::ParseElement(pReader); + } + if(CElementIndex::GetLowerIndex(pReader->GetLocalType())) + { + pReader->ClearReader(); + m_pLowerIndex = CParserStarMathString::ParseElement(pReader); + } + pReader->ReadingTheNextToken(); + } + if(pReader->GetLocalType() == TypeElement::from) + { + pReader->ClearReader(); + SetFromValue(CParserStarMathString::ReadingWithoutBracket(pReader)); + } + if(pReader->GetLocalType() == TypeElement::to) + { + pReader->ClearReader(); + SetToValue(CParserStarMathString::ReadingWithoutBracket(pReader)); + } + m_pValueOperator = CParserStarMathString::ParseElement(pReader); + pReader->ReadingTheNextToken(); + while(pReader->GetGlobalType() == TypeElement::Index) + { + CParserStarMathString::ReadingElementsWithPriorities(pReader,m_pValueOperator); + } + } + void CElementOperator::ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) + { + if(m_enTypeOperator == TypeElement::lim || TypeElement::liminf == m_enTypeOperator || TypeElement::limsup == m_enTypeOperator || TypeElement::oper == m_enTypeOperator) + { + pXmlWrite->WriteNodeBegin(L"m:func",false); + CConversionSMtoOOXML::PropertiesFuncPr(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:fName",false); + if((m_pValueFrom != nullptr || m_pLowerIndex != nullptr) && (m_pValueTo == nullptr && m_pUpperIndex == nullptr)) + CConversionSMtoOOXML::WriteLimUpOrLowNode(pXmlWrite,L"m:limLow",m_pValueFrom,m_enTypeOperator,GetAttribute(),m_wsName,m_pLowerIndex); + else if((m_pValueTo != nullptr || m_pUpperIndex != nullptr ) && (m_pValueFrom == nullptr && m_pLowerIndex == nullptr)) + CConversionSMtoOOXML::WriteLimUpOrLowNode(pXmlWrite,L"m:limUpp",m_pValueTo,m_enTypeOperator,GetAttribute(),m_wsName,m_pUpperIndex); + else if ((m_pValueFrom != nullptr || m_pLowerIndex != nullptr )&& (m_pValueTo != nullptr || m_pUpperIndex != nullptr)) + { + pXmlWrite->WriteNodeBegin(L"m:limUpp",false); + pXmlWrite->WriteNodeBegin(L"m:limUppPr",false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,nullptr); + pXmlWrite->WriteNodeEnd(L"m:limUppPr",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + CConversionSMtoOOXML::WriteLimUpOrLowNode(pXmlWrite,L"m:limLow",m_pValueFrom,m_enTypeOperator,GetAttribute(),m_wsName,m_pLowerIndex); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + pXmlWrite->WriteNodeBegin(L"m:lim",false); + if(m_pUpperIndex !=nullptr) + m_pUpperIndex->ConversionToOOXML(pXmlWrite); + if(m_pValueTo !=nullptr) + m_pValueTo->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:lim",false,false); + pXmlWrite->WriteNodeEnd(L"m:limUpp",false,false); + } + else if(m_pValueFrom == nullptr && m_pValueTo == nullptr) + CConversionSMtoOOXML::WriteRPrFName(m_enTypeOperator,pXmlWrite,GetAttribute(),GetName()); + pXmlWrite->WriteNodeEnd(L"m:fName",false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pValueOperator,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:func",false,false); + } + else + { + pXmlWrite->WriteNodeBegin(L"m:nary",false); + CConversionSMtoOOXML::PropertiesNaryPr(m_enTypeOperator,(nullptr == m_pValueFrom && nullptr == m_pLowerIndex),(nullptr == m_pValueTo && nullptr == m_pUpperIndex),pXmlWrite,GetAttribute()); + if(m_pValueFrom != nullptr && m_pLowerIndex != nullptr) + { + pXmlWrite->WriteNodeBegin(L"m:sub",false); + m_pLowerIndex->ConversionToOOXML(pXmlWrite); + m_pValueFrom->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:sub",false); + } + else if(m_pValueFrom == nullptr && m_pLowerIndex != nullptr) + CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pLowerIndex,pXmlWrite); + else if(m_pValueFrom != nullptr && m_pLowerIndex == nullptr) + CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pValueFrom,pXmlWrite); + else if(m_pValueFrom == nullptr && m_pLowerIndex == nullptr) + pXmlWrite->WriteNode(L"m:sub",L""); + if(m_pValueTo != nullptr && m_pUpperIndex != nullptr) + { + pXmlWrite->WriteNodeBegin(L"m:sup",false); + m_pUpperIndex->ConversionToOOXML(pXmlWrite); + m_pValueTo->ConversionToOOXML(pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:sup",false); + } + else if(m_pValueTo == nullptr && m_pUpperIndex != nullptr) + CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pUpperIndex,pXmlWrite); + else if(m_pValueTo != nullptr && m_pUpperIndex == nullptr) + CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pValueTo,pXmlWrite); + else if(m_pValueTo == nullptr && m_pUpperIndex == nullptr) + pXmlWrite->WriteNode(L"m:sup",L""); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pValueOperator,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:nary",false,false); + } + } + void CElementOperator::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pValueOperator!= nullptr) + m_pValueOperator->SetAttribute(pAttribute); + if(m_pValueFrom!= nullptr) + m_pValueFrom->SetAttribute(pAttribute); + if(m_pValueTo!=nullptr) + m_pValueTo->SetAttribute(pAttribute); + } +// class methods CStarMathReader + CStarMathReader::CStarMathReader(std::wstring::iterator& itStart, std::wstring::iterator& itEnd) + : m_enGlobalType(TypeElement::Empty),m_enUnderType(TypeElement::Empty),m_pAttribute(nullptr),m_bMarkForUnar(true) + { + m_itStart = itStart; + m_itEnd = itEnd; + } + CStarMathReader::~CStarMathReader() + { + delete m_pAttribute; + } + //TODO :: ParseColor and ParseFont + void CStarMathReader::GetToken() + { + if(CheckIteratorPosition()) + { + m_wsToken = GetElement(); + TypeElement enTypeFont = CAttribute::GetTypeFontAttribute(m_wsToken); + if(enTypeFont != TypeElement::undefine || L"color" == m_wsToken) + m_pAttribute = new CAttribute(); + while((enTypeFont != TypeElement::undefine || L"color" == m_wsToken) && m_itStart != m_itEnd) + { + if(L"color" == m_wsToken) + { + m_wsToken = GetElement(); + if(m_pAttribute->ParseColorAttribute(m_wsToken,this)) + m_wsToken.clear(); + } + else if(enTypeFont != TypeElement::undefine) + if(m_pAttribute->ParseFontAttribute(enTypeFont,this)) + m_wsToken.clear(); + else + enTypeFont = CAttribute::GetTypeFontAttribute(m_wsToken); + if((m_itStart != m_itEnd) && m_wsToken.empty()) + { + m_wsToken = GetElement(); + enTypeFont = CAttribute::GetTypeFontAttribute(m_wsToken); + } + } + if(m_pAttribute != nullptr && !m_pAttribute->CheckAttribute()) + m_pAttribute = nullptr; + if(m_wsToken == L"left") m_wsToken = GetElement(); + else if(L"right" == m_wsToken ) m_wsToken = GetElement(); + } + //std::wcout<base_font_italic) + m_pBaseAttribute->SetItal(); + if(pAttribute->base_font_bold) + m_pBaseAttribute->SetBold(); + if(!pAttribute->base_font_name.empty()) + m_pBaseAttribute->SetFontName(pAttribute->base_font_name); + if(pAttribute->base_font_size != 0) + m_pBaseAttribute->SetSize(pAttribute->base_font_size); + if(pAttribute->base_alignment >= 0 && pAttribute->base_alignment <=2) + m_pBaseAttribute->SetAlignment(pAttribute->base_alignment); + } + else + m_pBaseAttribute = nullptr; + } + CAttribute* CStarMathReader::GetBaseAttribute() + { + return m_pBaseAttribute; + } + std::wstring CStarMathReader::GetElement() + { + std::wstring m_wsElement{}; + for(; m_itStart != m_itEnd;m_itStart++) + { + if(iswspace(*m_itStart) && m_wsElement.empty()) continue; + else if(iswspace(*m_itStart) && !m_wsElement.empty()) + { + m_itStart++; + break; + } + else if(!m_wsElement.empty() && (CheckTokenForGetElement(*m_itStart) || *m_itStart == L'(' || L')' == *m_itStart || L'%' == *m_itStart||(L'#' == *m_itStart && L'#' != m_wsElement.back()) ||(L'-' == *m_itStart && L'+' != m_wsElement.back()) || (L'+' == *m_itStart && L'-' != m_wsElement.back()) || (iswdigit(*m_itStart) && !iswdigit(m_wsElement.back())) || (CheckIsalhpaForGetElement(*m_itStart,m_wsElement.back())) || ((m_wsElement.back() != L'<' && m_wsElement.back() != L'>') && (L'<' == *m_itStart || L'>' == *m_itStart || L'=' == *m_itStart)))) + { + return m_wsElement; + } + else if((( CheckTokenForGetElement(*m_itStart) || L'=' == *m_itStart) && m_wsElement.empty()) || (!m_wsElement.empty() && ((L'#' == m_wsElement.back() && L'#' == *m_itStart) || (L'-' == *m_itStart && L'+' == m_wsElement.back()) || (L'+' == *m_itStart && L'-' == m_wsElement.back()) || (m_wsElement.back() == L'<' && (L'=' == *m_itStart || L'<' == *m_itStart || L'>' == *m_itStart)) || (m_wsElement.back() == L'>' && (L'>' == *m_itStart || L'=' == *m_itStart)) ) ) ) + { + m_wsElement.push_back(*m_itStart); + m_itStart++; + return m_wsElement; + } + else + { + m_wsElement.push_back(*m_itStart); + } + } + if(!m_wsElement.empty()) return m_wsElement; + else return {}; + } + std::wstring CStarMathReader::TakingElementForHex() + { + std::wstring wsTokenHex{}; + for(;m_itStart != m_itEnd;m_itStart++) + { + if(iswspace(*m_itStart)) + return wsTokenHex; + else if(CAttribute::CheckHexPosition(*m_itStart)) + wsTokenHex.push_back(*m_itStart); + else + return wsTokenHex; + } + return wsTokenHex; + } + int CStarMathReader::TakingElementForRGB() + { + int iTokenRGB{-1}; + std::wstring wsToken; + std::wstring::iterator itTempStart = m_itStart; + wsToken = GetElement(); + if(CElementString::GetDigit(wsToken) != TypeElement::undefine) + { + iTokenRGB = std::stoi(wsToken); + if(iTokenRGB >= 0 && iTokenRGB<256) + return iTokenRGB; + else + { + m_itStart = itTempStart; + return -1; + } + } + else + { + m_itStart = itTempStart; + return -1; + } + } + void CStarMathReader::SetString(const std::wstring &wsToken) + { + m_wsToken = wsToken; + } + void CStarMathReader::FindingTheEndOfParentheses() + { + std::wstring::iterator itStart = m_itStart,itStartBracketClose; + int inBracketInside = 0; + while(CheckIteratorPosition()) + { + itStartBracketClose = m_itStart; + GetToken(); + if(CElementBracket::GetBracketOpen(m_wsToken) != TypeElement::undefine) + { + inBracketInside +=1; + } + else if(CElementBracket::GetBracketClose(m_wsToken) != TypeElement::undefine && inBracketInside == 0) + { + m_stBracket.push(m_itEnd); + m_itEnd = itStartBracketClose; + break; + } + else if(CElementBracket::GetBracketClose(m_wsToken) != TypeElement::undefine && inBracketInside != 0) + { + inBracketInside -=1; + } + } + ClearReader(); + m_itStart = itStart; + } + void CStarMathReader::IteratorNullification() + { + if(!m_stBracket.empty()) + { + m_itEnd = m_stBracket.top(); + m_stBracket.pop(); + } + while(TypeElement::undefine == CElementBracket::GetBracketClose(GetString()) && CheckIteratorPosition()) + { + GetToken(); + } + ClearReader(); + } + void CStarMathReader::ReadingTheNextToken() + { + if(m_wsToken.empty()) + { + GetToken(); + SetTypesToken(); + } + } + bool CStarMathReader::CheckTokenForGetElement(const wchar_t &cToken) + { + switch(cToken) + { + case L'[': + case L']': + case L'{': + case L'}': + case L'_': + case L'^': + case L'*': + case L'/': + case L'`': + case L'~': + return true; + default: + return false; + } + } + bool CStarMathReader::CheckIsalhpaForGetElement(const wchar_t &cToken, const wchar_t &cLastToken) + { + if(isalpha(cToken)) + { + if(L'%' == cLastToken) + return false; + if(isalpha(cLastToken)) + return false; + } + else + return false; + return true; + } + void CStarMathReader::SetMarkForUnar(const bool &bMark) + { + m_bMarkForUnar = bMark; + } + bool CStarMathReader::GetMarkForUnar() + { + return m_bMarkForUnar; + } +//class methods CElementBracketWithIndex + CElementBracketWithIndex::CElementBracketWithIndex(const TypeElement &enType) + :CElement(TypeElement::BracketWithIndex),m_pLeftArg(nullptr), m_pValue(nullptr),m_enTypeBracketWithIndex(enType) + { + } + CElementBracketWithIndex::~CElementBracketWithIndex() + { + delete m_pLeftArg; + delete m_pValue; + } + void CElementBracketWithIndex::SetLeftArg(CElement *pElement) + { + m_pLeftArg = pElement; + } + void CElementBracketWithIndex::SetBracketValue(CElement *pElement) + { + m_pValue = pElement; + } + CElement* CElementBracketWithIndex::GetLeftArg() + { + return m_pLeftArg; + } + void CElementBracketWithIndex::Parse(CStarMathReader *pReader) + { + m_pValue = CParserStarMathString::ParseElement(pReader); + pReader->ReadingTheNextToken(); + while(pReader->GetGlobalType() == TypeElement::Index) + { + CParserStarMathString::ReadingElementsWithPriorities(pReader,m_pValue); + } + } + void CElementBracketWithIndex::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) + { + std::wstring wsNameNode; + switch (m_enTypeBracketWithIndex) { + case TypeElement::overbrace: + wsNameNode = L"m:limUpp"; + break; + case TypeElement::underbrace: + wsNameNode = L"m:limLow"; + break; + default: + break; + } + pXmlWrite->WriteNodeBegin(wsNameNode,false); + pXmlWrite->WriteNodeBegin(wsNameNode+L"Pr",false); + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeEnd(wsNameNode+L"Pr",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + pXmlWrite->WriteNodeBegin(L"m:groupChr",false); + pXmlWrite->WriteNodeBegin(L"m:groupChrPr",false); + if(TypeElement::overbrace == m_enTypeBracketWithIndex) + { + pXmlWrite->WriteNodeBegin(L"m:chr",true); + pXmlWrite->WriteAttribute(L"m:val",L"\u23DE"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"m:pos",true); + pXmlWrite->WriteAttribute(L"m:val",L"top"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + pXmlWrite->WriteNodeBegin(L"m:vertJc",true); + pXmlWrite->WriteAttribute(L"m:val",L"bot"); + pXmlWrite->WriteNodeEnd(L"w",true,true); + } + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeEnd(L"m:groupChrPr",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + switch(m_enTypeBracketWithIndex) + { + case TypeElement::overbrace: + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pLeftArg); + break; + case TypeElement::underbrace: + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pValue); + break; + default: + break; + } + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + pXmlWrite->WriteNodeEnd(L"m:groupChr",false,false); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + pXmlWrite->WriteNodeBegin(L"m:lim",false); + switch(m_enTypeBracketWithIndex) + { + case TypeElement::overbrace: + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pValue); + break; + case TypeElement::underbrace: + CConversionSMtoOOXML::ElementConversion(pXmlWrite,m_pLeftArg); + break; + default: + break; + } + pXmlWrite->WriteNodeEnd(L"m:lim",false,false); + pXmlWrite->WriteNodeEnd(wsNameNode,false,false); + } + TypeElement CElementBracketWithIndex::GetBracketWithIndex(const std::wstring &wsToken) + { + if(L"overbrace" == wsToken) return TypeElement::overbrace; + else if(L"underbrace" == wsToken) return TypeElement::underbrace; + else return TypeElement::undefine; + } + void CElementBracketWithIndex::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pValue!= nullptr) + m_pValue->SetAttribute(pAttribute); + if(m_pLeftArg != nullptr) + m_pLeftArg->SetAttribute(pAttribute); + } + const TypeElement& CElementBracketWithIndex::GetType() + { + return m_enTypeBracketWithIndex; + } +//class methods CElementGrade + CElementGrade::CElementGrade() + :CElement(TypeElement::Grade),m_pValueGrade(nullptr), m_pValueFrom(nullptr), m_pValueTo(nullptr) + { + } + CElementGrade::~CElementGrade() + { + delete m_pValueFrom; + delete m_pValueTo; + delete m_pValueGrade; + } + void CElementGrade::SetValueFrom(CElement* pElement) + { + m_pValueFrom = pElement; + } + void CElementGrade::SetValueTo(CElement *pElement) + { + m_pValueTo = pElement; + } + void CElementGrade::SetValueGrade(CElement *pElement) + { + m_pValueGrade = pElement; + } + void CElementGrade::Parse(CStarMathReader *pReader) + { + m_pValueGrade = CParserStarMathString::ParseElement(pReader); + pReader->ReadingTheNextToken(); + if(pReader->GetLocalType() == TypeElement::from) + { + pReader->ClearReader(); + m_pValueFrom = CParserStarMathString::ParseElement(pReader); + pReader->ReadingTheNextToken(); + } + if(pReader->GetLocalType() == TypeElement::to) + { + pReader->ClearReader(); + m_pValueTo = CParserStarMathString::ParseElement(pReader); + } + if(GetAttribute() != nullptr) + SetAttribute(GetAttribute()); + } + void CElementGrade::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) + { + if(m_pValueFrom == nullptr && m_pValueTo == nullptr) + { + CConversionSMtoOOXML::NodeGrade(pXmlWrite,m_pValueGrade,GetAttribute()); + } + else + { + std::wstring wsNodeGrade; + if(m_pValueFrom != nullptr && m_pValueTo == nullptr) + { + wsNodeGrade = L"m:sSub"; + } + else if(m_pValueFrom == nullptr && m_pValueTo != nullptr) + { + wsNodeGrade = L"m:sSup"; + } + else if(m_pValueFrom != nullptr && m_pValueTo != nullptr) + { + wsNodeGrade = L"m:sSubSup"; + } + pXmlWrite->WriteNodeBegin(wsNodeGrade,false); + pXmlWrite->WriteNodeBegin(wsNodeGrade + L"Pr",false); + pXmlWrite->WriteNodeBegin(L"m:ctrlPr",false); + CConversionSMtoOOXML::StandartProperties(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeEnd(L"m:ctrlPr",false,false); + pXmlWrite->WriteNodeEnd(wsNodeGrade + L"Pr",false,false); + pXmlWrite->WriteNodeBegin(L"m:e",false); + CConversionSMtoOOXML::NodeGrade(pXmlWrite,m_pValueGrade,GetAttribute()); + pXmlWrite->WriteNodeEnd(L"m:e",false,false); + if(m_pValueFrom != nullptr) + { + CConversionSMtoOOXML::WriteNodeConversion(L"m:sub",m_pValueFrom,pXmlWrite); + } + if(m_pValueTo != nullptr) + { + CConversionSMtoOOXML::WriteNodeConversion(L"m:sup",m_pValueTo,pXmlWrite); + } + pXmlWrite->WriteNodeEnd(wsNodeGrade,false,false); + } + } + TypeElement CElementGrade::GetGrade(const std::wstring &wsToken) + { + if(L"evaluate" == wsToken) return TypeElement::evaluate; + else return TypeElement::undefine; + } + void CElementGrade::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pValueGrade!=nullptr) + m_pValueGrade->SetAttribute(pAttribute); + if(m_pValueFrom!=nullptr) + m_pValueFrom->SetAttribute(pAttribute); + if(m_pValueTo!=nullptr) + m_pValueTo->SetAttribute(pAttribute); + } +//class methods CElementMatrix + CElementMatrix::CElementMatrix(const TypeElement &enType) + :CElement(TypeElement::Matrix), m_pFirstArgument(nullptr), m_pSecondArgument(nullptr), m_enTypeMatrix(enType) + { + } + CElementMatrix::~CElementMatrix() + { + delete m_pFirstArgument; + delete m_pSecondArgument; + } + void CElementMatrix::SetFirstArgument(CElement *pElement) + { + m_pFirstArgument = pElement; + } + void CElementMatrix::SetSecondArgument(CElement *pElement) + { + m_pSecondArgument = pElement; + } + TypeElement CElementMatrix::GetMatrix(const std::wstring &wsToken) + { + if(L"binom" == wsToken) return TypeElement::binom; + else if(L"stack" == wsToken) return TypeElement::stack; + else if(L"matrix" == wsToken) return TypeElement::matrix; + else return TypeElement::undefine; + } + void CElementMatrix::Parse(CStarMathReader *pReader) + { + if(m_enTypeMatrix == TypeElement::binom) + { + SetFirstArgument(CParserStarMathString::ReadingWithoutBracket(pReader,false)); + SetSecondArgument(CParserStarMathString::ReadingWithoutBracket(pReader,false)); + } + else + { + SetFirstArgument(CParserStarMathString::ParseElement(pReader)); + } + if(GetAttribute() != nullptr) + SetAttribute(GetAttribute()); + } + void CElementMatrix::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) + { + pXmlWrite->WriteNodeBegin(L"m:m",false); + CConversionSMtoOOXML::PropertiesMPr(pXmlWrite,m_enTypeMatrix,GetAttribute()); + pXmlWrite->WriteNodeBegin(L"m:mr",false); + switch(m_enTypeMatrix) + { + case TypeElement::matrix: + { + CElementBracket* pTempBracket = dynamic_cast(m_pFirstArgument); + std::vector pTempValue = pTempBracket->GetBracketValue(); + for(CElement* pOneElement:pTempValue) + { + if(pOneElement->GetBaseType() != TypeElement::SpecialSymbol && pOneElement->GetBaseType()!= TypeElement::undefine) + { + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",pOneElement,pXmlWrite); + } + else if(pOneElement->GetBaseType() == TypeElement::SpecialSymbol) + { + CElementSpecialSymbol* pTempSpecial = dynamic_cast(pOneElement); + if(pTempSpecial->GetType() == TypeElement::transition) + { + pXmlWrite->WriteNodeEnd(L"m:mr",false,false); + pXmlWrite->WriteNodeBegin(L"m:mr",false); + } + } + else if(pOneElement->GetBaseType() != TypeElement::undefine) + CConversionSMtoOOXML::ElementConversion(pXmlWrite,pOneElement); + } + break; + } + case TypeElement::stack: + { + CElementBracket* pTempBracket = dynamic_cast(m_pFirstArgument); + std::vector pTempValue = pTempBracket->GetBracketValue(); + for(CElement* pOneElement:pTempValue) + { + if(pOneElement->GetBaseType() != TypeElement::SpecialSymbol) + { + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",pOneElement,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:mr",false,false); + pXmlWrite->WriteNodeBegin(L"m:mr",false); + } + } + break; + } + case TypeElement::binom: + { + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pFirstArgument,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:mr",false,false); + pXmlWrite->WriteNodeBegin(L"m:mr",false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pSecondArgument,pXmlWrite); + break; + } + } + pXmlWrite->WriteNodeEnd(L"m:mr",false,false); + pXmlWrite->WriteNodeEnd(L"m:m",false,false); + } + void CElementMatrix::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pFirstArgument != nullptr) + m_pFirstArgument->SetAttribute(pAttribute); + if(m_pSecondArgument != nullptr) + m_pSecondArgument->SetAttribute(pAttribute); + } +//class CElementDiacriticalMark + CElementDiacriticalMark::CElementDiacriticalMark(const TypeElement& enType) + :CElement(TypeElement::Mark),m_pValueMark(nullptr),m_enTypeMark(enType) + { + } + CElementDiacriticalMark::~CElementDiacriticalMark() + { + delete m_pValueMark; + } + void CElementDiacriticalMark::SetValueMark(CElement *pValue) + { + m_pValueMark = pValue; + } + TypeElement CElementDiacriticalMark::GetMark(const std::wstring &wsToken) + { + if(L"acute" == wsToken) return TypeElement::acute; + else if(L"breve" == wsToken) return TypeElement::breve; + else if(L"dot" == wsToken) return TypeElement::dot; + else if(L"dddot" == wsToken) return TypeElement::dddot; + else if(L"vec" == wsToken) return TypeElement::vec; + else if(L"tilde" == wsToken) return TypeElement::tilde; + else if(L"check" == wsToken) return TypeElement::check; + else if(L"grave" == wsToken) return TypeElement::grave; + else if(L"circle" == wsToken) return TypeElement::circle; + else if(L"ddot" == wsToken) return TypeElement::ddot; + else if(L"bar" == wsToken) return TypeElement::bar; + else if(L"harpoon" == wsToken) return TypeElement::harpoon; + else if(L"hat" == wsToken) return TypeElement::hat; + else if(L"widevec" == wsToken) return TypeElement::widevec; + else if(L"widetilde" == wsToken) return TypeElement::widetilde; + else if(L"overline" == wsToken) return TypeElement::overline; + else if(L"overstrike" == wsToken) return TypeElement::overstrike; + else if(L"wideharpoon" == wsToken) return TypeElement::wideharpoon; + else if(L"widehat" == wsToken) return TypeElement::widehat; + else if(L"underline" == wsToken) return TypeElement::underline; + } + void CElementDiacriticalMark::Parse(CStarMathReader *pReader) + { + SetValueMark(CParserStarMathString::ParseElement(pReader)); + } + void CElementDiacriticalMark::ConversionToOOXML(XmlUtils::CXmlWriter *pXmlWrite) + { + std::wstring wsTypeMark; + switch(m_enTypeMark) + { + case TypeElement::dot: + wsTypeMark = L"\u0307"; + break; + case TypeElement::overline: + wsTypeMark = L"\u0305"; + break; + case TypeElement::vec: + wsTypeMark = L"\u20D7"; + break; + case TypeElement::acute: + wsTypeMark = L"\u0301"; + break; + case TypeElement::grave: + wsTypeMark = L"\u0300"; + break; + case TypeElement::breve: + wsTypeMark = L"\u0306"; + break; + case TypeElement::circle: + wsTypeMark = L"\u030A"; + break; + case TypeElement::ddot: + wsTypeMark = L"\u0308"; + break; + case TypeElement::bar: + wsTypeMark = L"\u0304"; + break; + case TypeElement::dddot: + wsTypeMark = L"\u20DB"; + break; + case TypeElement::harpoon: + wsTypeMark = L"\u20D1"; + break; + case TypeElement::tilde: + wsTypeMark = L"\u0342"; + break; + case TypeElement::hat: + wsTypeMark = L"\u0302"; + break; + case TypeElement::check: + wsTypeMark = L"\u030C"; + break; + case TypeElement::widevec: + wsTypeMark = L"\u20D7"; + break; + case TypeElement::widetilde: + wsTypeMark = L"\u0360"; + break; + case TypeElement::wideharpoon: + wsTypeMark = L"\u20D1"; + break; + case TypeElement::underline: + wsTypeMark = L"\u0332"; + break; + default: + break; + } + pXmlWrite->WriteNodeBegin(L"m:acc",false); + pXmlWrite->WriteNodeBegin(L"m:accPr",false); + switch(m_enTypeMark) + { + case TypeElement::widehat: + break; + default: + { + pXmlWrite->WriteNodeBegin(L"m:chr",true); + pXmlWrite->WriteAttribute(L"m:val",wsTypeMark); + pXmlWrite->WriteNodeEnd(L"w",true,true); + break; + } + } + CConversionSMtoOOXML::WriteCtrlPrNode(pXmlWrite,GetAttribute()); + pXmlWrite->WriteNodeEnd(L"m:accPr",false,false); + CConversionSMtoOOXML::WriteNodeConversion(L"m:e",m_pValueMark,pXmlWrite); + pXmlWrite->WriteNodeEnd(L"m:acc",false,false); + } + void CElementDiacriticalMark::SetAttribute(CAttribute *pAttribute) + { + SetBaseAttribute(pAttribute); + if(m_pValueMark != nullptr) + m_pValueMark->SetAttribute(pAttribute); + } +} + + diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h new file mode 100644 index 0000000000..38393a1e26 --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/cstarmathpars.h @@ -0,0 +1,447 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ + +#ifndef CSTARMATHPARS_H +#define CSTARMATHPARS_H +#include "typeselements.h" +#include +#include +#include +#include +#include +#include "../../../../DesktopEditor/xml/include/xmlwriter.h" + +namespace StarMath +{ + class CStarMathReader; + + struct TBaseAttribute + { + unsigned int base_font_size = 12; + std::wstring base_font_name = L"Arial"; + unsigned int base_alignment = 1;//(0 - center,1 - left,2 - right) + bool base_font_bold = false; + bool base_font_italic = false; + }; + + class CAttribute + { + public: + CAttribute(); + ~CAttribute(); + static TypeElement GetTypeColorAttribute(const std::wstring& wsToken); + static TypeElement GetTypeFontAttribute(const std::wstring& wsToken); + bool GetBold(); + bool GetItal(); + bool GetPhantom(); + bool GetStrike(); + unsigned int GetSize(); + unsigned int GetAlignment(); + std::wstring GetColor(); + const std::wstring& GetFontName(); + bool EmptyColor(); + bool ParseFontAttribute(const TypeElement& enTypeFont,CStarMathReader* pReader); + bool ParseColorAttribute(const std::wstring& wsToken,CStarMathReader* pReader); + void SetSize(const unsigned int& iSize); + void SetAlignment(const unsigned int& iAlignment); + void SetBold(); + void SetItal(); + void SetPhantom(); + void SetStrike(); + bool SetColor(const TypeElement& enColor); + void SetColor(const std::wstring& wsColor); + bool SetFont(const TypeElement& enFont); + void SetFontName(const std::wstring& wsNameFont); + bool CheckAttribute(); + //checking an element for a number from 1 to 9 or from the letter A to F + static bool CheckHexPosition(const wchar_t& cToken); + private: + void RefundOfTheAmountRGB(CStarMathReader* pReader,const int& iRed, const int& iGreen, const int& iBlue); + std::wstring m_wsColor,m_wsNameFont; + bool m_bBold,m_bItal,m_bPhantom,m_bStrike; + unsigned int m_iSize,m_iAlignment; + }; + //Сlass for working with tokens (reading, defining types, passing) + class CStarMathReader + { + public: + CStarMathReader(std::wstring::iterator& itStart, std::wstring::iterator& itEnd); + ~CStarMathReader(); + void GetToken(); + //getting a subtype and setting the global type of a token to variables m_enUnderType and m_enGlobalType + void SetTypesToken(); + //void SkipNextElement(); + TypeElement GetGlobalType(); + TypeElement GetLocalType(); + std::wstring GetString(); + //clearing a variable m_wsToken + void ClearReader(); + bool CheckIteratorPosition(); + bool EmptyString(); + void SetAttribute(CAttribute* pAttribute); + CAttribute* GetAttribute(); + void SetBaseAttribute(const TBaseAttribute* pAttribute); + CAttribute* GetBaseAttribute(); + //The function returns a Token from a string (the iterator pointer m_itStart is on the next element) + std::wstring GetElement(); + // + std::wstring TakingElementForHex(); + // + int TakingElementForRGB(); + void SetString(const std::wstring& wsToken); + void FindingTheEndOfParentheses(); + void IteratorNullification(); + void ReadingTheNextToken(); + void SetMarkForUnar(const bool& bMark); + bool GetMarkForUnar(); + private: + bool CheckTokenForGetElement(const wchar_t& cToken); + bool CheckIsalhpaForGetElement(const wchar_t& cToken,const wchar_t& cLastToken); + bool m_bMarkForUnar; + std::wstring::iterator m_itStart,m_itEnd; + TypeElement m_enGlobalType,m_enUnderType; + std::wstring m_wsToken; + CAttribute* m_pAttribute; + CAttribute* m_pBaseAttribute; + std::stack m_stBracket; + }; + + class CElement + { + public: + CElement(); + CElement(const TypeElement& enTypeBase); + virtual ~CElement(); + virtual void Parse(CStarMathReader* pReader) = 0; + //The function creates the class we need (by determining the class type by a variable m_enGlobalType from the class CStarMathReader) + static CElement* CreateElement(CStarMathReader* pReader); + virtual void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) = 0; + virtual void SetAttribute(CAttribute* pAttribute) = 0; + void SetBaseAttribute(CAttribute* pAttribute); + void SetBaseType(const TypeElement& enType); + CAttribute* GetAttribute(); + const TypeElement& GetBaseType(); + private: + CAttribute* m_pAttribute; + TypeElement m_enBaseType; + }; + + class CElementIndex: public CElement + { + public: + CElementIndex(const TypeElement& enType); + virtual ~CElementIndex(); + void SetValueIndex(CElement* pElement); + void SetLeftArg(CElement* pElement); + CElement* GetValueIndex(); + CElement* GetLeftArg(); + static TypeElement GetIndex(const std::wstring& wsCheckToken); + static bool GetUpperIndex(const TypeElement& enType); + static bool GetLowerIndex(const TypeElement& enType); + const TypeElement& GetType(); + private: + void SetAttribute(CAttribute* pAttribute) override; + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + void ConversionOfIndicesToValue(XmlUtils::CXmlWriter* pXmlWrite); + void ConversionOfIndicesAfterValue(XmlUtils::CXmlWriter* pXmlWrite); + CElement* m_pValueIndex; + CElement* m_pUpperIndex; + CElement* m_pLowerIndex; + CElement* m_pLsubIndex; + CElement* m_pLsupIndex; + CElement* m_pCsubIndex; + CElement* m_pCsupIndex; + CElement* m_pLeftArg; + TypeElement m_enTypeIndex; + }; + + class CElementString: public CElement + { + public: + CElementString(const std::wstring& wsTokenString); + virtual ~CElementString(); + void SetString(const std::wstring& wsTokenString); + std::wstring GetString(); + static TypeElement GetDigit(const std::wstring& wsCheckToken); + static TypeElement GetWord(const std::wstring& wsToken); + void SetAttribute(CAttribute* pAttribute) override; + private: + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + std::wstring m_wsString; + }; + + class CElementBinOperator: public CElement + { + public: + CElementBinOperator(const TypeElement& enType); + virtual ~CElementBinOperator(); + void SetLeftArg(CElement* pElement); + void SetRightArg(CElement* pElement); + void SetTypeBinOP(const TypeElement& enType); + CElement* GetRightArg(); + CElement* GetLeftArg(); + static TypeElement GetBinOperator(const std::wstring& wsToken); + static void UnaryCheck(CStarMathReader* pReader,CElement* pLastElement); + const TypeElement& GetType(); + private: + //checking for signs such as -,+,-+,+-. + static bool MixedOperators(const TypeElement& enType); + void SetAttribute(CAttribute* pAttribute) override; + bool IsBinOperatorLowPrior(); + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) override; + CElement* m_pLeftArgument; + CElement* m_pRightArgument; + TypeElement m_enTypeBinOp; + }; + + class CElementOperator: public CElement + { + public: + CElementOperator(const TypeElement& enType,const std::wstring& wsNameOp = L""); + virtual ~CElementOperator(); + void SetValueOperator(CElement* pElement); + CElement* GetValueOperator(); + void SetFromValue(CElement* pElement); + CElement* GetFromValue(); + void SetToValue(CElement* pElement); + CElement* GetToValue(); + void SetName(const std::wstring& wsNameOp); + std::wstring GetName(); + static TypeElement GetOperator(const std::wstring& wsToken); + static TypeElement GetFromOrTo(const std::wstring& wsToken); + private: + void SetAttribute(CAttribute* pAttribute); + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* oXmlWrite) override; + CElement* m_pValueOperator; + CElement* m_pValueFrom; + CElement* m_pValueTo; + CElement* m_pUpperIndex; + CElement* m_pLowerIndex; + TypeElement m_enTypeOperator; + std::wstring m_wsName; + }; + + class CElementGrade: public CElement + { + public: + CElementGrade(); + virtual ~CElementGrade(); + void SetValueGrade(CElement* pElement); + void SetValueFrom(CElement* pElement); + void SetValueTo(CElement* pElement); + static TypeElement GetGrade(const std::wstring& wsToken); + private: + void SetAttribute(CAttribute* pAttribute) override; + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + CElement* m_pValueGrade; + CElement* m_pValueFrom; + CElement* m_pValueTo; + }; + + class CElementBracket: public CElement + { + public: + CElementBracket(const TypeElement& enType); + virtual ~CElementBracket(); + void SetBracketValue(const std::vector& arValue); + static TypeElement GetBracketOpen(const std::wstring& wsToken); + static TypeElement GetBracketClose(const std::wstring& wsToken); + std::vector GetBracketValue(); + private: + void SetAttribute(CAttribute* pAttribute) override; + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + bool CheckMline(CElement* pElement); + TypeElement m_enTypeBracket; + std::vector m_arBrecketValue; + }; + + class CElementBracketWithIndex: public CElement + { + public: + CElementBracketWithIndex(const TypeElement& enType); + virtual ~CElementBracketWithIndex(); + void SetLeftArg(CElement* pElement); + void SetBracketValue(CElement* pElement); + CElement* GetLeftArg(); + static TypeElement GetBracketWithIndex(const std::wstring& wsToken); + const TypeElement& GetType(); + private: + void SetAttribute(CAttribute* pAttribute) override; + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + CElement* m_pLeftArg; + CElement* m_pValue; + TypeElement m_enTypeBracketWithIndex; + }; + + class CElementSetOperations: public CElement + { + public: + CElementSetOperations(const TypeElement& enType); + virtual ~CElementSetOperations(); + void SetLeftArg(CElement* pElement); + CElement* GetLeftArg(); + void SetRightArg(CElement* pElement); + CElement* GetRightArg(); + static TypeElement GetSetOperation(const std::wstring& wsToken); + const TypeElement& GetType(); + private: + void SetAttribute(CAttribute* pAttribute) override; + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + CElement* m_pLeftArgument; + CElement* m_pRightArgument; + TypeElement m_enTypeSet; + }; + + class CElementConnection: public CElement + { + public: + CElementConnection(const TypeElement& enType); + virtual ~CElementConnection(); + void SetRightArg(CElement* pElement); + CElement* GetRightArg(); + void SetLeftArg(CElement* pElement); + CElement* GetLeftArg(); + static TypeElement GetConnection(const std::wstring& wsToken); + const TypeElement& GetType(); + private: + void SetAttribute(CAttribute* pAttribute) override; + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + CElement* m_pLeftArgument; + CElement* m_pRightArgument; + TypeElement m_enTypeCon; + }; + + class CElementFunction: public CElement + { + public: + CElementFunction(const TypeElement& enType, const std::wstring& wsNameFunc = L""); + virtual ~CElementFunction(); + void SetValueFunction(CElement* pElement); + CElement* GetValueFunction(); + void SetNameFunc(const std::wstring& wsNameFunc); + std::wstring GetNameFuncInString(); + static TypeElement GetFunction(const std::wstring& wsToken); + private: + void SetAttribute(CAttribute* pAttribute) override; + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + CElement* m_pValue; + CElement* m_pIndex; + std::wstring m_wsNameFunc; + TypeElement m_enTypeFunction; + }; + + class CElementSpecialSymbol: public CElement + { + public: + CElementSpecialSymbol(const TypeElement& enType); + virtual ~CElementSpecialSymbol(); + static TypeElement GetSpecialSymbol(std::wstring& wsToken); + void SetValue(CElement* pValue); + const TypeElement GetType(); + private: + void SetTypeSymbol(); + void SetAttribute(CAttribute* pAttribute) override; + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + CElement* m_pValue; + TypeElement m_enTypeSpecial; + std::wstring m_wsType; + }; + + class CElementMatrix: public CElement + { + public: + CElementMatrix(const TypeElement& enType); + virtual ~CElementMatrix(); + void SetFirstArgument(CElement* pElement); + void SetSecondArgument(CElement* pElement); + static TypeElement GetMatrix(const std::wstring& wsToken); + private: + void SetAttribute(CAttribute* pAttribute) override; + void Parse(CStarMathReader *pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + CElement* m_pFirstArgument; + CElement* m_pSecondArgument; + TypeElement m_enTypeMatrix; + }; + + class CElementDiacriticalMark: public CElement + { + public: + CElementDiacriticalMark(const TypeElement& enType); + virtual ~CElementDiacriticalMark(); + void SetValueMark(CElement* pValue); + static TypeElement GetMark(const std::wstring& wsToken); + private: + void SetAttribute(CAttribute* pAttribute) override; + void Parse(CStarMathReader* pReader) override; + void ConversionToOOXML(XmlUtils::CXmlWriter* pXmlWrite) override; + CElement* m_pValueMark; + TypeElement m_enTypeMark; + }; + + class CParserStarMathString + { + public: + std::vector Parse(std::wstring& wsParseString, const TBaseAttribute* pBaseAttribute = nullptr); + static CElement* ParseElement(CStarMathReader* pReader); + //Function for adding a left argument (receives the argument itself and the element to which it needs to be added as input. Works with classes:CElementBinOperator,CElementConnection,CElementSetOperation). + static bool AddLeftArgument(CElement* pLeftArg,CElement* pElementWhichAdd); + static bool CheckForLeftArgument(const TypeElement& enType, const bool& bConnection = true); + static CElement* ReadingWithoutBracket(CStarMathReader* pReader,const bool& bConnection = true); + //checking the element (true if it is newline) + static bool CheckNewline(CElement* pElement); + //adding an element to the array, checking that it is not empty and adding the left element, if there is one. + static void AddingAnElementToAnArray(std::vector& arrEquation,CElement* pAddElement); + //Receives the left element as input, reads the next one, if the next element has a higher priority and contains the left element, the element received at the input is passed to it. The entire structure is saved and returned. + static void ReadingElementsWithPriorities(CStarMathReader* pReader,CElement*& pLeftElement); + //method for parsing indexes with attributes. If there is an attribute present when indexes are read, then all subsequent indexes are applied to the index with the attribute. + static void ReadingElementsWithAttributes(CStarMathReader* pReader,CElement*& pSavingElement); + void SetAlignment(const unsigned int& iAlignment); + const unsigned int& GetAlignment(); + private: + std::vector m_arEquation; + unsigned int m_iAlignment; + }; +} + +#endif // CSTARMATHPARS_H diff --git a/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h new file mode 100644 index 0000000000..04c58fe3b9 --- /dev/null +++ b/OdfFile/Reader/Converter/StarMath2OOXML/typeselements.h @@ -0,0 +1,370 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ + +#ifndef TYPESELEMENTS_H +#define TYPESELEMENTS_H + +namespace StarMath +{ +enum class TypeElement{ + undefine, + //global + String, + BinOperator, + SetOperations, + Operator, + Bracket, + BracketWithIndex, + Grade, + Mark, + UnarSign, + Attribute, + SpecialSymbol, + Function, + Operation, + Index, + Matrix, + Connection, + Empty, + //binoop + cdot, + times, + over, + plus, + minus, + frac, + div, + multipl, + division, + oplus, + ominus, + odot, + otimes, + odivide, + circ, + wideslash, + widebslash, + //logic + And, + Or, + neg, + //unary + plus_minus, + minus_plus, + //op + lim, + sum, + liminf, + limsup, + prod, + coprod, + Int, + iint, + iiint, + lint, + llint, + lllint, + oper, + //brace + brace, + round, + square, + ldbracket, + lbrace, + langle, + lceil, + lfloor, + lline, + ldline, + //attribute + ital, + bold, + phantom, + overstrike, + size, + font, + alignl, + alignc, + alignr, + //top element + acute, + breve, + dot, + dddot, + vec, + tilde, + check, + grave, + circle, + ddot, + bar, + harpoon, + hat, + widevec, + widetilde, + overline, + wideharpoon, + widehat, + underline,//top elements + color, + hex, + rgb, + black, + green, + aqua, + yellow, + lime, + navy, + purple, + teal, + blue, + red, + fuchsia, + gray, + maroon, + olive, + silver, + coral, + midnightblue, + crimson, + violet, + orange, + seagreen, + hotpink, + orangered, + indigo, + lavender, + //color(without rgb and hex) + mline, + dlgrid, + //setopetions + intersection, + Union, + setminus, + setquotient, + subseteq, + subset, + supset, + supseteq, + nsubset, + nsupseteq, + nsupset, + nsubseteq, + in, + notin, + owns, + //connection + approx, + sim, + simeq, + equiv, + prop, + parallel, + ortho, + divides, + ndivides, + toward, + transl, + transr, + def, + equals, + notequals, + learrow, + learrowequals, + leslant, + riarrow, + riarrowequals, + geslant, + dllearrow, + dlriarrow, + prec, + succ, + preccurlyeq, + succcurlyeq, + precsim, + succsim, + nprec, + nsucc, + dlarrow, + dlrarrow, + drarrow, + //SpecialSymbol + emptyset, + aleph, + setN, + setZ, + setQ, + setR, + setC, + grid, + transition, + emptiness, + interval, + infinity, + partial, + nabla, + exists, + notexists, + forall, + hbar, + lambdabar, + Re, + Im, + wp, + laplace, + fourier, + backepsilon, + alpha, + zeta, + lambda, + pi, + phi, + alpha_small, + varepsilon, + iota_small, + xi, + varrho, + phi_small, + beta, + eta, + mu, + rho, + chi, + beta_small, + zeta_small, + kappa, + omicron, + sigma, + varphi, + gamma, + theta, + nu, + sigma_small, + psi, + gamma_small, + eta_small, + lambda_small, + pi_small, + varsigma, + chi_small, + delta, + iota, + xi_small, + tau, + omega, + delta_small, + theta_small, + mu_small, + varpi, + tau_small, + psi_small, + epsilon, + kappa_small, + omicron_small, + upsilon, + epsilon_small, + vartheta, + nu_small, + rho_small, + upsilon_small, + omega_small, + perthousand, + angle, + rightarrow, + leftarrow, + uparrow, + downarrow, + dotsaxis, + dotsvert, + dotsup, + dotsdown, + dotslow, + newline, + //function + abs, + fact, + sqrt, + nroot,//nroot? + sin, + cos, + tan, + cot, + sinh, + cosh, + tanh, + coth, + arcsin, + arccos, + arctan, + arccot, + arsinh, + arcosh, + artanh, + arcoth, + ln, + exp, + log, + func, + //index + upper, + lower, + lsup, + lsub, + csup, + csub, + // + binom, + stack, + matrix, + //bracket close + rwbrace, + rbrace, + rround, + rsquare, + rdbracket, + rangle, + rceil, + rfloor, + rline, + rdline, + right, + //op + from, + to, + //bracketWithIndex + overbrace, + underbrace, + //grade + evaluate, +}; +} +#endif // TYPESELEMENTS_H diff --git a/OdfFile/Reader/Converter/drawing_object_description.h b/OdfFile/Reader/Converter/drawing_object_description.h index d29c86e429..692fb11fd6 100644 --- a/OdfFile/Reader/Converter/drawing_object_description.h +++ b/OdfFile/Reader/Converter/drawing_object_description.h @@ -76,6 +76,8 @@ struct drawing_object_description _action_desc action_; std::vector<_hlink_desc> hlinks_; + bool hidden_; + std::vector additional_; //shape properties std::wstring xlink_href_; //ссылка на внешний объект diff --git a/OdfFile/Reader/Converter/mediaitems.cpp b/OdfFile/Reader/Converter/mediaitems.cpp index 66207875b4..01e4e350bb 100644 --- a/OdfFile/Reader/Converter/mediaitems.cpp +++ b/OdfFile/Reader/Converter/mediaitems.cpp @@ -64,7 +64,7 @@ bool is_internal(const std::wstring & uri, const std::wstring & packetRoot) std::wstring testRoot = pathRoot.GetPath(); std::wstring testFile = pathFile.GetPath(); - return (NSFile::CFileBinary::Exists(resultPath) || NSDirectory::Exists(mediaPath)) && (std::wstring::npos != testFile.find(testRoot)); + return (NSFile::CFileBinary::Exists(testFile) || NSDirectory::Exists(testFile)) && (std::wstring::npos != testFile.find(testRoot)); } mediaitems::item::item(std::wstring const & _href,_rels_type _type, std::wstring const & _outputName, @@ -270,6 +270,7 @@ std::wstring mediaitems::add_or_find(const std::wstring & href, _rels_type type, } else if ( type == typeMsObject || type == typeOleObject) { + isMediaInternal = is_internal(href, odf_packet_); sub_path = L"embeddings/"; } else if ( type == typeControlProps) diff --git a/OdfFile/Reader/Converter/oox_conversion_context.cpp b/OdfFile/Reader/Converter/oox_conversion_context.cpp index 9ec757fcee..15e36a90b7 100644 --- a/OdfFile/Reader/Converter/oox_conversion_context.cpp +++ b/OdfFile/Reader/Converter/oox_conversion_context.cpp @@ -277,7 +277,8 @@ void math_context::start() } math_stream_ << L"\"/>"; - math_stream_ << L""; + math_stream_ << L""; + //math_stream_ << L""; start_level(); } diff --git a/OdfFile/Reader/Converter/pptx_conversion_context.cpp b/OdfFile/Reader/Converter/pptx_conversion_context.cpp index f857f0e1d0..49f975a0eb 100644 --- a/OdfFile/Reader/Converter/pptx_conversion_context.cpp +++ b/OdfFile/Reader/Converter/pptx_conversion_context.cpp @@ -53,675 +53,678 @@ namespace cpdoccore { } namespace oox { + namespace package + { + class pptx_document; + } - namespace package + pptx_conversion_context::pptx_conversion_context(odf_reader::odf_document* odfDocument) + :output_document_(NULL) + , odf_document_(odfDocument) + , pptx_text_context_(odf_document_->odf_context(), *this) + , pptx_table_context_(*this) + , pptx_comments_context_(comments_context_handle_) + , pptx_slide_context_(*this/*, pptx_text_context_*/) + , math_context_(odf_document_->odf_context().fontContainer(), true) + , last_idx_placeHolder(1) + , last_uniq_big_id(1) + { + } + + pptx_conversion_context::~pptx_conversion_context() + { + } + + void pptx_conversion_context::set_output_document(package::pptx_document* document) + { + output_document_ = document; + } + + void pptx_conversion_context::set_font_directory(std::wstring pathFonts) + { + pptx_slide_context_.get_mediaitems()->set_font_directory(pathFonts); + } + void pptx_conversion_context::add_page_name(const std::wstring& page_name) + { + page_names_.push_back(page_name); + } + + const std::vector& pptx_conversion_context::get_page_names() const + { + return page_names_; + } + + void pptx_conversion_context::process_layouts() + { + odf_reader::presentation_layouts_instance& layouts = root()->odf_context().styleContainer().presentation_layouts(); + + get_text_context().set_process_layouts(true); + + //актуальные + for (size_t layout_index = 0; layout_index < layouts.content.size(); layout_index++) { - class pptx_document; - } + start_layout(layout_index); - pptx_conversion_context::pptx_conversion_context(odf_reader::odf_document* odfDocument) - :output_document_(NULL) - , odf_document_(odfDocument) - , pptx_text_context_(odf_document_->odf_context(), *this) - , pptx_table_context_(*this) - , pptx_comments_context_(comments_context_handle_) - , pptx_slide_context_(*this/*, pptx_text_context_*/) - , math_context_(odf_document_->odf_context().fontContainer(), true) - , last_idx_placeHolder(1) - , last_uniq_big_id(1) - { - } + odf_reader::style_presentation_page_layout* layout = + root()->odf_context().pageLayoutContainer().presentation_page_layout_by_name(layouts.content[layout_index].layout_name); - pptx_conversion_context::~pptx_conversion_context() - { - } - - void pptx_conversion_context::set_output_document(package::pptx_document* document) - { - output_document_ = document; - } - - void pptx_conversion_context::set_font_directory(std::wstring pathFonts) - { - pptx_slide_context_.get_mediaitems()->set_font_directory(pathFonts); - } -void pptx_conversion_context::add_page_name(const std::wstring& page_name) -{ - page_names_.push_back(page_name); -} - -const std::vector& pptx_conversion_context::get_page_names() const -{ - return page_names_; -} - - void pptx_conversion_context::process_layouts() - { - odf_reader::presentation_layouts_instance& layouts = root()->odf_context().styleContainer().presentation_layouts(); - - get_text_context().set_process_layouts(true); - - //актуальные - for (size_t layout_index = 0; layout_index < layouts.content.size(); layout_index++) + if (layout) { - start_layout(layout_index); + layout->pptx_convert(*this); + } + //нужно вытащить footers + odf_reader::style_master_page* master = + root()->odf_context().pageLayoutContainer().master_page_by_name(layouts.content[layout_index].master_name); - odf_reader::style_presentation_page_layout* layout = - root()->odf_context().pageLayoutContainer().presentation_page_layout_by_name(layouts.content[layout_index].layout_name); - - if (layout) + if (master) + { + for (size_t i = 0; i < master->content_.size(); i++) { - layout->pptx_convert(*this); - } - //нужно вытащить footers - odf_reader::style_master_page* master = - root()->odf_context().pageLayoutContainer().master_page_by_name(layouts.content[layout_index].master_name); - - if (master) - { - for (size_t i = 0; i < master->content_.size(); i++) + odf_reader::draw_frame* frame = dynamic_cast(master->content_[i].get()); + if (frame) { - odf_reader::draw_frame* frame = dynamic_cast(master->content_[i].get()); - if (frame) + odf_types::common_presentation_attlist& common_presentation_attlist_ = frame->common_draw_attlists_.shape_with_text_and_styles_.common_presentation_attlist_; + + if (common_presentation_attlist_.presentation_class_) { - odf_types::common_presentation_attlist& common_presentation_attlist_ = frame->common_draw_attlists_.shape_with_text_and_styles_.common_presentation_attlist_; + odf_types::presentation_class::type type = common_presentation_attlist_.presentation_class_->get_type(); - if (common_presentation_attlist_.presentation_class_) + if (type == odf_types::presentation_class::footer || + type == odf_types::presentation_class::date_time || + type == odf_types::presentation_class::header || + type == odf_types::presentation_class::page_number) { - odf_types::presentation_class::type type = common_presentation_attlist_.presentation_class_->get_type(); + if (frame->idx_in_owner < 0) + frame->idx_in_owner = last_idx_placeHolder++; - if (type == odf_types::presentation_class::footer || - type == odf_types::presentation_class::date_time || - type == odf_types::presentation_class::header || - type == odf_types::presentation_class::page_number) - { - if (frame->idx_in_owner < 0) - frame->idx_in_owner = last_idx_placeHolder++; - - frame->pptx_convert_placeHolder(*this); - } + frame->pptx_convert_placeHolder(*this); } } } } - end_layout(); } - get_text_context().set_process_layouts(false); + end_layout(); } - void pptx_conversion_context::process_master_pages() + get_text_context().set_process_layouts(false); + } + void pptx_conversion_context::process_master_pages() + { + odf_reader::presentation_masters_instance& masters = root()->odf_context().styleContainer().presentation_masters(); + + process_masters_ = true; + get_text_context().set_process_layouts(true); + + //берем только актуальные + odf_reader::office_element_ptr master_notes_; + + for (size_t master_index = 0; master_index < masters.content.size(); master_index++) { - odf_reader::presentation_masters_instance& masters = root()->odf_context().styleContainer().presentation_masters(); + start_master(master_index); - process_masters_ = true; - get_text_context().set_process_layouts(true); + odf_reader::style_master_page* master = + root()->odf_context().pageLayoutContainer().master_page_by_name(masters.content[master_index].master_name); - //берем только актуальные - odf_reader::office_element_ptr master_notes_; - - for (size_t master_index = 0; master_index < masters.content.size(); master_index++) + if (master) { - start_master(master_index); + master->pptx_convert(*this); - odf_reader::style_master_page* master = - root()->odf_context().pageLayoutContainer().master_page_by_name(masters.content[master_index].master_name); + if (!master_notes_ && master->presentation_notes_) + master_notes_ = master->presentation_notes_; + } - if (master) + + end_master(); + } + + if (master_notes_) + { + start_master_notes(); + master_notes_->pptx_convert(*this); + end_master_notes(); + } + process_masters_ = false; + get_text_context().set_process_layouts(false); + + } + + void pptx_conversion_context::process_styles() + { + + } + void pptx_conversion_context::process_theme(std::wstring name) + { + int current = themes_.size() + 1; + + if (name.empty()) + { + name = L"User Theme: " + std::to_wstring(current); + } + start_theme(name); + // + pptx_serialize_clrScheme(current_theme().clrSchemeData()); + pptx_serialize_fmtScheme(current_theme().fmtSchemeData()); + pptx_serialize_fontScheme(current_theme().fontSchemeData()); + // + end_theme(); + + } + void pptx_conversion_context::start_document() + { + odf_reader::odf_read_context& odfContext = root()->odf_context(); + std::vector instances; + + instances.push_back(odfContext.styleContainer().style_default_by_type(odf_types::style_family::Presentation)); + instances.push_back(odfContext.styleContainer().style_by_name(L"Default", odf_types::style_family::Presentation, false)); + + odf_reader::text_format_properties_ptr textFormatProperties = calc_text_properties_content(instances); + odf_reader::paragraph_format_properties parFormatProperties = calc_paragraph_properties_content(instances); + + process_masters_ = false; + } + + void pptx_conversion_context::end_document() + { + for (size_t i = 0; i < slideMasters_.size(); i++) + { + pptx_xml_slideMaster_ptr& slideM = slideMasters_[i]; + + package::slide_content_ptr content = package::slide_content::create(); + + slideM->write_to(content->content()); + content->add_rels(slideM->Rels());//media & links rels + + output_document_->get_ppt_files().add_slideMaster(content);//slideMaster.xml + + CP_XML_WRITER(presentation_.slideMastersData())//presentation.xml + { + CP_XML_NODE(L"p:sldMasterId") { - master->pptx_convert(*this); - - if (!master_notes_ && master->presentation_notes_) - master_notes_ = master->presentation_notes_; - } - - - end_master(); - } - - if (master_notes_) - { - start_master_notes(); - master_notes_->pptx_convert(*this); - end_master_notes(); - } - process_masters_ = false; - get_text_context().set_process_layouts(false); - - } - - void pptx_conversion_context::process_styles() - { - - } - void pptx_conversion_context::process_theme(std::wstring name) - { - int current = themes_.size() + 1; - - if (name.empty()) - { - name = L"User Theme: " + std::to_wstring(current); - } - start_theme(name); - // - pptx_serialize_clrScheme(current_theme().clrSchemeData()); - pptx_serialize_fmtScheme(current_theme().fmtSchemeData()); - pptx_serialize_fontScheme(current_theme().fontSchemeData()); - // - end_theme(); - - } - void pptx_conversion_context::start_document() - { - odf_reader::odf_read_context& odfContext = root()->odf_context(); - std::vector instances; - - instances.push_back(odfContext.styleContainer().style_default_by_type(odf_types::style_family::Presentation)); - instances.push_back(odfContext.styleContainer().style_by_name(L"Default", odf_types::style_family::Presentation, false)); - - odf_reader::text_format_properties_ptr textFormatProperties = calc_text_properties_content(instances); - odf_reader::paragraph_format_properties parFormatProperties = calc_paragraph_properties_content(instances); - - process_masters_ = false; - } - - void pptx_conversion_context::end_document() - { - for (size_t i = 0; i < slideMasters_.size(); i++) - { - pptx_xml_slideMaster_ptr& slideM = slideMasters_[i]; - - package::slide_content_ptr content = package::slide_content::create(); - - slideM->write_to(content->content()); - content->add_rels(slideM->Rels());//media & links rels - - output_document_->get_ppt_files().add_slideMaster(content);//slideMaster.xml - - CP_XML_WRITER(presentation_.slideMastersData())//presentation.xml - { - CP_XML_NODE(L"p:sldMasterId") - { - CP_XML_ATTR(L"id", 0x80000000 + last_uniq_big_id++); - CP_XML_ATTR(L"r:id", slideM->rId()); - } + CP_XML_ATTR(L"id", 0x80000000 + last_uniq_big_id++); + CP_XML_ATTR(L"r:id", slideM->rId()); } } - if (!slideMasters_.empty()) - presentation_.slidesProperties() << slideMasters_[0]->Sizes().str(); + } + if (!slideMasters_.empty()) + presentation_.slidesProperties() << slideMasters_[0]->Sizes().str(); - //////////////////////////////////////////////////////////////////////////////////////////////////// - for (size_t i = 0; i < slides_.size(); i++) + //////////////////////////////////////////////////////////////////////////////////////////////////// + for (size_t i = 0; i < slides_.size(); i++) + { + pptx_xml_slide_ptr& slide = slides_[i]; + + package::slide_content_ptr content = package::slide_content::create(); + + slide->write_to(content->content()); + content->add_rels(slide->Rels());//media & links rels + + output_document_->get_ppt_files().add_slide(content);//slide.xml + + CP_XML_WRITER(presentation_.slidesData())//presentation.xml { - pptx_xml_slide_ptr& slide = slides_[i]; - - package::slide_content_ptr content = package::slide_content::create(); - - slide->write_to(content->content()); - content->add_rels(slide->Rels());//media & links rels - - output_document_->get_ppt_files().add_slide(content);//slide.xml - - CP_XML_WRITER(presentation_.slidesData())//presentation.xml + CP_XML_NODE(L"p:sldId") { - CP_XML_NODE(L"p:sldId") - { - CP_XML_ATTR(L"id", 0x100 + i); - CP_XML_ATTR(L"r:id", slide->rId()); - } + CP_XML_ATTR(L"id", 0x100 + i); + CP_XML_ATTR(L"r:id", slide->rId()); } } - //---------------------------------------------------------------------------------- - for (size_t i = 0; i < slideLayouts_.size(); i++) + } + //---------------------------------------------------------------------------------- + for (size_t i = 0; i < slideLayouts_.size(); i++) + { + pptx_xml_slideLayout_ptr& slideL = slideLayouts_[i]; + + package::slide_content_ptr content = package::slide_content::create(); + + slideL->write_to(content->content()); + content->add_rels(slideL->Rels());//media & links rels + + output_document_->get_ppt_files().add_slideLayout(content);//slideMaster.xml + } + //---------------------------------------------------------------------------------- + for (size_t i = 0; i < notes_.size(); i++) + { + pptx_xml_slideNotes_ptr& slideN = notes_[i]; + + package::slide_content_ptr content = package::slide_content::create(); + + slideN->write_to(content->content()); + content->add_rels(slideN->Rels());//media & links rels + + output_document_->get_ppt_files().add_notes(content); + } + if (slideNotesMaster_) + { + package::slide_content_ptr content = package::slide_content::create(); + + slideNotesMaster_->write_to(content->content()); + content->add_rels(slideNotesMaster_->Rels());//media & links rels + + output_document_->get_ppt_files().add_notesMaster(content); + + CP_XML_WRITER(presentation_.slideNotesMastersData())//presentation.xml { - pptx_xml_slideLayout_ptr& slideL = slideLayouts_[i]; - - package::slide_content_ptr content = package::slide_content::create(); - - slideL->write_to(content->content()); - content->add_rels(slideL->Rels());//media & links rels - - output_document_->get_ppt_files().add_slideLayout(content);//slideMaster.xml - } - //---------------------------------------------------------------------------------- - for (size_t i = 0; i < notes_.size(); i++) - { - pptx_xml_slideNotes_ptr& slideN = notes_[i]; - - package::slide_content_ptr content = package::slide_content::create(); - - slideN->write_to(content->content()); - content->add_rels(slideN->Rels());//media & links rels - - output_document_->get_ppt_files().add_notes(content); - } - if (slideNotesMaster_) - { - package::slide_content_ptr content = package::slide_content::create(); - - slideNotesMaster_->write_to(content->content()); - content->add_rels(slideNotesMaster_->Rels());//media & links rels - - output_document_->get_ppt_files().add_notesMaster(content); - - CP_XML_WRITER(presentation_.slideNotesMastersData())//presentation.xml + CP_XML_NODE(L"p:notesMasterId") { - CP_XML_NODE(L"p:notesMasterId") - { - CP_XML_ATTR(L"r:id", slideNotesMaster_->rId()); - } + CP_XML_ATTR(L"r:id", slideNotesMaster_->rId()); } } - //else - pptx_serialize_size(current_presentation().slidesNotesProperties(), 6858000, 9144000, L"p:notesSz"); - - //////////////////////////////////////////////////////////////////////////////////////////////////////////// - - for (size_t i = 0; i < charts_.size(); i++) - { - package::chart_content_ptr content = package::chart_content::create(); - - charts_[i]->serialize(content->content()); - charts_[i]->dump_rels(content->get_rel_file()->get_rels()); - - output_document_->get_ppt_files().add_charts(content); - - } - //////////////////////////////////////////////////////////////////////////////////////////////////////////// - for (size_t i = 0; i < themes_.size(); i++) - { - output_document_->get_ppt_files().add_theme(themes_[i]); - - } - package::ppt_comments_files_ptr comments = package::ppt_comments_files::create(comments_context_handle_.content()); - - output_document_->get_ppt_files().set_presentation(presentation_); - output_document_->get_ppt_files().set_comments(comments); - output_document_->get_ppt_files().set_authors_comments(authors_comments_); - output_document_->get_ppt_files().set_media(get_mediaitems()); - - output_document_->get_content_types_file().set_media(get_mediaitems()); } + //else + pptx_serialize_size(current_presentation().slidesNotesProperties(), 6858000, 9144000, L"p:notesSz"); - void pptx_conversion_context::start_body() + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + + for (size_t i = 0; i < charts_.size(); i++) { + package::chart_content_ptr content = package::chart_content::create(); + + charts_[i]->serialize(content->content()); + charts_[i]->dump_rels(content->get_rel_file()->get_rels()); + + output_document_->get_ppt_files().add_charts(content); } - - void pptx_conversion_context::end_body() + //////////////////////////////////////////////////////////////////////////////////////////////////////////// + for (size_t i = 0; i < themes_.size(); i++) { - } - pptx_xml_slideNotesMaster& pptx_conversion_context::current_notesMaster() - { - if (slideNotesMaster_) - { - return *slideNotesMaster_; - } - else - { - throw std::runtime_error("internal error"); - } - } - pptx_xml_slideNotes& pptx_conversion_context::current_notes() - { - if (!notes_.empty()) - { - return *notes_.back().get(); - } - else - { - throw std::runtime_error("internal error"); - } - } - pptx_xml_slide& pptx_conversion_context::current_slide() - { - if (!slides_.empty()) - { - return *slides_.back().get(); - } - else - { - throw std::runtime_error("internal error"); - } - } - pptx_xml_slideLayout& pptx_conversion_context::current_layout() - { - if (!slideLayouts_.empty()) - { - return *slideLayouts_.back().get(); - } - else - { - throw std::runtime_error("internal error"); - } - } - pptx_xml_theme& pptx_conversion_context::current_theme() - { - if (!themes_.empty()) - { - return *themes_.back().get(); - } - else - { - throw std::runtime_error("internal error"); - } - } - pptx_xml_presentation& pptx_conversion_context::current_presentation() - { - return presentation_; - } - - oox_chart_context& pptx_conversion_context::current_chart() - { - if (!charts_.empty()) - { - return *charts_.back().get(); - } - else - { - throw std::runtime_error("internal error"); - } - } - pptx_xml_slideMaster& pptx_conversion_context::current_master() - { - if (!slideMasters_.empty()) - { - return *slideMasters_.back().get(); - } - else - { - throw std::runtime_error("internal error"); - } - } - void pptx_conversion_context::create_new_slide(std::wstring const& name) - { - pptx_xml_slide_ptr s = pptx_xml_slide::create(name, slides_.size() + 1); - slides_.push_back(s); - } - void pptx_conversion_context::create_new_slideNotes() - { - pptx_xml_slideNotes_ptr s = pptx_xml_slideNotes::create(notes_.size() + 1); - notes_.push_back(s); - } - void pptx_conversion_context::create_new_slideNotesMaster() - { - slideNotesMaster_ = pptx_xml_slideNotesMaster::create(); - } - void pptx_conversion_context::create_new_slideLayout(int id) - { - pptx_xml_slideLayout_ptr s = pptx_xml_slideLayout::create(id); - slideLayouts_.push_back(s); - } - void pptx_conversion_context::create_new_slideMaster(int id) - { - pptx_xml_slideMaster_ptr s = pptx_xml_slideMaster::create(id); - slideMasters_.push_back(s); - } - bool pptx_conversion_context::start_page(const std::wstring& pageName, const std::wstring& pageStyleName, - const std::wstring& pageLayoutName, - const std::wstring& pageMasterName) - { - create_new_slide(pageName); - get_slide_context().start_slide();//pageName, pageStyleName); - get_slide_context().get_animation_context().clear(); - - current_master_page_name_ = pageMasterName; - current_layout_page_name_ = pageLayoutName; - - //const std::wstring masterPageNameLayout = root()->odf_context().pageLayoutContainer().page_layout_name_by_style(current_master_page_name_); - - std::pair layout_id = - root()->odf_context().styleContainer().presentation_layouts().add_or_find(pageLayoutName, pageMasterName); - - current_slide().Rels().add(relationship(layout_id.second, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout", - std::wstring(L"../slideLayouts/slideLayout") + std::to_wstring(layout_id.first) + L".xml")); - - return true; - } - - bool pptx_conversion_context::start_layout(int layout_index) - { - if (layout_index >= 0) - { - odf_reader::presentation_layouts_instance& layouts = root()->odf_context().styleContainer().presentation_layouts(); - - create_new_slideLayout(layouts.content[layout_index].Id); - - get_slide_context().start_slide();//layouts.content[layout_index].layout_name, L"");//????? - - current_master_page_name_ = layouts.content[layout_index].master_name; - current_layout_page_name_ = L""; - - std::pair master_id = //std::pair(1, L"smId1"); - root()->odf_context().styleContainer().presentation_masters().add_or_find(layouts.content[layout_index].master_name); - - root()->odf_context().styleContainer().presentation_masters().add_layout_to(layouts.content[layout_index].master_name, layouts.content[layout_index]); - - current_layout().Rels().add(relationship(L"smId1"/*master_id.second*/, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster", - std::wstring(L"../slideMasters/slideMaster") + std::to_wstring(master_id.first) + L".xml")); - - // - } - else//общий шаблон (насильно пропишем к темам несоответствующие шалоны) - { - } - - //layout type - - // - //1375 - //1376 - //1377 - //1378 - //1379 - //1380 - //1381 - //1382 - //1383 - //1384 - //1385 - //1386 - //1387 - //1388 - //1389 - //1390 - //1391 - //1392 - //1393 - //1394 - //1395 - //1396 - //1397 - //1398 - //1399 - //1400 - //1401 - //1402 - //1403 - //1404 - //1405 ---------------------------------- !!!!!!!!!!!!! - //1406 - //1407 - //1408 - //1409 - - return true; - } - bool pptx_conversion_context::start_master(int master_index) - { - odf_reader::presentation_masters_instance& masters = root()->odf_context().styleContainer().presentation_masters(); - - create_new_slideMaster(masters.content[master_index].Id); - - get_slide_context().start_slide(); - - current_master_page_name_ = L""; - current_layout_page_name_ = L""; - - process_theme(masters.content[master_index].master_name);//add default theme - одинаковые но под разными именами - current_master().add_theme(current_theme().id(), L"tId1"); - - for (size_t i = 0; i < masters.content[master_index].layouts.size(); i++) - { - current_master().add_layout(masters.content[master_index].layouts[i].Id, masters.content[master_index].layouts[i].rId, 0x80000000 + last_uniq_big_id++); - } - - //---------------------------------------------------------------------------------- - //размеры страниц в презентации - const std::wstring pageProperties = root()->odf_context().pageLayoutContainer().page_layout_name_by_style(masters.content[master_index].master_name); - - odf_reader::page_layout_instance* pages_layouts = root()->odf_context().pageLayoutContainer().page_layout_by_name(pageProperties); - - if (pages_layouts) - pages_layouts->pptx_serialize(current_master().Sizes(), *this); - - return true; - } - void pptx_conversion_context::end_page() - { - if (!get_comments_context().empty()) - { - std::wstringstream strm; - get_comments_context().serialize(strm); - - const std::pair commentsName = - comments_context_handle_.add_comments_xml(strm.str(), get_comments_context().get_comments()); - - get_slide_context().add_rels(false, commentsName.second, L"../comments/" + commentsName.first, typeComment); - } - - get_slide_context().serialize_background(current_slide().Background()); - get_slide_context().serialize_objects(current_slide().Data()); - get_slide_context().serialize_animations(current_slide().Timing()); - - { - // NOTE: При использовании operator<< потока буст пушит туда лишний пробел перед значением. - // С этим пробелом наш редактор onlyoffice на распознает значение. - // Example: - // ppt_y - // ppt_y - // TODO: Figure out how to push value without redundant space character - current_slide().remove_timing_redundant_space(); - } - - get_slide_context().dump_rels(current_slide().Rels());//hyperlinks, mediaitems, ... - - get_slide_context().end_slide(); - } - bool pptx_conversion_context::start_page_notes() - { - create_new_slideNotes(); - - current_slide().Rels().add(relationship(notes_.back()->rId(), L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide", - L"../notesSlides/notesSlide" + std::to_wstring(notes_.size()) + L".xml")); - - get_slide_context().start_slide(); - - current_notes().Rels().add(relationship(L"nId1", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide", - L"../slides/slide" + std::to_wstring(slides_.size()) + L".xml")); - - return true; - } - - void pptx_conversion_context::end_page_notes() - { - get_slide_context().serialize_background(current_notes().Background()); - get_slide_context().serialize_objects(current_notes().Data()); - - get_slide_context().dump_rels(current_notes().Rels());//hyperlinks, mediaitems, ... - - get_slide_context().end_slide(); - } - bool pptx_conversion_context::start_master_notes() - { - create_new_slideNotesMaster(); - - get_slide_context().start_slide(); - - process_theme(L"");//add default theme - одинаковые но под разными именами - current_notesMaster().add_theme(current_theme().id(), L"tId1"); - - get_slide_context().start_slide(); - return true; - } - - void pptx_conversion_context::end_master_notes() - { - get_slide_context().serialize_background(current_notesMaster().Background()); - get_slide_context().serialize_objects(current_notesMaster().Data()); - - get_slide_context().dump_rels(current_notesMaster().Rels());//hyperlinks, mediaitems, ... - - get_slide_context().end_slide(); - - for (size_t i = 0; i < notes_.size(); i++) - { - notes_[i]->Rels().add(relationship(L"nmId1", - L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster", - L"../notesMasters/notesMaster1.xml")); - } - } - void pptx_conversion_context::end_layout() - { - get_slide_context().serialize_objects(current_layout().Data()); - - get_slide_context().dump_rels(current_layout().Rels());//hyperlinks, mediaitems, ... - - get_slide_context().end_slide(); - } - - std::pair pptx_conversion_context::add_author_comments(std::wstring author) - { - if (!authors_comments_) - { - authors_comments_ = pptx_xml_authors_comments::create(); - if (!authors_comments_)return std::pair(-1, -1); - } - - return authors_comments_->add_or_find(author); - } - - void pptx_conversion_context::end_master() - { - get_slide_context().serialize_background(current_master().Background(), true); - get_slide_context().serialize_objects(current_master().Data()); - get_slide_context().serialize_HeaderFooter(current_master().DataExtra()); - - get_slide_context().dump_rels(current_master().Rels());//hyperlinks, mediaitems, ... - - get_slide_context().end_slide(); - } - void pptx_conversion_context::start_theme(std::wstring& name) - { - themes_.push_back(pptx_xml_theme::create(name, themes_.size() + 1)); - } - void pptx_conversion_context::end_theme() - { - } - void pptx_conversion_context::start_office_presentation() - { - } - - void pptx_conversion_context::end_office_presentation() - { - } - void pptx_conversion_context::start_chart(std::wstring name) - { - charts_.push_back(oox_chart_context_ptr(new oox_chart_context(get_mediaitems(), name))); - //добавляем новую форму для диаграммы - //в ней будет информационная часть - и она пишется каждый раз в свою xml (их - по числу диаграмм) - //этот контекст нужно передавать в файл + output_document_->get_ppt_files().add_theme(themes_[i]); } - void pptx_conversion_context::end_chart() - { - //current_chart().set_drawing_link(current_sheet().get_drawing_link()); - //излишняя инфа - } - void pptx_conversion_context::add_jsaProject(const std::string& content) - { - if (content.empty()) return; + package::ppt_comments_files_ptr comments = package::ppt_comments_files::create(comments_context_handle_.content()); - output_document_->get_ppt_files().add_jsaProject(content); - output_document_->get_content_types_file().add_or_find_default(L"bin"); + output_document_->get_ppt_files().set_presentation(presentation_); + output_document_->get_ppt_files().set_comments(comments); + output_document_->get_ppt_files().set_authors_comments(authors_comments_); + output_document_->get_ppt_files().set_media(get_mediaitems()); + + output_document_->get_content_types_file().set_media(get_mediaitems()); + } + + void pptx_conversion_context::start_body() + { + + } + + void pptx_conversion_context::end_body() + { + } + pptx_xml_slideNotesMaster& pptx_conversion_context::current_notesMaster() + { + if (slideNotesMaster_) + { + return *slideNotesMaster_; + } + else + { + throw std::runtime_error("internal error"); } } + pptx_xml_slideNotes& pptx_conversion_context::current_notes() + { + if (!notes_.empty()) + { + return *notes_.back().get(); + } + else + { + throw std::runtime_error("internal error"); + } + } + pptx_xml_slide& pptx_conversion_context::current_slide() + { + if (!slides_.empty()) + { + return *slides_.back().get(); + } + else + { + throw std::runtime_error("internal error"); + } + } + pptx_xml_slideLayout& pptx_conversion_context::current_layout() + { + if (!slideLayouts_.empty()) + { + return *slideLayouts_.back().get(); + } + else + { + throw std::runtime_error("internal error"); + } + } + pptx_xml_theme& pptx_conversion_context::current_theme() + { + if (!themes_.empty()) + { + return *themes_.back().get(); + } + else + { + throw std::runtime_error("internal error"); + } + } + pptx_xml_presentation& pptx_conversion_context::current_presentation() + { + return presentation_; + } + + oox_chart_context& pptx_conversion_context::current_chart() + { + if (!charts_.empty()) + { + return *charts_.back().get(); + } + else + { + throw std::runtime_error("internal error"); + } + } + pptx_xml_slideMaster& pptx_conversion_context::current_master() + { + if (!slideMasters_.empty()) + { + return *slideMasters_.back().get(); + } + else + { + throw std::runtime_error("internal error"); + } + } + void pptx_conversion_context::create_new_slide(std::wstring const& name) + { + pptx_xml_slide_ptr s = pptx_xml_slide::create(name, slides_.size() + 1); + slides_.push_back(s); + } + void pptx_conversion_context::create_new_slideNotes() + { + pptx_xml_slideNotes_ptr s = pptx_xml_slideNotes::create(notes_.size() + 1); + notes_.push_back(s); + } + void pptx_conversion_context::create_new_slideNotesMaster() + { + slideNotesMaster_ = pptx_xml_slideNotesMaster::create(); + } + void pptx_conversion_context::create_new_slideLayout(int id) + { + pptx_xml_slideLayout_ptr s = pptx_xml_slideLayout::create(id); + slideLayouts_.push_back(s); + } + void pptx_conversion_context::create_new_slideMaster(int id) + { + pptx_xml_slideMaster_ptr s = pptx_xml_slideMaster::create(id); + slideMasters_.push_back(s); + } + bool pptx_conversion_context::start_page(const std::wstring& pageName, const std::wstring& pageStyleName, + const std::wstring& pageLayoutName, + const std::wstring& pageMasterName) + { + create_new_slide(pageName); + get_slide_context().start_slide();//pageName, pageStyleName); + get_slide_context().get_animation_context().clear(); + + current_master_page_name_ = pageMasterName; + current_layout_page_name_ = pageLayoutName; + + //const std::wstring masterPageNameLayout = root()->odf_context().pageLayoutContainer().page_layout_name_by_style(current_master_page_name_); + + std::pair layout_id = + root()->odf_context().styleContainer().presentation_layouts().add_or_find(pageLayoutName, pageMasterName); + + current_slide().Rels().add(relationship(layout_id.second, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout", + std::wstring(L"../slideLayouts/slideLayout") + std::to_wstring(layout_id.first) + L".xml")); + + return true; + } + + bool pptx_conversion_context::start_layout(int layout_index) + { + if (layout_index >= 0) + { + odf_reader::presentation_layouts_instance& layouts = root()->odf_context().styleContainer().presentation_layouts(); + + create_new_slideLayout(layouts.content[layout_index].Id); + + get_slide_context().start_slide();//layouts.content[layout_index].layout_name, L"");//????? + + current_master_page_name_ = layouts.content[layout_index].master_name; + current_layout_page_name_ = L""; + + std::pair master_id = //std::pair(1, L"smId1"); + root()->odf_context().styleContainer().presentation_masters().add_or_find(layouts.content[layout_index].master_name); + + root()->odf_context().styleContainer().presentation_masters().add_layout_to(layouts.content[layout_index].master_name, layouts.content[layout_index]); + + current_layout().Rels().add(relationship(L"smId1"/*master_id.second*/, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster", + std::wstring(L"../slideMasters/slideMaster") + std::to_wstring(master_id.first) + L".xml")); + + // + } + else//общий шаблон (насильно пропишем к темам несоответствующие шалоны) + { + } + + //layout type + + // + //1375 + //1376 + //1377 + //1378 + //1379 + //1380 + //1381 + //1382 + //1383 + //1384 + //1385 + //1386 + //1387 + //1388 + //1389 + //1390 + //1391 + //1392 + //1393 + //1394 + //1395 + //1396 + //1397 + //1398 + //1399 + //1400 + //1401 + //1402 + //1403 + //1404 + //1405 ---------------------------------- !!!!!!!!!!!!! + //1406 + //1407 + //1408 + //1409 + + return true; + } + bool pptx_conversion_context::start_master(int master_index) + { + odf_reader::presentation_masters_instance& masters = root()->odf_context().styleContainer().presentation_masters(); + + create_new_slideMaster(masters.content[master_index].Id); + + get_slide_context().start_slide(); + + current_master_page_name_ = L""; + current_layout_page_name_ = L""; + + process_theme(masters.content[master_index].master_name);//add default theme - одинаковые но под разными именами + current_master().add_theme(current_theme().id(), L"tId1"); + + for (size_t i = 0; i < masters.content[master_index].layouts.size(); i++) + { + current_master().add_layout(masters.content[master_index].layouts[i].Id, masters.content[master_index].layouts[i].rId, 0x80000000 + last_uniq_big_id++); + } + + //---------------------------------------------------------------------------------- + //размеры страниц в презентации + const std::wstring pageProperties = root()->odf_context().pageLayoutContainer().page_layout_name_by_style(masters.content[master_index].master_name); + + odf_reader::page_layout_instance* pages_layouts = root()->odf_context().pageLayoutContainer().page_layout_by_name(pageProperties); + + if (pages_layouts) + pages_layouts->pptx_serialize(current_master().Sizes(), *this); + + return true; + } + void pptx_conversion_context::end_page() + { + if (!get_comments_context().empty()) + { + std::wstringstream strm; + get_comments_context().serialize(strm); + + const std::pair commentsName = + comments_context_handle_.add_comments_xml(strm.str(), get_comments_context().get_comments()); + + get_slide_context().add_rels(false, commentsName.second, L"../comments/" + commentsName.first, typeComment); + } + + get_slide_context().serialize_background(current_slide().Background()); + get_slide_context().serialize_objects(current_slide().Data()); + get_slide_context().serialize_animations(current_slide().Timing()); + + { + // NOTE: При использовании operator<< потока буст пушит туда лишний пробел перед значением. + // С этим пробелом наш редактор onlyoffice на распознает значение. + // Example: + // ppt_y + // ppt_y + // TODO: Figure out how to push value without redundant space character + current_slide().remove_timing_redundant_space(); + } + + get_slide_context().dump_rels(current_slide().Rels());//hyperlinks, mediaitems, ... + + get_slide_context().end_slide(); + } + bool pptx_conversion_context::start_page_notes() + { + create_new_slideNotes(); + + current_slide().Rels().add(relationship(notes_.back()->rId(), L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide", + L"../notesSlides/notesSlide" + std::to_wstring(notes_.size()) + L".xml")); + + get_slide_context().start_slide(); + + current_notes().Rels().add(relationship(L"nId1", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide", + L"../slides/slide" + std::to_wstring(slides_.size()) + L".xml")); + + return true; + } + + void pptx_conversion_context::end_page_notes() + { + get_slide_context().serialize_background(current_notes().Background()); + get_slide_context().serialize_objects(current_notes().Data()); + + get_slide_context().dump_rels(current_notes().Rels());//hyperlinks, mediaitems, ... + + get_slide_context().end_slide(); + } + bool pptx_conversion_context::start_master_notes() + { + create_new_slideNotesMaster(); + + get_slide_context().start_slide(); + + process_theme(L"");//add default theme - одинаковые но под разными именами + current_notesMaster().add_theme(current_theme().id(), L"tId1"); + + get_slide_context().start_slide(); + return true; + } + + void pptx_conversion_context::end_master_notes() + { + get_slide_context().serialize_background(current_notesMaster().Background()); + get_slide_context().serialize_objects(current_notesMaster().Data()); + + get_slide_context().dump_rels(current_notesMaster().Rels());//hyperlinks, mediaitems, ... + + get_slide_context().end_slide(); + + for (size_t i = 0; i < notes_.size(); i++) + { + notes_[i]->Rels().add(relationship(L"nmId1", + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster", + L"../notesMasters/notesMaster1.xml")); + } + } + void pptx_conversion_context::end_layout() + { + get_slide_context().process_drawings(); + + get_slide_context().serialize_objects(current_layout().Data()); + + get_slide_context().dump_rels(current_layout().Rels());//hyperlinks, mediaitems, ... + + get_slide_context().end_slide(); + } + + std::pair pptx_conversion_context::add_author_comments(std::wstring author) + { + if (!authors_comments_) + { + authors_comments_ = pptx_xml_authors_comments::create(); + if (!authors_comments_)return std::pair(-1, -1); + } + + return authors_comments_->add_or_find(author); + } + + void pptx_conversion_context::end_master() + { + get_slide_context().process_drawings(); + + get_slide_context().serialize_background(current_master().Background(), true); + get_slide_context().serialize_objects(current_master().Data()); + get_slide_context().serialize_HeaderFooter(current_master().DataExtra()); + + get_slide_context().dump_rels(current_master().Rels());//hyperlinks, mediaitems, ... + + get_slide_context().end_slide(); + } + void pptx_conversion_context::start_theme(std::wstring& name) + { + themes_.push_back(pptx_xml_theme::create(name, themes_.size() + 1)); + } + void pptx_conversion_context::end_theme() + { + } + void pptx_conversion_context::start_office_presentation() + { + } + + void pptx_conversion_context::end_office_presentation() + { + } + void pptx_conversion_context::start_chart(std::wstring name) + { + charts_.push_back(oox_chart_context_ptr(new oox_chart_context(get_mediaitems(), name))); + //добавляем новую форму для диаграммы + //в ней будет информационная часть - и она пишется каждый раз в свою xml (их - по числу диаграмм) + //этот контекст нужно передавать в файл + + } + void pptx_conversion_context::end_chart() + { + //current_chart().set_drawing_link(current_sheet().get_drawing_link()); + //излишняя инфа + } + void pptx_conversion_context::add_jsaProject(const std::string& content) + { + if (content.empty()) return; + + output_document_->get_ppt_files().add_jsaProject(content); + output_document_->get_content_types_file().add_or_find_default(L"bin"); + } + } } diff --git a/OdfFile/Reader/Converter/pptx_drawing.cpp b/OdfFile/Reader/Converter/pptx_drawing.cpp index 757b27653d..1c91de4048 100644 --- a/OdfFile/Reader/Converter/pptx_drawing.cpp +++ b/OdfFile/Reader/Converter/pptx_drawing.cpp @@ -76,7 +76,8 @@ void pptx_serialize_image(std::wostream & strm, _pptx_drawing & val) { CP_XML_ATTR(L"id", val.id); CP_XML_ATTR(L"name", val.name); - + if (val.hidden) CP_XML_ATTR(L"hidden", true); + oox_serialize_action(CP_XML_STREAM(), val.action); } @@ -123,6 +124,7 @@ void pptx_serialize_media(std::wostream & strm, _pptx_drawing & val) { CP_XML_ATTR(L"id", val.id); CP_XML_ATTR(L"name", val.name); + if (val.hidden) CP_XML_ATTR(L"hidden", true); oox_serialize_action(CP_XML_STREAM(), val.action); @@ -210,6 +212,7 @@ void pptx_serialize_shape(std::wostream & strm, _pptx_drawing & val) { CP_XML_ATTR(L"id", val.id);//числовое значение val.rId CP_XML_ATTR(L"name", val.name); + if (val.hidden) CP_XML_ATTR(L"hidden", true); oox_serialize_action(CP_XML_STREAM(),val.action); } @@ -270,6 +273,7 @@ void pptx_serialize_connector(std::wostream & strm, _pptx_drawing & val) { CP_XML_ATTR(L"id", val.id);//числовое значение val.rId CP_XML_ATTR(L"name", val.name); + if (val.hidden) CP_XML_ATTR(L"hidden", true); oox_serialize_action(CP_XML_STREAM(), val.action); } @@ -342,7 +346,8 @@ void pptx_serialize_chart(std::wostream & strm, _pptx_drawing & val) { CP_XML_ATTR(L"id", val.id); CP_XML_ATTR(L"name", val.name); - } + if (val.hidden) CP_XML_ATTR(L"hidden", true); + } CP_XML_NODE(L"p:cNvGraphicFramePr"); CP_XML_NODE(L"p:nvPr"); @@ -379,7 +384,8 @@ void pptx_serialize_table(std::wostream & strm, _pptx_drawing & val) { CP_XML_ATTR(L"id", val.id); CP_XML_ATTR(L"name", val.name); - } + if (val.hidden) CP_XML_ATTR(L"hidden", true); + } CP_XML_NODE(L"p:cNvGraphicFramePr"); CP_XML_NODE(L"p:nvPr"); @@ -420,7 +426,8 @@ void pptx_serialize_object(std::wostream & strm, _pptx_drawing & val) { CP_XML_ATTR(L"id", val.id); CP_XML_ATTR(L"name", val.name); - } + if (val.hidden) CP_XML_ATTR(L"hidden", true); + } CP_XML_NODE(L"p:cNvGraphicFramePr"); CP_XML_NODE(L"p:nvPr"); diff --git a/OdfFile/Reader/Converter/pptx_slide_context.cpp b/OdfFile/Reader/Converter/pptx_slide_context.cpp index cc9248c690..a2c2deae66 100644 --- a/OdfFile/Reader/Converter/pptx_slide_context.cpp +++ b/OdfFile/Reader/Converter/pptx_slide_context.cpp @@ -290,6 +290,8 @@ void pptx_slide_context::default_set() impl_->object_description_.connector_ = false; impl_->object_description_.lined_ = false; + impl_->object_description_.hidden_ = false; + impl_->object_description_.start_shape_id = boost::none; impl_->object_description_.start_shape_glue_point = boost::none; impl_->object_description_.end_shape_id = boost::none; @@ -466,6 +468,10 @@ void pptx_slide_context::set_id(std::wstring const& id) { impl_->object_description_.xml_id_ = id; } +void pptx_slide_context::set_hidden(bool val) +{ + impl_->object_description_.hidden_ = val; +} void pptx_slide_context::start_shape(int type) { @@ -841,7 +847,8 @@ void pptx_slide_context::Impl::process_common_properties(drawing_object_descript val = (int)(0.5 + odf_types::length(pic.svg_rect_->cy, odf_types::length::pt).get_value_unit(odf_types::length::emu)); if ( val >=0 ) drawing.cy = val; } - + + drawing.hidden = pic.hidden_; drawing.additional = pic.additional_; drawing.hlinks = pic.hlinks_; drawing.action = pic.action_; diff --git a/OdfFile/Reader/Converter/pptx_slide_context.h b/OdfFile/Reader/Converter/pptx_slide_context.h index a7e0d0e751..85f6412449 100644 --- a/OdfFile/Reader/Converter/pptx_slide_context.h +++ b/OdfFile/Reader/Converter/pptx_slide_context.h @@ -73,6 +73,7 @@ public: std::vector & get_properties(); void set_clipping (const std::wstring & str ); void set_fill (_oox_fill & fill); + void set_hidden (bool val); void set_is_line_shape(bool val); void set_is_connector_shape(bool val); diff --git a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp index 8a1dada7ba..a6358c9f98 100644 --- a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp +++ b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.cpp @@ -74,6 +74,34 @@ namespace oox { } } } + void serializeEx(std::wostream& _Wostream) + { + CP_XML_WRITER(_Wostream) + { + CP_XML_NODE(L"x14:cfvo") + { + switch (type) + { + case 0: CP_XML_ATTR(L"type", L"percent"); break; + case 1: CP_XML_ATTR(L"type", L"num"); break; + case 2: CP_XML_ATTR(L"type", L"max"); break; + case 3: CP_XML_ATTR(L"type", L"min"); break; + case 4: CP_XML_ATTR(L"type", L"autoMax"); break; + case 5: CP_XML_ATTR(L"type", L"autoMin"); break; + case 6: CP_XML_ATTR(L"type", L"formula"); break; + case 7: CP_XML_ATTR(L"type", L"percentile"); break;//BOA PARA ESTUDAR - JOGAR LOTOFACIL minha predileta 1.ods + + } + if (val) + { + CP_XML_NODE(L"xm:f") + { + CP_XML_CONTENT(*val); + } + } + } + } + } }; struct rule @@ -90,6 +118,9 @@ namespace oox { _CP_OPT(std::wstring) formula2; _CP_OPT(int) rank; _CP_OPT(bool) bottom; + _CP_OPT(bool) equal; + _CP_OPT(bool) above; + _CP_OPT(int) stdDev; //color scale icon set data_bar std::vector<_cfvo> cfvo; //color scale data_bar(1 element) @@ -97,11 +128,12 @@ namespace oox { //data bar icon_set _CP_OPT(bool) showValue; //data bar - _CP_OPT(int) minLength; - _CP_OPT(int) maxLength; + _CP_OPT(unsigned int) minLength; + _CP_OPT(unsigned int) maxLength; _CP_OPT(std::wstring) axis_position; _CP_OPT(std::wstring) axis_color; _CP_OPT(std::wstring) negative_color; + _CP_OPT(bool) gradient; //icon set _CP_OPT(int) icon_set_type; _CP_OPT(bool) reverse; @@ -109,9 +141,19 @@ namespace oox { _CP_OPT(int) iconset_type; //date is _CP_OPT(int) time_period; + + bool isExtended() + { + if (gradient || axis_color || axis_position || negative_color) + { + return true; + } + return false; + } }; struct conditionalFormatting { + bool bUsed = false; std::wstring ref; std::vector rules; }; @@ -122,159 +164,352 @@ public: void serialize(std::wostream & _Wostream) { - if (!conditionalFormattings_.empty()) - { - int priority = 1; - CP_XML_WRITER(_Wostream) - { - for (size_t i = 0 ; i < conditionalFormattings_.size(); i++) - { - conditionalFormatting & c = conditionalFormattings_[i]; - - if (c.rules.size() < 1) continue; - - CP_XML_NODE(L"conditionalFormatting") - { - CP_XML_ATTR(L"sqref", c.ref); + if (conditionalFormattings_.empty()) return; - for (size_t j = 0 ; j < c.rules.size(); j++) + int priority = 1; + CP_XML_WRITER(_Wostream) + { + for (size_t i = 0; i < conditionalFormattings_.size(); i++) + { + conditionalFormatting& c = conditionalFormattings_[i]; + + if (c.bUsed) continue; + if (c.rules.size() < 1) continue; + + CP_XML_NODE(L"conditionalFormatting") + { + CP_XML_ATTR(L"sqref", c.ref); + + for (size_t j = 0; j < c.rules.size(); j++) + { + if (c.rules[j].type < 1 || c.rules[j].type > 5) continue; + + CP_XML_NODE(L"cfRule") { - if (c.rules[j].type < 1 || c.rules[j].type > 5) continue; + CP_XML_ATTR(L"priority", priority++); - CP_XML_NODE(L"cfRule") - { - CP_XML_ATTR(L"priority", priority++); - - if (c.rules[j].dxfId) CP_XML_ATTR(L"dxfId", *c.rules[j].dxfId); - if (c.rules[j].percent) CP_XML_ATTR(L"percent", *c.rules[j].percent); - if (c.rules[j].operator_) CP_XML_ATTR(L"operator", *c.rules[j].operator_); - if (c.rules[j].stopIfTrue) CP_XML_ATTR(L"stopIfTrue", *c.rules[j].stopIfTrue); - if (c.rules[j].text) CP_XML_ATTR(L"text", *c.rules[j].text); - if (c.rules[j].rank) CP_XML_ATTR(L"rank", *c.rules[j].rank); - if (c.rules[j].bottom) CP_XML_ATTR(L"bottom", *c.rules[j].bottom); - //CP_XML_ATTR(L"equalAverage" , 0); - //CP_XML_ATTR(L"aboveAverage" , 0); - if (c.rules[j].type == 1) - { - if (c.rules[j].formula_type) - CP_XML_ATTR(L"type", *c.rules[j].formula_type); - else - CP_XML_ATTR(L"type", L"cellIs"); - if ((c.rules[j].formula) && (!c.rules[j].formula->empty())) - { - CP_XML_NODE(L"formula") - { - CP_XML_CONTENT(*c.rules[j].formula); - } - } - if ((c.rules[j].formula2) && (!c.rules[j].formula2->empty())) - { - CP_XML_NODE(L"formula") - { - CP_XML_CONTENT(*c.rules[j].formula2); - } - } - } - else if (c.rules[j].type == 2) - { - CP_XML_ATTR(L"type", L"dataBar"); - CP_XML_NODE(L"dataBar") - { - if (c.rules[j].showValue) CP_XML_ATTR(L"showValue", *c.rules[j].showValue); - if (c.rules[j].minLength) CP_XML_ATTR(L"minLength", *c.rules[j].minLength); - if (c.rules[j].maxLength) CP_XML_ATTR(L"maxLength", *c.rules[j].maxLength); + if (c.rules[j].dxfId) CP_XML_ATTR(L"dxfId", *c.rules[j].dxfId); + if (c.rules[j].percent) CP_XML_ATTR(L"percent", *c.rules[j].percent); + if (c.rules[j].operator_) CP_XML_ATTR(L"operator", *c.rules[j].operator_); + if (c.rules[j].stopIfTrue) CP_XML_ATTR(L"stopIfTrue", *c.rules[j].stopIfTrue); + if (c.rules[j].text) CP_XML_ATTR(L"text", *c.rules[j].text); + if (c.rules[j].rank) CP_XML_ATTR(L"rank", *c.rules[j].rank); + if (c.rules[j].bottom) CP_XML_ATTR(L"bottom", *c.rules[j].bottom); + if (c.rules[j].above) CP_XML_ATTR(L"aboveAverage", *c.rules[j].above); + if (c.rules[j].equal) CP_XML_ATTR(L"equalAverage", *c.rules[j].equal); + if (c.rules[j].stdDev) CP_XML_ATTR(L"stdDev", *c.rules[j].stdDev); - for (size_t k = 0; k < c.rules[j].cfvo.size(); k++) - { - c.rules[j].cfvo[k].serialize(CP_XML_STREAM()); - } - - CP_XML_NODE(L"color") - { - CP_XML_ATTR(L"rgb", !c.rules[j].color.empty() ? c.rules[j].color[0] : L"FF000000"); - } + if (c.rules[j].type == 1) + { + if (c.rules[j].formula_type) + CP_XML_ATTR(L"type", *c.rules[j].formula_type); + else + CP_XML_ATTR(L"type", L"cellIs"); + if ((c.rules[j].formula) && (!c.rules[j].formula->empty())) + { + CP_XML_NODE(L"formula") + { + CP_XML_CONTENT(*c.rules[j].formula); } } - else if (c.rules[j].type == 3) + if ((c.rules[j].formula2) && (!c.rules[j].formula2->empty())) { - CP_XML_ATTR(L"type", L"colorScale"); - CP_XML_NODE(L"colorScale") + CP_XML_NODE(L"formula") { - for (size_t k = 0; k < c.rules[j].cfvo.size(); k++) - { - c.rules[j].cfvo[k].serialize(CP_XML_STREAM()); - } - for (size_t k = 0; k < c.rules[j].color.size(); k++) - { - CP_XML_NODE(L"color") - { - CP_XML_ATTR(L"rgb", c.rules[j].color[k]); - } - } - } - } - else if (c.rules[j].type == 4) - { - CP_XML_ATTR(L"type", L"iconSet"); - CP_XML_NODE(L"iconSet") - { - if (c.rules[j].icon_set_type) - { - switch (*c.rules[j].icon_set_type) - { - case 1: CP_XML_ATTR(L"iconSet", L"3ArrowsGray"); break; - case 2: CP_XML_ATTR(L"iconSet", L"3Flags"); break; - case 3: CP_XML_ATTR(L"iconSet", L"3Signs"); break; - case 4: CP_XML_ATTR(L"iconSet", L"3Symbols"); break; - case 5: CP_XML_ATTR(L"iconSet", L"3Symbols2"); break; - case 6: CP_XML_ATTR(L"iconSet", L"3TrafficLights1"); break; - case 7: CP_XML_ATTR(L"iconSet", L"3TrafficLights2"); break; - case 8: CP_XML_ATTR(L"iconSet", L"4Arrows"); break; - case 9: CP_XML_ATTR(L"iconSet", L"4ArrowsGray"); break; - case 10: CP_XML_ATTR(L"iconSet", L"4Rating"); break; - case 11: CP_XML_ATTR(L"iconSet", L"4RedToBlack"); break; - case 12: CP_XML_ATTR(L"iconSet", L"4TrafficLights"); break; - case 13: CP_XML_ATTR(L"iconSet", L"5Arrows"); break; - case 14: CP_XML_ATTR(L"iconSet", L"5ArrowsGray"); break; - case 15: CP_XML_ATTR(L"iconSet", L"5Quarters"); break; - case 16: CP_XML_ATTR(L"iconSet", L"5Rating"); break; - case 0: - default: CP_XML_ATTR(L"iconSet", L"3Arrows"); break; - break; - } - } - if (c.rules[j].showValue) CP_XML_ATTR(L"showValue", *c.rules[j].showValue); - - for (size_t k = 0; k < c.rules[j].cfvo.size(); k++) - { - c.rules[j].cfvo[k].serialize(CP_XML_STREAM()); - } - } - } - else if (c.rules[j].type == 5) - { - CP_XML_ATTR(L"type", L"timePeriod"); - switch (*c.rules[j].time_period) - { - case 0: CP_XML_ATTR(L"timePeriod", L"today"); break; - case 1: CP_XML_ATTR(L"timePeriod", L"yesterday"); break; - case 2: CP_XML_ATTR(L"timePeriod", L"tomorrow"); break; - case 3: CP_XML_ATTR(L"timePeriod", L"last7Days"); break; - case 4: CP_XML_ATTR(L"timePeriod", L"thisMonth"); break; - case 5: CP_XML_ATTR(L"timePeriod", L"lastMonth"); break; - case 6: CP_XML_ATTR(L"timePeriod", L"nextMonth"); break; - case 7: CP_XML_ATTR(L"timePeriod", L"thisWeek"); break; - case 8: CP_XML_ATTR(L"timePeriod", L"lastWeek"); break; - case 9: CP_XML_ATTR(L"timePeriod", L"nextWeek"); break; + CP_XML_CONTENT(*c.rules[j].formula2); } } } + else if (c.rules[j].type == 2) + { + CP_XML_ATTR(L"type", L"dataBar"); + CP_XML_NODE(L"dataBar") + { + if (c.rules[j].showValue) CP_XML_ATTR(L"showValue", *c.rules[j].showValue); + if (c.rules[j].minLength) CP_XML_ATTR(L"minLength", *c.rules[j].minLength); + if (c.rules[j].maxLength) CP_XML_ATTR(L"maxLength", *c.rules[j].maxLength); + if (c.rules[j].gradient) CP_XML_ATTR(L"gradient", *c.rules[j].gradient); + + for (size_t k = 0; k < c.rules[j].cfvo.size(); k++) + { + c.rules[j].cfvo[k].serialize(CP_XML_STREAM()); + } + + CP_XML_NODE(L"color") + { + CP_XML_ATTR(L"rgb", !c.rules[j].color.empty() ? c.rules[j].color[0] : L"FF000000"); + } + } + } + else if (c.rules[j].type == 3) + { + CP_XML_ATTR(L"type", L"colorScale"); + CP_XML_NODE(L"colorScale") + { + for (size_t k = 0; k < c.rules[j].cfvo.size(); k++) + { + c.rules[j].cfvo[k].serialize(CP_XML_STREAM()); + } + for (size_t k = 0; k < c.rules[j].color.size(); k++) + { + CP_XML_NODE(L"color") + { + CP_XML_ATTR(L"rgb", c.rules[j].color[k]); + } + } + } + } + else if (c.rules[j].type == 4) + { + CP_XML_ATTR(L"type", L"iconSet"); + CP_XML_NODE(L"iconSet") + { + if (c.rules[j].icon_set_type) + { + switch (*c.rules[j].icon_set_type) + { + case 1: CP_XML_ATTR(L"iconSet", L"3ArrowsGray"); break; + case 2: CP_XML_ATTR(L"iconSet", L"3Flags"); break; + case 3: CP_XML_ATTR(L"iconSet", L"3Signs"); break; + case 4: CP_XML_ATTR(L"iconSet", L"3Symbols"); break; + case 5: CP_XML_ATTR(L"iconSet", L"3Symbols2"); break; + case 6: CP_XML_ATTR(L"iconSet", L"3TrafficLights1"); break; + case 7: CP_XML_ATTR(L"iconSet", L"3TrafficLights2"); break; + case 8: CP_XML_ATTR(L"iconSet", L"4Arrows"); break; + case 9: CP_XML_ATTR(L"iconSet", L"4ArrowsGray"); break; + case 10: CP_XML_ATTR(L"iconSet", L"4Rating"); break; + case 11: CP_XML_ATTR(L"iconSet", L"4RedToBlack"); break; + case 12: CP_XML_ATTR(L"iconSet", L"4TrafficLights"); break; + case 13: CP_XML_ATTR(L"iconSet", L"5Arrows"); break; + case 14: CP_XML_ATTR(L"iconSet", L"5ArrowsGray"); break; + case 15: CP_XML_ATTR(L"iconSet", L"5Quarters"); break; + case 16: CP_XML_ATTR(L"iconSet", L"5Rating"); break; + case 17: CP_XML_ATTR(L"iconSet", L"3Triangles"); break; + case 18: CP_XML_ATTR(L"iconSet", L"3Stars"); break; + case 19: CP_XML_ATTR(L"iconSet", L"5Boxes"); break; + case 0: + default: CP_XML_ATTR(L"iconSet", L"3Arrows"); break; + break; + } + } + if (c.rules[j].showValue) CP_XML_ATTR(L"showValue", *c.rules[j].showValue); + + for (size_t k = 0; k < c.rules[j].cfvo.size(); k++) + { + c.rules[j].cfvo[k].serialize(CP_XML_STREAM()); + } + } + } + else if (c.rules[j].type == 5) + { + CP_XML_ATTR(L"type", L"timePeriod"); + switch (*c.rules[j].time_period) + { + case 0: CP_XML_ATTR(L"timePeriod", L"today"); break; + case 1: CP_XML_ATTR(L"timePeriod", L"yesterday"); break; + case 2: CP_XML_ATTR(L"timePeriod", L"tomorrow"); break; + case 3: CP_XML_ATTR(L"timePeriod", L"last7Days"); break; + case 4: CP_XML_ATTR(L"timePeriod", L"thisMonth"); break; + case 5: CP_XML_ATTR(L"timePeriod", L"lastMonth"); break; + case 6: CP_XML_ATTR(L"timePeriod", L"nextMonth"); break; + case 7: CP_XML_ATTR(L"timePeriod", L"thisWeek"); break; + case 8: CP_XML_ATTR(L"timePeriod", L"lastWeek"); break; + case 9: CP_XML_ATTR(L"timePeriod", L"nextWeek"); break; + } + } } - } - } - } - } + } + } + } + } } + void serializeEx(std::wostream& _Wostream) + { + if (conditionalFormattings_.empty()) return; + + int priority = 1; + CP_XML_WRITER(_Wostream) + { + for (size_t i = 0; i < conditionalFormattings_.size(); i++) + { + conditionalFormatting& c = conditionalFormattings_[i]; + + if (c.bUsed) continue; + if (c.rules.size() < 1) continue; + + for (size_t j = 0; j < c.rules.size(); j++) + { + if (c.rules[j].isExtended()) + { + c.bUsed = true; + break; + } + } + if (!c.bUsed) continue; + + CP_XML_NODE(L"x14:conditionalFormatting") + { + CP_XML_ATTR(L"xmlns:xm", L"http://schemas.microsoft.com/office/excel/2006/main"); + + for (size_t j = 0; j < c.rules.size(); j++) + { + if (c.rules[j].type < 1 || c.rules[j].type > 5) continue; + + CP_XML_NODE(L"x14:cfRule") + { + CP_XML_ATTR(L"priority", priority++); + + if (c.rules[j].dxfId) CP_XML_ATTR(L"dxfId", *c.rules[j].dxfId); + if (c.rules[j].percent) CP_XML_ATTR(L"percent", *c.rules[j].percent); + if (c.rules[j].operator_) CP_XML_ATTR(L"operator", *c.rules[j].operator_); + if (c.rules[j].stopIfTrue) CP_XML_ATTR(L"stopIfTrue", *c.rules[j].stopIfTrue); + if (c.rules[j].text) CP_XML_ATTR(L"text", *c.rules[j].text); + if (c.rules[j].rank) CP_XML_ATTR(L"rank", *c.rules[j].rank); + if (c.rules[j].bottom) CP_XML_ATTR(L"bottom", *c.rules[j].bottom); + if (c.rules[j].above) CP_XML_ATTR(L"aboveAverage", *c.rules[j].above); + if (c.rules[j].equal) CP_XML_ATTR(L"equalAverage", *c.rules[j].equal); + if (c.rules[j].stdDev) CP_XML_ATTR(L"stdDev", *c.rules[j].stdDev); + + if (c.rules[j].type == 1) + { + if (c.rules[j].formula_type) + CP_XML_ATTR(L"type", *c.rules[j].formula_type); + else + CP_XML_ATTR(L"type", L"cellIs"); + if ((c.rules[j].formula) && (!c.rules[j].formula->empty())) + { + CP_XML_NODE(L"formula") + { + CP_XML_CONTENT(*c.rules[j].formula); + } + } + if ((c.rules[j].formula2) && (!c.rules[j].formula2->empty())) + { + CP_XML_NODE(L"formula") + { + CP_XML_CONTENT(*c.rules[j].formula2); + } + } + } + else if (c.rules[j].type == 2) + { + CP_XML_ATTR(L"type", L"dataBar"); + CP_XML_NODE(L"x14:dataBar") + { + if (c.rules[j].showValue) CP_XML_ATTR(L"showValue", *c.rules[j].showValue); + if (c.rules[j].minLength) CP_XML_ATTR(L"minLength", *c.rules[j].minLength); + if (c.rules[j].maxLength) CP_XML_ATTR(L"maxLength", *c.rules[j].maxLength); + if (c.rules[j].gradient) CP_XML_ATTR(L"gradient", *c.rules[j].gradient); + if (c.rules[j].axis_position) CP_XML_ATTR(L"axisPosition", *c.rules[j].axis_position); + + for (size_t k = 0; k < c.rules[j].cfvo.size(); k++) + { + c.rules[j].cfvo[k].serializeEx(CP_XML_STREAM()); + } + CP_XML_NODE(L"x14:fillColor") + { + CP_XML_ATTR(L"rgb", !c.rules[j].color.empty() ? c.rules[j].color[0] : L"FF000000"); + } + if (c.rules[j].negative_color) + { + CP_XML_NODE(L"x14:negativeFillColor") + { + CP_XML_ATTR(L"rgb", *c.rules[j].negative_color); + } + } + if (c.rules[j].axis_color) + { + CP_XML_NODE(L"x14:axisColor") + { + CP_XML_ATTR(L"rgb", *c.rules[j].axis_color); + } + } + } + } + else if (c.rules[j].type == 3) + { + CP_XML_ATTR(L"type", L"colorScale"); + CP_XML_NODE(L"x14:colorScale") + { + for (size_t k = 0; k < c.rules[j].cfvo.size(); k++) + { + c.rules[j].cfvo[k].serialize(CP_XML_STREAM()); + } + for (size_t k = 0; k < c.rules[j].color.size(); k++) + { + CP_XML_NODE(L"x14:color") + { + CP_XML_ATTR(L"rgb", c.rules[j].color[k]); + } + } + } + } + else if (c.rules[j].type == 4) + { + CP_XML_ATTR(L"type", L"iconSet"); + CP_XML_NODE(L"x14:iconSet") + { + if (c.rules[j].icon_set_type) + { + switch (*c.rules[j].icon_set_type) + { + case 1: CP_XML_ATTR(L"iconSet", L"3ArrowsGray"); break; + case 2: CP_XML_ATTR(L"iconSet", L"3Flags"); break; + case 3: CP_XML_ATTR(L"iconSet", L"3Signs"); break; + case 4: CP_XML_ATTR(L"iconSet", L"3Symbols"); break; + case 5: CP_XML_ATTR(L"iconSet", L"3Symbols2"); break; + case 6: CP_XML_ATTR(L"iconSet", L"3TrafficLights1"); break; + case 7: CP_XML_ATTR(L"iconSet", L"3TrafficLights2"); break; + case 8: CP_XML_ATTR(L"iconSet", L"4Arrows"); break; + case 9: CP_XML_ATTR(L"iconSet", L"4ArrowsGray"); break; + case 10: CP_XML_ATTR(L"iconSet", L"4Rating"); break; + case 11: CP_XML_ATTR(L"iconSet", L"4RedToBlack"); break; + case 12: CP_XML_ATTR(L"iconSet", L"4TrafficLights"); break; + case 13: CP_XML_ATTR(L"iconSet", L"5Arrows"); break; + case 14: CP_XML_ATTR(L"iconSet", L"5ArrowsGray"); break; + case 15: CP_XML_ATTR(L"iconSet", L"5Quarters"); break; + case 16: CP_XML_ATTR(L"iconSet", L"5Rating"); break; + case 0: + default: CP_XML_ATTR(L"iconSet", L"3Arrows"); break; + break; + } + } + if (c.rules[j].showValue) CP_XML_ATTR(L"showValue", *c.rules[j].showValue); + + for (size_t k = 0; k < c.rules[j].cfvo.size(); k++) + { + c.rules[j].cfvo[k].serialize(CP_XML_STREAM()); + } + } + } + else if (c.rules[j].type == 5) + { + CP_XML_ATTR(L"type", L"timePeriod"); + switch (*c.rules[j].time_period) + { + case 0: CP_XML_ATTR(L"timePeriod", L"today"); break; + case 1: CP_XML_ATTR(L"timePeriod", L"yesterday"); break; + case 2: CP_XML_ATTR(L"timePeriod", L"tomorrow"); break; + case 3: CP_XML_ATTR(L"timePeriod", L"last7Days"); break; + case 4: CP_XML_ATTR(L"timePeriod", L"thisMonth"); break; + case 5: CP_XML_ATTR(L"timePeriod", L"lastMonth"); break; + case 6: CP_XML_ATTR(L"timePeriod", L"nextMonth"); break; + case 7: CP_XML_ATTR(L"timePeriod", L"thisWeek"); break; + case 8: CP_XML_ATTR(L"timePeriod", L"lastWeek"); break; + case 9: CP_XML_ATTR(L"timePeriod", L"nextWeek"); break; + } + } + } + } + + CP_XML_NODE(L"xm:sqref") + { + CP_XML_CONTENT(c.ref); + } + } + } + } + } std::vector conditionalFormattings_; }; @@ -290,7 +525,10 @@ void xlsx_conditionalFormatting_context::serialize(std::wostream & _Wostream) { return impl_->serialize(_Wostream); } - +void xlsx_conditionalFormatting_context::serializeEx(std::wostream& _Wostream) +{ + return impl_->serializeEx(_Wostream); +} void xlsx_conditionalFormatting_context::start(std::wstring ref) { formulasconvert::odf2oox_converter converter; @@ -324,6 +562,22 @@ void xlsx_conditionalFormatting_context::set_formula(std::wstring f) { impl_->conditionalFormattings_.back().rules.back().formula_type = L"aboveAverage"; } + else if (f == L"below-average") + { + impl_->conditionalFormattings_.back().rules.back().formula_type = L"aboveAverage"; + impl_->conditionalFormattings_.back().rules.back().above = false; + } + else if (f == L"above-equal-average") + { + impl_->conditionalFormattings_.back().rules.back().formula_type = L"aboveAverage"; + impl_->conditionalFormattings_.back().rules.back().equal = true; + } + else if (f == L"below-equal-average") + { + impl_->conditionalFormattings_.back().rules.back().formula_type = L"aboveAverage"; + impl_->conditionalFormattings_.back().rules.back().above = false; + impl_->conditionalFormattings_.back().rules.back().equal = true; + } else if ( 0 <= (pos = f.find(L"formula-is("))) { impl_->conditionalFormattings_.back().rules.back().formula_type = L"expression"; @@ -339,11 +593,13 @@ void xlsx_conditionalFormatting_context::set_formula(std::wstring f) } else if (0 <= (pos = f.find(L"is-between("))) { + val = f.substr(11, f.size() - 12); impl_->conditionalFormattings_.back().rules.back().formula_type = L"expression"; impl_->conditionalFormattings_.back().rules.back().formula = converter.convert_named_expr(val); } else if (0 <= (pos = f.find(L"is-time("))) { + val = f.substr(8, f.size() - 9); impl_->conditionalFormattings_.back().rules.back().formula_type = L"expression"; impl_->conditionalFormattings_.back().rules.back().formula = converter.convert_named_expr(val); } @@ -352,6 +608,10 @@ void xlsx_conditionalFormatting_context::set_formula(std::wstring f) impl_->conditionalFormattings_.back().rules.back().formula_type = L"containsErrors"; impl_->conditionalFormattings_.back().rules.back().formula = L"0"; } + else if (0 <= (pos = f.find(L"is-no-error"))) + { + impl_->conditionalFormattings_.back().rules.back().formula_type = L"notContainsErrors"; + } else if (0 <= (pos = f.find(L"duplicate"))) { impl_->conditionalFormattings_.back().rules.back().formula_type = L"duplicateValues"; @@ -382,7 +642,9 @@ void xlsx_conditionalFormatting_context::set_formula(std::wstring f) } else if (0 <= (pos = f.find(L"contains-text"))) { - impl_->conditionalFormattings_.back().rules.back().formula_type = L"containsText"; + if (std::wstring::npos != f.find(L"not-contains-text")) + impl_->conditionalFormattings_.back().rules.back().formula_type = L"notContainsText"; + else impl_->conditionalFormattings_.back().rules.back().formula_type = L"containsText"; std::wstring text = f.substr(pos + 14, f.length() - pos - 15); @@ -464,6 +726,28 @@ void xlsx_conditionalFormatting_context::set_formula(std::wstring f) { val = converter.convert_named_expr( f ); } + else if (0 <= (pos = f.find(L"between"))) + { + if (0 <= (pos = f.find(L"not-between"))) + { + impl_->conditionalFormattings_.back().rules.back().operator_ = L"notBetween"; + val = f.substr(12, f.length() - 13); + } + else + { + impl_->conditionalFormattings_.back().rules.back().operator_ = L"between"; + val = f.substr(8, f.length() - 9); + } + + XmlUtils::replace_all(val, L"(", L""); + XmlUtils::replace_all(val, L")", L""); + if (0 <= (pos = val.find(L","))) + { + impl_->conditionalFormattings_.back().rules.back().formula2 = converter.convert_named_expr(val.substr(pos + 1)); + val = val.substr(0, pos); + } + val = converter.convert_named_expr(val); + } else if (0 <= (pos = f.find(L"!="))) { impl_->conditionalFormattings_.back().rules.back().operator_ = L"notEqual"; @@ -494,20 +778,6 @@ void xlsx_conditionalFormatting_context::set_formula(std::wstring f) impl_->conditionalFormattings_.back().rules.back().operator_ = L"greaterThan"; val = converter.convert_named_expr( f.substr(1) ); } - else if (0 <= (pos = f.find(L"between"))) - { - impl_->conditionalFormattings_.back().rules.back().operator_ = L"between"; - val = f.substr(8, f.length() - 9); - - XmlUtils::replace_all(val, L"(", L""); - XmlUtils::replace_all(val, L")", L""); - if (0 <= (pos = val.find(L","))) - { - impl_->conditionalFormattings_.back().rules.back().formula2 = converter.convert_named_expr( val.substr(pos + 1) ); - val = val.substr(0, pos); - } - val = converter.convert_named_expr( val ); - } else { val = converter.convert( f ); @@ -517,7 +787,11 @@ void xlsx_conditionalFormatting_context::set_formula(std::wstring f) impl_->conditionalFormattings_.back().rules.back().formula = val; } } -void xlsx_conditionalFormatting_context::set_dataBar(_CP_OPT(int) min, _CP_OPT(int) max) +void xlsx_conditionalFormatting_context::set_gradient(bool val) +{ + impl_->conditionalFormattings_.back().rules.back().gradient = val; +} +void xlsx_conditionalFormatting_context::set_dataBar(_CP_OPT(unsigned int) min, _CP_OPT(unsigned int) max) { impl_->conditionalFormattings_.back().rules.back().minLength = min; impl_->conditionalFormattings_.back().rules.back().maxLength = max; @@ -574,5 +848,10 @@ void xlsx_conditionalFormatting_context::set_time_period(int val) { impl_->conditionalFormattings_.back().rules.back().time_period = val; } +void xlsx_conditionalFormatting_context::set_stdDev(int val) +{ + impl_->conditionalFormattings_.back().rules.back().stdDev = val; +} + } } diff --git a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.h b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.h index 9176225541..ae3183febe 100644 --- a/OdfFile/Reader/Converter/xlsx_conditionalFormatting.h +++ b/OdfFile/Reader/Converter/xlsx_conditionalFormatting.h @@ -50,11 +50,14 @@ public: void add_rule(int type); void set_formula(std::wstring f); - void set_dataBar(_CP_OPT(int) min, _CP_OPT(int) max); + + void set_dataBar(_CP_OPT(unsigned int) min, _CP_OPT(unsigned int) max); + void set_gradient(bool val); void set_dxf (int dxf_id); void set_showVal(bool val); void set_time_period(int val); + void set_stdDev(int val); void add_sfv (int type, std::wstring value); void add_color (std::wstring col); @@ -66,6 +69,7 @@ public: void set_icon_set_type(int type); void serialize(std::wostream & _Wostream); + void serializeEx(std::wostream& _Wostream); private: class Impl; _CP_SCOPED_PTR(Impl) impl_; diff --git a/OdfFile/Reader/Converter/xlsx_output_xml.cpp b/OdfFile/Reader/Converter/xlsx_output_xml.cpp index b5c4379d32..3b983b9276 100644 --- a/OdfFile/Reader/Converter/xlsx_output_xml.cpp +++ b/OdfFile/Reader/Converter/xlsx_output_xml.cpp @@ -78,6 +78,7 @@ public: std::wstringstream tableParts_; std::wstringstream autofilter_; std::wstringstream conditionalFormatting_; + std::wstringstream conditionalFormattingEx_; std::wstringstream picture_background_; std::wstringstream dataValidations_; std::wstringstream dataValidationsX14_; @@ -148,6 +149,10 @@ std::wostream & xlsx_xml_worksheet::conditionalFormatting() { return impl_->conditionalFormatting_; } +std::wostream& xlsx_xml_worksheet::conditionalFormattingEx() +{ + return impl_->conditionalFormattingEx_; +} std::wostream & xlsx_xml_worksheet::sort() { return impl_->sort_; @@ -312,8 +317,9 @@ void xlsx_xml_worksheet::write_to(std::wostream & strm) std::wstring dataValidations14 = impl_->dataValidationsX14_.str(); std::wstring sparklines = impl_->sparklines_.str(); + std::wstring condFormattings = impl_->conditionalFormattingEx_.str(); - if (false == dataValidations14.empty() || false == sparklines.empty()) + if (false == dataValidations14.empty() || false == sparklines.empty() || false == condFormattings.empty()) { CP_XML_NODE(L"extLst") { @@ -337,6 +343,19 @@ void xlsx_xml_worksheet::write_to(std::wostream & strm) CP_XML_STREAM() << sparklines; } } + if (false == condFormattings.empty()) + { + CP_XML_NODE(L"ext") + { + CP_XML_ATTR(L"uri", L"{78C0D931-6437-407d-A8EE-F0AAD7539E65}"); + CP_XML_ATTR(L"xmlns:x14", L"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"); + + CP_XML_NODE(L"x14:conditionalFormattings") + { + CP_XML_STREAM() << condFormattings; + } + } + } } } } diff --git a/OdfFile/Reader/Converter/xlsx_output_xml.h b/OdfFile/Reader/Converter/xlsx_output_xml.h index ba49392a97..62c487b600 100644 --- a/OdfFile/Reader/Converter/xlsx_output_xml.h +++ b/OdfFile/Reader/Converter/xlsx_output_xml.h @@ -61,6 +61,7 @@ public: std::wostream & autofilter(); std::wostream & tableParts(); std::wostream & conditionalFormatting(); + std::wostream & conditionalFormattingEx(); std::wostream & picture_background(); std::wostream & dataValidations(); std::wostream & dataValidationsX14(); diff --git a/OdfFile/Reader/Converter/xlsx_table_state.cpp b/OdfFile/Reader/Converter/xlsx_table_state.cpp index 1c3249a2d9..445c20d353 100644 --- a/OdfFile/Reader/Converter/xlsx_table_state.cpp +++ b/OdfFile/Reader/Converter/xlsx_table_state.cpp @@ -794,10 +794,14 @@ void xlsx_table_state::serialize_hyperlinks(std::wostream & strm) { return xlsx_hyperlinks_.xlsx_serialize(strm); } -void xlsx_table_state::serialize_conditionalFormatting(std::wostream & strm) +void xlsx_table_state::serialize_condFormatting(std::wostream & strm) { return xlsx_conditionalFormatting_context_.serialize(strm); } +void xlsx_table_state::serialize_condFormattingEx(std::wostream& strm) +{ + return xlsx_conditionalFormatting_context_.serializeEx(strm); +} void xlsx_table_state::dump_rels_hyperlinks(rels & Rels) { return xlsx_hyperlinks_.dump_rels(Rels); diff --git a/OdfFile/Reader/Converter/xlsx_table_state.h b/OdfFile/Reader/Converter/xlsx_table_state.h index 69f48a37b4..b0ca244f7b 100644 --- a/OdfFile/Reader/Converter/xlsx_table_state.h +++ b/OdfFile/Reader/Converter/xlsx_table_state.h @@ -203,7 +203,8 @@ public: void set_background (std::wstring rId) { tableBackground_ = rId; } - void serialize_conditionalFormatting (std::wostream & _Wostream); + void serialize_condFormatting (std::wostream & _Wostream); + void serialize_condFormattingEx (std::wostream& _Wostream); void serialize_table_format (std::wostream & _Wostream); void serialize_merge_cells (std::wostream & _Wostream); void serialize_hyperlinks (std::wostream & _Wostream); diff --git a/OdfFile/Reader/Converter/xlsx_tablecontext.cpp b/OdfFile/Reader/Converter/xlsx_tablecontext.cpp index ed345d18d9..57897738b0 100644 --- a/OdfFile/Reader/Converter/xlsx_tablecontext.cpp +++ b/OdfFile/Reader/Converter/xlsx_tablecontext.cpp @@ -621,9 +621,13 @@ namespace oox { { return state()->serialize_protection(_Wostream); } - void xlsx_table_context::serialize_conditionalFormatting(std::wostream& _Wostream) + void xlsx_table_context::serialize_condFormatting(std::wostream& _Wostream) { - return state()->serialize_conditionalFormatting(_Wostream); + return state()->serialize_condFormatting(_Wostream); + } + void xlsx_table_context::serialize_condFormattingEx(std::wostream& _Wostream) + { + return state()->serialize_condFormattingEx(_Wostream); } void xlsx_table_context::serialize_merge_cells(std::wostream& _Wostream) { diff --git a/OdfFile/Reader/Converter/xlsx_tablecontext.h b/OdfFile/Reader/Converter/xlsx_tablecontext.h index 86b1408841..7cde938de7 100644 --- a/OdfFile/Reader/Converter/xlsx_tablecontext.h +++ b/OdfFile/Reader/Converter/xlsx_tablecontext.h @@ -88,7 +88,8 @@ public: void serialize_autofilter (std::wostream & _Wostream); void serialize_merge_cells (std::wostream & _Wostream); void serialize_table_format (std::wostream & _Wostream); - void serialize_conditionalFormatting(std::wostream & _Wostream); + void serialize_condFormatting (std::wostream & _Wostream); + void serialize_condFormattingEx (std::wostream& _Wostream); void serialize_hyperlinks (std::wostream & _Wostream); void serialize_ole_objects (std::wostream & _Wostream); void serialize_controls (std::wostream & _Wostream); diff --git a/OdfFile/Reader/Converter/xlsxconversioncontext.cpp b/OdfFile/Reader/Converter/xlsxconversioncontext.cpp index acdbf41768..7c7b79323c 100644 --- a/OdfFile/Reader/Converter/xlsxconversioncontext.cpp +++ b/OdfFile/Reader/Converter/xlsxconversioncontext.cpp @@ -520,7 +520,8 @@ void xlsx_conversion_context::end_table() get_table_context().serialize_table_format (current_sheet().sheetFormat()); get_table_context().serialize_page_properties (current_sheet().page_properties()); get_table_context().serialize_header_footer (current_sheet().header_footer()); - get_table_context().serialize_conditionalFormatting (current_sheet().conditionalFormatting()); + get_table_context().serialize_condFormattingEx (current_sheet().conditionalFormattingEx()); + get_table_context().serialize_condFormatting (current_sheet().conditionalFormatting()); get_table_context().serialize_tableParts (current_sheet().tableParts(), current_sheet().sheet_rels()); get_table_context().serialize_autofilter (current_sheet().autofilter()); get_table_context().serialize_sort (current_sheet().sort()); diff --git a/OdfFile/Reader/Format/calcext_elements.cpp b/OdfFile/Reader/Format/calcext_elements.cpp index d8b152833f..2eee236ec8 100644 --- a/OdfFile/Reader/Format/calcext_elements.cpp +++ b/OdfFile/Reader/Format/calcext_elements.cpp @@ -60,6 +60,7 @@ void calcext_data_bar_attr::add_attributes( const xml::attributes_wc_ptr & Attri CP_APPLY_ATTR(L"calcext:min-length", min_length_); CP_APPLY_ATTR(L"calcext:max-length", max_length_); CP_APPLY_ATTR(L"calcext:axis-position", axis_position_); + CP_APPLY_ATTR(L"calcext:gradient", gradient_); } void calcext_icon_set_attr::add_attributes( const xml::attributes_wc_ptr & Attributes ) @@ -72,6 +73,7 @@ void calcext_condition_attr::add_attributes( const xml::attributes_wc_ptr & Attr CP_APPLY_ATTR(L"calcext:base-cell-address", base_cell_address_); CP_APPLY_ATTR(L"calcext:apply-style-name", apply_style_name_); CP_APPLY_ATTR(L"calcext:value", value_); + CP_APPLY_ATTR(L"loext:stdDev", loext_stdDev_); } void calcext_date_is_attr::add_attributes( const xml::attributes_wc_ptr & Attributes ) { @@ -180,6 +182,9 @@ void calcext_data_bar::xlsx_convert(oox::xlsx_conversion_context & Context) if (attr_.axis_position_) Context.get_conditionalFormatting_context().set_axis_position(*attr_.axis_position_); + if (attr_.gradient_) + Context.get_conditionalFormatting_context().set_gradient(*attr_.gradient_); + Context.get_conditionalFormatting_context().set_dataBar(attr_.min_length_, attr_.max_length_); for (size_t i = 0 ; i < content_.size(); i++) @@ -233,7 +238,7 @@ void calcext_icon_set::xlsx_convert(oox::xlsx_conversion_context & Context) } } -// calcext_formatting_entry +/// calcext:formatting-entry //--------------------------------------------------------------------------------------------------------- const wchar_t * calcext_formatting_entry::ns = L"calcext"; const wchar_t * calcext_formatting_entry::name = L"formatting-entry"; @@ -309,6 +314,9 @@ void calcext_condition::xlsx_convert(oox::xlsx_conversion_context & Context) if (dxfId >= 0) Context.get_conditionalFormatting_context().set_dxf(dxfId); + + if (attr_.loext_stdDev_) + Context.get_conditionalFormatting_context().set_stdDev(*attr_.loext_stdDev_); } // calcext_condition //--------------------------------------------------------------------------------------------------------- diff --git a/OdfFile/Reader/Format/calcext_elements.h b/OdfFile/Reader/Format/calcext_elements.h index 987d9150f7..d001359329 100644 --- a/OdfFile/Reader/Format/calcext_elements.h +++ b/OdfFile/Reader/Format/calcext_elements.h @@ -53,12 +53,13 @@ class calcext_data_bar_attr public: void add_attributes( const xml::attributes_wc_ptr & Attributes ); - _CP_OPT(odf_types::color) axis_color_; - _CP_OPT(odf_types::color) positive_color_; - _CP_OPT(odf_types::color) negative_color_; - _CP_OPT(std::wstring) axis_position_; - _CP_OPT(int) max_length_; - _CP_OPT(int) min_length_; + _CP_OPT(odf_types::color) axis_color_; + _CP_OPT(odf_types::color) positive_color_; + _CP_OPT(odf_types::color) negative_color_; + _CP_OPT(std::wstring) axis_position_; + _CP_OPT(bool) gradient_; + _CP_OPT(unsigned int) min_length_; + _CP_OPT(unsigned int) max_length_; }; class calcext_condition_attr @@ -69,6 +70,7 @@ public: _CP_OPT(std::wstring) base_cell_address_; _CP_OPT(std::wstring) apply_style_name_; _CP_OPT(std::wstring) value_; + _CP_OPT(int) loext_stdDev_; }; class calcext_icon_set_attr @@ -77,7 +79,6 @@ public: void add_attributes( const xml::attributes_wc_ptr & Attributes ); _CP_OPT(odf_types::iconset_type) icon_set_type_; - }; class calcext_date_is_attr diff --git a/OdfFile/Reader/Format/documentcontext.cpp b/OdfFile/Reader/Format/documentcontext.cpp index a5549a3045..a74e425205 100644 --- a/OdfFile/Reader/Format/documentcontext.cpp +++ b/OdfFile/Reader/Format/documentcontext.cpp @@ -36,7 +36,7 @@ namespace cpdoccore { namespace odf_reader { -document_context::document_context() : last_paragraph(NULL) +document_context::document_context() : last_paragraph(NULL), is_old_version(false) { } diff --git a/OdfFile/Reader/Format/documentcontext.h b/OdfFile/Reader/Format/documentcontext.h index 4e1bf4bcbb..b37fde3163 100644 --- a/OdfFile/Reader/Format/documentcontext.h +++ b/OdfFile/Reader/Format/documentcontext.h @@ -49,6 +49,7 @@ public: office_element* get_last_element(); std::wstring office_class_; //openoffice xml 1.0 + bool is_old_version; //openoffice xml 1.0 std::vector levels; office_element* last_paragraph; diff --git a/OdfFile/Reader/Format/draw_frame_docx.cpp b/OdfFile/Reader/Format/draw_frame_docx.cpp index 64e4e50bf5..567d4eca62 100644 --- a/OdfFile/Reader/Format/draw_frame_docx.cpp +++ b/OdfFile/Reader/Format/draw_frame_docx.cpp @@ -1644,18 +1644,21 @@ void draw_object::docx_convert(oox::docx_conversion_context & Context) try { std::wstring href = xlink_attlist_.href_.get_value_or(L""); - std::wstring tempPath = Context.root()->get_temp_folder(); std::wstring odfPath = Context.root()->get_folder(); - + std::wstring tempPath = Context.root()->get_temp_folder(); + if (!odf_document_ && false == href.empty()) { if (href[0] == L'#') href = href.substr(1); - std::wstring objectPath = odfPath + FILE_SEPARATOR_STR + href; - // normalize path ???? todooo - XmlUtils::replace_all( objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR); + if (Context.get_mediaitems()->is_internal_path(href, odfPath)) + { + std::wstring objectPath = odfPath + FILE_SEPARATOR_STR + href; + // normalize path ???? todooo - odf_document_ = odf_document_ptr(new odf_document(objectPath, tempPath, L"")); + XmlUtils::replace_all(objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR); + odf_document_ = odf_document_ptr(new odf_document(objectPath, tempPath, L"")); + } } //--------------------------------------------------------------------------------------------------------------------- office_element* contentSubDoc = odf_document_ ? odf_document_->get_impl()->get_content() : NULL; @@ -1807,25 +1810,35 @@ void draw_object_ole::docx_convert(oox::docx_conversion_context & Context) //------------------------------------------------ std::wstring href = xlink_attlist_.href_.get_value_or(L""); - std::wstring folderPath = Context.root()->get_folder(); - std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href; - if (href.empty()) return; draw_frame* frame = Context.get_drawing_context().get_current_frame(); //owner if (!frame) return; - oox::_docx_drawing * drawing = dynamic_cast(frame->oox_drawing_.get()); + if (href.empty()) return; + + oox::_docx_drawing* drawing = dynamic_cast(frame->oox_drawing_.get()); if (!drawing) return; - - std::wstring extension; - detectObject(objectPath, drawing->objectProgId, extension, drawing->type); - NSFile::CFileBinary::Copy(objectPath, objectPath + extension); + std::wstring folderPath = Context.root()->get_folder(); + if (Context.get_mediaitems()->is_internal_path(href, folderPath)) + { + std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href; - bool isMediaInternal = true; - drawing->objectId = Context.get_mediaitems()->add_or_find(href + extension, drawing->type, isMediaInternal, href, Context.get_type_place()); + std::wstring extension; + detectObject(objectPath, drawing->objectProgId, extension, drawing->type); + NSFile::CFileBinary::Copy(objectPath, objectPath + extension); + + bool isMediaInternal = true; + drawing->objectId = Context.get_mediaitems()->add_or_find(href + extension, drawing->type, isMediaInternal, href, Context.get_type_place()); + } + else + { + bool isMediaInternal = false; + drawing->objectId = Context.get_mediaitems()->add_or_find(href, oox::typeOleObject, isMediaInternal, href, Context.get_type_place()); + + } } void draw_control::docx_convert(oox::docx_conversion_context & Context) { diff --git a/OdfFile/Reader/Format/draw_frame_pptx.cpp b/OdfFile/Reader/Format/draw_frame_pptx.cpp index 55df515d82..83927b7898 100644 --- a/OdfFile/Reader/Format/draw_frame_pptx.cpp +++ b/OdfFile/Reader/Format/draw_frame_pptx.cpp @@ -88,7 +88,7 @@ void draw_frame::pptx_convert(oox::pptx_conversion_context & Context) { common_shape_draw_attlist &common_draw_attlist_ = common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_; common_presentation_attlist &common_presentation_attlist_ = common_draw_attlists_.shape_with_text_and_styles_.common_presentation_attlist_; - + const unsigned int z_index = common_draw_attlist_.draw_z_index_.get_value_or(0); const std::wstring name = common_draw_attlist_.draw_name_.get_value_or(L""); const std::wstring textStyleName = common_draw_attlist_.draw_text_style_name_.get_value_or(L""); @@ -191,12 +191,32 @@ void draw_frame::pptx_convert(oox::pptx_conversion_context & Context) Context.get_slide_context().set_placeHolder_idx(idx_in_owner); } + if (common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.drawooo_display_) + { + Context.get_slide_context().set_hidden(true); + } + if (!textStyleName.empty()) { odf_reader::style_instance* textStyleInst = Context.root()->odf_context().styleContainer().style_by_name(textStyleName, odf_types::style_family::Paragraph, Context.process_masters_); paragraph_format_properties paragraph_properties = calc_paragraph_properties_content(textStyleInst); + + if (paragraph_properties.style_writing_mode_) + { + const odf_types::writing_mode& mode = *paragraph_properties.style_writing_mode_; + if (mode.get_type() == odf_types::writing_mode::TbRl) + { + _property vert = _property(L"text_vert", 1); + Context.get_slide_context().set_property(vert); + } + else if (mode.get_type() == odf_types::writing_mode::TbLr) + { + _property vert270 = _property(L"text_vert", 2); + Context.get_slide_context().set_property(vert270); + } + } } if (office_event_listeners_) office_event_listeners_->pptx_convert(Context); @@ -341,12 +361,13 @@ void draw_object::pptx_convert(oox::pptx_conversion_context & Context) { if (href[0] == L'#') href = href.substr(1); - std::wstring objectPath = odfPath + FILE_SEPARATOR_STR + href; - - // normalize path ???? todooo - XmlUtils::replace_all( objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR); - - odf_document_ = odf_document_ptr(new odf_document(objectPath, tempPath, L"")); + if (Context.get_mediaitems()->is_internal_path(href, odfPath)) + { + std::wstring objectPath = odfPath + FILE_SEPARATOR_STR + href; + // normalize path ???? todooo + XmlUtils::replace_all(objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR); + odf_document_ = odf_document_ptr(new odf_document(objectPath, tempPath, L"")); + } } //--------------------------------------------------------------------------------------------------------------------- office_element *contentSubDoc = odf_document_ ? odf_document_->get_impl()->get_content() : NULL; @@ -465,12 +486,14 @@ void draw_object_ole::pptx_convert(oox::pptx_conversion_context & Context) { Context.get_slide_context().set_use_image_replacement(); - std::wstring href = xlink_attlist_.href_.get_value_or(L""); - std::wstring folderPath = Context.root()->get_folder(); - std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href; + std::wstring href = xlink_attlist_.href_.get_value_or(L""); + if (href.empty()) return; - if (!href.empty()) + std::wstring folderPath = Context.root()->get_folder(); + if (Context.get_mediaitems()->is_internal_path(href, folderPath)) { + std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href; + std::wstring prog, extension; oox::_rels_type relsType; detectObject(objectPath, prog, extension, relsType); @@ -482,6 +505,10 @@ void draw_object_ole::pptx_convert(oox::pptx_conversion_context & Context) else Context.get_slide_context().set_ole_object(href + extension, prog); } + else + { + Context.get_slide_context().set_ole_object(href, L""); + } } void draw_param::pptx_convert(oox::pptx_conversion_context & Context) diff --git a/OdfFile/Reader/Format/draw_frame_xlsx.cpp b/OdfFile/Reader/Format/draw_frame_xlsx.cpp index ab7ee9bacf..5aabe7921e 100644 --- a/OdfFile/Reader/Format/draw_frame_xlsx.cpp +++ b/OdfFile/Reader/Format/draw_frame_xlsx.cpp @@ -340,19 +340,22 @@ void draw_object::xlsx_convert(oox::xlsx_conversion_context & Context) try { std::wstring href = xlink_attlist_.href_.get_value_or(L""); - + std::wstring tempPath = Context.root()->get_temp_folder(); + if (!odf_document_ && false == href.empty()) { if (href[0] == L'#') href = href.substr(1); - - std::wstring tempPath = Context.root()->get_temp_folder(); + std::wstring folderPath = Context.root()->get_folder(); - std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href; + if (Context.get_mediaitems()->is_internal_path(href, folderPath)) + { + std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href; - // normalize path ???? todooo - XmlUtils::replace_all( objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR); + // normalize path ???? todooo + XmlUtils::replace_all(objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR); - odf_document_ = odf_document_ptr(new odf_document(objectPath, tempPath, L"")); + odf_document_ = odf_document_ptr(new odf_document(objectPath, tempPath, L"")); + } } office_element *contentSubDoc = odf_document_ ? odf_document_->get_impl()->get_content() : NULL; if (!contentSubDoc) @@ -439,11 +442,13 @@ void draw_object_ole::xlsx_convert(oox::xlsx_conversion_context & Context) Context.get_drawing_context().set_use_image_replacement(); std::wstring href = xlink_attlist_.href_.get_value_or(L""); - std::wstring folderPath = Context.root()->get_folder(); - std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href; + if (href.empty()) return; - if (!href.empty()) + std::wstring folderPath = Context.root()->get_folder(); + if (Context.get_mediaitems()->is_internal_path(href, folderPath)) { + std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href; + std::wstring prog, extension; oox::_rels_type relsType; detectObject(objectPath, prog, extension, relsType); @@ -455,6 +460,10 @@ void draw_object_ole::xlsx_convert(oox::xlsx_conversion_context & Context) else Context.get_drawing_context().set_ole_object(href + extension, prog); } + else + { + Context.get_drawing_context().set_ole_object(href, L""); + } } } diff --git a/OdfFile/Reader/Format/draw_shapes_pptx.cpp b/OdfFile/Reader/Format/draw_shapes_pptx.cpp index e3e2cd70ba..04bc9eb8ed 100644 --- a/OdfFile/Reader/Format/draw_shapes_pptx.cpp +++ b/OdfFile/Reader/Format/draw_shapes_pptx.cpp @@ -397,10 +397,7 @@ void draw_connector::pptx_convert(oox::pptx_conversion_context & Context) } void draw_enhanced_geometry::pptx_convert(oox::pptx_conversion_context & Context) { - find_draw_type_oox(); - - bool set_shape = oox_convert(Context.get_slide_context().get_properties()); - + bool set_shape = oox_convert(Context.get_slide_context().get_properties()); if (!set_shape) { diff --git a/OdfFile/Reader/Format/math_elements.cpp b/OdfFile/Reader/Format/math_elements.cpp index 7e68a62abf..aa46882f15 100644 --- a/OdfFile/Reader/Format/math_elements.cpp +++ b/OdfFile/Reader/Format/math_elements.cpp @@ -31,6 +31,7 @@ */ #include "math_elements.h" +#include "../Converter/StarMath2OOXML/cconversionsmtoooxml.h" namespace cpdoccore { @@ -93,10 +94,39 @@ void math_semantics::add_child_element( xml::sax * Reader, const std::wstring & void math_semantics::oox_convert(oox::math_context & Context) { - for (size_t i = 0 ; i < content_.size(); i++) + math_annotation* annotation = dynamic_cast(annotation_.get()); + math_annotation_xml* annotation_xml = dynamic_cast(annotation_.get()); + + std::wstring annotation_text; + if ((annotation) && (annotation->text_)) annotation_text = *annotation->text_; + else if ((annotation_xml) && (annotation_xml->text_)) annotation_text = *annotation_xml->text_; + + bool result = false; + if (!annotation_text.empty()) { - office_math_element* math_element = dynamic_cast(content_[i].get()); - math_element->oox_convert(Context); + result = true; + StarMath::CParserStarMathString parser; + StarMath::CConversionSMtoOOXML converter; + + // базовые свойства шрифта для математики + /*parser.set*/ /*?*/ /*converter.set*/ Context.base_font_name_; + /*parser.set*/ /*?*/ /*converter.set*/ Context.base_font_size_; + /*parser.set*/ /*?*/ /*converter.set*/ Context.base_alignment_; + /*parser.set*/ /*?*/ /*converter.set*/ Context.base_font_italic_; + /*parser.set*/ /*?*/ /*converter.set*/ Context.base_font_bold_; + + /*result = */converter.StartConversion(parser.Parse(annotation_text)); + + Context.output_stream() << converter.GetOOXML(); + } + + if (!result) + { + for (size_t i = 0; i < content_.size(); i++) + { + office_math_element* math_element = dynamic_cast(content_[i].get()); + math_element->oox_convert(Context); + } } } @@ -126,11 +156,6 @@ void math_annotation::add_text(const std::wstring & Text) text_ = Text; } -void math_annotation::oox_convert(oox::math_context & Context) -{ - -} - //---------------------------------------------------------------------------------------------------- const wchar_t * math_annotation_xml::ns = L"math"; const wchar_t * math_annotation_xml::name = L"annotation-xml"; @@ -157,10 +182,6 @@ void math_annotation_xml::add_text(const std::wstring & Text) text_ = Text; } -void math_annotation_xml::oox_convert(oox::math_context & Context) -{ - -} //---------------------------------------------------------------------------------------------------- } diff --git a/OdfFile/Reader/Format/math_elements.h b/OdfFile/Reader/Format/math_elements.h index e7691fa0d5..0c8e49dbec 100644 --- a/OdfFile/Reader/Format/math_elements.h +++ b/OdfFile/Reader/Format/math_elements.h @@ -119,16 +119,16 @@ public: static const xml::NodeType xml_type = xml::typeElement; static const ElementType type = typeMathAnnotation; - virtual void oox_convert(oox::math_context & Context); + virtual void oox_convert(oox::math_context& Context) {} + _CP_OPT(std::wstring) text_; private: virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ); virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name); virtual void add_text(const std::wstring & Text); - office_element_ptr_array content_; - _CP_OPT(std::wstring) text_; - _CP_OPT(std::wstring) encoding_; + office_element_ptr_array content_; + _CP_OPT(std::wstring) encoding_; }; CP_REGISTER_OFFICE_ELEMENT2(math_annotation); @@ -142,15 +142,15 @@ public: static const xml::NodeType xml_type = xml::typeElement; static const ElementType type = typeMathAnnotationXml; - virtual void oox_convert(oox::math_context & Context); + virtual void oox_convert(oox::math_context& Context) {} + _CP_OPT(std::wstring) text_; private: virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ); virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name); virtual void add_text(const std::wstring & Text); office_element_ptr_array content_; - _CP_OPT(std::wstring) text_; _CP_OPT(std::wstring) encoding_; }; diff --git a/OdfFile/Reader/Format/paragraph_elements.cpp b/OdfFile/Reader/Format/paragraph_elements.cpp index dd5bc730bf..d4bc450363 100644 --- a/OdfFile/Reader/Format/paragraph_elements.cpp +++ b/OdfFile/Reader/Format/paragraph_elements.cpp @@ -91,6 +91,31 @@ void paragraph_content_element::docx_serialize_field(const std::wstring & field_ strm << L""; } } + +void paragraph_content_element::docx_serialize_field(const std::wstring& field_name, office_element_ptr_array& content, + oox::docx_conversion_context& Context, bool bLock) +{ + std::wostream& strm = Context.output_stream(); + Context.finish_run(); + + if (false == field_name.empty()) + { + strm << L""; + strm << L"" << field_name << L""; + } + + docx_serialize_run(content, Context); + + if (false == field_name.empty()) + { + strm << L""; + } +} void paragraph_content_element::docx_serialize_sdt_placeholder(const std::wstring & name, office_element_ptr & text, oox::docx_conversion_context & Context) { std::wostream & strm = Context.output_stream(); @@ -105,7 +130,20 @@ void paragraph_content_element::docx_serialize_sdt_placeholder(const std::wstrin strm << L""; } +void paragraph_content_element::docx_serialize_sdt_placeholder(const std::wstring& name, office_element_ptr_array& content, oox::docx_conversion_context& Context) +{ + std::wostream& strm = Context.output_stream(); + Context.finish_run(); + strm << L""; + strm << L""; + + docx_serialize_run(content, Context); + + strm << L""; +} void paragraph_content_element::docx_serialize_run(office_element_ptr & text, oox::docx_conversion_context & Context) { Context.add_new_run(); @@ -115,7 +153,23 @@ void paragraph_content_element::docx_serialize_run(office_element_ptr & text, oo } Context.finish_run(); } - +void paragraph_content_element::docx_serialize_run(office_element_ptr_array& content, oox::docx_conversion_context& Context) +{ + for (size_t i = 0; i < content.size(); ++i) + { + docx_serialize_run(content[i], Context); + } +} +void paragraph_content_element::xlsx_serialize(std::wostream& _Wostream, oox::xlsx_conversion_context& Context) +{ + std::wstringstream val; + text_to_stream(val, true); + std::wstring val_text = val.str(); + if (val_text != L"???") + { + _Wostream << val_text; + } +} //------------------------------------------------------------------------------------------------------------ const wchar_t * text::ns = L""; const wchar_t * text::name = L""; @@ -396,7 +450,26 @@ void bookmark_ref::add_attributes( const xml::attributes_wc_ptr & Attributes ) } void bookmark_ref::add_text(const std::wstring & Text) { - content_ = Text; + office_element_ptr elm = text::create(Text); + content_.push_back( elm ); +} +void bookmark_ref::add_child_element(xml::sax* Reader, const std::wstring& Ns, const std::wstring& Name) +{ + CP_CREATE_ELEMENT(content_); +} +void bookmark_ref::docx_convert(oox::docx_conversion_context& Context) +{ + std::wstring field_name = (ref_name_ ? L"REF " + *ref_name_ : L"REF") + L" \\h"; + + if (reference_format_) + { + switch (reference_format_->get_type()) + { + case reference_format::direction: field_name += L" \\p"; break; + case reference_format::number: field_name += L" \\n"; break; + } + } + docx_serialize_field(field_name, content_, Context); } // text:reference-ref ////////////////////////////////////////////////////////////////////////////////////////////////// @@ -676,16 +749,16 @@ void a::add_space(const std::wstring & Text) } void a::docx_convert(oox::docx_conversion_context & Context) { - bool pushed_style = false; - - bool addNewRun = false; - Context.finish_run(); - - std::wostream & _Wostream = Context.output_stream(); - std::wstring ref = xlink_attlist_.href_.get_value_or(L""); + if (ref.empty()) return; + + bool pushed_style = false; + bool addNewRun = false; + + Context.finish_run(); - if (Context.is_table_content()) + std::wostream& _Wostream = Context.output_stream(); + if (Context.is_table_content() || office_target_frame_name_ || ref[0] == L'#') { size_t pos_outline = ref.find(L"|outline"); if (std::wstring::npos != pos_outline)//без # @@ -702,11 +775,14 @@ void a::docx_convert(oox::docx_conversion_context & Context) { ref = XmlUtils::EncodeXmlString(ref.substr(1)); } - _Wostream << L""; - int type = Context.get_table_content_context().get_type_current_content_template_index(); - //type == 3 (LinkStart) - Context.get_table_content_context().next_level_index(); + + if (Context.is_table_content()) + { + int type = Context.get_table_content_context().get_type_current_content_template_index(); + //type == 3 (LinkStart) + Context.get_table_content_context().next_level_index(); + } } else { @@ -1002,7 +1078,11 @@ void title::xlsx_convert(oox::xlsx_conversion_context & Context) { std::wstringstream val; text_to_stream(val); - Context.get_text_context()->add_text(val.str()); + std::wstring _title = val.str(); + if (_title != L"???") + { + Context.get_text_context()->add_text(_title); + } } void title::pptx_convert(oox::pptx_conversion_context & Context) { @@ -1036,11 +1116,15 @@ void subject::docx_convert(oox::docx_conversion_context & Context) docx_serialize_field(L"SUBJECT", text_, Context); } -void subject::xlsx_convert(oox::xlsx_conversion_context & Context) +void subject::xlsx_convert(oox::xlsx_conversion_context& Context) { - std::wstringstream val; - this->text_to_stream(val); - Context.get_text_context()->add_text(val.str()); + std::wstringstream val; + this->text_to_stream(val); + std::wstring _subject = val.str(); + if (_subject != L"???") + { + Context.get_text_context()->add_text(_subject); + } } void subject::pptx_convert(oox::pptx_conversion_context & Context) { @@ -1075,7 +1159,11 @@ void chapter::xlsx_convert(oox::xlsx_conversion_context & Context) { std::wstringstream val; this->text_to_stream(val); - Context.get_text_context()->add_text(val.str()); + std::wstring _chapter = val.str(); + if (_chapter != L"???") + { + Context.get_text_context()->add_text(_chapter); + } } void chapter::pptx_convert(oox::pptx_conversion_context & Context) { @@ -1088,30 +1176,32 @@ void chapter::pptx_convert(oox::pptx_conversion_context & Context) const wchar_t * text_placeholder::ns = L"text"; const wchar_t * text_placeholder::name = L"placeholder"; -std::wostream & text_placeholder::text_to_stream(std::wostream & _Wostream, bool bXmlEncode) const -{ - CP_SERIALIZE_TEXT(text_, bXmlEncode); - return _Wostream; -} - void text_placeholder::add_attributes( const xml::attributes_wc_ptr & Attributes ) { } +std::wostream & text_placeholder::text_to_stream(std::wostream & _Wostream, bool bXmlEncode) const +{ + CP_SERIALIZE_TEXT(content_, bXmlEncode); + return _Wostream; +} +void text_placeholder::add_child_element(xml::sax* Reader, const std::wstring& Ns, const std::wstring& Name) +{ + CP_CREATE_ELEMENT(content_); +} void text_placeholder::add_text(const std::wstring & Text) { - text_ = text::create(Text) ; + office_element_ptr text = text::create(Text) ; + content_.push_back(text); } - void text_placeholder::docx_convert(oox::docx_conversion_context & Context) { - docx_serialize_sdt_placeholder(L"Click placeholder and overwrite", text_, Context); + docx_serialize_sdt_placeholder(L"Click placeholder and overwrite", content_, Context); } - void text_placeholder::pptx_convert(oox::pptx_conversion_context & Context) { - if (text_) + for (size_t i = 0; i < content_.size(); ++i) { - text_->pptx_convert(Context); + content_[i]->pptx_convert(Context); } } @@ -1424,18 +1514,18 @@ void sequence::add_attributes( const xml::attributes_wc_ptr & Attributes ) } std::wostream & sequence::text_to_stream(std::wostream & _Wostream, bool bXmlEncode) const { - CP_SERIALIZE_TEXT(text_, bXmlEncode); + CP_SERIALIZE_TEXT(content_, bXmlEncode); return _Wostream; } void sequence::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name) { - CP_CREATE_ELEMENT(text_); + CP_CREATE_ELEMENT(content_); } void sequence::add_text(const std::wstring & Text) { office_element_ptr elm = text::create(Text) ; - text_.push_back( elm ); + content_.push_back( elm ); } void sequence::docx_convert(oox::docx_conversion_context & Context) @@ -1485,9 +1575,9 @@ void sequence::docx_convert(oox::docx_conversion_context & Context) Context.start_bookmark(name); Context.output_stream() << L""; Context.add_new_run(); - for (size_t i = 0; i < text_.size(); i++) + for (size_t i = 0; i < content_.size(); i++) { - text_[i]->docx_convert(Context); + content_[i]->docx_convert(Context); } Context.finish_run(); @@ -1502,9 +1592,9 @@ void sequence::docx_convert(oox::docx_conversion_context & Context) } void sequence::pptx_convert(oox::pptx_conversion_context & Context) { - for (size_t i = 0; i < text_.size(); i++) + for (size_t i = 0; i < content_.size(); i++) { - text_[i]->pptx_convert(Context); + content_[i]->pptx_convert(Context); } } //------------------------------------------------------------------------------------------------------------ diff --git a/OdfFile/Reader/Format/paragraph_elements.h b/OdfFile/Reader/Format/paragraph_elements.h index d690b77546..c36d2dde59 100644 --- a/OdfFile/Reader/Format/paragraph_elements.h +++ b/OdfFile/Reader/Format/paragraph_elements.h @@ -42,6 +42,7 @@ #include "../../DataTypes/noteclass.h" #include "../../DataTypes/bool.h" #include "../../DataTypes/bibliography.h" +#include "../../DataTypes/referenceformat.h" #include "../../Reader/Converter/docx_conversion_context.h" @@ -67,14 +68,17 @@ public: virtual void xlsx_convert(oox::xlsx_conversion_context & Context){} virtual void pptx_convert(oox::pptx_conversion_context & Context){} - virtual void docx_serialize_sdt_placeholder(const std::wstring & name, office_element_ptr & text, oox::docx_conversion_context & Context); - virtual void docx_serialize_field(const std::wstring & field_name, office_element_ptr & text, oox::docx_conversion_context & Context, bool bLock = false); - virtual void docx_serialize_run(office_element_ptr & text, oox::docx_conversion_context & Context); + virtual void docx_serialize_sdt_placeholder(const std::wstring& name, office_element_ptr_array& content, oox::docx_conversion_context& Context); + virtual void docx_serialize_sdt_placeholder(const std::wstring & name, office_element_ptr & text, oox::docx_conversion_context & Context); + + virtual void docx_serialize_field(const std::wstring & field_name, office_element_ptr & content, oox::docx_conversion_context & Context, bool bLock = false); + virtual void docx_serialize_field(const std::wstring& field_name, office_element_ptr_array& text, oox::docx_conversion_context& Context, bool bLock = false); + + virtual void docx_serialize_run(office_element_ptr & text, oox::docx_conversion_context & Context); + virtual void docx_serialize_run(office_element_ptr_array& content, oox::docx_conversion_context& Context); + + virtual void xlsx_serialize(std::wostream& _Wostream, oox::xlsx_conversion_context& Context); - virtual void xlsx_serialize(std::wostream & _Wostream, oox::xlsx_conversion_context & Context) - { - text_to_stream(_Wostream, true); - } private: virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ){} virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name){} @@ -245,7 +249,6 @@ private: virtual void add_text(const std::wstring & Text) {} }; - CP_REGISTER_OFFICE_ELEMENT2(bookmark); //------------------------------------------------------------------------------------------------------------------- // text:bookmark-start @@ -314,12 +317,15 @@ public: CPDOCCORE_DEFINE_VISITABLE(); CPDOCCORE_OFFICE_DOCUMENT_IMPL_NAME_FUNCS_; - _CP_OPT(std::wstring) ref_name_; - _CP_OPT(std::wstring) reference_format_; - std::wstring content_; + virtual void docx_convert(oox::docx_conversion_context& Context); + + _CP_OPT(std::wstring) ref_name_; + _CP_OPT(odf_types::reference_format) reference_format_; + + office_element_ptr_array content_; private: virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ); - virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name) {} + virtual void add_child_element(xml::sax* Reader, const std::wstring& Ns, const std::wstring& Name); virtual void add_text(const std::wstring & Text); }; CP_REGISTER_OFFICE_ELEMENT2(bookmark_ref); @@ -337,9 +343,10 @@ public: CPDOCCORE_DEFINE_VISITABLE(); CPDOCCORE_OFFICE_DOCUMENT_IMPL_NAME_FUNCS_; - _CP_OPT(std::wstring) ref_name_; - _CP_OPT(std::wstring) reference_format_; - std::wstring content_; + _CP_OPT(std::wstring) ref_name_; + _CP_OPT(odf_types::reference_format) reference_format_; + + std::wstring content_; private: virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ); @@ -699,10 +706,10 @@ public: _CP_OPT(std::wstring) text_description_; _CP_OPT(std::wstring) text_placeholder_type_; - office_element_ptr text_; + office_element_ptr_array content_; private: virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ); - virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name){} + virtual void add_child_element(xml::sax* Reader, const std::wstring& Ns, const std::wstring& Name); virtual void add_text(const std::wstring & Text); }; @@ -1007,7 +1014,7 @@ public: _CP_OPT(std::wstring) ref_name_; _CP_OPT(std::wstring) template_; - office_element_ptr_array text_; + office_element_ptr_array content_; private: virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ); virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name); @@ -1086,10 +1093,10 @@ public: void docx_convert(oox::docx_conversion_context & Context); - _CP_OPT(std::wstring) reference_format_;//caption, category-and-value, value, chapter, direction, page, text, number, number-all-superior, number-no-superior - _CP_OPT(std::wstring) ref_name_; + _CP_OPT(odf_types::reference_format) reference_format_; + _CP_OPT(std::wstring) ref_name_; - office_element_ptr text_; + office_element_ptr text_; private: virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ); diff --git a/OdfFile/Reader/Format/styles.cpp b/OdfFile/Reader/Format/styles.cpp index 6276981d8a..95be324126 100644 --- a/OdfFile/Reader/Format/styles.cpp +++ b/OdfFile/Reader/Format/styles.cpp @@ -41,6 +41,8 @@ #include "serialize_elements.h" #include "odfcontext.h" #include "draw_common.h" +#include "paragraph_elements.h" +#include "text_elements.h" namespace cpdoccore { @@ -279,6 +281,8 @@ void style_content::add_child_element( xml::sax * Reader, const std::wstring & N } else if CP_CHECK_NAME(L"style", L"properties") { + Context->is_old_version = true; + office_element_ptr element; CP_CREATE_ELEMENT_SIMPLE(element); @@ -1431,6 +1435,34 @@ bool style_page_layout_properties::docx_background_serialize(std::wostream & str return true; } +int style_page_layout_properties::DetectPageSize(double w, double h) +{ + int result = 0; + + if (w > 209.99) // A4 and more + { + if ( w < 211 && h > 296 && h < 298) result = 9; // pagesizeA4Paper; + else if (w > 279 && w < 280 && h > 431 && h < 433) result = 3; // pagesizeTabloidPaper; + else if (w > 215 && w < 217 && h > 354 && h < 356) result = 5; // pagesizeLegalPaper; + else if (w > 296 && w < 298 && h > 419 && h < 421) result = 8; // pagesizeA3Paper; + else if (w > 256 && w < 258 && h > 363 && h < 365) result = 12; // pagesizeB4Paper; + else if (w > 215 && w < 217 && h > 329 && h < 331) result = 14; // pagesizeFolioPaper; + else if (w > 228 && w < 230 && h > 323 && h < 325) result = 30; // pagesizeC4Envelope; + else if (w > 215 && w < 217 && h > 278 && h < 280) result = 1; // pagesizeLetterPaper; + } + else + { + if (w > 183 && w < 185 && h > 265 && h < 267) result = 7; // pagesizeExecutivePaper; + else if (w > 147 && w < 149 && h > 209 && h < 211) result = 11; // pagesizeA5Paper; + else if (w > 181 && w < 183 && h > 256 && h < 259) result = 13; // pagesizeB5Paper; + else if (w > 103 && w < 106 && h > 240 && h < 243) result = 20; // pagesize10Envelope; + else if (w > 109 && w < 111 && h > 219 && h < 221) result = 27; // pagesizeDLEnvelope; + else if (w > 161 && w < 164 && h > 228 && h < 230) result = 28; // pagesizeC5Envelope; + else if (w > 97 && w < 100 && h > 189 && h < 192) result = 37; // pagesizeMonarchEnvelope; + } + + return result; +} void style_page_layout_properties::xlsx_serialize(std::wostream & strm, oox::xlsx_conversion_context & Context) { @@ -1523,14 +1555,26 @@ void style_page_layout_properties::xlsx_serialize(std::wostream & strm, oox::xls if (attlist_.fo_page_height_) { h = attlist_.fo_page_height_->get_value_unit(length::mm); - CP_XML_ATTR(L"paperHeight", (int)h); } if (attlist_.fo_page_width_) { w = attlist_.fo_page_width_->get_value_unit(length::mm); - CP_XML_ATTR(L"paperWidth", (int)w); } - CP_XML_ATTR(L"paperUnits", L"mm"); + + if (h > 0 && w > 0) + { + int paperSize = DetectPageSize(w, h); + if (0 < paperSize) + { + CP_XML_ATTR(L"paperSize", paperSize); + } + else + { + CP_XML_ATTR(L"paperHeight", (int)h); + CP_XML_ATTR(L"paperWidth", (int)w); + CP_XML_ATTR(L"paperUnits", L"mm"); + } + } if (attlist_.style_scale_to_) { @@ -1775,16 +1819,41 @@ void style_master_page::pptx_convert(oox::pptx_conversion_context & Context) if (attlist_.draw_style_name_) { std::wstring style_name = attlist_.draw_style_name_.get(); - style_instance * style_inst = Context.root()->odf_context().styleContainer().style_by_name(style_name, style_family::DrawingPage, true); + graphic_format_properties* default_properties = NULL; + + if (getContext()->is_old_version) + { + style_instance* style_inst_def = Context.root()->odf_context().styleContainer().style_by_name(L"standard", style_family::Graphic, true); + if ((style_inst_def) && (style_inst_def->content())) + { + default_properties = style_inst_def->content()->get_graphic_properties(); + } + } + else + { + style_instance* style_inst_def = Context.root()->odf_context().styleContainer().style_default_by_type(odf_types::style_family::Graphic); + if ((style_inst_def) && (style_inst_def->content())) + { + default_properties = style_inst_def->content()->get_graphic_properties(); + } + } + style_instance * style_inst = Context.root()->odf_context().styleContainer().style_by_name(style_name, style_family::DrawingPage, true); if ((style_inst) && (style_inst->content())) { style_drawing_page_properties * properties = style_inst->content()->get_style_drawing_page_properties(); if (properties) { + odf_types::common_draw_fill_attlist calc_props; + if (default_properties) + { + calc_props.apply_from(default_properties->common_draw_fill_attlist_); + } + calc_props.apply_from(properties->content().common_draw_fill_attlist_); + oox::_oox_fill fill; - Compute_GraphicFill(properties->content().common_draw_fill_attlist_, office_element_ptr(), Context.root(), fill); + Compute_GraphicFill(calc_props, office_element_ptr(), Context.root(), fill); Context.get_slide_context().add_background(fill); } } @@ -2023,11 +2092,27 @@ void header_footer_impl::xlsx_serialize(std::wostream & _Wostream, oox::xlsx_con { region->xlsx_serialize(_Wostream, Context); } + else if (typeTextP == content_[i]->get_type()) + { + text::p* p = dynamic_cast(content_[i].get()); + for (size_t j = 0; p && j < p->paragraph_.content_.size(); j++) + { + text::paragraph_content_element* paragraph_element = dynamic_cast(p->paragraph_.content_[i].get()); + if (paragraph_element) + { + paragraph_element->xlsx_serialize(_Wostream, Context); + } + else + { + CP_SERIALIZE_TEXT(content_[i], true); + } + } + } else { CP_SERIALIZE_TEXT(content_[i], true); } - } + } } // text:notes-configuration //------------------------------------------------------------------------------------------------------- diff --git a/OdfFile/Reader/Format/styles.h b/OdfFile/Reader/Format/styles.h index 8b78ced093..61cf51eaaa 100644 --- a/OdfFile/Reader/Format/styles.h +++ b/OdfFile/Reader/Format/styles.h @@ -967,6 +967,8 @@ private: virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ); virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name); + + int DetectPageSize(double w, double h); }; CP_REGISTER_OFFICE_ELEMENT2(style_page_layout_properties); //------------------------------------------------------------------------------------------------------------------------- diff --git a/OdfFile/Reader/Format/styles_lite_container.cpp b/OdfFile/Reader/Format/styles_lite_container.cpp index 0b74c34cd9..0381d1d016 100644 --- a/OdfFile/Reader/Format/styles_lite_container.cpp +++ b/OdfFile/Reader/Format/styles_lite_container.cpp @@ -114,16 +114,17 @@ std::wstring doc_props_container::dump_user_defined() CP_XML_WRITER(output) { + int pid = 2; for (std::map::iterator it = impl_->map_user_defineds.begin(); it != impl_->map_user_defineds.end(); ++it) { CP_XML_NODE(L"property") { CP_XML_ATTR(L"fmtid", L"{D5CDD505-2E9C-101B-9397-08002B2CF9AE}"); - CP_XML_ATTR(L"name", it->first); - CP_XML_ATTR(L"pid", 2); + CP_XML_ATTR(L"pid", pid++); + CP_XML_ATTR(L"name", XmlUtils::EncodeXmlString(it->first)); CP_XML_NODE(L"vt:lpwstr") { - CP_XML_STREAM() << it->second; + CP_XML_STREAM() << XmlUtils::EncodeXmlString(it->second); } } } diff --git a/OdfFile/Writer/Converter/ConvertDrawing.cpp b/OdfFile/Writer/Converter/ConvertDrawing.cpp index 7f9ee702cb..3965a23bd7 100644 --- a/OdfFile/Writer/Converter/ConvertDrawing.cpp +++ b/OdfFile/Writer/Converter/ConvertDrawing.cpp @@ -397,7 +397,7 @@ void OoxConverter::convert(PPTX::Logic::Pic *oox_picture) { pathOle = find_link_by_id(oox_picture->oleObject->m_oId->get(), 4, bExternal); } - std::wstring odf_ref_ole = odf_context()->add_oleobject(pathOle); + std::wstring odf_ref_ole = odf_context()->add_oleobject(pathOle, bExternal); if (!odf_ref_ole.empty()) { @@ -442,7 +442,7 @@ void OoxConverter::convert(PPTX::Logic::Pic *oox_picture) } - odf_ref_image = bExternal ? pathImage : odf_context()->add_imageobject(pathImage); + odf_ref_image = odf_context()->add_imageobject(pathImage, bExternal); odf_context()->drawing_context()->set_image_replacement(odf_ref_image); odf_context()->drawing_context()->end_object_ole(); diff --git a/OdfFile/Writer/Converter/ConvertVml.cpp b/OdfFile/Writer/Converter/ConvertVml.cpp index de66957c09..3fd42d093f 100644 --- a/OdfFile/Writer/Converter/ConvertVml.cpp +++ b/OdfFile/Writer/Converter/ConvertVml.cpp @@ -332,7 +332,7 @@ namespace Oox2Odf { pathOle = find_link_by_id(vml_object->m_oId->GetValue(), 4, bExternal); } - std::wstring odf_ref_ole = odf_context()->add_oleobject(pathOle); + std::wstring odf_ref_ole = odf_context()->add_oleobject(pathOle, bExternal); if (!odf_ref_ole.empty()) { @@ -345,7 +345,7 @@ namespace Oox2Odf std::wstring sIdImageFileCache = GetImageIdFromVmlShape(vml_shape); std::wstring pathImage = find_link_by_id(sIdImageFileCache, 1, bExternal); - std::wstring odf_ref_image = odf_context()->add_imageobject(pathImage); + std::wstring odf_ref_image = odf_context()->add_imageobject(pathImage, bExternal); odf_context()->drawing_context()->set_image_replacement(odf_ref_image); diff --git a/OdfFile/Writer/Converter/DocxConverter.cpp b/OdfFile/Writer/Converter/DocxConverter.cpp index 7bceddb829..8f349f14d6 100644 --- a/OdfFile/Writer/Converter/DocxConverter.cpp +++ b/OdfFile/Writer/Converter/DocxConverter.cpp @@ -3143,7 +3143,7 @@ void DocxConverter::convert(OOX::Logic::CObject* oox_obj) { pathOle = find_link_by_id(oox_obj->m_oOleObject->m_oId->GetValue(), 4, bExternal); } - std::wstring odf_ref_ole = odf_context()->add_oleobject(pathOle); + std::wstring odf_ref_ole = odf_context()->add_oleobject(pathOle, bExternal); if (!odf_ref_ole.empty()) { @@ -3156,7 +3156,7 @@ void DocxConverter::convert(OOX::Logic::CObject* oox_obj) std::wstring sIdImageFileCache = GetImageIdFromVmlShape(oox_obj->m_oShape.GetPointer()); std::wstring pathImage = find_link_by_id(sIdImageFileCache, 1, bExternal); - std::wstring odf_ref_image = odf_context()->add_imageobject(pathImage); + std::wstring odf_ref_image = odf_context()->add_imageobject(pathImage, bExternal); OoxConverter::convert(oox_obj->m_oShape.GetPointer(), NULL); odf_context()->drawing_context()->set_image_replacement(odf_ref_image); diff --git a/OdfFile/Writer/Converter/XlsxConverter.cpp b/OdfFile/Writer/Converter/XlsxConverter.cpp index 31edbefe00..f963d5c616 100644 --- a/OdfFile/Writer/Converter/XlsxConverter.cpp +++ b/OdfFile/Writer/Converter/XlsxConverter.cpp @@ -445,9 +445,10 @@ void XlsxConverter::convert(OOX::Spreadsheet::CWorksheet *oox_sheet) if (!oox_sheet->m_arrConditionalFormatting.empty() || oox_sheet->m_oExtLst.IsInit()) { - std::multimap mapSorted; + std::multimap> mapSorted; - std::vector arUnsorted; + std::vector> arUnsorted; + std::vector> arUnsortedEx; // sort by prioritet for (size_t fmt = 0; fmt < oox_sheet->m_arrConditionalFormatting.size(); fmt++) @@ -465,9 +466,9 @@ void XlsxConverter::convert(OOX::Spreadsheet::CWorksheet *oox_sheet) } } if (priority >= 0) - mapSorted.insert(std::make_pair(priority, cond_fmt)); + mapSorted.insert(std::make_pair(priority, std::make_pair(cond_fmt, false))); else - arUnsorted.push_back(cond_fmt); + arUnsorted.push_back(std::make_pair(cond_fmt, false)); } } @@ -492,27 +493,32 @@ void XlsxConverter::convert(OOX::Spreadsheet::CWorksheet *oox_sheet) } } if (priority >= 0) - mapSorted.insert(std::make_pair(priority, cond_fmt)); + mapSorted.insert(std::make_pair(priority, std::make_pair(cond_fmt, true))); else - arUnsorted.push_back(cond_fmt); + arUnsortedEx.push_back(std::make_pair(cond_fmt, true)); } } } } //-------------------------------------------------------------------------- - if (arUnsorted.size() + mapSorted.size() > 0) + if (arUnsorted.size() + mapSorted.size() + arUnsortedEx.size() > 0) { ods_context->start_conditional_formats(); for (size_t fmt = 0; fmt < arUnsorted.size(); fmt++) { - convert(arUnsorted[fmt]); + convert(arUnsorted[fmt].first, oox_sheet->m_mapConditionalFormattingEx, arUnsorted[fmt].second); } - for (std::multimap::iterator it = mapSorted.begin(); it != mapSorted.end(); ++it) + for (std::multimap>::iterator it = mapSorted.begin(); it != mapSorted.end(); ++it) { - convert(it->second); + convert(it->second.first, oox_sheet->m_mapConditionalFormattingEx, it->second.second); + } + + for (size_t fmt = 0; fmt < arUnsortedEx.size(); fmt++) + { + convert(arUnsortedEx[fmt].first, oox_sheet->m_mapConditionalFormattingEx, arUnsortedEx[fmt].second); } ods_context->end_conditional_formats(); } @@ -1992,6 +1998,19 @@ void XlsxConverter::convert(OOX::Spreadsheet::CPageSetup *oox_page) width = odf_types::length(8.5, odf_types::length::inch); height = odf_types::length(11, odf_types::length::inch); break; + //case SimpleTypes::Spreadsheet::pagesizeLetterSmall: + case SimpleTypes::Spreadsheet::pagesizeTabloidPaper: + width = odf_types::length(279.4, odf_types::length::mm); + height = odf_types::length(431.8, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesizeLegalPaper: + width = odf_types::length(215.9, odf_types::length::mm); + height = odf_types::length(355.6, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesizeExecutivePaper: + width = odf_types::length(184.2, odf_types::length::mm); + height = odf_types::length(266.7, odf_types::length::mm); + break; case SimpleTypes::Spreadsheet::pagesizeA3Paper: width = odf_types::length(297, odf_types::length::mm); height = odf_types::length(420, odf_types::length::mm); @@ -2000,9 +2019,45 @@ void XlsxConverter::convert(OOX::Spreadsheet::CPageSetup *oox_page) width = odf_types::length(210, odf_types::length::mm); height = odf_types::length(297, odf_types::length::mm); break; + //case SimpleTypes::Spreadsheet::pagesizeA4SmallPaper: + case SimpleTypes::Spreadsheet::pagesizeA5Paper: + width = odf_types::length(148, odf_types::length::mm); + height = odf_types::length(210, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesizeB4Paper: + width = odf_types::length(257, odf_types::length::mm); + height = odf_types::length(364, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesizeB5Paper: + width = odf_types::length(182, odf_types::length::mm); + height = odf_types::length(257, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesizeFolioPaper: + width = odf_types::length(215.9, odf_types::length::mm); + height = odf_types::length(330.2, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesize10Envelope: + width = odf_types::length(104.7, odf_types::length::mm); + height = odf_types::length(241.3, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesizeDLEnvelope: + width = odf_types::length(110, odf_types::length::mm); + height = odf_types::length(220, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesizeC5Envelope: + width = odf_types::length(162, odf_types::length::mm); + height = odf_types::length(229, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesizeC4Envelope: + width = odf_types::length(229, odf_types::length::mm); + height = odf_types::length(324, odf_types::length::mm); + break; + case SimpleTypes::Spreadsheet::pagesizeMonarchEnvelope: + width = odf_types::length(98.4, odf_types::length::mm); + height = odf_types::length(190.5, odf_types::length::mm); + break; default: break; - //todooo } } ods_context->page_layout_context()->set_page_size(width, height); @@ -2956,7 +3011,7 @@ void XlsxConverter::convert(OOX::Spreadsheet::COleObjects *oox_objects, OOX::Spr std::wstring pathOle = find_link_by_id(sID, 4, bExternal); - odf_ref_object = odf_context()->add_oleobject(pathOle); + odf_ref_object = odf_context()->add_oleobject(pathOle, bExternal); } if ((object->m_oObjectPr.IsInit()) && (object->m_oObjectPr->m_oRid.IsInit())) { @@ -2964,7 +3019,7 @@ void XlsxConverter::convert(OOX::Spreadsheet::COleObjects *oox_objects, OOX::Spr std::wstring pathImage = find_link_by_id(sID, 1, bExternal); - odf_ref_image = odf_context()->add_imageobject(pathImage); + odf_ref_image = odf_context()->add_imageobject(pathImage, bExternal); } //-------------------------------------------------------------------------------------------------- if ((!bAnchor || odf_ref_image.empty()) && object->m_oShapeId.IsInit()) @@ -3409,35 +3464,66 @@ void XlsxConverter::convert(OOX::Spreadsheet::CAltTextTable *alt_text) if (!alt_text) return; } -void XlsxConverter::convert(OOX::Spreadsheet::CConditionalFormatting *oox_cond_fmt) +void XlsxConverter::convert(OOX::Spreadsheet::CConditionalFormatting *oox_cond_fmt, + std::map& mapCFRuleEx, bool isExt) { if (!oox_cond_fmt)return; - if (oox_cond_fmt->m_oSqRef.IsInit()) + bool bRule = false; + for (size_t i = 0; i < oox_cond_fmt->m_arrItems.size(); i++) + { + if (oox_cond_fmt->m_arrItems[i]->bUsage) continue; + bRule = true; + break; + } + if (!bRule) return; + + if (oox_cond_fmt->m_oSqRef.IsInit()) { ods_context->current_table()->start_conditional_format(oox_cond_fmt->m_oSqRef.get()); for (size_t i = 0; i < oox_cond_fmt->m_arrItems.size(); i++) { - convert(oox_cond_fmt->m_arrItems[i]);//rule + convert(oox_cond_fmt->m_arrItems[i], mapCFRuleEx, isExt);//rule } ods_context->current_table()->end_conditional_format(); } } -void XlsxConverter::convert(OOX::Spreadsheet::CConditionalFormattingRule *oox_cond_rule) +void XlsxConverter::convert(OOX::Spreadsheet::CConditionalFormattingRule *oox_cond_rule, + std::map& mapCFRuleEx, bool isExt) { - if (!oox_cond_rule)return; + if (!oox_cond_rule) return; + + std::map::iterator pFind; + if (oox_cond_rule->m_oExtId.IsInit()) + { + pFind = mapCFRuleEx.find(*oox_cond_rule->m_oExtId); + + if (pFind != mapCFRuleEx.end()) + { + OOX::Spreadsheet::CConditionalFormattingRule newRule = + OOX::Spreadsheet::CConditionalFormattingRule::Merge(*oox_cond_rule, *pFind->second); + + pFind->second->bUsage = true; + convert(&newRule, mapCFRuleEx, true); + return; + } + } if (false == oox_cond_rule->m_oType.IsInit()) return; _CP_OPT(unsigned int) rank; - _CP_OPT(bool) bottom, percent; - + _CP_OPT(bool) bottom, percent, above, equal; + _CP_OPT(int) stdDev; + if (oox_cond_rule->m_oRank.IsInit()) rank = oox_cond_rule->m_oRank->GetValue(); if (oox_cond_rule->m_oBottom.IsInit()) bottom = oox_cond_rule->m_oBottom->ToBool(); if (oox_cond_rule->m_oPercent.IsInit()) percent = oox_cond_rule->m_oPercent->ToBool(); + if (oox_cond_rule->m_oAboveAverage.IsInit()) above = oox_cond_rule->m_oAboveAverage->ToBool(); + if (oox_cond_rule->m_oEqualAverage.IsInit()) equal = oox_cond_rule->m_oEqualAverage->ToBool(); + if (oox_cond_rule->m_oStdDev.IsInit()) stdDev = oox_cond_rule->m_oStdDev->GetValue(); - ods_context->current_table()->start_conditional_rule(oox_cond_rule->m_oType->GetValue(), rank, bottom, percent); + ods_context->current_table()->start_conditional_rule(oox_cond_rule->m_oType->GetValue(), rank, bottom, percent, above, equal, stdDev); { if (oox_cond_rule->m_oDxfId.IsInit()) { @@ -3460,7 +3546,7 @@ void XlsxConverter::convert(OOX::Spreadsheet::CConditionalFormattingRule *oox_co if (oox_cond_rule->m_oTimePeriod.IsInit()) ods_context->current_table()->set_conditional_time(oox_cond_rule->m_oTimePeriod->GetValue()); - + convert(oox_cond_rule->m_oIconSet.GetPointer()); convert(oox_cond_rule->m_oColorScale.GetPointer()); convert(oox_cond_rule->m_oDataBar.GetPointer()); @@ -3476,26 +3562,38 @@ void XlsxConverter::convert(OOX::Spreadsheet::CDataBar *oox_cond_databar) _CP_OPT(odf_types::color) color; - if (oox_cond_databar->m_oBorderColor.IsInit()) - convert(oox_cond_databar->m_oBorderColor.GetPointer(), color); - else + if (oox_cond_databar->m_oColor.IsInit()) convert(oox_cond_databar->m_oColor.GetPointer(), color); + else if (oox_cond_databar->m_oBorderColor.IsInit()) // ???? + convert(oox_cond_databar->m_oBorderColor.GetPointer(), color); ods_context->current_table()->set_conditional_databar_color(color); convert(oox_cond_databar->m_oAxisColor.GetPointer(), color); ods_context->current_table()->set_conditional_databar_axis_color(color); - convert(oox_cond_databar->m_oNegativeBorderColor.GetPointer(), color); + if (oox_cond_databar->m_oNegativeFillColor.IsInit()) + convert(oox_cond_databar->m_oNegativeFillColor.GetPointer(), color); + else if (oox_cond_databar->m_oNegativeBorderColor.IsInit()) // ???? + convert(oox_cond_databar->m_oNegativeBorderColor.GetPointer(), color); + ods_context->current_table()->set_conditional_databar_negative_color(color); + if (oox_cond_databar->m_oGradient.IsInit()) + ods_context->current_table()->set_conditional_databar_gradient(oox_cond_databar->m_oGradient->ToBool()); + if (oox_cond_databar->m_oAxisPosition.IsInit()) ods_context->current_table()->set_conditional_databar_axis_position(oox_cond_databar->m_oAxisPosition->ToString()); if (oox_cond_databar->m_oShowValue.IsInit()) ods_context->current_table()->set_conditional_show_value(oox_cond_databar->m_oShowValue->ToBool()); - //nullable> m_oMaxLength; - //nullable> m_oMinLength; + + if (oox_cond_databar->m_oMaxLength.IsInit()) + ods_context->current_table()->set_conditional_databar_max(oox_cond_databar->m_oMaxLength->GetValue()); + + if (oox_cond_databar->m_oMinLength.IsInit()) + ods_context->current_table()->set_conditional_databar_min(oox_cond_databar->m_oMinLength->GetValue()); + for (size_t i=0; i< oox_cond_databar->m_arrValues.size(); i++) convert(oox_cond_databar->m_arrValues[i].GetPointer()); } diff --git a/OdfFile/Writer/Converter/XlsxConverter.h b/OdfFile/Writer/Converter/XlsxConverter.h index 39a268bfff..1266979c11 100644 --- a/OdfFile/Writer/Converter/XlsxConverter.h +++ b/OdfFile/Writer/Converter/XlsxConverter.h @@ -233,8 +233,10 @@ namespace Oox2Odf void convert(OOX::Spreadsheet::CSheetProtection *oox_prot); void convert(OOX::Spreadsheet::CDataValidations *oox_validations); void convert(OOX::Spreadsheet::CDataValidation *oox_validation); - void convert(OOX::Spreadsheet::CConditionalFormatting *oox_cond_fmt); - void convert(OOX::Spreadsheet::CConditionalFormattingRule *oox_cond_rule); + void convert(OOX::Spreadsheet::CConditionalFormatting *oox_cond_fmtc, + std::map& mapCFRuleEx, bool isExt); + void convert(OOX::Spreadsheet::CConditionalFormattingRule *oox_cond_rule, + std::map& mapCFRuleEx, bool isExt); void convert(OOX::Spreadsheet::CAutofilter *oox_filter); void convert(OOX::Spreadsheet::CFilterColumn *oox_filter_column); void convert(OOX::Spreadsheet::CDataBar *oox_cond_databar); diff --git a/OdfFile/Writer/Format/Shapes/oox_shapeCallouts.h b/OdfFile/Writer/Format/Shapes/oox_shapeCallouts.h index 6845f5e1e9..0bce887856 100644 --- a/OdfFile/Writer/Format/Shapes/oox_shapeCallouts.h +++ b/OdfFile/Writer/Format/Shapes/oox_shapeCallouts.h @@ -404,7 +404,8 @@ public: view_box = L"0 0 21600 21600"; modifiers = L"6300 24300"; glue_points = L"?f40 ?f41"; - + glue_points_leaving_directions = L"180"; + add(L"f0", L"$0 -10800"); add(L"f1", L"$1 -10800"); add(L"f2", L"if(?f18 ,$0 ,0)"); diff --git a/OdfFile/Writer/Format/calcext_elements.cpp b/OdfFile/Writer/Format/calcext_elements.cpp index 406b401543..2e2fda1e7a 100644 --- a/OdfFile/Writer/Format/calcext_elements.cpp +++ b/OdfFile/Writer/Format/calcext_elements.cpp @@ -44,10 +44,13 @@ namespace odf_writer { void calcext_data_bar_attr::serialize(CP_ATTR_NODE) { - CP_XML_ATTR_OPT(L"calcext:axis-color", calcext_axis_color_); - CP_XML_ATTR_OPT(L"calcext:positive-color", calcext_positive_color_); - CP_XML_ATTR_OPT(L"calcext:negative-color", calcext_negative_color_); - CP_XML_ATTR_OPT(L"calcext:axis-position", calcext_axis_position_); + CP_XML_ATTR_OPT(L"calcext:axis-color", axis_color_); + CP_XML_ATTR_OPT(L"calcext:positive-color", positive_color_); + CP_XML_ATTR_OPT(L"calcext:negative-color", negative_color_); + CP_XML_ATTR_OPT(L"calcext:axis-position", axis_position_); + CP_XML_ATTR_OPT(L"calcext:gradient", gradient_); + CP_XML_ATTR_OPT(L"calcext:min-length", min_length_); + CP_XML_ATTR_OPT(L"calcext:max-length", max_length_); } void calcext_icon_set_attr::serialize(CP_ATTR_NODE) @@ -60,6 +63,7 @@ void calcext_condition_attr::serialize(CP_ATTR_NODE) CP_XML_ATTR_OPT_ENCODE_STRING(L"calcext:base-cell-address", calcext_base_cell_address_); CP_XML_ATTR_OPT(L"calcext:apply-style-name", calcext_apply_style_name_); CP_XML_ATTR_OPT_ENCODE_STRING(L"calcext:value", calcext_value_); + CP_XML_ATTR_OPT(L"loext:stdDev", loext_stdDev_); } void calcext_date_is_attr::serialize(CP_ATTR_NODE) { @@ -235,7 +239,7 @@ void calcext_icon_set::serialize(std::wostream & _Wostream) } } -// calcext_formatting_entry +// calcext:formatting-entry ////////////////////////////////////////////////////////////////////////////////////////////////// const wchar_t * calcext_formatting_entry::ns = L"calcext"; const wchar_t * calcext_formatting_entry::name = L"formatting-entry"; diff --git a/OdfFile/Writer/Format/calcext_elements.h b/OdfFile/Writer/Format/calcext_elements.h index 593e0a6018..9885064689 100644 --- a/OdfFile/Writer/Format/calcext_elements.h +++ b/OdfFile/Writer/Format/calcext_elements.h @@ -56,10 +56,13 @@ class calcext_data_bar_attr public: void serialize(CP_ATTR_NODE); - _CP_OPT(odf_types::color) calcext_axis_color_; - _CP_OPT(odf_types::color) calcext_positive_color_; - _CP_OPT(odf_types::color) calcext_negative_color_; - _CP_OPT(std::wstring) calcext_axis_position_; + _CP_OPT(odf_types::color) axis_color_; + _CP_OPT(odf_types::color) positive_color_; + _CP_OPT(odf_types::color) negative_color_; + _CP_OPT(std::wstring) axis_position_; + _CP_OPT(odf_types::Bool) gradient_; + _CP_OPT(unsigned int) min_length_; + _CP_OPT(unsigned int) max_length_; }; class calcext_condition_attr @@ -70,7 +73,7 @@ public: _CP_OPT(std::wstring) calcext_base_cell_address_; _CP_OPT(std::wstring) calcext_apply_style_name_; _CP_OPT(std::wstring) calcext_value_; - + _CP_OPT(int) loext_stdDev_; }; class calcext_icon_set_attr { diff --git a/OdfFile/Writer/Format/draw_shapes.cpp b/OdfFile/Writer/Format/draw_shapes.cpp index 7149a8fed2..49b8c3dc91 100644 --- a/OdfFile/Writer/Format/draw_shapes.cpp +++ b/OdfFile/Writer/Format/draw_shapes.cpp @@ -428,6 +428,7 @@ void draw_enhanced_geometry_attlist::serialize(CP_ATTR_NODE) //CP_XML_ATTR_OPT(L"drawooo:enhanced-path", draw_enhanced_path_); CP_XML_ATTR_OPT(L"draw:enhanced-path", draw_enhanced_path_); CP_XML_ATTR_OPT(L"draw:glue-points", draw_glue_points_); + CP_XML_ATTR_OPT(L"draw:glue-point-leaving-directions", glue_points_leaving_directions_); CP_XML_ATTR_OPT(L"draw:mirror-vertical", draw_mirror_vertical_); CP_XML_ATTR_OPT(L"draw:mirror-horizontal", draw_mirror_horizontal_); diff --git a/OdfFile/Writer/Format/draw_shapes.h b/OdfFile/Writer/Format/draw_shapes.h index ba79801a85..de272fb8e2 100644 --- a/OdfFile/Writer/Format/draw_shapes.h +++ b/OdfFile/Writer/Format/draw_shapes.h @@ -311,7 +311,8 @@ public: _CP_OPT(std::wstring) draw_enhanced_path_; _CP_OPT(std::wstring) draw_text_areas_; _CP_OPT(std::wstring) draw_glue_points_; - + _CP_OPT(std::wstring) glue_points_leaving_directions_; + _CP_OPT(std::wstring) draw_sub_view_size_; _CP_OPT(odf_types::Bool) draw_mirror_vertical_; diff --git a/OdfFile/Writer/Format/odf_conversion_context.cpp b/OdfFile/Writer/Format/odf_conversion_context.cpp index 3415af65cb..849724ada1 100644 --- a/OdfFile/Writer/Format/odf_conversion_context.cpp +++ b/OdfFile/Writer/Format/odf_conversion_context.cpp @@ -565,23 +565,37 @@ std::wstring odf_conversion_context::add_media(const std::wstring & file_name, b return odf_ref_name; } } -std::wstring odf_conversion_context::add_imageobject(const std::wstring & file_name) +std::wstring odf_conversion_context::add_imageobject(const std::wstring & file_name, bool bExternal) { if (file_name.empty()) return L""; - std::wstring odf_ref_name ; - mediaitems()->add_or_find(file_name,_mediaitems::typeObjectReplacement, odf_ref_name); + if (bExternal) + { + return file_name; + } + else + { + std::wstring odf_ref_name; + mediaitems()->add_or_find(file_name, _mediaitems::typeObjectReplacement, odf_ref_name); - return odf_ref_name; + return odf_ref_name; + } } -std::wstring odf_conversion_context::add_oleobject(const std::wstring & file_name) +std::wstring odf_conversion_context::add_oleobject(const std::wstring & file_name, bool bExternal) { if (file_name.empty()) return L""; - std::wstring odf_ref_name ; - mediaitems()->add_or_find(file_name,_mediaitems::typeOleObject, odf_ref_name); + if (bExternal) + { + return file_name; + } + else + { + std::wstring odf_ref_name; + mediaitems()->add_or_find(file_name, _mediaitems::typeOleObject, odf_ref_name); - return odf_ref_name; + return odf_ref_name; + } } void odf_conversion_context::add_tab(_CP_OPT(int) type, _CP_OPT(length) _length, _CP_OPT(int) leader) { diff --git a/OdfFile/Writer/Format/odf_conversion_context.h b/OdfFile/Writer/Format/odf_conversion_context.h index 1a163f5e48..c16098f3c5 100644 --- a/OdfFile/Writer/Format/odf_conversion_context.h +++ b/OdfFile/Writer/Format/odf_conversion_context.h @@ -123,8 +123,8 @@ public: std::wstring add_image (const std::wstring & image_file_name, bool bExternal = false); std::wstring add_media (const std::wstring & file_name, bool bExternal = false); - std::wstring add_oleobject (const std::wstring & ole_file_name); - std::wstring add_imageobject(const std::wstring & ole_file_name); + std::wstring add_oleobject (const std::wstring & ole_file_name, bool bExternal = false); + std::wstring add_imageobject(const std::wstring & ole_file_name, bool bExternal = false); void add_meta(const std::wstring & ns, const std::wstring & name, const std::wstring & content); diff --git a/OdfFile/Writer/Format/odf_drawing_context.cpp b/OdfFile/Writer/Format/odf_drawing_context.cpp index 6492c82691..576ce8e805 100644 --- a/OdfFile/Writer/Format/odf_drawing_context.cpp +++ b/OdfFile/Writer/Format/odf_drawing_context.cpp @@ -433,7 +433,7 @@ void odf_drawing_context::start_group() //if (!impl_->current_drawing_state_.description_.empty()) // group->common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.draw_name_ = impl_->current_drawing_state_.description_; if (impl_->current_drawing_state_.hidden_) - group->common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.drawooo_display_ = L"printer"; + group->common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.drawooo_display_ = L"printer"; // L"none" ??? if (!impl_->current_drawing_state_.xml_id_.empty()) group->xml_id_ = impl_->current_drawing_state_.xml_id_; @@ -630,7 +630,7 @@ void odf_drawing_context::end_drawing() if (impl_->current_drawing_state_.z_order_ >= 0) draw->common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.draw_z_index_ = impl_->current_drawing_state_.z_order_; if (impl_->current_drawing_state_.hidden_) - draw->common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.drawooo_display_ = L"printer"; + draw->common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.drawooo_display_ = L"printer"; // L"none" ??? if (!impl_->current_drawing_state_.xml_id_.empty()) draw->xml_id_ = impl_->current_drawing_state_.xml_id_; @@ -1178,15 +1178,17 @@ void odf_drawing_context::end_shape() enhanced->attlist_.draw_glue_points_ = shape_define->glue_points; enhanced->attlist_.draw_sub_view_size_ = shape_define->sub_view_size; + enhanced->attlist_.glue_points_leaving_directions_ = shape_define->glue_points_leaving_directions; enhanced->attlist_.draw_path_stretchpoint_x_ = shape_define->path_stretchpoint_x; enhanced->attlist_.draw_path_stretchpoint_y_ = shape_define->path_stretchpoint_y; - if (!shape_define->modifiers.empty()) - { - enhanced->attlist_.draw_modifiers_ = shape_define->modifiers; - } - else if (impl_->current_drawing_state_.oox_shape_ && !impl_->current_drawing_state_.oox_shape_->modifiers.empty()) + //if (!shape_define->modifiers.empty()) + //{ + // enhanced->attlist_.draw_modifiers_ = shape_define->modifiers; + //} + + if (impl_->current_drawing_state_.oox_shape_ && !impl_->current_drawing_state_.oox_shape_->modifiers.empty()) { enhanced->attlist_.draw_modifiers_ = impl_->current_drawing_state_.oox_shape_->modifiers; } @@ -2759,12 +2761,13 @@ void odf_drawing_context::set_textarea_writing_mode(int mode) { switch(mode) { + case 4://SimpleTypes::textverticaltypeVert270: //нужно отзеркалить по горизонтали текст + paragraph_properties->style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::TbLr); + break; case 5://textverticaltypeWordArtVert: case 6://textverticaltypeWordArtVertRtl: - case 4://SimpleTypes::textverticaltypeVert270: //нужно отзеркалить по горизонтали текст case 3://SimpleTypes::textverticaltypeVert: case 2://SimpleTypes::textverticaltypeMongolianVert: - paragraph_properties->style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::TbRl); break; case 0://SimpleTypes::textverticaltypeEaVert: @@ -2780,9 +2783,11 @@ void odf_drawing_context::set_textarea_writing_mode(int mode) { switch(mode) { + case 4://SimpleTypes::textverticaltypeVert270: //нужно отзеркалить по горизонтали текст + impl_->current_paragraph_properties->style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::TbLr); + break; case 5://textverticaltypeWordArtVert: case 6://textverticaltypeWordArtVertRtl: - case 4://SimpleTypes::textverticaltypeVert270: //нужно отзеркалить по горизонтали текст case 3://SimpleTypes::textverticaltypeVert: case 2://SimpleTypes::textverticaltypeMongolianVert: impl_->current_paragraph_properties->style_writing_mode_ = odf_types::writing_mode(odf_types::writing_mode::TbRl); diff --git a/OdfFile/Writer/Format/odf_number_styles_context.cpp b/OdfFile/Writer/Format/odf_number_styles_context.cpp index e4c383a6ee..1520be6bed 100644 --- a/OdfFile/Writer/Format/odf_number_styles_context.cpp +++ b/OdfFile/Writer/Format/odf_number_styles_context.cpp @@ -929,31 +929,42 @@ void odf_number_styles_context::detect_format(number_format_state & state) std::wstring strFormatCode = boost::regex_replace(state.format_code[0], re_unwanted, &replace_unwanted, boost::match_any | boost::format_all); //find [$-]. - boost::wregex re(L"(?=(\\[{1}\\${1}(\\w*)\\-(\\d*)\\]{1}))"); + boost::wregex re(L"(\\[\\$.*\-[\\w\\d]+\\])"); std::vector result; std::wstring tmp = strFormatCode; bool b = boost::regex_split(std::back_inserter(result), tmp, re); - if (b && result.size() >= 3) - { - state.currency_str = result[1]; - - int code = -1; - try + if (b && result.size() > 0) + {//split Currency String + tmp = result[0].substr(1, result[0].size() - 2); + size_t sep = tmp.find(L"-"); + if (sep != std::wstring::npos) { - std::wstringstream ss; - ss << std::hex << result[2]; - ss >> state.language_code; - }catch(...){} + state.currency_str = tmp.substr(1, sep - 1); + + try + { + std::wstringstream ss; + ss << std::hex << tmp.substr(sep + 1); + ss >> state.language_code; + } + catch (...) {} + } + if (false == state.currency_str.empty()) + { + size_t pos_digit = (std::min)(strFormatCode.find(L"0"), strFormatCode.find(L"#")); + size_t pos_currency = strFormatCode.find(state.currency_str); + if (pos_digit != std::wstring::npos) state.currency_pos = pos_digit < pos_currency ? 1 : 2; + } XmlUtils::replace_all(strFormatCode, result[0], L""); } if (state.format_code.size() > 0) //any { - boost::wregex re1(L"([mM]{2,}|[hH]{2,}|[sS]{2,})"); - boost::wregex re2(L"([mM]{1,}|[dD]{1,}|[yY]{2,})"); + boost::wregex re1(L"([mM]{2,}|[hH]{1,}|[sS]{2,})"); + boost::wregex re2(L"([M]{2,}|[m]{1,}|[dD]{1,}|[yY]{2,})"); tmp = strFormatCode; diff --git a/OdfFile/Writer/Format/odf_number_styles_context.h b/OdfFile/Writer/Format/odf_number_styles_context.h index 3dca3db10f..0fffa3d735 100644 --- a/OdfFile/Writer/Format/odf_number_styles_context.h +++ b/OdfFile/Writer/Format/odf_number_styles_context.h @@ -49,7 +49,7 @@ typedef shared_ptr::Type office_element_ptr; struct number_format_state { - int oox_num_fmt;//дефолтные (по документации - номера 0-163, за исключением некоторых) + int oox_num_fmt;//дефолтные odf_types::office_value_type::type ods_type; @@ -59,6 +59,7 @@ struct number_format_state unsigned int language_code; std::wstring currency_str; + unsigned int currency_pos = 0; }; class odf_number_styles_context @@ -67,7 +68,7 @@ public: odf_number_styles_context(); void set_odf_context(odf_conversion_context * Context); - number_format_state & add_or_find(int oox_num_fmt, std::wstring formatCode = L""); + number_format_state & add_or_find(int oox_num_fmt, std::wstring formatCode = L""); void process_styles(office_element_ptr root ); private: @@ -81,7 +82,7 @@ private: void detect_format(number_format_state & state); //////////////// - odf_conversion_context *odf_context_; + odf_conversion_context *odf_context_; std::vector styles_elments; ////////////////// @@ -94,8 +95,6 @@ private: void create_percentage_style(number_format_state & state, office_element_ptr & root_elm); void create_numbers(number_format_state & state, office_element_ptr & elm, office_element_ptr & root_elm); - - }; } } diff --git a/OdfFile/Writer/Format/odf_text_context.cpp b/OdfFile/Writer/Format/odf_text_context.cpp index 771b4347ee..aafce02d4c 100644 --- a/OdfFile/Writer/Format/odf_text_context.cpp +++ b/OdfFile/Writer/Format/odf_text_context.cpp @@ -602,6 +602,18 @@ bool odf_text_context::start_field(int type, const std::wstring& value, const st { create_element(L"text", L"text-input", elm, odf_context_); }break; + case fieldRef: + { + create_element(L"text", L"bookmark-ref", elm, odf_context_); + text_bookmark_ref* ref = dynamic_cast(elm.get()); + if (ref) + { + if (false == value.empty()) ref->ref_name_ = value; + + ref->reference_format_ = odf_types::reference_format::parse(format.empty() ? L"text" : format); + + } + }break; } if (elm) diff --git a/OdfFile/Writer/Format/odf_text_context.h b/OdfFile/Writer/Format/odf_text_context.h index 9bfb87c793..960a18d382 100644 --- a/OdfFile/Writer/Format/odf_text_context.h +++ b/OdfFile/Writer/Format/odf_text_context.h @@ -58,6 +58,7 @@ namespace odf_writer fieldDropDown, fieldDate, fieldTime, + fieldRef, fieldBibliography = 0xff + 1, fieldIndex, diff --git a/OdfFile/Writer/Format/ods_table_state.cpp b/OdfFile/Writer/Format/ods_table_state.cpp index e51324774f..2ca0c6170b 100644 --- a/OdfFile/Writer/Format/ods_table_state.cpp +++ b/OdfFile/Writer/Format/ods_table_state.cpp @@ -69,7 +69,7 @@ namespace utils//////////////////////////////////////////// ОБЩАЯ хрен { std::wstring convert_date(int date) { - boost::gregorian::date date_ = boost::gregorian::date(1900, 1, 1) + boost::gregorian::date_duration(date - 2); + boost::gregorian::date date_ = boost::gregorian::date(1900, 1, 1) + boost::gregorian::date_duration( date - (date < 60 ? 1 : 2)); //29.02.1900 std::wstring date_str; @@ -100,9 +100,9 @@ namespace utils//////////////////////////////////////////// ОБЩАЯ хрен } return convert_date(iDate); } - std::wstring convert_time(double dTime) + std::wstring convert_time(double dTime, bool bPT) { - //12H15M42S + //12H15M42S - pt int hours = 0, minutes = 0; double sec = 0; @@ -110,23 +110,20 @@ namespace utils//////////////////////////////////////////// ОБЩАЯ хрен double millisec = day.total_milliseconds() * dTime; - sec = millisec / 1000.; hours = (int)(sec / 60. / 60.); - minutes = (int)((sec - (hours * 60 * 60)) / 60.); - sec = sec - (hours * 60 + minutes) * 60.; + minutes = (int)((sec - (hours * (int)60 * (int)60)) / 60.); + sec = sec - (hours * (int)60 + minutes) * 60.; int sec1 = (int)sec; std::wstring time_str = (hours < 10 ? L"0" : L"") + boost::lexical_cast(hours) - //+ std::wstring(L"H") + - + std::wstring(L":") + + + (bPT ? std::wstring(L"H") : std::wstring(L":")) + (minutes < 10 ? L"0" : L"") + boost::lexical_cast(minutes) - //+ std::wstring(L"M") + - + std::wstring(L":") + - (sec1 < 10 ? L"0" : L"") + boost::lexical_cast(sec1); - //+ std::wstring(L"S"); + + (bPT ? std::wstring(L"M") : std::wstring(L":")) + + (sec1 < 10 ? L"0" : L"") + boost::lexical_cast(sec1) + + (bPT ? std::wstring(L"S") : std::wstring(L"")); return time_str; } @@ -148,7 +145,7 @@ namespace utils//////////////////////////////////////////// ОБЩАЯ хрен std::wstring sDate, sTime; if (dTime > 0) { - sTime = convert_time(dTime); + sTime = convert_time(dTime, false); } if (nDate > 0) { @@ -173,8 +170,7 @@ namespace utils//////////////////////////////////////////// ОБЩАЯ хрен { return oox_time; } - //PT12H15M42S - return std::wstring(L"PT") + convert_time(dTime); + return std::wstring(L"PT") + convert_time(dTime, true); } }; @@ -1952,7 +1948,7 @@ void ods_table_state::end_conditional_format() { current_level_.pop_back(); } -void ods_table_state::start_conditional_rule(int rule_type, _CP_OPT(unsigned int) rank, _CP_OPT(bool) bottom, _CP_OPT(bool) percent) +void ods_table_state::start_conditional_rule(int rule_type, _CP_OPT(unsigned int) rank, _CP_OPT(bool) bottom, _CP_OPT(bool) percent, _CP_OPT(bool) above, _CP_OPT(bool) equal, _CP_OPT(int) stdDev) { office_element_ptr elm; @@ -1995,18 +1991,27 @@ void ods_table_state::start_conditional_rule(int rule_type, _CP_OPT(unsigned int table = L"'" + table + L"'"; } } - condition->attr_.calcext_base_cell_address_ = table + col + row; + condition->attr_.calcext_base_cell_address_ = (table.empty() ? L"" : (table + L".")) + col + row; } switch(rule_type) { - case 0: condition->attr_.calcext_value_ = L"above-average"; break; + case 0: + { + if (equal) condition->attr_.calcext_value_ = above.get_value_or(true) ? L"above-equal-average" : L"below-equal-average"; + else condition->attr_.calcext_value_ = above.get_value_or(true) ? L"above-average" : L"below-average"; + + if (stdDev) + { + condition->attr_.loext_stdDev_ = *stdDev; + } + }break; case 1: condition->attr_.calcext_value_ = L"begins-with()"; break; - case 4: condition->attr_.calcext_value_ = L"contains-text()"; break; + case 4: condition->attr_.calcext_value_ = L"formula-is()"; break; case 5: condition->attr_.calcext_value_ = L"is-error"; break; case 6: condition->attr_.calcext_value_ = L"contains-text()"; break; case 8: condition->attr_.calcext_value_ = L"duplicate"; break; case 9: condition->attr_.calcext_value_ = L"formula-is()"; break; - case 11: condition->attr_.calcext_value_ = L"not-contains-text()"; break; + case 11: condition->attr_.calcext_value_ = L"formula-is()"; break; case 12: condition->attr_.calcext_value_ = L"is-no-error"; break; case 13: condition->attr_.calcext_value_ = L"not-contains-text()"; break; case 15: @@ -2039,17 +2044,19 @@ void ods_table_state::end_conditional_rule() void ods_table_state::set_conditional_formula(const std::wstring& formula) { calcext_condition* condition = dynamic_cast (current_level_.back().get()); - if (!condition) return; std::wstring odfFormula = formulas_converter_table.convert_conditional_formula(formula); - std::wstring operator_; + std::wstring operator_ = condition->attr_.calcext_value_.get_value_or(L""); + + if (std::wstring::npos != operator_.find(L"is-no-error") || + std::wstring::npos != operator_.find(L"is-error")) + return; + bool s = false; bool split = false; - operator_ = condition->attr_.calcext_value_.get_value_or(L""); - size_t f_start = operator_.find(L"("); size_t f_end = operator_.rfind(L")"); if (f_start != std::wstring::npos && f_end != std::wstring::npos) @@ -2084,18 +2091,18 @@ void ods_table_state::set_conditional_time(int period) { switch (period) { - case 1: date_is->attr_.calcext_date_ = odf_types::time_period::yesterday; break; - case 2: date_is->attr_.calcext_date_ = odf_types::time_period::tomorrow; break; - case 3: date_is->attr_.calcext_date_ = odf_types::time_period::last7Days; break; - case 4: date_is->attr_.calcext_date_ = odf_types::time_period::thisMonth; break; - case 5: date_is->attr_.calcext_date_ = odf_types::time_period::lastMonth; break; - case 6: date_is->attr_.calcext_date_ = odf_types::time_period::nextMonth; break; - case 7: date_is->attr_.calcext_date_ = odf_types::time_period::thisWeek; break; - case 8: date_is->attr_.calcext_date_ = odf_types::time_period::lastWeek; break; - case 9: date_is->attr_.calcext_date_ = odf_types::time_period::nextWeek; break; + case 1: date_is->attr_.calcext_date_ = odf_types::time_period::lastMonth; break; + case 2: date_is->attr_.calcext_date_ = odf_types::time_period::lastWeek; break; + case 3: date_is->attr_.calcext_date_ = odf_types::time_period::nextMonth; break; + case 4: date_is->attr_.calcext_date_ = odf_types::time_period::nextWeek; break; + case 5: date_is->attr_.calcext_date_ = odf_types::time_period::thisMonth; break; + case 6: date_is->attr_.calcext_date_ = odf_types::time_period::thisWeek; break; + case 7: date_is->attr_.calcext_date_ = odf_types::time_period::today; break; + case 8: date_is->attr_.calcext_date_ = odf_types::time_period::tomorrow; break; + case 9: date_is->attr_.calcext_date_ = odf_types::time_period::yesterday; break; case 0: default: - date_is->attr_.calcext_date_ = odf_types::time_period::today; + date_is->attr_.calcext_date_ = odf_types::time_period::last7Days; } } } @@ -2250,7 +2257,7 @@ void ods_table_state::set_conditional_databar_color(_CP_OPT(color)& color) if (cond_format) { - cond_format->attr_.calcext_positive_color_ = color; + cond_format->attr_.positive_color_ = color; } } void ods_table_state::set_conditional_databar_axis_color(_CP_OPT(color)& color) @@ -2259,7 +2266,7 @@ void ods_table_state::set_conditional_databar_axis_color(_CP_OPT(color)& color) if (cond_format) { - cond_format->attr_.calcext_axis_color_ = color; + cond_format->attr_.axis_color_ = color; } } void ods_table_state::set_conditional_databar_negative_color(_CP_OPT(color)& color) @@ -2268,7 +2275,7 @@ void ods_table_state::set_conditional_databar_negative_color(_CP_OPT(color)& col if (cond_format) { - cond_format->attr_.calcext_negative_color_ = color; + cond_format->attr_.negative_color_ = color; } } void ods_table_state::set_conditional_databar_axis_position(const std::wstring& type) @@ -2277,9 +2284,35 @@ void ods_table_state::set_conditional_databar_axis_position(const std::wstring& if (cond_format) { - cond_format->attr_.calcext_axis_position_ = type; + cond_format->attr_.axis_position_ = type; } +} +void ods_table_state::set_conditional_databar_gradient(bool val) +{ + calcext_data_bar* cond_format = dynamic_cast(current_level_.back().get()); + if (cond_format) + { + cond_format->attr_.gradient_ = val; + } +} +void ods_table_state::set_conditional_databar_max(unsigned int val) +{ + calcext_data_bar* cond_format = dynamic_cast(current_level_.back().get()); + + if (cond_format) + { + cond_format->attr_.max_length_ = val; + } +} +void ods_table_state::set_conditional_databar_min(unsigned int val) +{ + calcext_data_bar* cond_format = dynamic_cast(current_level_.back().get()); + + if (cond_format) + { + cond_format->attr_.min_length_ = val; + } } } diff --git a/OdfFile/Writer/Format/ods_table_state.h b/OdfFile/Writer/Format/ods_table_state.h index fccbe0efa1..af32f5c59e 100644 --- a/OdfFile/Writer/Format/ods_table_state.h +++ b/OdfFile/Writer/Format/ods_table_state.h @@ -384,7 +384,7 @@ public: void start_conditional_formats(); void start_conditional_format(const std::wstring& ref); - void start_conditional_rule(int rule_type, _CP_OPT(unsigned int) rank, _CP_OPT(bool) bottom, _CP_OPT(bool) percent); + void start_conditional_rule(int rule_type, _CP_OPT(unsigned int) rank, _CP_OPT(bool) bottom, _CP_OPT(bool) percent, _CP_OPT(bool) above, _CP_OPT(bool) equal, _CP_OPT(int) stdDev); void set_conditional_formula(const std::wstring& formula); void set_conditional_value(int type, const std::wstring& value ); @@ -398,6 +398,9 @@ public: void set_conditional_databar_negative_color(_CP_OPT(odf_types::color) & color); void set_conditional_databar_axis_color(_CP_OPT(odf_types::color) & color); void set_conditional_databar_axis_position(const std::wstring& value); + void set_conditional_databar_gradient(bool val); + void set_conditional_databar_max(unsigned int val); + void set_conditional_databar_min(unsigned int val); void set_conditional_style_name(const std::wstring &style_name); void set_conditional_operator(int _operator); diff --git a/OdfFile/Writer/Format/odt_conversion_context.cpp b/OdfFile/Writer/Format/odt_conversion_context.cpp index da0f3a5fc7..28d20c9bf8 100644 --- a/OdfFile/Writer/Format/odt_conversion_context.cpp +++ b/OdfFile/Writer/Format/odt_conversion_context.cpp @@ -590,6 +590,15 @@ void odt_conversion_context::start_hyperlink(const std::wstring& link, const std text_a* hyperlink = dynamic_cast(hyperlink_elm.get()); if (hyperlink) { + if (location == L"_top") + hyperlink->office_target_frame_name_ = odf_types::target_frame_name::Top; + else if (location == L"_blank") + hyperlink->office_target_frame_name_ = odf_types::target_frame_name::Blank; + else if (location == L"_self") + hyperlink->office_target_frame_name_ = odf_types::target_frame_name::Self; + else if (location == L"_parent") + hyperlink->office_target_frame_name_ = odf_types::target_frame_name::Parent; + hyperlink->common_xlink_attlist_.href_ = link + (location.empty() ? L"" : (L"#" + location)); hyperlink->common_xlink_attlist_.type_ = xlink_type::Simple; @@ -767,6 +776,33 @@ void odt_conversion_context::set_field_instr() if (instr.length() > 9) current_fields.back().value = instr.substr(9, instr.length() - 5); } + res1 = instr.find(L"REF"); + if (std::wstring::npos != res1 && current_fields.back().type == 0) + { + current_fields.back().type = fieldRef; + std::map options = parse_instr_options(instr.substr(4)); + + for (std::map::iterator it = options.begin(); it != options.end(); ++it) + { + if (it->first == L" ")//field-argument + { + current_fields.back().value = it->second; + boost::algorithm::trim(current_fields.back().value); + } + else if (it->first == L"h") + { + current_fields.back().bHyperlinks = true; + } + else if (it->first == L"p") + { + current_fields.back().format = L"direction"; + } + else if (it->first == L"r" || it->first == L"n") + { + current_fields.back().format = L"number"; + } + } + } res1 = instr.find(L"PAGE"); if (std::wstring::npos != res1 && current_fields.back().type == 0) { diff --git a/OdfFile/Writer/Format/oox_shape_defines.h b/OdfFile/Writer/Format/oox_shape_defines.h index 01b987f855..f281c352aa 100644 --- a/OdfFile/Writer/Format/oox_shape_defines.h +++ b/OdfFile/Writer/Format/oox_shape_defines.h @@ -82,9 +82,10 @@ namespace cpdoccore _CP_OPT(std::wstring) view_box; _CP_OPT(std::wstring) sub_view_size; _CP_OPT(std::wstring) glue_points; + _CP_OPT(std::wstring) glue_points_leaving_directions; - std::wstring path_stretchpoint_x; - std::wstring path_stretchpoint_y; + _CP_OPT(std::wstring) path_stretchpoint_x; + _CP_OPT(std::wstring) path_stretchpoint_y; std::wstring odf_type_name; }; diff --git a/OdfFile/Writer/Format/paragraph_elements.cpp b/OdfFile/Writer/Format/paragraph_elements.cpp index 6df4f4a83d..7be3984343 100644 --- a/OdfFile/Writer/Format/paragraph_elements.cpp +++ b/OdfFile/Writer/Format/paragraph_elements.cpp @@ -188,6 +188,42 @@ void text_bookmark_end::serialize(std::wostream & _Wostream) } } } +//---------------------------------------------------------------------------------- +// text:bookmark-ref +//---------------------------------------------------------------------------------- +const wchar_t* text_bookmark_ref::ns = L"text"; +const wchar_t* text_bookmark_ref::name = L"bookmark-ref"; + +void text_bookmark_ref::create_child_element(const std::wstring& Ns, const std::wstring& Name) +{ + CP_CREATE_ELEMENT(content_); +} +void text_bookmark_ref::add_child_element(const office_element_ptr& child_element) +{ + content_.push_back(child_element); +} +void text_bookmark_ref::add_text(const std::wstring& Text) +{ + office_element_ptr elm = text_text::create(Text); + content_.push_back(elm); +} +void text_bookmark_ref::serialize(std::wostream& _Wostream) +{ + CP_XML_WRITER(_Wostream) + { + CP_XML_NODE_SIMPLE() + { + CP_XML_ATTR_OPT_ENCODE_STRING(L"text:ref-name", ref_name_); + CP_XML_ATTR_OPT(L"text:reference-format", reference_format_); + + for (size_t i = 0; i < content_.size(); i++) + { + content_[i]->serialize(CP_XML_STREAM()); + } + } + } +} + //---------------------------------------------------------------------------------- // text:reference-mark //---------------------------------------------------------------------------------- diff --git a/OdfFile/Writer/Format/paragraph_elements.h b/OdfFile/Writer/Format/paragraph_elements.h index 78e345513d..9b1fb663fd 100644 --- a/OdfFile/Writer/Format/paragraph_elements.h +++ b/OdfFile/Writer/Format/paragraph_elements.h @@ -42,6 +42,7 @@ #include "../../DataTypes/targetframename.h" #include "../../DataTypes/noteclass.h" #include "../../DataTypes/bibliography.h" +#include "../../DataTypes/referenceformat.h" #include "../../DataTypes/common_attlists.h" @@ -211,7 +212,33 @@ public: std::wstring text_name_; }; CP_REGISTER_OFFICE_ELEMENT2(text_bookmark_end); +//------------------------------------------------------------------------------------------------------------------- +// text:bookmark-ref +//------------------------------------------------------------------------------------------------------------------- +class text_bookmark_ref : public office_element_impl +{ +public: + static const wchar_t* ns; + static const wchar_t* name; + static const ElementType type = typeTextBookmarkRef; + + text_bookmark_ref() {}; + text_bookmark_ref(const std::wstring& Name) : ref_name_(Name) {}; + + virtual void create_child_element(const std::wstring& Ns, const std::wstring& Name); + virtual void add_child_element(const office_element_ptr& child_element); + virtual void add_text(const std::wstring& Text); + + virtual void serialize(std::wostream& _Wostream); + + _CP_OPT(std::wstring) ref_name_; + _CP_OPT(odf_types::reference_format) reference_format_; + + _CP_OPT(std::wstring) text_; + office_element_ptr_array content_; +}; +CP_REGISTER_OFFICE_ELEMENT2(text_bookmark_ref); // text:reference-mark //--------------------------------------------------------------------------------------------------- class text_reference_mark : public office_element_impl @@ -920,18 +947,17 @@ public: static const wchar_t * ns; static const wchar_t * name; - static const ElementType type = typeTextSequenceRef; - + static const ElementType type = typeTextSequenceRef; virtual void create_child_element (const std::wstring & Ns, const std::wstring & Name){} virtual void add_child_element ( const office_element_ptr & child_element){} virtual void serialize(std::wostream & _Wostream); - _CP_OPT(std::wstring) reference_format_;//caption, category-and-value, value, chapter, direction, page, text, number, number-all-superior, number-no-superior - _CP_OPT(std::wstring) ref_name_; + _CP_OPT(odf_types::reference_format) reference_format_; + _CP_OPT(std::wstring) ref_name_; - std::wstring content_; + std::wstring content_; }; CP_REGISTER_OFFICE_ELEMENT2(text_sequence_ref); //------------------------------------------------------------------------------------------------------------------- diff --git a/PdfFile/PdfReader.cpp b/PdfFile/PdfReader.cpp index 9d36d45c2b..57bb2b9164 100644 --- a/PdfFile/PdfReader.cpp +++ b/PdfFile/PdfReader.cpp @@ -1014,16 +1014,12 @@ BYTE* CPdfReader::GetWidgetFonts(int nTypeFonts) } } - if (!bFullFont || pField->getAcroFormFieldType() == acroFormFieldPushbutton) + if (!bFullFont) { oR.free(); oFonts.free(); oFontRef.free(); std::string sFontKey; bool bFind = PdfReader::GetFontFromAP(m_pPDFDocument, pField, &oR, &oFonts, &oFontRef, sFontKey); - if (bFind && std::find(arrFontsRef.begin(), arrFontsRef.end(), oFontRef.getRefNum()) == arrFontsRef.end() && - (pField->getAcroFormFieldType() == acroFormFieldPushbutton || (nTypeFonts & 2))) - { - bFindResources = true; - } + bFindResources = bFind && std::find(arrFontsRef.begin(), arrFontsRef.end(), oFontRef.getRefNum()) == arrFontsRef.end() && (nTypeFonts & 2); } std::string sFontName; @@ -1046,6 +1042,27 @@ BYTE* CPdfReader::GetWidgetFonts(int nTypeFonts) } } oR.free(); oFonts.free(); oFontRef.free(); + + if (pField->getAcroFormFieldType() == acroFormFieldPushbutton) + { + std::string sFontKey; + bool bFind = PdfReader::GetFontFromAP(m_pPDFDocument, pField, &oR, &oFonts, &oFontRef, sFontKey); + if (bFind && std::find(arrFontsRef.begin(), arrFontsRef.end(), oFontRef.getRefNum()) == arrFontsRef.end()) + { + bool bBold = false, bItalic = false; + wsFileName = PdfReader::GetFontData(m_pPDFDocument, m_pFontManager, m_pFontList, &oFonts, &oFontRef, nTypeFonts, sFontName, sFontName, bBold, bItalic); + + std::wstring wsFontName = UTF8_TO_U(sFontName); + if (m_mFonts.find(wsFontName) == m_mFonts.end()) + { + oRes.WriteString(sFontName); + nFontsID++; + arrFontsRef.push_back(oFontRef.getRefNum()); + m_mFonts[wsFontName] = wsFileName; + } + } + } + oR.free(); oFonts.free(); oFontRef.free(); } } diff --git a/PdfFile/PdfWriter.cpp b/PdfFile/PdfWriter.cpp index a9430403a5..9d70492268 100644 --- a/PdfFile/PdfWriter.cpp +++ b/PdfFile/PdfWriter.cpp @@ -1020,6 +1020,16 @@ HRESULT CPdfWriter::DrawImageFromFile(NSFonts::IApplicationFonts* pAppFonts, con if (!IsPageValid()) return S_OK; + if (m_pDocument->HasImage(wsImagePathSrc, nAlpha)) + { + PdfWriter::CImageDict* pPdfImage = m_pDocument->GetImage(wsImagePathSrc, nAlpha); + m_pPage->GrSave(); + UpdateTransform(); + m_pPage->DrawImage(pPdfImage, MM_2_PT(dX), MM_2_PT(m_dPageHeight - dY - dH), MM_2_PT(dW), MM_2_PT(dH)); + m_pPage->GrRestore(); + return S_OK; + } + std::wstring sTempImagePath = GetDownloadFile(wsImagePathSrc, wsTempDirectory); std::wstring wsImagePath = sTempImagePath.empty() ? wsImagePathSrc : sTempImagePath; @@ -1050,8 +1060,10 @@ HRESULT CPdfWriter::DrawImageFromFile(NSFonts::IApplicationFonts* pAppFonts, con } HRESULT hRes = S_OK; - if (!pAggImage || !DrawImage(pAggImage, dX, dY, dW, dH, nAlpha)) + PdfWriter::CImageDict* pPdfImage = NULL; + if (!pAggImage || !(pPdfImage = DrawImage(pAggImage, dX, dY, dW, dH, nAlpha))) hRes = S_FALSE; + m_pDocument->AddImage(wsImagePathSrc, nAlpha, pPdfImage); if (NSFile::CFileBinary::Exists(sTempImagePath)) NSFile::CFileBinary::Remove(sTempImagePath); @@ -2645,7 +2657,7 @@ void CPdfWriter::Sign(const double& dX, const double& dY, const double& dW, cons //---------------------------------------------------------------------------------------- // Внутренние функции //---------------------------------------------------------------------------------------- -PdfWriter::CImageDict* CPdfWriter::LoadImage(Aggplus::CImage* pImage, const BYTE& nAlpha) +PdfWriter::CImageDict* CPdfWriter::LoadImage(Aggplus::CImage* pImage, BYTE nAlpha) { TColor oColor; int nImageW = abs((int)pImage->GetWidth()); @@ -2740,18 +2752,18 @@ PdfWriter::CImageDict* CPdfWriter::LoadImage(Aggplus::CImage* pImage, const BYTE return pPdfImage; } -bool CPdfWriter::DrawImage(Aggplus::CImage* pImage, const double& dX, const double& dY, const double& dW, const double& dH, const BYTE& nAlpha) +PdfWriter::CImageDict* CPdfWriter::DrawImage(Aggplus::CImage* pImage, const double& dX, const double& dY, const double& dW, const double& dH, const BYTE& nAlpha) { PdfWriter::CImageDict* pPdfImage = LoadImage(pImage, nAlpha); if (!pPdfImage) - return false; + return NULL; m_pPage->GrSave(); UpdateTransform(); m_pPage->DrawImage(pPdfImage, MM_2_PT(dX), MM_2_PT(m_dPageHeight - dY - dH), MM_2_PT(dW), MM_2_PT(dH)); m_pPage->GrRestore(); - return true; + return pPdfImage; } bool CPdfWriter::DrawText(unsigned char* pCodes, const unsigned int& unLen, const double& dX, const double& dY) { @@ -3020,12 +3032,17 @@ void CPdfWriter::UpdateBrush(NSFonts::IApplicationFonts* pAppFonts, const std::w if (c_BrushTypeTexture == lBrushType) { std::wstring wsTexturePath = m_oBrush.GetTexturePath(); + BYTE nAlpha = m_oBrush.GetTextureAlpha(); CImageFileFormatChecker oImageFormat(wsTexturePath); PdfWriter::CImageDict* pImage = NULL; int nImageW = 0; int nImageH = 0; - if (_CXIMAGE_FORMAT_JPG == oImageFormat.eFileType || _CXIMAGE_FORMAT_JP2 == oImageFormat.eFileType) + if (m_pDocument->HasImage(wsTexturePath, nAlpha)) + { + pImage = m_pDocument->GetImage(wsTexturePath, nAlpha); + } + else if (_CXIMAGE_FORMAT_JPG == oImageFormat.eFileType || _CXIMAGE_FORMAT_JP2 == oImageFormat.eFileType) { pImage = m_pDocument->CreateImage(); CBgraFrame oFrame; @@ -3039,6 +3056,8 @@ void CPdfWriter::UpdateBrush(NSFonts::IApplicationFonts* pAppFonts, const std::w pImage->LoadJpeg(wsTexturePath.c_str(), nImageW, nImageH, oFrame.IsGrayScale()); else pImage->LoadJpx(wsTexturePath.c_str(), nImageW, nImageH); + + m_pDocument->AddImage(wsTexturePath, nAlpha, pImage); } } else if (_CXIMAGE_FORMAT_WMF == oImageFormat.eFileType || @@ -3082,6 +3101,7 @@ void CPdfWriter::UpdateBrush(NSFonts::IApplicationFonts* pAppFonts, const std::w nImageW = abs((int)oImage.GetWidth()); nImageH = abs((int)oImage.GetHeight()); pImage = LoadImage(&oImage, 255); + m_pDocument->AddImage(wsTexturePath, nAlpha, pImage); } else { @@ -3089,11 +3109,11 @@ void CPdfWriter::UpdateBrush(NSFonts::IApplicationFonts* pAppFonts, const std::w nImageW = abs((int)oImage.GetWidth()); nImageH = abs((int)oImage.GetHeight()); pImage = LoadImage(&oImage, 255); + m_pDocument->AddImage(wsTexturePath, nAlpha, pImage); } if (pImage) { - BYTE nAlpha = m_oBrush.GetTextureAlpha(); if (0xFF != nAlpha) pImage->AddTransparency(nAlpha); diff --git a/PdfFile/PdfWriter.h b/PdfFile/PdfWriter.h index c37b994284..50a8d7e33c 100644 --- a/PdfFile/PdfWriter.h +++ b/PdfFile/PdfWriter.h @@ -218,8 +218,8 @@ public: PdfWriter::CPage* GetPage(); private: - PdfWriter::CImageDict* LoadImage(Aggplus::CImage* pImage, const BYTE& nAlpha); - bool DrawImage(Aggplus::CImage* pImage, const double& dX, const double& dY, const double& dW, const double& dH, const BYTE& nAlpha); + PdfWriter::CImageDict* LoadImage(Aggplus::CImage* pImage, BYTE nAlpha); + PdfWriter::CImageDict* DrawImage(Aggplus::CImage* pImage, const double& dX, const double& dY, const double& dW, const double& dH, const BYTE& nAlpha); bool DrawText(unsigned char* pCodes, const unsigned int& unLen, const double& dX, const double& dY); bool DrawTextToRenderer(const unsigned int* unGid, const unsigned int& unLen, const double& dX, const double& dY); bool PathCommandDrawText(unsigned int* pUnicodes, unsigned int unLen, const double& dX, const double& dY, const unsigned int* pGids = NULL); diff --git a/PdfFile/SrcReader/PdfAnnot.cpp b/PdfFile/SrcReader/PdfAnnot.cpp index 6d4a0ced43..b878a3bbd7 100644 --- a/PdfFile/SrcReader/PdfAnnot.cpp +++ b/PdfFile/SrcReader/PdfAnnot.cpp @@ -2872,6 +2872,9 @@ void CAnnotAP::Clear() void CAnnotAP::Init(PDFDoc* pdfDoc, NSFonts::IFontManager* pFontManager, CPdfFontList* pFontList, int nRasterW, int nRasterH, int nBackgroundColor, int nPageIndex) { Page* pPage = pdfDoc->getCatalog()->getPage(nPageIndex + 1); + PDFRectangle* pCropBox = pPage->getCropBox(); + m_dCropX = pCropBox->x1; + m_dCropY = pCropBox->y1; double dWidth = pdfDoc->getPageCropWidth(nPageIndex + 1); double dHeight = pdfDoc->getPageCropHeight(nPageIndex + 1); @@ -2922,8 +2925,8 @@ void CAnnotAP::Init(PDFDoc* pdfDoc, NSFonts::IFontManager* pFontManager, CPdfFon m_gfx = new Gfx(pdfDoc, m_pRendererOut, nPageIndex + 1, pPage->getAttrs()->getResourceDict(), 72.0, 72.0, &box, crop ? cropBox : (PDFRectangle *)NULL, 0, NULL, NULL); // Координаты внешнего вида - m_nRx1 = (int)round(m_dx1 * m_dWScale) - 1; - m_nRy1 = nRasterH - (int)round(m_dy2 * m_dHScale) - 1; + m_nRx1 = (int)round((m_dx1 - m_dCropX) * m_dWScale) - 1; + m_nRy1 = nRasterH - (int)round((m_dy2 - m_dCropY) * m_dHScale) - 1; } void CAnnotAP::Init(AcroFormField* pField) { @@ -2987,7 +2990,7 @@ void CAnnotAP::Draw(PDFDoc* pdfDoc, Object* oAP, int nRasterH, int nBackgroundCo pView->sASName = oObj.dictGetKey(k); if ((oType == acroFormFieldRadioButton || oType == acroFormFieldCheckbox) && pView->sASName != "Off") pView->sASName = "Yes"; - m_pRenderer->SetCoordTransformOffset(-m_dx1 * m_dWScale + 1 + m_dWTale / 2, m_dy2 * m_dHScale - nRasterH + 1 + m_dHTale / 2); + m_pRenderer->SetCoordTransformOffset(-(m_dx1 - m_dCropX) * m_dWScale + 1 + m_dWTale / 2, (m_dy2 - m_dCropY) * m_dHScale - nRasterH + 1 + m_dHTale / 2); DrawAppearance(pdfDoc, nPageIndex + 1, pField, m_gfx, arrAPName[j], pView->sASName.c_str()); WriteAppearance(nBackgroundColor, pView); pView->nBlendMode = GetBlendMode(); @@ -2998,7 +3001,7 @@ void CAnnotAP::Draw(PDFDoc* pdfDoc, Object* oAP, int nRasterH, int nBackgroundCo { CAnnotAPView* pView = new CAnnotAPView(); pView->sAPName = arrAPName[j]; - m_pRenderer->SetCoordTransformOffset(-m_dx1 * m_dWScale + 1 + m_dWTale / 2, m_dy2 * m_dHScale - nRasterH + 1 + m_dHTale / 2); + m_pRenderer->SetCoordTransformOffset(-(m_dx1 - m_dCropX) * m_dWScale + 1 + m_dWTale / 2, (m_dy2 - m_dCropY) * m_dHScale - nRasterH + 1 + m_dHTale / 2); DrawAppearance(pdfDoc, nPageIndex + 1, pField, m_gfx, arrAPName[j], NULL); WriteAppearance(nBackgroundColor, pView); pView->nBlendMode = GetBlendMode(); @@ -3029,7 +3032,7 @@ void CAnnotAP::Draw(PDFDoc* pdfDoc, Object* oAP, int nRasterH, int nBackgroundCo pView = new CAnnotAPView(); pView->sAPName = arrAPName[j]; - m_pRenderer->SetCoordTransformOffset(-m_dx1 * m_dWScale + 1 + m_dWTale / 2, m_dy2 * m_dHScale - nRasterH + 1 + m_dHTale / 2); + m_pRenderer->SetCoordTransformOffset(-(m_dx1 - m_dCropX) * m_dWScale + 1 + m_dWTale / 2, (m_dy2 - m_dCropY) * m_dHScale - nRasterH + 1 + m_dHTale / 2); Ref ref = oAnnotRef->getRef(); Annot* annot = new Annot(pdfDoc, oAnnot.getDict(), &ref, arrAPName[j]); diff --git a/PdfFile/SrcReader/PdfAnnot.h b/PdfFile/SrcReader/PdfAnnot.h index 3262785b7b..12ee43c04f 100644 --- a/PdfFile/SrcReader/PdfAnnot.h +++ b/PdfFile/SrcReader/PdfAnnot.h @@ -143,6 +143,7 @@ private: unsigned int m_unRefNum; // Номер ссылки на объект double m_dx1, m_dy1, m_dx2, m_dy2; + double m_dCropX, m_dCropY; double m_dWScale, m_dHScale; double m_dWTale; double m_dHTale; diff --git a/PdfFile/SrcReader/RendererOutputDev.cpp b/PdfFile/SrcReader/RendererOutputDev.cpp index 95f4ea3489..a4489cb3ab 100644 --- a/PdfFile/SrcReader/RendererOutputDev.cpp +++ b/PdfFile/SrcReader/RendererOutputDev.cpp @@ -1608,7 +1608,7 @@ namespace PdfReader nLen = 0; } } - else if (L"" != wsFileName && (pFont8bit = dynamic_cast(pFont)) && pFont8bit->getHasEncoding()) + else if (L"" != wsFileName && (pFont8bit = dynamic_cast(pFont))) { char **ppEncoding = pFont8bit->getEncoding(); if (!ppEncoding) @@ -3945,8 +3945,8 @@ namespace PdfReader pNewTm[1] = pTm[1] * dITextScale * pGState->getHorizScaling(); pNewTm[2] = -pTm[2] * dITextScale; pNewTm[3] = -pTm[3] * dITextScale; - pNewTm[4] = dX; - pNewTm[5] = dY; + pNewTm[4] = dX - dOriginX; + pNewTm[5] = dY - dOriginY; } else { @@ -4035,8 +4035,9 @@ namespace PdfReader if (nRenderMode == 0 || nRenderMode == 4 || nRenderMode == 6 || (m_bDrawOnlyText && nRenderMode == 2)) { -#ifdef BUILDING_WASM_MODULE + bool bReplace = false; std::wstring sFontPath; +#ifdef BUILDING_WASM_MODULE m_pRenderer->get_FontPath(&sFontPath); if (!unGid && !wsUnicodeText.empty() && !sFontPath.empty()) { @@ -4079,13 +4080,15 @@ namespace PdfReader return; } m_pRenderer->put_FontPath(wsFileName); - sFontPath = wsFileName; + bReplace = true; } } } } #endif m_pRenderer->CommandDrawTextEx(wsUnicodeText, &unGid, unGidsCount, PDFCoordsToMM(dShiftX), PDFCoordsToMM(dShiftY), PDFCoordsToMM(dDx), PDFCoordsToMM(dDy)); + if (bReplace) + m_pRenderer->put_FontPath(sFontPath); } if (nRenderMode == 1 || nRenderMode == 2 || nRenderMode == 5 || nRenderMode == 6) diff --git a/PdfFile/SrcWriter/Document.cpp b/PdfFile/SrcWriter/Document.cpp index 09a6b5a3c9..95dfa6edb0 100644 --- a/PdfFile/SrcWriter/Document.cpp +++ b/PdfFile/SrcWriter/Document.cpp @@ -173,6 +173,7 @@ namespace PdfWriter m_vStrokeAlpha.clear(); m_vRadioGroups.clear(); m_vMetaOForms.clear(); + m_vImages.clear(); m_pTransparencyGroup = NULL; @@ -213,6 +214,8 @@ namespace PdfWriter m_vTTFonts.clear(); m_vFreeTypeFonts.clear(); m_vSignatures.clear(); + m_vMetaOForms.clear(); + m_vImages.clear(); if (m_pFreeTypeLibrary) { FT_Done_FreeType(m_pFreeTypeLibrary); @@ -541,9 +544,6 @@ namespace PdfWriter } CExtGrState* CDocument::GetExtGState(double dAlphaStroke, double dAlphaFill, EBlendMode eMode, int nStrokeAdjustment) { - if (IsPDFA()) - return NULL; - CExtGrState* pExtGrState = FindExtGrState(dAlphaStroke, dAlphaFill, eMode, nStrokeAdjustment); if (!pExtGrState) @@ -571,9 +571,6 @@ namespace PdfWriter } CExtGrState* CDocument::GetStrokeAlpha(double dAlpha) { - if (IsPDFA()) - return NULL; - CExtGrState* pExtGrState = NULL; for (unsigned int unIndex = 0, unCount = m_vStrokeAlpha.size(); unIndex < unCount; unIndex++) { @@ -594,9 +591,6 @@ namespace PdfWriter } CExtGrState* CDocument::GetFillAlpha(double dAlpha) { - if (IsPDFA()) - return NULL; - CExtGrState* pExtGrState = NULL; for (unsigned int unIndex = 0, unCount = m_vFillAlpha.size(); unIndex < unCount; unIndex++) { @@ -1248,6 +1242,30 @@ namespace PdfWriter return pField; } + bool CDocument::HasImage(const std::wstring& wsImagePath, BYTE nAlpha) + { + for (size_t i = 0, nSize = m_vImages.size(); i < nSize; ++i) + { + if (m_vImages[i].wsImagePath == wsImagePath && m_vImages[i].nAlpha == nAlpha) + return true; + } + return false; + } + CImageDict* CDocument::GetImage(const std::wstring& wsImagePath, BYTE nAlpha) + { + for (size_t i = 0, nSize = m_vImages.size(); i < nSize; ++i) + { + if (m_vImages[i].wsImagePath == wsImagePath && m_vImages[i].nAlpha == nAlpha) + return m_vImages[i].pImage; + } + return NULL; + } + void CDocument::AddImage(const std::wstring& wsImagePath, BYTE nAlpha, CImageDict* pImage) + { + if (!pImage) + return; + m_vImages.push_back({wsImagePath, nAlpha, pImage}); + } bool CDocument::CheckFieldName(CFieldBase* pField, const std::string& sName) { CFieldBase* pBase = m_mFields[sName]; diff --git a/PdfFile/SrcWriter/Document.h b/PdfFile/SrcWriter/Document.h index 35eecf5a8f..e4f7573880 100644 --- a/PdfFile/SrcWriter/Document.h +++ b/PdfFile/SrcWriter/Document.h @@ -178,6 +178,10 @@ namespace PdfWriter CSignatureField* CreateSignatureField(); CDateTimeField* CreateDateTimeField(); bool CheckFieldName(CFieldBase* pField, const std::string& sName); + + bool HasImage(const std::wstring& wsImagePath, BYTE nAlpha); + CImageDict* GetImage(const std::wstring& wsImagePath, BYTE nAlpha); + void AddImage(const std::wstring& wsImagePath, BYTE nAlpha, CImageDict* pImage); bool CreatePageTree(CXref* pXref, CPageTree* pPageTree); bool EditPdf(const std::wstring& wsPath, int nPosLastXRef, int nSizeXRef, CXref* pXref, CCatalog* pCatalog, CEncryptDict* pEncrypt, int nFormField); @@ -246,6 +250,19 @@ namespace PdfWriter CImageDict* pImage; ICertificate* pCertificate; }; + struct TImageInfo + { + TImageInfo(const std::wstring& _wsImagePath, BYTE _nAlpha, CImageDict* _pImage) + { + wsImagePath = _wsImagePath; + nAlpha = _nAlpha; + pImage = _pImage; + } + + std::wstring wsImagePath; + BYTE nAlpha; + CImageDict* pImage; + }; CCatalog* m_pCatalog; COutline* m_pOutlines; @@ -261,6 +278,7 @@ namespace PdfWriter bool m_bEncrypt; CEncryptDict* m_pEncryptDict; std::vector m_vSignatures; + std::vector m_vImages; unsigned int m_unFormFields; unsigned int m_unCompressMode; std::vector m_vExtGrStates; diff --git a/PdfFile/SrcWriter/Metadata.cpp b/PdfFile/SrcWriter/Metadata.cpp index d0cd8ebab7..ad4211b809 100644 --- a/PdfFile/SrcWriter/Metadata.cpp +++ b/PdfFile/SrcWriter/Metadata.cpp @@ -155,7 +155,7 @@ namespace PdfWriter if (pXref->IsPDFA()) { sXML += "\n"; - sXML += "1A\n"; + sXML += "2A\n"; sXML += ""; } diff --git a/PdfFile/lib/xpdf/Stream.cc b/PdfFile/lib/xpdf/Stream.cc index 0d2d284bb5..5a7b0eefd0 100644 --- a/PdfFile/lib/xpdf/Stream.cc +++ b/PdfFile/lib/xpdf/Stream.cc @@ -5252,7 +5252,7 @@ void FlateStream::readSome() { totalOut += remain; // check for a 'decompression bomb' - if (totalOut > 50000000 && totalIn < totalOut / 250) { + if (totalOut > 100000000 && totalIn < totalOut / 250) { error(errSyntaxError, getPos(), "Decompression bomb in flate stream"); endOfBlock = eof = gTrue; remain = 0; diff --git a/PdfFile/lib/xpdf/XRef.cc b/PdfFile/lib/xpdf/XRef.cc index 3b0f2fe998..1b2721be13 100644 --- a/PdfFile/lib/xpdf/XRef.cc +++ b/PdfFile/lib/xpdf/XRef.cc @@ -946,6 +946,7 @@ GBool XRef::constructXRef() { } // read each stream object, check for xref or object stream + GBool bRoot = gFalse; for (int i = 0; i < streamObjNumsLen; ++i) { Object obj; fetch(streamObjNums[i], entries[streamObjNums[i]].gen, &obj); @@ -953,8 +954,8 @@ GBool XRef::constructXRef() { Dict *dict = obj.streamGetDict(); Object type; dict->lookup("Type", &type); - if (type.isName("XRef")) { - saveTrailerDict(dict, gTrue); + if (type.isName("XRef") && !bRoot) { + bRoot = saveTrailerDict(dict, gTrue); } else if (type.isName("ObjStm")) { constructObjectStreamEntries(&obj, streamObjNums[i]); } @@ -991,7 +992,8 @@ void XRef::constructTrailerDict(GFileOffset pos) { // If [dict] "looks like" a trailer dict (i.e., has a Root entry), // save it as the trailer dict. -void XRef::saveTrailerDict(Dict *dict, GBool isXRefStream) { +GBool XRef::saveTrailerDict(Dict *dict, GBool isXRefStream) { + GBool bRes = gFalse; Object obj; dict->lookupNF("Root", &obj); if (obj.isRef()) { @@ -1005,9 +1007,11 @@ void XRef::saveTrailerDict(Dict *dict, GBool isXRefStream) { trailerDict.free(); } trailerDict.initDict(dict); + bRes = gTrue; } } obj.free(); + return bRes; } // Look for an object header ("nnn ggg obj") at [p]. The first diff --git a/PdfFile/lib/xpdf/XRef.h b/PdfFile/lib/xpdf/XRef.h index 9eb93eb396..3ea5ba7a39 100644 --- a/PdfFile/lib/xpdf/XRef.h +++ b/PdfFile/lib/xpdf/XRef.h @@ -174,7 +174,7 @@ private: GBool readXRefStreamSection(Stream *xrefStr, int *w, int first, int n); GBool constructXRef(); void constructTrailerDict(GFileOffset pos); - void saveTrailerDict(Dict *dict, GBool isXRefStream); + GBool saveTrailerDict(Dict *dict, GBool isXRefStream); char *constructObjectEntry(char *p, GFileOffset pos, int *objNum); void constructObjectStreamEntries(Object *objStr, int objStrObjNum); GBool constructXRefEntry(int num, int gen, GFileOffset pos, diff --git a/X2tConverter/build/Android/libx2t/src/main/cpp/jni/objects/JniBaseObjects.h b/X2tConverter/build/Android/libx2t/src/main/cpp/jni/objects/JniBaseObjects.h index 4522a3f1fc..ba56a04086 100644 --- a/X2tConverter/build/Android/libx2t/src/main/cpp/jni/objects/JniBaseObjects.h +++ b/X2tConverter/build/Android/libx2t/src/main/cpp/jni/objects/JniBaseObjects.h @@ -3,10 +3,9 @@ #include #include -#include -#include #include #include +#include "../../../../../../../../../DesktopEditor/common/File.h" #define DELETE_LOCAL_REF(ENV, REFERENCE) \ if (REFERENCE != NULL && !ENV->IsSameObject(REFERENCE, NULL)) { \ @@ -140,8 +139,8 @@ class JniBaseObjects { static std::string jstringToString(JNIEnv* env, jstring jstr) { jboolean isCopy; const char * charPath = env->GetStringUTFChars(jstr, &isCopy); - const int size = env->GetStringLength(jstr); - const std::string str(charPath, charPath + size); + const int size = env->GetStringUTFLength(jstr); + const std::string str(charPath, (size_t)size); env->ReleaseStringUTFChars(jstr, charPath); return str; } @@ -149,23 +148,28 @@ class JniBaseObjects { static std::string* jstringToPString(JNIEnv* env, jstring jstr) { jboolean isCopy; const char * charPath = env->GetStringUTFChars(jstr, &isCopy); - const int size = env->GetStringLength(jstr); - std::string* pStr = new std::string(charPath, charPath + size); + const int size = env->GetStringUTFLength(jstr); + std::string* pStr = new std::string(charPath, (size_t)size); env->ReleaseStringUTFChars(jstr, charPath); return pStr; } static std::wstring jstringToWString(JNIEnv* env, jstring jstr) { jboolean isCopy; - const char * cstr = env->GetStringUTFChars(jstr, &isCopy); - const int size = env->GetStringLength(jstr); - const std::wstring wstr = charsToWString(cstr); - env->ReleaseStringUTFChars(jstr, cstr); - return wstr; + const char * charPath = env->GetStringUTFChars(jstr, &isCopy); + const int size = env->GetStringUTFLength(jstr); + std::wstring pStr = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)charPath, (LONG)size); + env->ReleaseStringUTFChars(jstr, charPath); + return pStr; } - static jstring wStringToJString(JNIEnv* env, const std::wstring wstr) { - return env->NewStringUTF(wStringToString(wstr).c_str()); + static jstring wStringToJString(JNIEnv* env, const std::wstring& wstr) { + std::string sTmp = U_TO_UTF8(wstr); + return stringToJString(env, sTmp); + } + + static jstring stringToJString(JNIEnv* env, const std::string& str) { + return env->NewStringUTF(str.c_str()); } static jstring charToJString(JNIEnv* env, const char * str) { @@ -184,24 +188,6 @@ class JniBaseObjects { return jArray; } - static std::wstring charsToWString(const char * str) { - using convert_typeX = std::codecvt_utf8; - std::wstring_convert converterX; - return converterX.from_bytes(str); - } - - static std::wstring stringToWString(const std::string & str) { - using convert_typeX = std::codecvt_utf8; - std::wstring_convert converterX; - return converterX.from_bytes(str); - } - - static std::string wStringToString(const std::wstring & str) { - using convert_typeX = std::codecvt_utf8; - std::wstring_convert converterX; - return converterX.to_bytes(str); - } - static jobjectArray wStringToObjectArray(JNIEnv *jEnv, std::wstring *data, int length) { jobjectArray jObjectArray = NULL; jsize len = length; diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index bd83aeae93..613b2605ef 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -462,18 +462,26 @@ namespace NExtractTools NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT; nRes = doct_bin2image(eFromType, sFrom, sTo, params, convertParams); } - else if (0 != (AVS_OFFICESTUDIO_FILE_DOCUMENT & nFormatTo)) + else if (0 != (AVS_OFFICESTUDIO_FILE_DOCUMENT & nFormatTo) || + AVS_OFFICESTUDIO_FILE_OTHER_OOXML == nFormatTo || + AVS_OFFICESTUDIO_FILE_OTHER_ODF == nFormatTo) { std::wstring sDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); if (true == NSDirectory::CreateDirectory(sDocxDir)) { - params.m_bMacro = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM == nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM == nFormatTo; + params.m_bMacro = AVS_OFFICESTUDIO_FILE_OTHER_OOXML == nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM == nFormatTo || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOTM == nFormatTo; convertParams.m_sTempResultOOXMLDirectory = sDocxDir; nRes = doct_bin2docx_dir(sFrom, sTo, params, convertParams); if (SUCCEEDED_X2T(nRes)) { - nRes = fromDocxDir(sDocxDir, sTo, nFormatTo, params, convertParams); + std::wstring sFileToCurrent = *params.m_sFileTo; + params.changeFormatFromPost(*params.m_nFormatFrom, params.m_bMacro); + + if (NULL != params.m_nFormatTo) + nFormatTo = *params.m_nFormatTo; + + nRes = fromDocxDir(sDocxDir, *params.m_sFileTo, nFormatTo, params, convertParams); } } else @@ -528,7 +536,6 @@ namespace NExtractTools } else { - std::wstring sDocxFile; std::wstring sDocxDir = combinePath(convertParams.m_sTempDir, L"docx_unpacked"); NSDirectory::CreateDirectory(sDocxDir); @@ -536,14 +543,13 @@ namespace NExtractTools AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM == nFormatFrom || AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF == nFormatFrom) { - sDocxFile = sFrom; - convertParams.m_sTempParamOOXMLFile = sDocxFile; + convertParams.m_sTempParamOOXMLFile = sFrom; if (params.getFromChanges()) { params.setFromChanges(false); - nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT, sDocxFile, params, convertParams); + nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT, convertParams.m_sTempParamOOXMLFile, params, convertParams); } - nRes = zip2dir(sDocxFile, sDocxDir); + nRes = zip2dir(convertParams.m_sTempParamOOXMLFile, sDocxDir); if (false == SUCCEEDED_X2T(nRes)) { @@ -832,7 +838,9 @@ namespace NExtractTools NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::XLST; nRes = doct_bin2image(eFromType, sFrom, sTo, params, convertParams); } - else if (0 != (AVS_OFFICESTUDIO_FILE_SPREADSHEET & nFormatTo)) + else if (0 != (AVS_OFFICESTUDIO_FILE_SPREADSHEET & nFormatTo) || + AVS_OFFICESTUDIO_FILE_OTHER_OOXML == nFormatTo || + AVS_OFFICESTUDIO_FILE_OTHER_ODF == nFormatTo) { std::wstring sXlsxDir = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); if (true == NSDirectory::CreateDirectory(sXlsxDir)) @@ -842,8 +850,13 @@ namespace NExtractTools nRes = xlst_bin2xlsx_dir(sFrom, sTo, params, convertParams); if (SUCCEEDED_X2T(nRes)) { - std::wstring sXlsxFile; - nRes = fromXlsxDir(sXlsxDir, sTo, nFormatTo, params, convertParams); + std::wstring sFileToCurrent = *params.m_sFileTo; + params.changeFormatFromPost(*params.m_nFormatFrom, params.m_bMacro); + + if (NULL != params.m_nFormatTo) + nFormatTo = *params.m_nFormatTo; + + nRes = fromXlsxDir(sXlsxDir, *params.m_sFileTo, nFormatTo, params, convertParams); } } else @@ -1158,7 +1171,9 @@ namespace NExtractTools NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::PPTT; nRes = doct_bin2image(eFromType, sFrom, sTo, params, convertParams); } - else if (0 != (AVS_OFFICESTUDIO_FILE_PRESENTATION & nFormatTo)) + else if (0 != (AVS_OFFICESTUDIO_FILE_PRESENTATION & nFormatTo) || + AVS_OFFICESTUDIO_FILE_OTHER_OOXML == nFormatTo || + AVS_OFFICESTUDIO_FILE_OTHER_ODF == nFormatTo) { std::wstring sPptxDir = combinePath(convertParams.m_sTempDir, L"pptx_unpacked"); @@ -1172,7 +1187,13 @@ namespace NExtractTools nRes = pptt_bin2pptx_dir(sFrom, sTo, params, convertParams); if (SUCCEEDED_X2T(nRes)) { - nRes = fromPptxDir(sPptxDir, sTo, nFormatTo, params, convertParams); + std::wstring sFileToCurrent = *params.m_sFileTo; + params.changeFormatFromPost(*params.m_nFormatFrom, params.m_bMacro); + + if (NULL != params.m_nFormatTo) + nFormatTo = *params.m_nFormatTo; + + nRes = fromPptxDir(sPptxDir, *params.m_sFileTo, nFormatTo, params, convertParams); } } else diff --git a/X2tConverter/src/lib/csv.h b/X2tConverter/src/lib/csv.h index cd01472e47..0ce635462e 100644 --- a/X2tConverter/src/lib/csv.h +++ b/X2tConverter/src/lib/csv.h @@ -136,6 +136,9 @@ namespace NExtractTools nRes = oCXlsxSerializer.loadFromFile(sTargetBin, sTo, sXmlOptions, sMediaPath, sEmbedPath); } + // удаляем EditorWithChanges, потому что он не в Temp + if (sFrom != sTargetBin) + NSFile::CFileBinary::Remove(sTargetBin); return nRes; } diff --git a/X2tConverter/src/lib/html.h b/X2tConverter/src/lib/html.h index 1b0129f594..2a9b8d7aa7 100644 --- a/X2tConverter/src/lib/html.h +++ b/X2tConverter/src/lib/html.h @@ -152,7 +152,17 @@ namespace NExtractTools // doct_bin => html _UINT32 doct_bin2html_internal(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sFileFromDir = NSDirectory::GetFolderPath(sFrom); + _UINT32 nRes = 0; + std::wstring sTargetBin; + if (params.getFromChanges()) + { + params.setFromChanges(false); + nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT, sTargetBin, params, convertParams); + } + else + sTargetBin = sFrom; + + std::wstring sFileFromDir = NSDirectory::GetFolderPath(sTargetBin); std::wstring sImagesDirectory = combinePath(sFileFromDir, L"media"); std::wstring sHtmlFile = combinePath(convertParams.m_sTempDir, L"index.html"); if (!NSDirectory::Exists(sImagesDirectory)) @@ -161,17 +171,21 @@ namespace NExtractTools NSDoctRenderer::CDoctrenderer oDoctRenderer(NULL != params.m_sAllFontsPath ? *params.m_sAllFontsPath : L""); std::wstring sXml = getDoctXml(NSDoctRenderer::DoctRendererFormat::FormatFile::DOCT, NSDoctRenderer::DoctRendererFormat::FormatFile::HTML, - sFrom, sHtmlFile, sImagesDirectory, convertParams.m_sThemesDir, -1, L"", params); + sTargetBin, sHtmlFile, sImagesDirectory, convertParams.m_sThemesDir, -1, L"", params); std::wstring sResult; oDoctRenderer.Execute(sXml, sResult); + + // удаляем EditorWithChanges, потому что он не в Temp + if (sFrom != sTargetBin) + NSFile::CFileBinary::Remove(sTargetBin); if (sResult.find(L"error") != std::wstring::npos) { std::wcerr << L"DoctRenderer:" << sResult << std::endl; return AVS_FILEUTILS_ERROR_CONVERT; } - return 0; + return nRes; } // doct_bin -> epub diff --git a/X2tConverter/src/lib/xlsx.h b/X2tConverter/src/lib/xlsx.h index 396b6233c5..3e7e5e8132 100644 --- a/X2tConverter/src/lib/xlsx.h +++ b/X2tConverter/src/lib/xlsx.h @@ -157,10 +157,28 @@ namespace NExtractTools convertParams.m_bTempIsXmlOptions = false; return nRes; } + _UINT32 xlsx_dir2xlsb_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + const OOX::CPath oox_path(sFrom); + + OOX::Spreadsheet::CXlsb oXlsb; + oXlsb.m_bWriteToXlsb = true; + oXlsb.Read(oox_path); + + OOX::CContentTypes oContentTypes; + oXlsb.SetPropForWriteSheet(sTo, oContentTypes); + oXlsb.WriteSheetData(); + _UINT32 nRes = oXlsb.WriteBin(sTo, oContentTypes) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; + + return nRes; + } _UINT32 xlst_bin2xlsb_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - _UINT32 nRes = 0; + std::wstring sTempUnpackedXLSX = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedXLSX); + _UINT32 nRes = 0; + std::wstring sTargetBin; if (params.getFromChanges()) { @@ -169,29 +187,20 @@ namespace NExtractTools } else sTargetBin = sFrom; + + std::wstring sTempUnpackedXLSB = convertParams.m_sTempResultOOXMLDirectory; - BinXlsxRW::CXlsxSerializer oCXlsxSerializer; - - oCXlsxSerializer.setMacroEnabled(params.m_bMacro); - oCXlsxSerializer.setIsNoBase64(params.getIsNoBase64()); - oCXlsxSerializer.setFontDir(params.getFontPath()); - - std::wstring sXmlOptions = params.getXmlOptions(); - - std::wstring sMediaPath; // will be filled by 'CreateXlsxFolders' method - std::wstring sEmbedPath; // will be filled by 'CreateXlsxFolders' method - - oCXlsxSerializer.CreateXlsxFolders(sXmlOptions, convertParams.m_sTempResultOOXMLDirectory, sMediaPath, sEmbedPath); + convertParams.m_sTempResultOOXMLDirectory = sTempUnpackedXLSX; + nRes = xlst_bin2xlsx_dir(sTargetBin, sTempUnpackedXLSX, params, convertParams); if (SUCCEEDED_X2T(nRes)) { - nRes = oCXlsxSerializer.loadFromFile(sTargetBin, convertParams.m_sTempResultOOXMLDirectory, sXmlOptions, sMediaPath, sEmbedPath); + convertParams.m_sTempResultOOXMLDirectory = sTempUnpackedXLSB; + nRes = xlsx_dir2xlsb_dir(sTempUnpackedXLSX, sTempUnpackedXLSB, params, convertParams); } // удаляем EditorWithChanges, потому что он не в Temp if (sFrom != sTargetBin) NSFile::CFileBinary::Remove(sTargetBin); - - convertParams.m_sTempResultOOXMLDirectory = L""; return nRes; } _UINT32 xlst_bin2xlsb(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) @@ -358,19 +367,7 @@ namespace NExtractTools } return nRes; } - _UINT32 xlsx_dir2xlsb_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) - { - const OOX::CPath oox_path(sFrom); - OOX::Spreadsheet::CXlsb oXlsb; - oXlsb.m_bWriteToXlsb = true; - oXlsb.Read(oox_path); - - OOX::CContentTypes oContentTypes; - _UINT32 nRes = oXlsb.WriteBin(sTo, oContentTypes) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; - - return nRes; - } _UINT32 xlsx_dir2xlsb(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { return NSCommon::ooxml2ooxml(sFrom, sTo, params, convertParams, L"xlsb", xlsx_dir2xlsb_dir); diff --git a/X2tConverter/src/main.cpp b/X2tConverter/src/main.cpp index 6b19ec11c7..c615cb5cdb 100644 --- a/X2tConverter/src/main.cpp +++ b/X2tConverter/src/main.cpp @@ -98,7 +98,7 @@ int wmain_lib(int argc, wchar_t *argv[]) if (sMemoryLimit.empty()) sMemoryLimit = NSSystemUtils::gc_EnvMemoryLimitDefault; -#if !defined(_DEBUG) +#if !defined(_DEBUG) && !defined(__ANDROID__) && !defined(_IOS) long long nMemoryLimit; if (NSStringExt::FromHumanReadableByteCount(sMemoryLimit, nMemoryLimit) && nMemoryLimit > 0) limit_memory((size_t)nMemoryLimit);