void
  xml_compiler::filter_vector::add(const symbol_map& symbol_map,
                                   uint32_t filter_type,
                                   const std::string& prefix,
                                   const std::string& string)
  {
    std::vector<std::string> values;
    pqrs::string::split_by_comma(values, string);

    data_.push_back(values.size() + 1); // +1 == filter_type
    data_.push_back(filter_type);

    for (auto& v : values) {
      // support '|' for <modifier_only>.
      // For example: <modifier_only>ModifierFlag::COMMAND_L|ModifierFlag::CONTROL_L, ModifierFlag::COMMAND_L|ModifierFlag::OPTION_L</modifier_only>
      std::vector<std::string> items;
      pqrs::string::split_by_pipe(items, v);

      uint32_t filter_value = 0;
      for (auto& i : items) {
        std::string key = prefix + i;
        normalize_identifier(key);
        filter_value |= symbol_map.get(key);
      }
      data_.push_back(filter_value);
    }
  }