diff options
author | David Tardon <dtardon@redhat.com> | 2017-12-30 16:39:25 +0100 |
---|---|---|
committer | David Tardon <dtardon@redhat.com> | 2017-12-30 16:40:29 +0100 |
commit | 99e33fec6e9372840dc0c2e6d29a2b08a311e00a (patch) | |
tree | aeb22284437fb283b3ab3ea54cff7d0af2afdc6c | |
parent | df9a3b0cc2d2af14f2816477f2ca2e65320234a4 (diff) |
parse locale information
Change-Id: If47fadac1a24c6bebb73f530d9623e6b950d7a3f
-rw-r--r-- | src/lib/MSPUBBlockID.h | 1 | ||||
-rw-r--r-- | src/lib/MSPUBCollector.cpp | 24 | ||||
-rw-r--r-- | src/lib/MSPUBParser.cpp | 3 | ||||
-rw-r--r-- | src/lib/MSPUBTypes.h | 2 |
4 files changed, 30 insertions, 0 deletions
diff --git a/src/lib/MSPUBBlockID.h b/src/lib/MSPUBBlockID.h index bf92664..38f6139 100644 --- a/src/lib/MSPUBBlockID.h +++ b/src/lib/MSPUBBlockID.h @@ -37,6 +37,7 @@ enum MSPUBBlockID // Don't be alarmed by multiple elements with the same value; UNDERLINE_ID = 0x1E, OUTLINE_ID = 0x4, SHADOW_ID = 0x5, + LOCALE_ID = 0x12, SMALL_CAPS_ID = 0x13, ALL_CAPS_ID = 0x14, EMBOSS_ID = 0x16, diff --git a/src/lib/MSPUBCollector.cpp b/src/lib/MSPUBCollector.cpp index 24c8d08..95a463b 100644 --- a/src/lib/MSPUBCollector.cpp +++ b/src/lib/MSPUBCollector.cpp @@ -14,6 +14,7 @@ #include <boost/multi_array.hpp> #include <unicode/ucsdet.h> +#include <unicode/uloc.h> #include "Coordinate.h" #include "MSPUBConstants.h" @@ -314,6 +315,25 @@ void fillUnderline(librevenge::RVNGPropertyList &props, const Underline underlin } } +void fillLocale(librevenge::RVNGPropertyList &props, const unsigned lcid) +{ + char locale[ULOC_FULLNAME_CAPACITY]; + UErrorCode status = U_ZERO_ERROR; + uloc_getLocaleForLCID(lcid, locale, ULOC_FULLNAME_CAPACITY, &status); + if (!U_SUCCESS(status)) + return; + char component[ULOC_FULLNAME_CAPACITY]; + int32_t len = uloc_getLanguage(locale, component, ULOC_FULLNAME_CAPACITY, &status); + if (U_SUCCESS(status) && len > 0) + props.insert("fo:language", component); + len = uloc_getCountry(locale, component, ULOC_FULLNAME_CAPACITY, &status); + if (U_SUCCESS(status) && len > 0) + props.insert("fo:country", component); + len = uloc_getScript(locale, component, ULOC_FULLNAME_CAPACITY, &status); + if (U_SUCCESS(status) && len > 0) + props.insert("fo:script", component); +} + } // anonymous namespace void MSPUBCollector::collectMetaData(const librevenge::RVNGPropertyList &metaData) @@ -1680,6 +1700,10 @@ librevenge::RVNGPropertyList MSPUBCollector::getCharStyleProps(const CharacterSt default: break; } + if (style.lcid) + fillLocale(ret, get(style.lcid)); + else if (defaultCharStyle.lcid) + fillLocale(ret, get(defaultCharStyle.lcid)); return ret; } diff --git a/src/lib/MSPUBParser.cpp b/src/lib/MSPUBParser.cpp index b6d6bbb..8a307eb 100644 --- a/src/lib/MSPUBParser.cpp +++ b/src/lib/MSPUBParser.cpp @@ -1465,6 +1465,9 @@ CharacterStyle MSPUBParser::getCharacterStyle(librevenge::RVNGInputStream *input case SCALING_ID: style.textScale = double(info.data) / 10; break; + case LOCALE_ID: + style.lcid = info.data; + break; default: break; } diff --git a/src/lib/MSPUBTypes.h b/src/lib/MSPUBTypes.h index ec1aa5c..04219d0 100644 --- a/src/lib/MSPUBTypes.h +++ b/src/lib/MSPUBTypes.h @@ -121,6 +121,7 @@ struct CharacterStyle , emboss(false) , engrave(false) , textScale() + , lcid() { } boost::optional<Underline> underline; @@ -137,6 +138,7 @@ struct CharacterStyle bool emboss; bool engrave; boost::optional<double> textScale; + boost::optional<unsigned> lcid; }; enum LineSpacingType |