blob: 19e42c5d2b8f916105bd8733485bb0b291149b0f [file] [log] [blame]
// Copyright 2010-2015, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef MOZC_CONFIG_CHARACTER_FORM_MANAGER_H_
#define MOZC_CONFIG_CHARACTER_FORM_MANAGER_H_
#include <string>
#include <vector>
#include <utility>
#include "base/port.h"
#include "base/scoped_ptr.h"
#include "config/config.pb.h"
namespace mozc {
// TODO(team): Get rid of Singleton.
template <class T> class Singleton;
namespace config {
// TOOD(hidehiko): Move some methods which don't depend on "config" to the
// mozc::Util class.
class CharacterFormManager {
public:
enum FormType {
UNKNOWN_FORM,
HALF_WIDTH,
FULL_WIDTH
};
// Returns the preference of character form.
// This method cannot return the preference,
// if str has two set of string groups having different preferences.
// e.g., GetPreeditCharacterForm("グーグル012") returns NO_CONVERSION
Config::CharacterForm GetPreeditCharacterForm(const string &input) const;
Config::CharacterForm GetConversionCharacterForm(const string &input) const;
// Converts string according to the config rules.
void ConvertPreeditString(const string &input, string *output) const;
void ConvertConversionString(const string &input, string *output) const;
// Converts string according to the config rules.
// if alternate output, which should be shown next to
// the output, is defined, it is stored into alternative_output.
// If alternative_output is not required, you can pass NULL.
// e.g., output = "@" alternative_output = "@"
// return true if both output and alternative_output are defined.
bool ConvertPreeditStringWithAlternative(
const string &input, string *output, string *alternative_output) const;
bool ConvertConversionStringWithAlternative(
const string &input, string *output, string *alternative_output) const;
// Calls this method after user fixed the final result.
// If a character has "LAST_FORM" preference in the config,
// SetCharacterForm() stores the last character form into local file.
// Next time user calls GetPreeditCharacterForm() or
// GetConversionCharacterForm(), the preference is restored.
void SetCharacterForm(const string &input, Config::CharacterForm form);
// Guesses the character form of str and call
// SetCharacterForm with this result.
// Call this method after user fixed the final result.
// It is more useful to call GuessAndSetCharacterForm(), as
// you don't need to pass the form.
// You can just pass the final final conversion string to this method.
void GuessAndSetCharacterForm(const string &input);
// Clears history data. This method does not clear config data.
void ClearHistory();
// Clears internal rules.
void Clear();
// Adds a rule.
// Example:
// AddPreeditRule("[]{}()", config::Config::LAST_FORM);
// AddPreeditRule("+=", config::Config::HALF_WIDTH);
// The all characters in str are treated as the same group.
void AddPreeditRule(const string &input, Config::CharacterForm form);
void AddConversionRule(const string &input, Config::CharacterForm form);
// Loads Default rules.
void SetDefaultRule();
// Reload explicitly.
void Reload();
// Utility function: pass character form.
static void ConvertWidth(const string &input, string *output,
Config::CharacterForm form);
// Returns form types for given two pair of strings.
// This function tries to find the difference between
// |input1| and |input2| and find the place where the script
// form (halfwidth/fullwidth) is different. This function returns
// true if input1 or input2 needs to have full/half width anotation.
//
// Example:
// input1="ABCぐーぐる input2="ABC"
// form1=Half form2=Full
//
// If input1 and input2 have mixed form types and the result
// is ambigous, this function returns false.
//
// Ambiguous case:
// input1="ABC123" input2="ABC123"
// return false.
static bool GetFormTypesFromStringPair(
const string &input1, FormType *form1,
const string &input2, FormType *form2);
// Returns the singleton instance.
static CharacterFormManager* GetCharacterFormManager();
private:
class Data;
friend class Singleton<CharacterFormManager>;
CharacterFormManager();
~CharacterFormManager();
scoped_ptr<Data> data_;
DISALLOW_COPY_AND_ASSIGN(CharacterFormManager);
};
} // namespace config
} // namespace mozc
#endif // MOZC_CONFIG_CHARACTER_FORM_MANAGER_H_