summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2020-08-27 22:48:00 +0200
committerCarl Hetherington <cth@carlh.net>2020-09-21 21:57:18 +0200
commit04d4661dd008284aedc95b2a1f9e120cee17571b (patch)
tree50cf2da8a530a33c0b4b44b440584f27df4aff29 /src
parent140d631d7df68d47c36bd15558e9b58ef4038e27 (diff)
Allow LanguageTag to be constructed from a tag string.
Diffstat (limited to 'src')
-rw-r--r--src/language_tag.cc61
-rw-r--r--src/language_tag.h3
2 files changed, 64 insertions, 0 deletions
diff --git a/src/language_tag.cc b/src/language_tag.cc
index 47b46024..b64dab72 100644
--- a/src/language_tag.cc
+++ b/src/language_tag.cc
@@ -36,6 +36,7 @@
#include "dcp_assert.h"
#include "exceptions.h"
#include "language_tag.h"
+#include <boost/algorithm/string.hpp>
#include <boost/foreach.hpp>
#include <string>
@@ -93,6 +94,66 @@ LanguageTag::Subtag::Subtag (string subtag, SubtagType type)
}
+LanguageTag::LanguageTag (string tag)
+{
+ vector<string> parts;
+ boost::split (parts, tag, boost::is_any_of("-"));
+ if (parts.empty()) {
+ throw LanguageTagError (String::compose("Could not parse language tag %1", tag));
+ }
+
+ vector<string>::size_type p = 0;
+ _language = LanguageSubtag (parts[p]);
+ ++p;
+
+ if (p == parts.size()) {
+ return;
+ }
+
+ try {
+ _script = ScriptSubtag (parts[p]);
+ ++p;
+ } catch (...) {}
+
+ if (p == parts.size()) {
+ return;
+ }
+
+ try {
+ _region = RegionSubtag (parts[p]);
+ ++p;
+ } catch (...) {}
+
+ if (p == parts.size()) {
+ return;
+ }
+
+ try {
+ while (true) {
+ _variants.push_back (VariantSubtag(parts[p]));
+ ++p;
+ if (p == parts.size()) {
+ return;
+ }
+ }
+ } catch (...) {}
+
+ try {
+ while (true) {
+ _extlangs.push_back (ExtlangSubtag(parts[p]));
+ ++p;
+ if (p == parts.size()) {
+ return;
+ }
+ }
+ } catch (...) {}
+
+ if (p < parts.size()) {
+ throw LanguageTagError (String::compose("Unrecognised subtag %1", parts[p]));
+ }
+}
+
+
string
LanguageTag::to_string () const
{
diff --git a/src/language_tag.h b/src/language_tag.h
index 7a6fd159..8aa8a723 100644
--- a/src/language_tag.h
+++ b/src/language_tag.h
@@ -141,6 +141,9 @@ public:
bool operator< (ExtlangSubtag const& other) const;
};
+ LanguageTag () {}
+ LanguageTag (std::string tag);
+
void set_language (LanguageSubtag language);
void set_script (ScriptSubtag script);
void set_region (RegionSubtag region);