Index: third_party/libaddressinput/chromium/cpp/src/rule.cc |
diff --git a/third_party/libaddressinput/chromium/cpp/src/rule.cc b/third_party/libaddressinput/chromium/cpp/src/rule.cc |
deleted file mode 100644 |
index 336d40dc15add81aa939a57a13217b9410baab42..0000000000000000000000000000000000000000 |
--- a/third_party/libaddressinput/chromium/cpp/src/rule.cc |
+++ /dev/null |
@@ -1,313 +0,0 @@ |
-// Copyright (C) 2013 Google Inc. |
-// |
-// 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. |
- |
-#include "rule.h" |
- |
-#include <libaddressinput/address_field.h> |
-#include <libaddressinput/util/scoped_ptr.h> |
- |
-#include <cassert> |
-#include <cstddef> |
-#include <string> |
-#include <vector> |
- |
-#include "region_data_constants.h" |
-#include "util/json.h" |
-#include "util/string_util.h" |
- |
-namespace i18n { |
-namespace addressinput { |
- |
-namespace { |
- |
-bool ParseToken(char c, AddressField* field) { |
- assert(field != NULL); |
- switch (c) { |
- case 'R': |
- *field = COUNTRY; |
- return true; |
- case 'S': |
- *field = ADMIN_AREA; |
- return true; |
- case 'C': |
- *field = LOCALITY; |
- return true; |
- case 'D': |
- *field = DEPENDENT_LOCALITY; |
- return true; |
- case 'X': |
- *field = SORTING_CODE; |
- return true; |
- case 'Z': |
- *field = POSTAL_CODE; |
- return true; |
- case 'A': |
- *field = STREET_ADDRESS; |
- return true; |
- case 'N': |
- *field = RECIPIENT; |
- return true; |
- default: |
- return false; |
- } |
-} |
- |
-// Clears |lines|, parses |format|, and adds the address fields and literals to |
-// |lines|. |
-// |
-// For example, the address format in Finland is "%O%n%N%n%A%nAX-%Z %C%nÅLAND". |
-// It includes the allowed fields prefixed with %, newlines denoted %n, and the |
-// extra text that should be included on an envelope. It is parsed into: |
-// { |
-// {RECIPIENT}, |
-// {STREET_ADDRESS}, |
-// {"AX-", POSTAL_CODE, " ", LOCALITY}, |
-// {"ÅLAND"} |
-// } |
-void ParseAddressFieldsFormat(const std::string& format, |
- std::vector<std::vector<FormatElement> >* lines) { |
- assert(lines != NULL); |
- lines->clear(); |
- lines->resize(1); |
- |
- std::vector<std::string> format_parts; |
- SplitString(format, '%', &format_parts); |
- |
- // If the address format starts with a literal, then it will be in the first |
- // element of |format_parts|. This literal does not begin with % and should |
- // not be parsed as a token. |
- if (!format_parts.empty() && !format_parts[0].empty()) { |
- lines->back().push_back(FormatElement(format_parts[0])); |
- } |
- |
- // The rest of the elements in |format_parts| begin with %. |
- for (size_t i = 1; i < format_parts.size(); ++i) { |
- if (format_parts[i].empty()) { |
- continue; |
- } |
- |
- // The first character after % denotes a field or a newline token. |
- const char control_character = format_parts[i][0]; |
- |
- // The rest of the string after the token is a literal. |
- const std::string literal = format_parts[i].substr(1); |
- |
- AddressField field = COUNTRY; |
- if (ParseToken(control_character, &field)) { |
- lines->back().push_back(FormatElement(field)); |
- } else if (control_character == 'n' && !lines->back().empty()) { |
- lines->push_back(std::vector<FormatElement>()); |
- } |
- |
- if (!literal.empty()) { |
- lines->back().push_back(FormatElement(literal)); |
- } |
- } |
-} |
- |
-// Clears |fields|, parses |required|, and adds the required fields to |fields|. |
-// For example, parses "SCDX" into {ADMIN_AREA, LOCALITY, DEPENDENT_LOCALITY, |
-// SORTING_CODE}. |
-void ParseAddressFieldsRequired(const std::string& required, |
- std::vector<AddressField>* fields) { |
- assert(fields != NULL); |
- fields->clear(); |
- for (size_t i = 0; i < required.length(); ++i) { |
- AddressField field = COUNTRY; |
- if (ParseToken(required[i], &field)) { |
- fields->push_back(field); |
- } |
- } |
-} |
- |
-// Finds |target| in |values_to_compare| and sets |selected_value| to the |
-// associated value from |values_to_select|. Returns true if |target| is in |
-// |values_to_compare|. |selected_value| should not be NULL. |values_to_compare| |
-// should not be larger than |values_to_select|. |
-bool GetMatchingValue(const std::string& target, |
- const std::vector<std::string>& values_to_compare, |
- const std::vector<std::string>& values_to_select, |
- std::string* selected_value) { |
- assert(selected_value != NULL); |
- assert(values_to_select.size() >= values_to_compare.size()); |
- for (size_t i = 0; i < values_to_compare.size(); ++i) { |
- if (LooseStringCompare(values_to_compare[i], target)) { |
- *selected_value = values_to_select[i]; |
- return true; |
- } |
- } |
- return false; |
-} |
- |
-} // namespace |
- |
-FormatElement::FormatElement(AddressField field) |
- : field(field), literal() {} |
- |
-FormatElement::FormatElement(const std::string& literal) |
- : field(COUNTRY), literal(literal) { |
- assert(!literal.empty()); |
-} |
- |
-FormatElement::~FormatElement() {} |
- |
-bool FormatElement::operator==(const FormatElement& other) const { |
- return field == other.field && literal == other.literal; |
-} |
- |
-Rule::Rule() {} |
- |
-Rule::~Rule() {} |
- |
-// static |
-const Rule& Rule::GetDefault() { |
- // Allocated once and leaked on shutdown. |
- static Rule* default_rule = NULL; |
- if (default_rule == NULL) { |
- default_rule = new Rule; |
- default_rule->ParseSerializedRule( |
- RegionDataConstants::GetDefaultRegionData()); |
- } |
- return *default_rule; |
-} |
- |
-void Rule::CopyFrom(const Rule& rule) { |
- key_ = rule.key_; |
- name_ = rule.name_; |
- latin_name_ = rule.latin_name_; |
- format_ = rule.format_; |
- latin_format_ = rule.latin_format_; |
- required_ = rule.required_; |
- sub_keys_ = rule.sub_keys_; |
- languages_ = rule.languages_; |
- input_languages_ = rule.input_languages_; |
- language_ = rule.language_; |
- sub_keys_ = rule.sub_keys_; |
- sub_names_ = rule.sub_names_; |
- sub_lnames_ = rule.sub_lnames_; |
- postal_code_format_ = rule.postal_code_format_; |
- admin_area_name_type_ = rule.admin_area_name_type_; |
- postal_code_name_type_ = rule.postal_code_name_type_; |
-} |
- |
-bool Rule::ParseSerializedRule(const std::string& serialized_rule) { |
- scoped_ptr<Json> json(Json::Build()); |
- if (!json->ParseObject(serialized_rule)) { |
- return false; |
- } |
- ParseJsonRule(*json); |
- return true; |
-} |
- |
-void Rule::ParseJsonRule(const Json& json_rule) { |
- std::string value; |
- if (json_rule.GetStringValueForKey("key", &value)) { |
- key_.swap(value); |
- } |
- |
- if (json_rule.GetStringValueForKey("name", &value)) { |
- name_.swap(value); |
- } |
- |
- if (json_rule.GetStringValueForKey("lname", &value)) { |
- latin_name_.swap(value); |
- } |
- |
- if (json_rule.GetStringValueForKey("fmt", &value)) { |
- ParseAddressFieldsFormat(value, &format_); |
- } |
- |
- if (json_rule.GetStringValueForKey("lfmt", &value)) { |
- ParseAddressFieldsFormat(value, &latin_format_); |
- } |
- |
- if (json_rule.GetStringValueForKey("require", &value)) { |
- ParseAddressFieldsRequired(value, &required_); |
- } |
- |
- // Used as a separator in a list of items. For example, the list of supported |
- // languages can be "de~fr~it". |
- static const char kSeparator = '~'; |
- if (json_rule.GetStringValueForKey("sub_keys", &value)) { |
- SplitString(value, kSeparator, &sub_keys_); |
- } |
- |
- if (json_rule.GetStringValueForKey("sub_names", &value)) { |
- SplitString(value, kSeparator, &sub_names_); |
- assert(sub_names_.size() == sub_keys_.size()); |
- } |
- |
- if (json_rule.GetStringValueForKey("sub_lnames", &value)) { |
- SplitString(value, kSeparator, &sub_lnames_); |
- assert(sub_lnames_.size() == sub_keys_.size()); |
- } |
- |
- if (json_rule.GetStringValueForKey("languages", &value)) { |
- SplitString(value, kSeparator, &languages_); |
- } |
- |
- if (json_rule.GetStringValueForKey("input_languages", &value)) { |
- SplitString(value, kSeparator, &input_languages_); |
- } |
- |
- if (json_rule.GetStringValueForKey("lang", &value)) { |
- language_.swap(value); |
- } |
- |
- if (json_rule.GetStringValueForKey("zip", &value)) { |
- postal_code_format_.swap(value); |
- } |
- |
- if (json_rule.GetStringValueForKey("state_name_type", &value)) { |
- admin_area_name_type_.swap(value); |
- } |
- |
- if (json_rule.GetStringValueForKey("zip_name_type", &value)) { |
- postal_code_name_type_.swap(value); |
- } |
-} |
- |
-const std::string& Rule::GetIdentityField(IdentityField identity_field) const { |
- switch (identity_field) { |
- case KEY: |
- return key_; |
- case NAME: |
- return name_; |
- case LATIN_NAME: |
- return latin_name_; |
- case IDENTITY_FIELDS_SIZE: |
- assert(false); |
- } |
- return key_; |
-} |
- |
-bool Rule::CanonicalizeSubKey(const std::string& user_input, |
- bool keep_input_latin, |
- std::string* sub_key) const { |
- assert(sub_key != NULL); |
- |
- if (sub_keys_.empty()) { |
- *sub_key = user_input; |
- return true; |
- } |
- |
- return GetMatchingValue(user_input, sub_keys_, sub_keys_, sub_key) || |
- GetMatchingValue(user_input, sub_names_, sub_keys_, sub_key) || |
- (keep_input_latin && |
- GetMatchingValue(user_input, sub_lnames_, sub_lnames_, sub_key)) || |
- GetMatchingValue(user_input, sub_lnames_, sub_keys_, sub_key); |
-} |
- |
-} // namespace addressinput |
-} // namespace i18n |