summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Tardon <dtardon@redhat.com>2017-12-30 16:39:25 +0100
committerDavid Tardon <dtardon@redhat.com>2017-12-30 16:40:29 +0100
commit99e33fec6e9372840dc0c2e6d29a2b08a311e00a (patch)
treeaeb22284437fb283b3ab3ea54cff7d0af2afdc6c
parentdf9a3b0cc2d2af14f2816477f2ca2e65320234a4 (diff)
parse locale information
Change-Id: If47fadac1a24c6bebb73f530d9623e6b950d7a3f
-rw-r--r--src/lib/MSPUBBlockID.h1
-rw-r--r--src/lib/MSPUBCollector.cpp24
-rw-r--r--src/lib/MSPUBParser.cpp3
-rw-r--r--src/lib/MSPUBTypes.h2
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