diff options
| author | Carl Hetherington <cth@carlh.net> | 2020-08-27 22:48:00 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2020-09-21 21:57:18 +0200 |
| commit | 04d4661dd008284aedc95b2a1f9e120cee17571b (patch) | |
| tree | 50cf2da8a530a33c0b4b44b440584f27df4aff29 /src | |
| parent | 140d631d7df68d47c36bd15558e9b58ef4038e27 (diff) | |
Allow LanguageTag to be constructed from a tag string.
Diffstat (limited to 'src')
| -rw-r--r-- | src/language_tag.cc | 61 | ||||
| -rw-r--r-- | src/language_tag.h | 3 |
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); |
