| // 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. |
| |
| // Date comment style are following. |
| // - If the input number converts strictly 2 character with padding, comment |
| // format is like "HH" or "MM". |
| // e.g.) "YYYY/MM/DD HH:MM" -> "2011/01/30 03:20" |
| // - If the input number converts string without padding, comment format is |
| // like "H" or "M" |
| // e.g.) "Y/M/D H:M" -> "645/2/3 9:2" |
| |
| #include "rewriter/date_rewriter.h" |
| |
| #include <algorithm> |
| #include <cstdio> |
| #include <ctime> |
| #include <string> |
| #include <vector> |
| |
| #include "base/logging.h" |
| #include "base/number_util.h" |
| #include "base/util.h" |
| #include "composer/composer.h" |
| #include "composer/table.h" |
| #include "config/config.pb.h" |
| #include "config/config_handler.h" |
| #include "converter/conversion_request.h" |
| #include "converter/segments.h" |
| #include "session/commands.pb.h" |
| |
| namespace mozc { |
| |
| namespace { |
| struct DateData { |
| const char *key; |
| const char *value; |
| const char *description; |
| int diff; // diff from the current time in day or month or year |
| }; |
| |
| const struct DateData kDateData[] = { |
| { |
| // きょう will show today's date |
| "\xE3\x81\x8D\xE3\x82\x87\xE3\x81\x86", |
| "\xE4\xBB\x8A\xE6\x97\xA5", |
| "\xE4\xBB\x8A\xE6\x97\xA5\xE3\x81\xAE\xE6\x97\xA5\xE4\xBB\x98", |
| 0 |
| }, { |
| // あした will show tomorrow's date |
| "\xE3\x81\x82\xE3\x81\x97\xE3\x81\x9F", |
| "\xE6\x98\x8E\xE6\x97\xA5", |
| "\xE6\x98\x8E\xE6\x97\xA5\xE3\x81\xAE\xE6\x97\xA5\xE4\xBB\x98", |
| 1 |
| }, { |
| // あす will show tomorrow's date |
| "\xE3\x81\x82\xE3\x81\x99", |
| "\xE6\x98\x8E\xE6\x97\xA5", |
| "\xE6\x98\x8E\xE6\x97\xA5\xE3\x81\xAE\xE6\x97\xA5\xE4\xBB\x98", |
| 1 |
| }, { |
| // さくじつ will show yesterday's date |
| "\xE3\x81\x95\xE3\x81\x8F\xE3\x81\x98\xE3\x81\xA4", |
| "\xE6\x98\xA8\xE6\x97\xA5", |
| "\xE6\x98\xA8\xE6\x97\xA5\xE3\x81\xAE\xE6\x97\xA5\xE4\xBB\x98", |
| -1 |
| }, { |
| // きのう will show yesterday's date |
| "\xE3\x81\x8D\xE3\x81\xAE\xE3\x81\x86", |
| "\xE6\x98\xA8\xE6\x97\xA5", |
| "\xE6\x98\xA8\xE6\x97\xA5\xE3\x81\xAE\xE6\x97\xA5\xE4\xBB\x98", |
| -1 |
| }, { |
| // おととい will show the date of 2 days ago |
| "\xE3\x81\x8A\xE3\x81\xA8\xE3\x81\xA8\xE3\x81\x84", |
| "\xE4\xB8\x80\xE6\x98\xA8\xE6\x97\xA5", |
| "2\xE6\x97\xA5\xE5\x89\x8D\xE3\x81\xAE\xE6\x97\xA5\xE4\xBB\x98", |
| -2 |
| }, { |
| // おとつい will show the date of 2 days ago |
| "\xE3\x81\x8A\xE3\x81\xA8\xE3\x81\xA4\xE3\x81\x84", |
| "\xE4\xB8\x80\xE6\x98\xA8\xE6\x97\xA5", |
| "2\xE6\x97\xA5\xE5\x89\x8D\xE3\x81\xAE\xE6\x97\xA5\xE4\xBB\x98", |
| -2 |
| }, { |
| // いっさくじつ will show the date of 2 days ago |
| "\xE3\x81\x84\xE3\x81\xA3\xE3\x81\x95\xE3\x81\x8F\xE3\x81\x98\xE3\x81\xA4", |
| "\xE4\xB8\x80\xE6\x98\xA8\xE6\x97\xA5", |
| "2\xE6\x97\xA5\xE5\x89\x8D\xE3\x81\xAE\xE6\x97\xA5\xE4\xBB\x98", |
| -2 |
| }, { |
| // さきおととい will show the date of 3 days ago |
| "\xe3\x81\x95\xe3\x81\x8d\xe3\x81\x8a\xe3\x81\xa8" |
| "\xe3\x81\xa8\xe3\x81\x84", |
| "\xe4\xb8\x80\xe6\x98\xa8\xe6\x98\xa8\xe6\x97\xa5", |
| "3\xE6\x97\xA5\xE5\x89\x8D\xE3\x81\xAE\xE6\x97\xA5\xE4\xBB\x98", |
| -3 |
| }, { |
| // あさって will show the date of 2 days from now |
| "\xE3\x81\x82\xE3\x81\x95\xE3\x81\xA3\xE3\x81\xA6", |
| "\xE6\x98\x8E\xE5\xBE\x8C\xE6\x97\xA5", |
| "\xE6\x98\x8E\xE5\xBE\x8C\xE6\x97\xA5\xE3\x81\xAE\xE6\x97\xA5\xE4\xBB\x98", |
| 2, |
| }, { |
| // みょうごにち will show the date of 2 days from now |
| "\xE3\x81\xBF\xE3\x82\x87\xE3\x81\x86" |
| "\xE3\x81\x94\xE3\x81\xAB\xE3\x81\xA1", |
| "\xE6\x98\x8E\xE5\xBE\x8C\xE6\x97\xA5", |
| "\xE6\x98\x8E\xE5\xBE\x8C\xE6\x97\xA5\xE3\x81\xAE\xE6\x97\xA5\xE4\xBB\x98", |
| 2 |
| }, { |
| // しあさって will show the date of 3 days from now |
| "\xE3\x81\x97\xE3\x81\x82\xE3\x81\x95" |
| "\xE3\x81\xA3\xE3\x81\xA6", |
| "\xE6\x98\x8E\xE6\x98\x8E\xE5\xBE\x8C\xE6\x97\xA5", |
| "\xE6\x98\x8E\xE6\x98\x8E\xE5\xBE\x8C\xE6\x97\xA5\xE3\x81\xAE" |
| "\xE6\x97\xA5\xE4\xBB\x98", |
| 3 |
| } |
| }; |
| |
| const struct DateData kWeekDayData[] = { |
| { |
| // "にちようび" |
| "\xe3\x81\xab\xe3\x81\xa1\xe3\x82\x88\xe3\x81\x86\xe3\x81\xb3", |
| "\xe6\x97\xa5\xe6\x9b\x9c\xe6\x97\xa5", |
| "\xe6\xac\xa1\xe3\x81\xae\xe6\x97\xa5\xe6\x9b\x9c\xe6\x97\xa5", |
| 0 |
| }, { |
| // "げつようび" |
| "\xe3\x81\x92\xe3\x81\xa4\xe3\x82\x88\xe3\x81\x86\xe3\x81\xb3", |
| "\xe6\x9c\x88\xe6\x9b\x9c\xe6\x97\xa5", |
| "\xe6\xac\xa1\xe3\x81\xae\xe6\x9c\x88\xe6\x9b\x9c\xe6\x97\xa5", |
| 1 |
| }, { |
| // "かようび" |
| "\xe3\x81\x8b\xe3\x82\x88\xe3\x81\x86\xe3\x81\xb3", |
| "\xe7\x81\xab\xe6\x9b\x9c\xe6\x97\xa5", |
| "\xe6\xac\xa1\xe3\x81\xae\xe7\x81\xab\xe6\x9b\x9c\xe6\x97\xa5", |
| 2 |
| }, { |
| // "すいようび" |
| "\xe3\x81\x99\xe3\x81\x84\xe3\x82\x88\xe3\x81\x86\xe3\x81\xb3", |
| "\xe6\xb0\xb4\xe6\x9b\x9c\xe6\x97\xa5", |
| "\xe6\xac\xa1\xe3\x81\xae\xe6\xb0\xb4\xe6\x9b\x9c\xe6\x97\xa5", |
| 3 |
| }, { |
| // "もくようび" |
| "\xe3\x82\x82\xe3\x81\x8f\xe3\x82\x88\xe3\x81\x86\xe3\x81\xb3", |
| "\xe6\x9c\xa8\xe6\x9b\x9c\xe6\x97\xa5", |
| "\xe6\xac\xa1\xe3\x81\xae\xe6\x9c\xa8\xe6\x9b\x9c\xe6\x97\xa5", |
| 4 |
| }, { |
| // "きんようび" |
| "\xe3\x81\x8d\xe3\x82\x93\xe3\x82\x88\xe3\x81\x86\xe3\x81\xb3", |
| "\xe9\x87\x91\xe6\x9b\x9c\xe6\x97\xa5", |
| "\xe6\xac\xa1\xe3\x81\xae\xe9\x87\x91\xe6\x9b\x9c\xe6\x97\xa5", |
| 5 |
| }, { |
| // "どようび" |
| "\xe3\x81\xa9\xe3\x82\x88\xe3\x81\x86\xe3\x81\xb3", |
| "\xe5\x9c\x9f\xe6\x9b\x9c\xe6\x97\xa5", |
| "\xe6\xac\xa1\xe3\x81\xae\xe5\x9c\x9f\xe6\x9b\x9c\xe6\x97\xa5", |
| 6 |
| }, { |
| // "にちよう" |
| "\xE3\x81\xAB\xE3\x81\xA1\xE3\x82\x88\xE3\x81\x86", |
| "\xE6\x97\xA5\xE6\x9B\x9C", |
| "\xE6\xAC\xA1\xE3\x81\xAE\xE6\x97\xA5\xE6\x9B\x9C\xE6\x97\xA5", |
| 0 |
| }, { |
| // "げつよう" |
| "\xE3\x81\x92\xE3\x81\xA4\xE3\x82\x88\xE3\x81\x86", |
| "\xE6\x9C\x88\xE6\x9B\x9C", |
| "\xE6\xAC\xA1\xE3\x81\xAE\xE6\x9C\x88\xE6\x9B\x9C\xE6\x97\xA5", |
| 1 |
| }, { |
| // "かよう" |
| "\xE3\x81\x8B\xE3\x82\x88\xE3\x81\x86", |
| "\xE7\x81\xAB\xE6\x9B\x9C", |
| "\xE6\xAC\xA1\xE3\x81\xAE\xE7\x81\xAB\xE6\x9B\x9C\xE6\x97\xA5", |
| 2 |
| }, { |
| // "すいよう" |
| "\xE3\x81\x99\xE3\x81\x84\xE3\x82\x88\xE3\x81\x86", |
| "\xE6\xB0\xB4\xE6\x9B\x9C", |
| "\xE6\xAC\xA1\xE3\x81\xAE\xE6\xB0\xB4\xE6\x9B\x9C\xE6\x97\xA5", |
| 3 |
| }, { |
| // "もくよう" |
| "\xE3\x82\x82\xE3\x81\x8F\xE3\x82\x88\xE3\x81\x86", |
| "\xE6\x9C\xA8\xE6\x9B\x9C", |
| "\xE6\xAC\xA1\xE3\x81\xAE\xE6\x9C\xA8\xE6\x9B\x9C\xE6\x97\xA5", |
| 4 |
| }, { |
| // "きんよう" |
| "\xE3\x81\x8D\xE3\x82\x93\xE3\x82\x88\xE3\x81\x86", |
| "\xE9\x87\x91\xE6\x9B\x9C", |
| "\xE6\xAC\xA1\xE3\x81\xAE\xE9\x87\x91\xE6\x9B\x9C\xE6\x97\xA5", |
| 5 |
| }, { |
| // "どよう" |
| "\xE3\x81\xA9\xE3\x82\x88\xE3\x81\x86", |
| "\xE5\x9C\x9F\xE6\x9B\x9C", |
| "\xE6\xAC\xA1\xE3\x81\xAE\xE5\x9C\x9F\xE6\x9B\x9C\xE6\x97\xA5", |
| 6 |
| } |
| }; |
| |
| const struct DateData kYearData[] = { |
| { |
| // "ことし" |
| "\xE3\x81\x93\xE3\x81\xA8\xE3\x81\x97", |
| "\xE4\xBB\x8A\xE5\xB9\xB4", |
| "\xE4\xBB\x8A\xE5\xB9\xB4", |
| 0 |
| }, { |
| // "らいねん" |
| "\xE3\x82\x89\xE3\x81\x84\xE3\x81\xAD\xE3\x82\x93", |
| "\xE6\x9D\xA5\xE5\xB9\xB4", |
| "\xE6\x9D\xA5\xE5\xB9\xB4", |
| 1 |
| }, { |
| // "さくねん" |
| "\xE3\x81\x95\xE3\x81\x8F\xE3\x81\xAD\xE3\x82\x93", |
| "\xE6\x98\xA8\xE5\xB9\xB4", |
| "\xE6\x98\xA8\xE5\xB9\xB4", |
| -1 |
| }, { |
| // "きょねん" |
| "\xE3\x81\x8D\xE3\x82\x87\xE3\x81\xAD\xE3\x82\x93", |
| "\xE5\x8E\xBB\xE5\xB9\xB4", |
| "\xE5\x8E\xBB\xE5\xB9\xB4", |
| -1 |
| }, { |
| // "おととし" |
| "\xE3\x81\x8A\xE3\x81\xA8\xE3\x81\xA8\xE3\x81\x97", |
| "\xE4\xB8\x80\xE6\x98\xA8\xE5\xB9\xB4", |
| "\xE4\xB8\x80\xE6\x98\xA8\xE5\xB9\xB4", |
| -2 |
| }, { |
| // "さらいねん" |
| "\xE3\x81\x95\xE3\x82\x89\xE3\x81\x84\xE3\x81\xAD\xE3\x82\x93", |
| "\xE5\x86\x8D\xE6\x9D\xA5\xE5\xB9\xB4", |
| "\xE5\x86\x8D\xE6\x9D\xA5\xE5\xB9\xB4", |
| 2 |
| } |
| }; |
| |
| const struct DateData kMonthData[] = { |
| { |
| // "こんげつ" |
| "\xE3\x81\x93\xE3\x82\x93\xE3\x81\x92\xE3\x81\xA4", |
| "\xE4\xBB\x8A\xE6\x9C\x88", |
| "\xE4\xBB\x8A\xE6\x9C\x88", |
| 0 |
| }, { |
| // "らいげつ" |
| "\xE3\x82\x89\xE3\x81\x84\xE3\x81\x92\xE3\x81\xA4", |
| "\xE6\x9D\xA5\xE6\x9C\x88", |
| "\xE6\x9D\xA5\xE6\x9C\x88", |
| 1 |
| }, { |
| // "せんげつ" |
| "\xE3\x81\x9B\xE3\x82\x93\xE3\x81\x92\xE3\x81\xA4", |
| "\xE5\x85\x88\xE6\x9C\x88", |
| "\xE5\x85\x88\xE6\x9C\x88", |
| -1 |
| }, { |
| // "せんせんげつ" |
| "\xE3\x81\x9B\xE3\x82\x93\xE3\x81\x9B\xE3\x82\x93\xE3\x81\x92\xE3\x81\xA4", |
| "\xE5\x85\x88\xE3\x80\x85\xE6\x9C\x88", |
| "\xE5\x85\x88\xE3\x80\x85\xE6\x9C\x88", |
| -2 |
| }, { |
| // "さらいげつ" |
| "\xE3\x81\x95\xE3\x82\x89\xE3\x81\x84\xE3\x81\x92\xE3\x81\xA4", |
| "\xE5\x86\x8D\xE6\x9D\xA5\xE6\x9C\x88", |
| "\xE5\x86\x8D\xE6\x9D\xA5\xE6\x9C\x88", |
| 2 |
| } |
| }; |
| |
| const struct DateData kCurrentTimeData[] = { |
| { |
| // "いま" |
| "\xE3\x81\x84\xE3\x81\xBE", |
| "\xE4\xBB\x8A", |
| "\xE7\x8F\xBE\xE5\x9C\xA8\xE3\x81\xAE\xE6\x99\x82\xE5\x88\xBB", |
| 0 |
| }, { |
| // "じこく" |
| "\xE3\x81\x98\xE3\x81\x93\xE3\x81\x8F", |
| "\xE6\x99\x82\xE5\x88\xBB", |
| "\xE7\x8F\xBE\xE5\x9C\xA8\xE3\x81\xAE\xE6\x99\x82\xE5\x88\xBB", |
| 0 |
| } |
| }; |
| |
| const struct DateData kDateAndCurrentTimeData[] = { |
| { |
| // "にちじ" |
| "\xE3\x81\xAB\xE3\x81\xA1\xE3\x81\x98", |
| "\xE6\x97\xA5\xE6\x99\x82", |
| "\xE7\x8F\xBE\xE5\x9C\xA8\xE3\x81\xAE\xE6\x97\xA5\xE6\x99\x82", |
| 0 |
| }, |
| }; |
| |
| struct YearData { |
| int ad; // AD year |
| const char *era; // Japanese year a.k.a, GENGO |
| const char *key; // reading of the `era` |
| }; |
| |
| const YearData kEraData[] = { |
| // "元徳", "建武" and "明徳" are used for both south and north courts. |
| { |
| // "大化" "たいか" |
| 645, |
| "\xE5\xA4\xA7\xE5\x8C\x96", |
| "\xE3\x81\x9F\xE3\x81\x84\xE3\x81\x8B", |
| }, { |
| // "白雉" "はくち" |
| 650, |
| "\xE7\x99\xBD\xE9\x9B\x89", |
| "\xE3\x81\xAF\xE3\x81\x8F\xE3\x81\xA1", |
| }, { |
| // "朱鳥" "しゅちょう" |
| 686, |
| "\xE6\x9C\xB1\xE9\xB3\xA5", |
| "\xE3\x81\x97\xE3\x82\x85\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "大宝" "たいほう" |
| 701, |
| "\xE5\xA4\xA7\xE5\xAE\x9D", |
| "\xE3\x81\x9F\xE3\x81\x84\xE3\x81\xBB\xE3\x81\x86", |
| }, { |
| // "慶雲" "けいうん" |
| 704, |
| "\xE6\x85\xB6\xE9\x9B\xB2", |
| "\xE3\x81\x91\xE3\x81\x84\xE3\x81\x86\xE3\x82\x93", |
| }, { |
| // "和銅" "わどう" |
| 708, |
| "\xE5\x92\x8C\xE9\x8A\x85", |
| "\xE3\x82\x8F\xE3\x81\xA9\xE3\x81\x86", |
| }, { |
| // "霊亀" "れいき" |
| 715, |
| "\xE9\x9C\x8A\xE4\xBA\x80", |
| "\xE3\x82\x8C\xE3\x81\x84\xE3\x81\x8D", |
| }, { |
| // "養老" "ようろう" |
| 717, |
| "\xE9\xA4\x8A\xE8\x80\x81", |
| "\xE3\x82\x88\xE3\x81\x86\xE3\x82\x8D\xE3\x81\x86", |
| }, { |
| // "神亀" "じんき" |
| 724, |
| "\xE7\xA5\x9E\xE4\xBA\x80", |
| "\xE3\x81\x98\xE3\x82\x93\xE3\x81\x8D", |
| }, { |
| // "天平" "てんぴょう" |
| 729, |
| "\xE5\xA4\xA9\xE5\xB9\xB3", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\xB4\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "天平感宝" "てんぴょうかんぽう" |
| 749, |
| "\xE5\xA4\xA9\xE5\xB9\xB3\xE6\x84\x9F\xE5\xAE\x9D", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\xB4\xE3\x82\x87\xE3\x81\x86" |
| "\xE3\x81\x8B\xE3\x82\x93\xE3\x81\xBD\xE3\x81\x86", |
| }, { |
| // "天平勝宝" "てんぴょうしょうほう" |
| 749, |
| "\xE5\xA4\xA9\xE5\xB9\xB3\xE5\x8B\x9D\xE5\xAE\x9D", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\xB4\xE3\x82\x87\xE3\x81\x86" |
| "\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86\xE3\x81\xBB\xE3\x81\x86", |
| }, { |
| // "天平宝字" "てんぴょうほうじ" |
| 757, |
| "\xE5\xA4\xA9\xE5\xB9\xB3\xE5\xAE\x9D\xE5\xAD\x97", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\xB4\xE3\x82\x87\xE3\x81\x86" |
| "\xE3\x81\xBB\xE3\x81\x86\xE3\x81\x98", |
| }, { |
| // "天平神護" "てんぴょうじんご" |
| 765, |
| "\xE5\xA4\xA9\xE5\xB9\xB3\xE7\xA5\x9E\xE8\xAD\xB7", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\xB4\xE3\x82\x87\xE3\x81\x86" |
| "\xE3\x81\x98\xE3\x82\x93\xE3\x81\x94", |
| }, { |
| // "神護景雲" "じんごけいうん" |
| 767, |
| "\xE7\xA5\x9E\xE8\xAD\xB7\xE6\x99\xAF\xE9\x9B\xB2", |
| "\xE3\x81\x98\xE3\x82\x93\xE3\x81\x94" |
| "\xE3\x81\x91\xE3\x81\x84\xE3\x81\x86\xE3\x82\x93", |
| }, { |
| // "宝亀" "ほうき" |
| 770, |
| "\xE5\xAE\x9D\xE4\xBA\x80", |
| "\xE3\x81\xBB\xE3\x81\x86\xE3\x81\x8D", |
| }, { |
| // "天応" "てんおう" |
| 781, |
| "\xE5\xA4\xA9\xE5\xBF\x9C", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\x8A\xE3\x81\x86", |
| }, { |
| // "延暦" "えんりゃく" |
| 782, |
| "\xE5\xBB\xB6\xE6\x9A\xA6", |
| "\xE3\x81\x88\xE3\x82\x93\xE3\x82\x8A\xE3\x82\x83\xE3\x81\x8F", |
| }, { |
| // "大同" "たいどう" |
| 806, |
| "\xE5\xA4\xA7\xE5\x90\x8C", |
| "\xE3\x81\x9F\xE3\x81\x84\xE3\x81\xA9\xE3\x81\x86", |
| }, { |
| // "弘仁" "こうにん" |
| 810, |
| "\xE5\xBC\x98\xE4\xBB\x81", |
| "\xE3\x81\x93\xE3\x81\x86\xE3\x81\xAB\xE3\x82\x93", |
| }, { |
| // "天長" "てんちょう" |
| 824, |
| "\xE5\xA4\xA9\xE9\x95\xB7", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "承和" "じょうわ" |
| 834, |
| "\xE6\x89\xBF\xE5\x92\x8C", |
| "\xE3\x81\x98\xE3\x82\x87\xE3\x81\x86\xE3\x82\x8F", |
| }, { |
| // "嘉祥" "かしょう" |
| 848, |
| "\xE5\x98\x89\xE7\xA5\xA5", |
| "\xE3\x81\x8B\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "仁寿" "にんじゅ" |
| 851, |
| "\xE4\xBB\x81\xE5\xAF\xBF", |
| "\xE3\x81\xAB\xE3\x82\x93\xE3\x81\x98\xE3\x82\x85", |
| }, { |
| // "斉衡" "さいこう" |
| 854, |
| "\xE6\x96\x89\xE8\xA1\xA1", |
| "\xE3\x81\x95\xE3\x81\x84\xE3\x81\x93\xE3\x81\x86", |
| }, { |
| // "天安" "てんなん" |
| 857, |
| "\xE5\xA4\xA9\xE5\xAE\x89", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\xAA\xE3\x82\x93", |
| }, { |
| // "貞観" "じょうかん" |
| 859, |
| "\xE8\xB2\x9E\xE8\xA6\xB3", |
| "\xE3\x81\x98\xE3\x82\x87\xE3\x81\x86\xE3\x81\x8B\xE3\x82\x93", |
| }, { |
| // "元慶" "がんぎょう" |
| 877, |
| "\xE5\x85\x83\xE6\x85\xB6", |
| "\xE3\x81\x8C\xE3\x82\x93\xE3\x81\x8E\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "仁和" "にんな" |
| 885, |
| "\xE4\xBB\x81\xE5\x92\x8C", |
| "\xE3\x81\xAB\xE3\x82\x93\xE3\x81\xAA", |
| }, { |
| // "寛平" "かんぴょう" |
| 889, |
| "\xE5\xAF\x9B\xE5\xB9\xB3", |
| "\xE3\x81\x8B\xE3\x82\x93\xE3\x81\xB4\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "昌泰" "しょうたい" |
| 898, |
| "\xE6\x98\x8C\xE6\xB3\xB0", |
| "\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86\xE3\x81\x9F\xE3\x81\x84", |
| }, { |
| // "延喜" "えんぎ" |
| 901, |
| "\xE5\xBB\xB6\xE5\x96\x9C", |
| "\xE3\x81\x88\xE3\x82\x93\xE3\x81\x8E", |
| }, { |
| // "延長" "えんちょう" |
| 923, |
| "\xE5\xBB\xB6\xE9\x95\xB7", |
| "\xE3\x81\x88\xE3\x82\x93\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "承平" "じょうへい" |
| 931, |
| "\xE6\x89\xBF\xE5\xB9\xB3", |
| "\xE3\x81\x98\xE3\x82\x87\xE3\x81\x86\xE3\x81\xB8\xE3\x81\x84", |
| }, { |
| // "天慶" "てんぎょう" |
| 938, |
| "\xE5\xA4\xA9\xE6\x85\xB6", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\x8E\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "天暦" "てんりゃく" |
| 947, |
| "\xE5\xA4\xA9\xE6\x9A\xA6", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x82\x8A\xE3\x82\x83\xE3\x81\x8F", |
| }, { |
| // "天徳" "てんとく" |
| 957, |
| "\xE5\xA4\xA9\xE5\xBE\xB3", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\xA8\xE3\x81\x8F", |
| }, { |
| // "応和" "おうわ" |
| 961, |
| "\xE5\xBF\x9C\xE5\x92\x8C", |
| "\xE3\x81\x8A\xE3\x81\x86\xE3\x82\x8F", |
| }, { |
| // "康保" "こうほう" |
| 964, |
| "\xE5\xBA\xB7\xE4\xBF\x9D", |
| "\xE3\x81\x93\xE3\x81\x86\xE3\x81\xBB\xE3\x81\x86", |
| }, { |
| // "安和" "あんな" |
| 968, |
| "\xE5\xAE\x89\xE5\x92\x8C", |
| "\xE3\x81\x82\xE3\x82\x93\xE3\x81\xAA", |
| }, { |
| // "天禄" "てんろく" |
| 970, |
| "\xE5\xA4\xA9\xE7\xA6\x84", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x82\x8D\xE3\x81\x8F", |
| }, { |
| // "天延" "てんえん" |
| 973, |
| "\xE5\xA4\xA9\xE5\xBB\xB6", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\x88\xE3\x82\x93", |
| }, { |
| // "貞元" "じょうげん" |
| 976, |
| "\xE8\xB2\x9E\xE5\x85\x83", |
| "\xE3\x81\x98\xE3\x82\x87\xE3\x81\x86\xE3\x81\x92\xE3\x82\x93", |
| }, { |
| // "天元" "てんげん" |
| 978, |
| "\xE5\xA4\xA9\xE5\x85\x83", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\x92\xE3\x82\x93", |
| }, { |
| // "永観" "えいかん" |
| 983, |
| "\xE6\xB0\xB8\xE8\xA6\xB3", |
| "\xE3\x81\x88\xE3\x81\x84\xE3\x81\x8B\xE3\x82\x93", |
| }, { |
| // "寛和" "かんな" |
| 985, |
| "\xE5\xAF\x9B\xE5\x92\x8C", |
| "\xE3\x81\x8B\xE3\x82\x93\xE3\x81\xAA", |
| }, { |
| // "永延" "えいえん" |
| 987, |
| "\xE6\xB0\xB8\xE5\xBB\xB6", |
| "\xE3\x81\x88\xE3\x81\x84\xE3\x81\x88\xE3\x82\x93", |
| }, { |
| // "永祚" "えいそ" |
| 989, |
| "\xE6\xB0\xB8\xE7\xA5\x9A", |
| "\xE3\x81\x88\xE3\x81\x84\xE3\x81\x9D", |
| }, { |
| // "正暦" "しょうりゃく" |
| 990, |
| "\xE6\xAD\xA3\xE6\x9A\xA6", |
| "\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86\xE3\x82\x8A\xE3\x82\x83\xE3\x81\x8F", |
| }, { |
| // "長徳" "ちょうとく" |
| 995, |
| "\xE9\x95\xB7\xE5\xBE\xB3", |
| "\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86\xE3\x81\xA8\xE3\x81\x8F", |
| }, { |
| // "長保" "ちょうほう" |
| 999, |
| "\xE9\x95\xB7\xE4\xBF\x9D", |
| "\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86\xE3\x81\xBB\xE3\x81\x86", |
| }, { |
| // "寛弘" "かんこう" |
| 1004, |
| "\xE5\xAF\x9B\xE5\xBC\x98", |
| "\xE3\x81\x8B\xE3\x82\x93\xE3\x81\x93\xE3\x81\x86", |
| }, { |
| // "長和" "ちょうわ" |
| 1012, |
| "\xE9\x95\xB7\xE5\x92\x8C", |
| "\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86\xE3\x82\x8F", |
| }, { |
| // "寛仁" "かんにん" |
| 1017, |
| "\xE5\xAF\x9B\xE4\xBB\x81", |
| "\xE3\x81\x8B\xE3\x82\x93\xE3\x81\xAB\xE3\x82\x93", |
| }, { |
| // "治安" "じあん" |
| 1021, |
| "\xE6\xB2\xBB\xE5\xAE\x89", |
| "\xE3\x81\x98\xE3\x81\x82\xE3\x82\x93", |
| }, { |
| // "万寿" "まんじゅ" |
| 1024, |
| "\xE4\xB8\x87\xE5\xAF\xBF", |
| "\xE3\x81\xBE\xE3\x82\x93\xE3\x81\x98\xE3\x82\x85", |
| }, { |
| // "長元" "ちょうげん" |
| 1028, |
| "\xE9\x95\xB7\xE5\x85\x83", |
| "\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86\xE3\x81\x92\xE3\x82\x93", |
| }, { |
| // "長暦" "ちょうりゃく" |
| 1037, |
| "\xE9\x95\xB7\xE6\x9A\xA6", |
| "\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86\xE3\x82\x8A\xE3\x82\x83\xE3\x81\x8F", |
| }, { |
| // "長久" "ちょうきゅう" |
| 1040, |
| "\xE9\x95\xB7\xE4\xB9\x85", |
| "\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86\xE3\x81\x8D\xE3\x82\x85\xE3\x81\x86", |
| }, { |
| // "寛徳" "かんとく" |
| 1044, |
| "\xE5\xAF\x9B\xE5\xBE\xB3", |
| "\xE3\x81\x8B\xE3\x82\x93\xE3\x81\xA8\xE3\x81\x8F", |
| }, { |
| // "永承" "えいしょう" |
| 1046, |
| "\xE6\xB0\xB8\xE6\x89\xBF", |
| "\xE3\x81\x88\xE3\x81\x84\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "天喜" "てんき" |
| 1053, |
| "\xE5\xA4\xA9\xE5\x96\x9C", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\x8D", |
| }, { |
| // "康平" "こうへい" |
| 1058, |
| "\xE5\xBA\xB7\xE5\xB9\xB3", |
| "\xE3\x81\x93\xE3\x81\x86\xE3\x81\xB8\xE3\x81\x84", |
| }, { |
| // "治暦" "じりゃく" |
| 1065, |
| "\xE6\xB2\xBB\xE6\x9A\xA6", |
| "\xE3\x81\x98\xE3\x82\x8A\xE3\x82\x83\xE3\x81\x8F", |
| }, { |
| // "延久" "えんきゅう" |
| 1069, |
| "\xE5\xBB\xB6\xE4\xB9\x85", |
| "\xE3\x81\x88\xE3\x82\x93\xE3\x81\x8D\xE3\x82\x85\xE3\x81\x86", |
| }, { |
| // "承保" "じょうほう" |
| 1074, |
| "\xE6\x89\xBF\xE4\xBF\x9D", |
| "\xE3\x81\x98\xE3\x82\x87\xE3\x81\x86\xE3\x81\xBB\xE3\x81\x86", |
| }, { |
| // "承暦" "じょうりゃく" |
| 1077, |
| "\xE6\x89\xBF\xE6\x9A\xA6", |
| "\xE3\x81\x98\xE3\x82\x87\xE3\x81\x86\xE3\x82\x8A\xE3\x82\x83\xE3\x81\x8F", |
| }, { |
| // "永保" "えいほ" |
| 1081, |
| "\xE6\xB0\xB8\xE4\xBF\x9D", |
| "\xE3\x81\x88\xE3\x81\x84\xE3\x81\xBB", |
| }, { |
| // "応徳" "おうとく" |
| 1084, |
| "\xE5\xBF\x9C\xE5\xBE\xB3", |
| "\xE3\x81\x8A\xE3\x81\x86\xE3\x81\xA8\xE3\x81\x8F", |
| }, { |
| // "寛治" "かんじ" |
| 1087, |
| "\xE5\xAF\x9B\xE6\xB2\xBB", |
| "\xE3\x81\x8B\xE3\x82\x93\xE3\x81\x98", |
| }, { |
| // "嘉保" "かほう" |
| 1094, |
| "\xE5\x98\x89\xE4\xBF\x9D", |
| "\xE3\x81\x8B\xE3\x81\xBB\xE3\x81\x86", |
| }, { |
| // "永長" "えいちょう" |
| 1096, |
| "\xE6\xB0\xB8\xE9\x95\xB7", |
| "\xE3\x81\x88\xE3\x81\x84\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "承徳" "じょうとく" |
| 1097, |
| "\xE6\x89\xBF\xE5\xBE\xB3", |
| "\xE3\x81\x98\xE3\x82\x87\xE3\x81\x86\xE3\x81\xA8\xE3\x81\x8F", |
| }, { |
| // "康和" "こうわ" |
| 1099, |
| "\xE5\xBA\xB7\xE5\x92\x8C", |
| "\xE3\x81\x93\xE3\x81\x86\xE3\x82\x8F", |
| }, { |
| // "長治" "ちょうじ" |
| 1104, |
| "\xE9\x95\xB7\xE6\xB2\xBB", |
| "\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86\xE3\x81\x98", |
| }, { |
| // "嘉承" "かしょう" |
| 1106, |
| "\xE5\x98\x89\xE6\x89\xBF", |
| "\xE3\x81\x8B\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "天仁" "てんにん" |
| 1108, |
| "\xE5\xA4\xA9\xE4\xBB\x81", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\xAB\xE3\x82\x93", |
| }, { |
| // "天永" "てんえい" |
| 1110, |
| "\xE5\xA4\xA9\xE6\xB0\xB8", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\x88\xE3\x81\x84", |
| }, { |
| // "永久" "えいきゅう" |
| 1113, |
| "\xE6\xB0\xB8\xE4\xB9\x85", |
| "\xE3\x81\x88\xE3\x81\x84\xE3\x81\x8D\xE3\x82\x85\xE3\x81\x86", |
| }, { |
| // "元永" "げんえい" |
| 1118, |
| "\xE5\x85\x83\xE6\xB0\xB8", |
| "\xE3\x81\x92\xE3\x82\x93\xE3\x81\x88\xE3\x81\x84", |
| }, { |
| // "保安" "ほうあん" |
| 1120, |
| "\xE4\xBF\x9D\xE5\xAE\x89", |
| "\xE3\x81\xBB\xE3\x81\x86\xE3\x81\x82\xE3\x82\x93", |
| }, { |
| // "天治" "てんじ" |
| 1124, |
| "\xE5\xA4\xA9\xE6\xB2\xBB", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\x98", |
| }, { |
| // "大治" "だいじ" |
| 1126, |
| "\xE5\xA4\xA7\xE6\xB2\xBB", |
| "\xE3\x81\xA0\xE3\x81\x84\xE3\x81\x98", |
| }, { |
| // "天承" "てんじょう" |
| 1131, |
| "\xE5\xA4\xA9\xE6\x89\xBF", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\x98\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "長承" "ちょうじょう" |
| 1132, |
| "\xE9\x95\xB7\xE6\x89\xBF", |
| "\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86\xE3\x81\x98\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "保延" "ほうえん" |
| 1135, |
| "\xE4\xBF\x9D\xE5\xBB\xB6", |
| "\xE3\x81\xBB\xE3\x81\x86\xE3\x81\x88\xE3\x82\x93", |
| }, { |
| // "永治" "えいじ" |
| 1141, |
| "\xE6\xB0\xB8\xE6\xB2\xBB", |
| "\xE3\x81\x88\xE3\x81\x84\xE3\x81\x98", |
| }, { |
| // "康治" "こうじ" |
| 1142, |
| "\xE5\xBA\xB7\xE6\xB2\xBB", |
| "\xE3\x81\x93\xE3\x81\x86\xE3\x81\x98", |
| }, { |
| // "天養" "てんよう" |
| 1144, |
| "\xE5\xA4\xA9\xE9\xA4\x8A", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x82\x88\xE3\x81\x86", |
| }, { |
| // "久安" "きゅうあん" |
| 1145, |
| "\xE4\xB9\x85\xE5\xAE\x89", |
| "\xE3\x81\x8D\xE3\x82\x85\xE3\x81\x86\xE3\x81\x82\xE3\x82\x93", |
| }, { |
| // "仁平" "にんぺい" |
| 1151, |
| "\xE4\xBB\x81\xE5\xB9\xB3", |
| "\xE3\x81\xAB\xE3\x82\x93\xE3\x81\xBA\xE3\x81\x84", |
| }, { |
| // "久寿" "きゅうじゅ" |
| 1154, |
| "\xE4\xB9\x85\xE5\xAF\xBF", |
| "\xE3\x81\x8D\xE3\x82\x85\xE3\x81\x86\xE3\x81\x98\xE3\x82\x85", |
| }, { |
| // "保元" "ほうげん" |
| 1156, |
| "\xE4\xBF\x9D\xE5\x85\x83", |
| "\xE3\x81\xBB\xE3\x81\x86\xE3\x81\x92\xE3\x82\x93", |
| }, { |
| // "平治" "へいじ" |
| 1159, |
| "\xE5\xB9\xB3\xE6\xB2\xBB", |
| "\xE3\x81\xB8\xE3\x81\x84\xE3\x81\x98", |
| }, { |
| // "永暦" "えいりゃく" |
| 1160, |
| "\xE6\xB0\xB8\xE6\x9A\xA6", |
| "\xE3\x81\x88\xE3\x81\x84\xE3\x82\x8A\xE3\x82\x83\xE3\x81\x8F", |
| }, { |
| // "応保" "おうほ" |
| 1161, |
| "\xE5\xBF\x9C\xE4\xBF\x9D", |
| "\xE3\x81\x8A\xE3\x81\x86\xE3\x81\xBB", |
| }, { |
| // "長寛" "ちょうかん" |
| 1163, |
| "\xE9\x95\xB7\xE5\xAF\x9B", |
| "\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86\xE3\x81\x8B\xE3\x82\x93", |
| }, { |
| // "永万" "えいまん" |
| 1165, |
| "\xE6\xB0\xB8\xE4\xB8\x87", |
| "\xE3\x81\x88\xE3\x81\x84\xE3\x81\xBE\xE3\x82\x93", |
| }, { |
| // "仁安" "にんあん" |
| 1166, |
| "\xE4\xBB\x81\xE5\xAE\x89", |
| "\xE3\x81\xAB\xE3\x82\x93\xE3\x81\x82\xE3\x82\x93", |
| }, { |
| // "嘉応" "かおう" |
| 1169, |
| "\xE5\x98\x89\xE5\xBF\x9C", |
| "\xE3\x81\x8B\xE3\x81\x8A\xE3\x81\x86", |
| }, { |
| // "承安" "しょうあん" |
| 1171, |
| "\xE6\x89\xBF\xE5\xAE\x89", |
| "\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86\xE3\x81\x82\xE3\x82\x93", |
| }, { |
| // "安元" "あんげん" |
| 1175, |
| "\xE5\xAE\x89\xE5\x85\x83", |
| "\xE3\x81\x82\xE3\x82\x93\xE3\x81\x92\xE3\x82\x93", |
| }, { |
| // "治承" "じしょう" |
| 1177, |
| "\xE6\xB2\xBB\xE6\x89\xBF", |
| "\xE3\x81\x98\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "養和" "ようわ" |
| 1181, |
| "\xE9\xA4\x8A\xE5\x92\x8C", |
| "\xE3\x82\x88\xE3\x81\x86\xE3\x82\x8F", |
| }, { |
| // "寿永" "じゅえい" |
| 1182, |
| "\xE5\xAF\xBF\xE6\xB0\xB8", |
| "\xE3\x81\x98\xE3\x82\x85\xE3\x81\x88\xE3\x81\x84", |
| }, { |
| // "元暦" "げんりゃく" |
| 1184, |
| "\xE5\x85\x83\xE6\x9A\xA6", |
| "\xE3\x81\x92\xE3\x82\x93\xE3\x82\x8A\xE3\x82\x83\xE3\x81\x8F", |
| }, { |
| // "文治" "ぶんじ" |
| 1185, |
| "\xE6\x96\x87\xE6\xB2\xBB", |
| "\xE3\x81\xB6\xE3\x82\x93\xE3\x81\x98", |
| }, { |
| // "建久" "けんきゅう" |
| 1190, |
| "\xE5\xBB\xBA\xE4\xB9\x85", |
| "\xE3\x81\x91\xE3\x82\x93\xE3\x81\x8D\xE3\x82\x85\xE3\x81\x86", |
| }, { |
| // "正治" "しょうじ" |
| 1199, |
| "\xE6\xAD\xA3\xE6\xB2\xBB", |
| "\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86\xE3\x81\x98", |
| }, { |
| // "建仁" "けんにん" |
| 1201, |
| "\xE5\xBB\xBA\xE4\xBB\x81", |
| "\xE3\x81\x91\xE3\x82\x93\xE3\x81\xAB\xE3\x82\x93", |
| }, { |
| // "元久" "げんきゅう" |
| 1204, |
| "\xE5\x85\x83\xE4\xB9\x85", |
| "\xE3\x81\x92\xE3\x82\x93\xE3\x81\x8D\xE3\x82\x85\xE3\x81\x86", |
| }, { |
| // "建永" "けんえい" |
| 1206, |
| "\xE5\xBB\xBA\xE6\xB0\xB8", |
| "\xE3\x81\x91\xE3\x82\x93\xE3\x81\x88\xE3\x81\x84", |
| }, { |
| // "承元" "じょうげん" |
| 1207, |
| "\xE6\x89\xBF\xE5\x85\x83", |
| "\xE3\x81\x98\xE3\x82\x87\xE3\x81\x86\xE3\x81\x92\xE3\x82\x93", |
| }, { |
| // "建暦" "けんりゃく" |
| 1211, |
| "\xE5\xBB\xBA\xE6\x9A\xA6", |
| "\xE3\x81\x91\xE3\x82\x93\xE3\x82\x8A\xE3\x82\x83\xE3\x81\x8F", |
| }, { |
| // "建保" "けんぽう" |
| 1213, |
| "\xE5\xBB\xBA\xE4\xBF\x9D", |
| "\xE3\x81\x91\xE3\x82\x93\xE3\x81\xBD\xE3\x81\x86", |
| }, { |
| // "承久" "しょうきゅう" |
| 1219, |
| "\xE6\x89\xBF\xE4\xB9\x85", |
| "\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86\xE3\x81\x8D\xE3\x82\x85\xE3\x81\x86", |
| }, { |
| // "貞応" "じょうおう" |
| 1222, |
| "\xE8\xB2\x9E\xE5\xBF\x9C", |
| "\xE3\x81\x98\xE3\x82\x87\xE3\x81\x86\xE3\x81\x8A\xE3\x81\x86", |
| }, { |
| // "元仁" "げんにん" |
| 1224, |
| "\xE5\x85\x83\xE4\xBB\x81", |
| "\xE3\x81\x92\xE3\x82\x93\xE3\x81\xAB\xE3\x82\x93", |
| }, { |
| // "嘉禄" "かろく" |
| 1225, |
| "\xE5\x98\x89\xE7\xA6\x84", |
| "\xE3\x81\x8B\xE3\x82\x8D\xE3\x81\x8F", |
| }, { |
| // "安貞" "あんてい" |
| 1227, |
| "\xE5\xAE\x89\xE8\xB2\x9E", |
| "\xE3\x81\x82\xE3\x82\x93\xE3\x81\xA6\xE3\x81\x84", |
| }, { |
| // "寛喜" "かんき" |
| 1229, |
| "\xE5\xAF\x9B\xE5\x96\x9C", |
| "\xE3\x81\x8B\xE3\x82\x93\xE3\x81\x8D", |
| }, { |
| // "貞永" "じょうえい" |
| 1232, |
| "\xE8\xB2\x9E\xE6\xB0\xB8", |
| "\xE3\x81\x98\xE3\x82\x87\xE3\x81\x86\xE3\x81\x88\xE3\x81\x84", |
| }, { |
| // "天福" "てんぷく" |
| 1233, |
| "\xE5\xA4\xA9\xE7\xA6\x8F", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\xB7\xE3\x81\x8F", |
| }, { |
| // "文暦" "ぶんりゃく" |
| 1234, |
| "\xE6\x96\x87\xE6\x9A\xA6", |
| "\xE3\x81\xB6\xE3\x82\x93\xE3\x82\x8A\xE3\x82\x83\xE3\x81\x8F", |
| }, { |
| // "嘉禎" "かてい" |
| 1235, |
| "\xE5\x98\x89\xE7\xA6\x8E", |
| "\xE3\x81\x8B\xE3\x81\xA6\xE3\x81\x84", |
| }, { |
| // "暦仁" "りゃくにん" |
| 1238, |
| "\xE6\x9A\xA6\xE4\xBB\x81", |
| "\xE3\x82\x8A\xE3\x82\x83\xE3\x81\x8F\xE3\x81\xAB\xE3\x82\x93", |
| }, { |
| // "延応" "えんおう" |
| 1239, |
| "\xE5\xBB\xB6\xE5\xBF\x9C", |
| "\xE3\x81\x88\xE3\x82\x93\xE3\x81\x8A\xE3\x81\x86", |
| }, { |
| // "仁治" "にんじゅ" |
| 1240, |
| "\xE4\xBB\x81\xE6\xB2\xBB", |
| "\xE3\x81\xAB\xE3\x82\x93\xE3\x81\x98\xE3\x82\x85", |
| }, { |
| // "寛元" "かんげん" |
| 1243, |
| "\xE5\xAF\x9B\xE5\x85\x83", |
| "\xE3\x81\x8B\xE3\x82\x93\xE3\x81\x92\xE3\x82\x93", |
| }, { |
| // "宝治" "ほうじ" |
| 1247, |
| "\xE5\xAE\x9D\xE6\xB2\xBB", |
| "\xE3\x81\xBB\xE3\x81\x86\xE3\x81\x98", |
| }, { |
| // "建長" "けんちょう" |
| 1249, |
| "\xE5\xBB\xBA\xE9\x95\xB7", |
| "\xE3\x81\x91\xE3\x82\x93\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "康元" "こうげん" |
| 1256, |
| "\xE5\xBA\xB7\xE5\x85\x83", |
| "\xE3\x81\x93\xE3\x81\x86\xE3\x81\x92\xE3\x82\x93", |
| }, { |
| // "正嘉" "しょうか" |
| 1257, |
| "\xE6\xAD\xA3\xE5\x98\x89", |
| "\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86\xE3\x81\x8B", |
| }, { |
| // "正元" "しょうげん" |
| 1259, |
| "\xE6\xAD\xA3\xE5\x85\x83", |
| "\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86\xE3\x81\x92\xE3\x82\x93", |
| }, { |
| // "文応" "ぶんおう" |
| 1260, |
| "\xE6\x96\x87\xE5\xBF\x9C", |
| "\xE3\x81\xB6\xE3\x82\x93\xE3\x81\x8A\xE3\x81\x86", |
| }, { |
| // "弘長" "こうちょう" |
| 1261, |
| "\xE5\xBC\x98\xE9\x95\xB7", |
| "\xE3\x81\x93\xE3\x81\x86\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "文永" "ぶんえい" |
| 1264, |
| "\xE6\x96\x87\xE6\xB0\xB8", |
| "\xE3\x81\xB6\xE3\x82\x93\xE3\x81\x88\xE3\x81\x84", |
| }, { |
| // "建治" "けんじ" |
| 1275, |
| "\xE5\xBB\xBA\xE6\xB2\xBB", |
| "\xE3\x81\x91\xE3\x82\x93\xE3\x81\x98", |
| }, { |
| // "弘安" "こうあん" |
| 1278, |
| "\xE5\xBC\x98\xE5\xAE\x89", |
| "\xE3\x81\x93\xE3\x81\x86\xE3\x81\x82\xE3\x82\x93", |
| }, { |
| // "正応" "しょうおう" |
| 1288, |
| "\xE6\xAD\xA3\xE5\xBF\x9C", |
| "\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86\xE3\x81\x8A\xE3\x81\x86", |
| }, { |
| // "永仁" "えいにん" |
| 1293, |
| "\xE6\xB0\xB8\xE4\xBB\x81", |
| "\xE3\x81\x88\xE3\x81\x84\xE3\x81\xAB\xE3\x82\x93", |
| }, { |
| // "正安" "しょうあん" |
| 1299, |
| "\xE6\xAD\xA3\xE5\xAE\x89", |
| "\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86\xE3\x81\x82\xE3\x82\x93", |
| }, { |
| // "乾元" "けんげん" |
| 1302, |
| "\xE4\xB9\xBE\xE5\x85\x83", |
| "\xE3\x81\x91\xE3\x82\x93\xE3\x81\x92\xE3\x82\x93", |
| }, { |
| // "嘉元" "かげん" |
| 1303, |
| "\xE5\x98\x89\xE5\x85\x83", |
| "\xE3\x81\x8B\xE3\x81\x92\xE3\x82\x93", |
| }, { |
| // "徳治" "とくじ" |
| 1306, |
| "\xE5\xBE\xB3\xE6\xB2\xBB", |
| "\xE3\x81\xA8\xE3\x81\x8F\xE3\x81\x98", |
| }, { |
| // "延慶" "えんぎょう" |
| 1308, |
| "\xE5\xBB\xB6\xE6\x85\xB6", |
| "\xE3\x81\x88\xE3\x82\x93\xE3\x81\x8E\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "応長" "おうちょう" |
| 1311, |
| "\xE5\xBF\x9C\xE9\x95\xB7", |
| "\xE3\x81\x8A\xE3\x81\x86\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "正和" "しょうわ" |
| 1312, |
| "\xE6\xAD\xA3\xE5\x92\x8C", |
| "\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86\xE3\x82\x8F", |
| }, { |
| // "文保" "ぶんぽう" |
| 1317, |
| "\xE6\x96\x87\xE4\xBF\x9D", |
| "\xE3\x81\xB6\xE3\x82\x93\xE3\x81\xBD\xE3\x81\x86", |
| }, { |
| // "元応" "げんおう" |
| 1319, |
| "\xE5\x85\x83\xE5\xBF\x9C", |
| "\xE3\x81\x92\xE3\x82\x93\xE3\x81\x8A\xE3\x81\x86", |
| }, { |
| // "元亨" "げんこう" |
| 1321, |
| "\xE5\x85\x83\xE4\xBA\xA8", |
| "\xE3\x81\x92\xE3\x82\x93\xE3\x81\x93\xE3\x81\x86", |
| }, { |
| // "正中" "しょうちゅう" |
| 1324, |
| "\xE6\xAD\xA3\xE4\xB8\xAD", |
| "\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86\xE3\x81\xA1\xE3\x82\x85\xE3\x81\x86", |
| }, { |
| // "嘉暦" "かりゃく" |
| 1326, |
| "\xE5\x98\x89\xE6\x9A\xA6", |
| "\xE3\x81\x8B\xE3\x82\x8A\xE3\x82\x83\xE3\x81\x8F", |
| }, { |
| // "元徳" "げんとく" |
| 1329, |
| "\xE5\x85\x83\xE5\xBE\xB3", |
| "\xE3\x81\x92\xE3\x82\x93\xE3\x81\xA8\xE3\x81\x8F", |
| }, { |
| // "元弘" "げんこう" |
| 1331, |
| "\xE5\x85\x83\xE5\xBC\x98", |
| "\xE3\x81\x92\xE3\x82\x93\xE3\x81\x93\xE3\x81\x86", |
| }, { |
| // "建武" "けんむ" |
| 1334, |
| "\xE5\xBB\xBA\xE6\xAD\xA6", |
| "\xE3\x81\x91\xE3\x82\x93\xE3\x82\x80", |
| }, { |
| // "延元" "えんげん" |
| 1336, |
| "\xE5\xBB\xB6\xE5\x85\x83", |
| "\xE3\x81\x88\xE3\x82\x93\xE3\x81\x92\xE3\x82\x93", |
| }, { |
| // "興国" "こうこく" |
| 1340, |
| "\xE8\x88\x88\xE5\x9B\xBD", |
| "\xE3\x81\x93\xE3\x81\x86\xE3\x81\x93\xE3\x81\x8F", |
| }, { |
| // "正平" "しょうへい" |
| 1346, |
| "\xE6\xAD\xA3\xE5\xB9\xB3", |
| "\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86\xE3\x81\xB8\xE3\x81\x84", |
| }, { |
| // "建徳" "けんとく" |
| 1370, |
| "\xE5\xBB\xBA\xE5\xBE\xB3", |
| "\xE3\x81\x91\xE3\x82\x93\xE3\x81\xA8\xE3\x81\x8F", |
| }, { |
| // "文中" "ぶんちゅう" |
| 1372, |
| "\xE6\x96\x87\xE4\xB8\xAD", |
| "\xE3\x81\xB6\xE3\x82\x93\xE3\x81\xA1\xE3\x82\x85\xE3\x81\x86", |
| }, { |
| // "天授" "てんじゅ" |
| 1375, |
| "\xE5\xA4\xA9\xE6\x8E\x88", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\x98\xE3\x82\x85", |
| }, { |
| // "弘和" "こうわ" |
| 1381, |
| "\xE5\xBC\x98\xE5\x92\x8C", |
| "\xE3\x81\x93\xE3\x81\x86\xE3\x82\x8F", |
| }, { |
| // "元中" "げんちゅう" |
| 1384, |
| "\xE5\x85\x83\xE4\xB8\xAD", |
| "\xE3\x81\x92\xE3\x82\x93\xE3\x81\xA1\xE3\x82\x85\xE3\x81\x86", |
| }, { |
| // "明徳" "めいとく" |
| 1390, |
| "\xE6\x98\x8E\xE5\xBE\xB3", |
| "\xE3\x82\x81\xE3\x81\x84\xE3\x81\xA8\xE3\x81\x8F", |
| }, { |
| // "応永" "おうえい" |
| 1394, |
| "\xE5\xBF\x9C\xE6\xB0\xB8", |
| "\xE3\x81\x8A\xE3\x81\x86\xE3\x81\x88\xE3\x81\x84", |
| }, { |
| // "正長" "しょうちょう" |
| 1428, |
| "\xE6\xAD\xA3\xE9\x95\xB7", |
| "\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "永享" "えいきょう" |
| 1429, |
| "\xE6\xB0\xB8\xE4\xBA\xAB", |
| "\xE3\x81\x88\xE3\x81\x84\xE3\x81\x8D\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "嘉吉" "かきつ" |
| 1441, |
| "\xE5\x98\x89\xE5\x90\x89", |
| "\xE3\x81\x8B\xE3\x81\x8D\xE3\x81\xA4", |
| }, { |
| // "文安" "ぶんあん" |
| 1444, |
| "\xE6\x96\x87\xE5\xAE\x89", |
| "\xE3\x81\xB6\xE3\x82\x93\xE3\x81\x82\xE3\x82\x93", |
| }, { |
| // "宝徳" "ほうとく" |
| 1449, |
| "\xE5\xAE\x9D\xE5\xBE\xB3", |
| "\xE3\x81\xBB\xE3\x81\x86\xE3\x81\xA8\xE3\x81\x8F", |
| }, { |
| // "享徳" "きょうとく" |
| 1452, |
| "\xE4\xBA\xAB\xE5\xBE\xB3", |
| "\xE3\x81\x8D\xE3\x82\x87\xE3\x81\x86\xE3\x81\xA8\xE3\x81\x8F", |
| }, { |
| // "康正" "こうしょう" |
| 1455, |
| "\xE5\xBA\xB7\xE6\xAD\xA3", |
| "\xE3\x81\x93\xE3\x81\x86\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "長禄" "ちょうろく" |
| 1457, |
| "\xE9\x95\xB7\xE7\xA6\x84", |
| "\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86\xE3\x82\x8D\xE3\x81\x8F", |
| }, { |
| // "寛正" "かんしょう" |
| 1460, |
| "\xE5\xAF\x9B\xE6\xAD\xA3", |
| "\xE3\x81\x8B\xE3\x82\x93\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "文正" "ぶんしょう" |
| 1466, |
| "\xE6\x96\x87\xE6\xAD\xA3", |
| "\xE3\x81\xB6\xE3\x82\x93\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "応仁" "おうにん" |
| 1467, |
| "\xE5\xBF\x9C\xE4\xBB\x81", |
| "\xE3\x81\x8A\xE3\x81\x86\xE3\x81\xAB\xE3\x82\x93", |
| }, { |
| // "文明" "ぶんめい" |
| 1469, |
| "\xE6\x96\x87\xE6\x98\x8E", |
| "\xE3\x81\xB6\xE3\x82\x93\xE3\x82\x81\xE3\x81\x84", |
| }, { |
| // "長享" "ちょうきょう" |
| 1487, |
| "\xE9\x95\xB7\xE4\xBA\xAB", |
| "\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86\xE3\x81\x8D\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "延徳" "えんとく" |
| 1489, |
| "\xE5\xBB\xB6\xE5\xBE\xB3", |
| "\xE3\x81\x88\xE3\x82\x93\xE3\x81\xA8\xE3\x81\x8F", |
| }, { |
| // "明応" "めいおう" |
| 1492, |
| "\xE6\x98\x8E\xE5\xBF\x9C", |
| "\xE3\x82\x81\xE3\x81\x84\xE3\x81\x8A\xE3\x81\x86", |
| }, { |
| // "文亀" "ぶんき" |
| 1501, |
| "\xE6\x96\x87\xE4\xBA\x80", |
| "\xE3\x81\xB6\xE3\x82\x93\xE3\x81\x8D", |
| }, { |
| // "永正" "えいしょう" |
| 1504, |
| "\xE6\xB0\xB8\xE6\xAD\xA3", |
| "\xE3\x81\x88\xE3\x81\x84\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "大永" "だいえい" |
| 1521, |
| "\xE5\xA4\xA7\xE6\xB0\xB8", |
| "\xE3\x81\xA0\xE3\x81\x84\xE3\x81\x88\xE3\x81\x84", |
| }, { |
| // "享禄" "きょうろく" |
| 1528, |
| "\xE4\xBA\xAB\xE7\xA6\x84", |
| "\xE3\x81\x8D\xE3\x82\x87\xE3\x81\x86\xE3\x82\x8D\xE3\x81\x8F", |
| }, { |
| // "天文" "てんぶん" |
| 1532, |
| "\xE5\xA4\xA9\xE6\x96\x87", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\xB6\xE3\x82\x93", |
| }, { |
| // "弘治" "こうじ" |
| 1555, |
| "\xE5\xBC\x98\xE6\xB2\xBB", |
| "\xE3\x81\x93\xE3\x81\x86\xE3\x81\x98", |
| }, { |
| // "永禄" "えいろく" |
| 1558, |
| "\xE6\xB0\xB8\xE7\xA6\x84", |
| "\xE3\x81\x88\xE3\x81\x84\xE3\x82\x8D\xE3\x81\x8F", |
| }, { |
| // "元亀" "げんき" |
| 1570, |
| "\xE5\x85\x83\xE4\xBA\x80", |
| "\xE3\x81\x92\xE3\x82\x93\xE3\x81\x8D", |
| }, { |
| // "天正" "てんしょう" |
| 1573, |
| "\xE5\xA4\xA9\xE6\xAD\xA3", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "文禄" "ぶんろく" |
| 1592, |
| "\xE6\x96\x87\xE7\xA6\x84", |
| "\xE3\x81\xB6\xE3\x82\x93\xE3\x82\x8D\xE3\x81\x8F", |
| }, { |
| // "慶長" "けいちょう" |
| 1596, |
| "\xE6\x85\xB6\xE9\x95\xB7", |
| "\xE3\x81\x91\xE3\x81\x84\xE3\x81\xA1\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "元和" "げんな" |
| 1615, |
| "\xE5\x85\x83\xE5\x92\x8C", |
| "\xE3\x81\x92\xE3\x82\x93\xE3\x81\xAA", |
| }, { |
| // "寛永" "かんえい" |
| 1624, |
| "\xE5\xAF\x9B\xE6\xB0\xB8", |
| "\xE3\x81\x8B\xE3\x82\x93\xE3\x81\x88\xE3\x81\x84", |
| }, { |
| // "正保" "しょうほう" |
| 1644, |
| "\xE6\xAD\xA3\xE4\xBF\x9D", |
| "\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86\xE3\x81\xBB\xE3\x81\x86", |
| }, { |
| // "慶安" "けいあん" |
| 1648, |
| "\xE6\x85\xB6\xE5\xAE\x89", |
| "\xE3\x81\x91\xE3\x81\x84\xE3\x81\x82\xE3\x82\x93", |
| }, { |
| // "承応" "じょうおう" |
| 1652, |
| "\xE6\x89\xBF\xE5\xBF\x9C", |
| "\xE3\x81\x98\xE3\x82\x87\xE3\x81\x86\xE3\x81\x8A\xE3\x81\x86", |
| }, { |
| // "明暦" "めいれき" |
| 1655, |
| "\xE6\x98\x8E\xE6\x9A\xA6", |
| "\xE3\x82\x81\xE3\x81\x84\xE3\x82\x8C\xE3\x81\x8D", |
| }, { |
| // "万治" "まんじ" |
| 1658, |
| "\xE4\xB8\x87\xE6\xB2\xBB", |
| "\xE3\x81\xBE\xE3\x82\x93\xE3\x81\x98", |
| }, { |
| // "寛文" "かんぶん" |
| 1661, |
| "\xE5\xAF\x9B\xE6\x96\x87", |
| "\xE3\x81\x8B\xE3\x82\x93\xE3\x81\xB6\xE3\x82\x93", |
| }, { |
| // "延宝" "えんぽう" |
| 1673, |
| "\xE5\xBB\xB6\xE5\xAE\x9D", |
| "\xE3\x81\x88\xE3\x82\x93\xE3\x81\xBD\xE3\x81\x86", |
| }, { |
| // "天和" "てんな" |
| 1681, |
| "\xE5\xA4\xA9\xE5\x92\x8C", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\xAA", |
| }, { |
| // "貞享" "じょうきょう" |
| 1684, |
| "\xE8\xB2\x9E\xE4\xBA\xAB", |
| "\xE3\x81\x98\xE3\x82\x87\xE3\x81\x86\xE3\x81\x8D\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "元禄" "げんろく" |
| 1688, |
| "\xE5\x85\x83\xE7\xA6\x84", |
| "\xE3\x81\x92\xE3\x82\x93\xE3\x82\x8D\xE3\x81\x8F", |
| }, { |
| // "宝永" "ほうえい" |
| 1704, |
| "\xE5\xAE\x9D\xE6\xB0\xB8", |
| "\xE3\x81\xBB\xE3\x81\x86\xE3\x81\x88\xE3\x81\x84", |
| }, { |
| // "正徳" "しょうとく" |
| 1711, |
| "\xE6\xAD\xA3\xE5\xBE\xB3", |
| "\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86\xE3\x81\xA8\xE3\x81\x8F", |
| }, { |
| // "享保" "きょうほ" |
| 1716, |
| "\xE4\xBA\xAB\xE4\xBF\x9D", |
| "\xE3\x81\x8D\xE3\x82\x87\xE3\x81\x86\xE3\x81\xBB", |
| }, { |
| // "元文" "げんぶん" |
| 1736, |
| "\xE5\x85\x83\xE6\x96\x87", |
| "\xE3\x81\x92\xE3\x82\x93\xE3\x81\xB6\xE3\x82\x93", |
| }, { |
| // "寛保" "かんぽ" |
| 1741, |
| "\xE5\xAF\x9B\xE4\xBF\x9D", |
| "\xE3\x81\x8B\xE3\x82\x93\xE3\x81\xBD", |
| }, { |
| // "延享" "えんきょう" |
| 1744, |
| "\xE5\xBB\xB6\xE4\xBA\xAB", |
| "\xE3\x81\x88\xE3\x82\x93\xE3\x81\x8D\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "寛延" "かんえん" |
| 1748, |
| "\xE5\xAF\x9B\xE5\xBB\xB6", |
| "\xE3\x81\x8B\xE3\x82\x93\xE3\x81\x88\xE3\x82\x93", |
| }, { |
| // "宝暦" "ほうれき" |
| 1751, |
| "\xE5\xAE\x9D\xE6\x9A\xA6", |
| "\xE3\x81\xBB\xE3\x81\x86\xE3\x82\x8C\xE3\x81\x8D", |
| }, { |
| // "明和" "めいわ" |
| 1764, |
| "\xE6\x98\x8E\xE5\x92\x8C", |
| "\xE3\x82\x81\xE3\x81\x84\xE3\x82\x8F", |
| }, { |
| // "安永" "あんえい" |
| 1772, |
| "\xE5\xAE\x89\xE6\xB0\xB8", |
| "\xE3\x81\x82\xE3\x82\x93\xE3\x81\x88\xE3\x81\x84", |
| }, { |
| // "天明" "てんめい" |
| 1781, |
| "\xE5\xA4\xA9\xE6\x98\x8E", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x82\x81\xE3\x81\x84", |
| }, { |
| // "寛政" "かんせい" |
| 1789, |
| "\xE5\xAF\x9B\xE6\x94\xBF", |
| "\xE3\x81\x8B\xE3\x82\x93\xE3\x81\x9B\xE3\x81\x84", |
| }, { |
| // "享和" "きょうわ" |
| 1801, |
| "\xE4\xBA\xAB\xE5\x92\x8C", |
| "\xE3\x81\x8D\xE3\x82\x87\xE3\x81\x86\xE3\x82\x8F", |
| }, { |
| // "文化" "ぶんか" |
| 1804, |
| "\xE6\x96\x87\xE5\x8C\x96", |
| "\xE3\x81\xB6\xE3\x82\x93\xE3\x81\x8B", |
| }, { |
| // "文政" "ぶんせい" |
| 1818, |
| "\xE6\x96\x87\xE6\x94\xBF", |
| "\xE3\x81\xB6\xE3\x82\x93\xE3\x81\x9B\xE3\x81\x84", |
| }, { |
| // "天保" "てんぽう" |
| 1830, |
| "\xE5\xA4\xA9\xE4\xBF\x9D", |
| "\xE3\x81\xA6\xE3\x82\x93\xE3\x81\xBD\xE3\x81\x86", |
| }, { |
| // "弘化" "こうか" |
| 1844, |
| "\xE5\xBC\x98\xE5\x8C\x96", |
| "\xE3\x81\x93\xE3\x81\x86\xE3\x81\x8B", |
| }, { |
| // "嘉永" "かえい" |
| 1848, |
| "\xE5\x98\x89\xE6\xB0\xB8", |
| "\xE3\x81\x8B\xE3\x81\x88\xE3\x81\x84", |
| }, { |
| // "安政" "あんせい" |
| 1854, |
| "\xE5\xAE\x89\xE6\x94\xBF", |
| "\xE3\x81\x82\xE3\x82\x93\xE3\x81\x9B\xE3\x81\x84", |
| }, { |
| // "万延" "まんえん" |
| 1860, |
| "\xE4\xB8\x87\xE5\xBB\xB6", |
| "\xE3\x81\xBE\xE3\x82\x93\xE3\x81\x88\xE3\x82\x93", |
| }, { |
| // "文久" "ぶんきゅう" |
| 1861, |
| "\xE6\x96\x87\xE4\xB9\x85", |
| "\xE3\x81\xB6\xE3\x82\x93\xE3\x81\x8D\xE3\x82\x85\xE3\x81\x86", |
| }, { |
| // "元治" "げんじ" |
| 1864, |
| "\xE5\x85\x83\xE6\xB2\xBB", |
| "\xE3\x81\x92\xE3\x82\x93\xE3\x81\x98", |
| }, { |
| // "慶応" "けいおう" |
| 1865, |
| "\xE6\x85\xB6\xE5\xBF\x9C", |
| "\xE3\x81\x91\xE3\x81\x84\xE3\x81\x8A\xE3\x81\x86", |
| }, { |
| // "明治" "めいじ" |
| 1868, |
| "\xE6\x98\x8E\xE6\xB2\xBB", |
| "\xE3\x82\x81\xE3\x81\x84\xE3\x81\x98", |
| }, { |
| // "大正" "たいしょう" |
| 1912, |
| "\xE5\xA4\xA7\xE6\xAD\xA3", |
| "\xE3\x81\x9F\xE3\x81\x84\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86", |
| }, { |
| // "昭和" "しょうわ" |
| 1926, |
| "\xE6\x98\xAD\xE5\x92\x8C", |
| "\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86\xE3\x82\x8F", |
| }, { |
| // "平成" "へいせい" |
| 1989, |
| "\xE5\xB9\xB3\xE6\x88\x90", |
| "\xE3\x81\xB8\xE3\x81\x84\xE3\x81\x9B\xE3\x81\x84", |
| } |
| }; |
| |
| const YearData kNorthEraData[] = { |
| // "元徳", "建武" and "明徳" are used for both south and north courts. |
| { |
| // "元徳" "げんとく" |
| 1329, |
| "\xE5\x85\x83\xE5\xBE\xB3", |
| "\xE3\x81\x92\xE3\x82\x93\xE3\x81\xA8\xE3\x81\x8F", |
| }, { |
| // "正慶" "しょうけい" |
| 1332, |
| "\xE6\xAD\xA3\xE6\x85\xB6", |
| "\xE3\x81\x97\xE3\x82\x87\xE3\x81\x86\xE3\x81\x91\xE3\x81\x84", |
| }, { |
| // "建武" "けんむ" |
| 1334, |
| "\xE5\xBB\xBA\xE6\xAD\xA6", |
| "\xE3\x81\x91\xE3\x82\x93\xE3\x82\x80", |
| }, { |
| // "暦応" "りゃくおう" |
| 1338, |
| "\xE6\x9A\xA6\xE5\xBF\x9C", |
| "\xE3\x82\x8A\xE3\x82\x83\xE3\x81\x8F\xE3\x81\x8A\xE3\x81\x86", |
| }, { |
| // "康永" "こうえい" |
| 1342, |
| "\xE5\xBA\xB7\xE6\xB0\xB8", |
| "\xE3\x81\x93\xE3\x81\x86\xE3\x81\x88\xE3\x81\x84", |
| }, { |
| // "貞和" "じょうわ" |
| 1345, |
| "\xE8\xB2\x9E\xE5\x92\x8C", |
| "\xE3\x81\x98\xE3\x82\x87\xE3\x81\x86\xE3\x82\x8F", |
| }, { |
| // "観応" "かんおう" |
| 1350, |
| "\xE8\xA6\xB3\xE5\xBF\x9C", |
| "\xE3\x81\x8B\xE3\x82\x93\xE3\x81\x8A\xE3\x81\x86", |
| }, { |
| // "文和" "ぶんわ" |
| 1352, |
| "\xE6\x96\x87\xE5\x92\x8C", |
| "\xE3\x81\xB6\xE3\x82\x93\xE3\x82\x8F", |
| }, { |
| // "延文" "えんぶん" |
| 1356, |
| "\xE5\xBB\xB6\xE6\x96\x87", |
| "\xE3\x81\x88\xE3\x82\x93\xE3\x81\xB6\xE3\x82\x93", |
| }, { |
| // "康安" "こうあん" |
| 1361, |
| "\xE5\xBA\xB7\xE5\xAE\x89", |
| "\xE3\x81\x93\xE3\x81\x86\xE3\x81\x82\xE3\x82\x93", |
| }, { |
| // "貞治" "じょうじ" |
| 1362, |
| "\xE8\xB2\x9E\xE6\xB2\xBB", |
| "\xE3\x81\x98\xE3\x82\x87\xE3\x81\x86\xE3\x81\x98", |
| }, { |
| // "応安" "おうあん" |
| 1368, |
| "\xE5\xBF\x9C\xE5\xAE\x89", |
| "\xE3\x81\x8A\xE3\x81\x86\xE3\x81\x82\xE3\x82\x93", |
| }, { |
| // "永和" "えいわ" |
| 1375, |
| "\xE6\xB0\xB8\xE5\x92\x8C", |
| "\xE3\x81\x88\xE3\x81\x84\xE3\x82\x8F", |
| }, { |
| // "康暦" "こうりゃく" |
| 1379, |
| "\xE5\xBA\xB7\xE6\x9A\xA6", |
| "\xE3\x81\x93\xE3\x81\x86\xE3\x82\x8A\xE3\x82\x83\xE3\x81\x8F", |
| }, { |
| // "永徳" "えいとく" |
| 1381, |
| "\xE6\xB0\xB8\xE5\xBE\xB3", |
| "\xE3\x81\x88\xE3\x81\x84\xE3\x81\xA8\xE3\x81\x8F", |
| }, { |
| // "至徳" "しとく" |
| 1384, |
| "\xE8\x87\xB3\xE5\xBE\xB3", |
| "\xE3\x81\x97\xE3\x81\xA8\xE3\x81\x8F", |
| }, { |
| // "嘉慶" "かけい" |
| 1387, |
| "\xE5\x98\x89\xE6\x85\xB6", |
| "\xE3\x81\x8B\xE3\x81\x91\xE3\x81\x84", |
| }, { |
| // "康応" "こうおう" |
| 1389, |
| "\xE5\xBA\xB7\xE5\xBF\x9C", |
| "\xE3\x81\x93\xE3\x81\x86\xE3\x81\x8A\xE3\x81\x86", |
| }, { |
| // "明徳" "めいとく" |
| 1390, |
| "\xE6\x98\x8E\xE5\xBE\xB3", |
| "\xE3\x82\x81\xE3\x81\x84\xE3\x81\xA8\xE3\x81\x8F", |
| } |
| }; |
| |
| const char *kWeekDayString[] = { |
| "\xE6\x97\xA5", // "日" |
| "\xE6\x9C\x88", // "月" |
| "\xE7\x81\xAB", // "火" |
| "\xE6\xB0\xB4", // "水" |
| "\xE6\x9C\xA8", // "木" |
| "\xE9\x87\x91", // "金" |
| "\xE5\x9C\x9F", // "土" |
| }; |
| |
| // Converts a prefix and year number to Japanese Kanji Representation |
| // arguments : |
| // - input "prefix" : a japanese style year counter prefix. |
| // - input "year" : represent integer must be smaller than 100. |
| // - output "result" : will be stored candidate strings |
| // If the input year is invalid ( accept only [ 1 - 99 ] ) , this function |
| // returns false and clear output vector. |
| bool ExpandYear(const string &prefix, int year, vector<string> *result) { |
| DCHECK(result); |
| if (year <= 0 || year >= 100) { |
| result->clear(); |
| return false; |
| } |
| |
| if (year == 1) { |
| // "元年" |
| result->push_back(prefix + "\xE5\x85\x83"); |
| return true; |
| } |
| |
| result->push_back(prefix + NumberUtil::SimpleItoa(year)); |
| |
| string arabic = NumberUtil::SimpleItoa(year); |
| |
| vector<NumberUtil::NumberString> output; |
| |
| NumberUtil::ArabicToKanji(arabic, &output); |
| |
| for (int i = 0; i < output.size(); i++) { |
| if (output[i].style == NumberUtil::NumberString::NUMBER_KANJI) { |
| result->push_back(prefix + output[i].value); |
| } |
| } |
| |
| return true; |
| } |
| |
| void Insert(const Segment::Candidate &base_candidate, |
| int position, |
| const string &value, |
| const char *description, |
| Segment *segment) { |
| Segment::Candidate *c = segment->insert_candidate(position); |
| DCHECK(c); |
| c->Init(); |
| c->lid = base_candidate.lid; |
| c->rid = base_candidate.rid; |
| c->cost = base_candidate.cost; |
| c->value = value; |
| c->key = base_candidate.key; |
| c->content_key = base_candidate.content_key; |
| c->attributes |= Segment::Candidate::NO_LEARNING; |
| c->attributes |= Segment::Candidate::NO_VARIANTS_EXPANSION; |
| if (description != NULL) { |
| c->description = description; |
| } |
| } |
| |
| enum { |
| REWRITE_YEAR, |
| REWRITE_DATE, |
| REWRITE_MONTH, |
| REWRITE_CURRENT_TIME, |
| REWRITE_DATE_AND_CURRENT_TIME |
| }; |
| |
| bool AdToEraForCourt(const YearData *data, int size, |
| int year, vector<string> *results) { |
| for (int i = size - 1; i >= 0; --i) { |
| if (i == size - 1 && year > data[i].ad) { |
| ExpandYear(data[i].era, year - data[i].ad + 1, results); |
| return true; |
| } else if (i > 0 && data[i-1].ad < year && year <= data[i].ad) { |
| // have two representations: |
| // 1989 -> "昭和64" and "平成元" |
| if (year == data[i].ad) { |
| ExpandYear(data[i].era, 1, results); |
| } |
| ExpandYear(data[i - 1].era, year - data[i - 1].ad + 1, results); |
| return true; |
| } else if (i == 0 && data[i].ad <= year) { |
| if (year == data[i].ad) { |
| ExpandYear(data[i].era, 1, results); |
| } else { |
| ExpandYear(data[i - 1].era, year - data[i - 1].ad + 1, results); |
| } |
| return true; |
| } |
| } |
| |
| return false; |
| } |
| |
| // "ねん" |
| const char kNenKey[] = "\xE3\x81\xAD\xE3\x82\x93"; |
| // "年" |
| const char kNenValue[] = "\xE5\xB9\xB4"; |
| |
| bool ExtractYearFromKey(const YearData &year_data, |
| const string &key, |
| int *year, |
| string *description) { |
| // "がん" |
| const char kGanKey[] = "\xE3\x81\x8C\xE3\x82\x93"; |
| // "元" |
| const char kGanValue[] = "\xE5\x85\x83"; |
| |
| // Util::EndsWith(key, kNenKey) is expected to always return true |
| DCHECK(Util::EndsWith(key, kNenKey)); |
| if (!Util::StartsWith(key, year_data.key)) { |
| return false; |
| } |
| // key="しょうわ59ねん" -> era_year_str="59" |
| // key="へいせいがんねん" -> era_year_str="がん" |
| const size_t year_start = Util::CharsLen(year_data.key); |
| const size_t year_length = Util::CharsLen(key) - |
| year_start - Util::CharsLen(kNenKey); |
| string era_year_str(Util::SubString(key, year_start, year_length)); |
| |
| // "元年" |
| if (era_year_str == kGanKey) { |
| *year = 1; |
| description->assign(year_data.era).append(kGanValue).append(kNenValue); |
| return true; |
| } |
| |
| if (!NumberUtil::IsArabicNumber(era_year_str)) { |
| return false; |
| } |
| *year = atoi32(era_year_str.c_str()); |
| if (*year <= 0) { |
| return false; |
| } |
| *description = year_data.era + era_year_str + kNenValue; |
| |
| return true; |
| } |
| |
| bool EraToAdForCourt(const YearData *data, size_t size, const string &key, |
| vector<string> *results, vector<string> *descriptions) { |
| if (!Util::EndsWith(key, kNenKey)) { |
| return false; |
| } |
| |
| bool modified = false; |
| for (size_t i = 0; i < size; ++i) { |
| const YearData &year_data = data[i]; |
| if (!Util::StartsWith(key, year_data.key)) { |
| continue; |
| } |
| |
| // key="しょうわ59ねん" -> era_year=59, description="昭和59年" |
| // key="へいせいがんねん" -> era_year=1, description="平成元年" |
| int era_year = 0; |
| string description = ""; |
| if (!ExtractYearFromKey(year_data, key, &era_year, &description)) { |
| continue; |
| } |
| const int ad_year = era_year + year_data.ad - 1; |
| |
| // Get wide arabic numbers |
| // e.g.) 1989 -> "1989", "一九八九" |
| vector<NumberUtil::NumberString> output; |
| const string ad_year_str(NumberUtil::SimpleItoa(ad_year)); |
| NumberUtil::ArabicToWideArabic(ad_year_str, &output); |
| // add half-width arabic number to `output` (e.g. "1989") |
| output.push_back(NumberUtil::NumberString( |
| ad_year_str, |
| "", |
| NumberUtil::NumberString::DEFAULT_STYLE)); |
| |
| for (size_t j = 0; j < output.size(); ++j) { |
| // "元徳", "建武" and "明徳" require dedupe |
| const string value(output[j].value + kNenValue); |
| vector<string>::const_iterator found = find(results->begin(), |
| results->end(), |
| value); |
| if (found != results->end()) { |
| continue; |
| } |
| results->push_back(value); |
| descriptions->push_back(description); |
| } |
| modified = true; |
| } |
| return modified; |
| } |
| |
| // Checkes given date is valid or not. |
| // Over 24 hour expression is allowed in this function. |
| // Acceptable hour is between 0 and 29. |
| bool IsValidTime(uint32 hour, uint32 minute) { |
| if (hour >= 30 || minute >= 60) { |
| return false; |
| } else { |
| return true; |
| } |
| } |
| |
| // Returns February last day. |
| // This function deals with leap year with Gregorian calendar. |
| uint32 GetFebruaryLastDay(uint32 year) { |
| uint32 february_end = (year % 4 == 0) ? 29 : 28; |
| if (year % 100 == 0 && year % 400 != 0) { |
| february_end = 28; |
| } |
| return february_end; |
| } |
| |
| // Checkes given date is valid or not. |
| bool IsValidDate(uint32 year, uint32 month, uint32 day) { |
| if (day < 1) { |
| return false; |
| } |
| |
| if (year == 0 || year > 2100) { |
| return false; |
| } |
| |
| switch (month) { |
| case 2: { |
| if (day > GetFebruaryLastDay(year)) { |
| return false; |
| } else { |
| return true; |
| } |
| } |
| case 4: case 6: case 9: case 11: { |
| if (day > 30) { |
| return false; |
| } else { |
| return true; |
| } |
| } |
| case 1: case 3: case 5: case 7: case 8: case 10: case 12: { |
| if (day > 31) { |
| return false; |
| } else { |
| return true; |
| } |
| } |
| default: { |
| return false; |
| } |
| } |
| } |
| |
| // Checks given date is valid or not in this year |
| bool IsValidDateInThisYear(uint32 month, uint32 day) { |
| struct tm t_st; |
| if (!Util::GetTmWithOffsetSecond(&t_st, 0)) { |
| LOG(ERROR) << "GetTmWithOffsetSecond() failed"; |
| return false; |
| } |
| return IsValidDate(t_st.tm_year + 1900, month, day); |
| } |
| } // namespace |
| |
| // convert AD to Japanese ERA. |
| // The results will have multiple variants. |
| bool DateRewriter::AdToEra(int year, vector<string> *results) const { |
| if (year < 645 || year > 2050) { // TODO(taku) is it enough? |
| return false; |
| } |
| |
| // The order is south to north. |
| vector<string> eras; |
| bool r = false; |
| r = AdToEraForCourt(kEraData, arraysize(kEraData), year, &eras); |
| if (year > 1331 && year < 1393) { |
| r |= AdToEraForCourt(kNorthEraData, arraysize(kNorthEraData), |
| year, &eras); |
| } |
| // 1334 requires dedupe |
| for (int i = 0; i < eras.size(); ++i) { |
| bool found = false; |
| for (int j = 0; j < i; ++j) { |
| if (eras[j] == eras[i]) { |
| found = true; |
| } |
| } |
| if (!found) { |
| results->push_back(eras[i]); |
| } |
| } |
| return r; |
| } |
| |
| bool DateRewriter::EraToAd(const string &key, |
| vector<string> *results, |
| vector<string> *descritions) const { |
| bool ret = false; |
| // The order is south to north, older to newer |
| ret |= EraToAdForCourt(kEraData, arraysize(kEraData), |
| key, results, descritions); |
| ret |= EraToAdForCourt(kNorthEraData, arraysize(kNorthEraData), |
| key, results, descritions); |
| return ret; |
| } |
| |
| bool DateRewriter::ConvertTime(uint32 hour, uint32 min, |
| vector<string> *results) const { |
| DCHECK(results); |
| if (!IsValidTime(hour, min)) { |
| return false; |
| } |
| |
| results->push_back(Util::StringPrintf("%d:%2.2d", hour, min)); |
| |
| // "H時MM分" |
| results->push_back(Util::StringPrintf("%d\xE6\x99\x82%2.2d\xE5\x88\x86", |
| hour, min)); |
| |
| if (min == 30) { |
| // "H時半" |
| results->push_back(Util::StringPrintf("%d\xE6\x99\x82\xE5\x8D\x8A", hour)); |
| } |
| |
| if ((hour % 24) * 60 + min < 720) { // 0:00 -- 11:59 |
| // "午前H時MM分" |
| results->push_back(Util::StringPrintf( |
| "\xE5\x8D\x88\xE5\x89\x8D%d\xE6\x99\x82%d\xE5\x88\x86", |
| hour % 24, min)); |
| |
| if (min == 30) { |
| // "午前H時半" |
| results->push_back(Util::StringPrintf( |
| "\xE5\x8D\x88\xE5\x89\x8D%d\xE6\x99\x82\xE5\x8D\x8A", |
| hour % 24)); |
| } |
| } else { |
| // "午後H時MM分" |
| results->push_back(Util::StringPrintf( |
| "\xE5\x8D\x88\xE5\xBE\x8C%d\xE6\x99\x82%d\xE5\x88\x86", |
| (hour - 12) % 24, min)); |
| |
| if (min == 30) { |
| // "午後H時半" |
| results->push_back(Util::StringPrintf( |
| "\xE5\x8D\x88\xE5\xBE\x8C%d\xE6\x99\x82\xE5\x8D\x8A", |
| (hour - 12) % 24)); |
| } |
| } |
| |
| return true; |
| } |
| |
| bool DateRewriter::ConvertDateWithYear(uint32 year, uint32 month, uint32 day, |
| vector<string> *results) const { |
| DCHECK(results); |
| if (!IsValidDate(year, month, day)) { |
| return false; |
| } |
| |
| // "Y/MM/DD" |
| results->push_back(Util::StringPrintf("%d/%2.2d/%2.2d", year, month, day)); |
| |
| // "Y-MM-DD" |
| results->push_back(Util::StringPrintf("%d-%2.2d-%2.2d", year, month, day)); |
| |
| // "Y年M月D日" |
| results->push_back(Util::StringPrintf( |
| "%d" "\xE5\xB9\xB4" "%d" "\xE6\x9C\x88" "%d" "\xE6\x97\xA5", |
| year, month, day)); |
| |
| return true; |
| } |
| |
| bool DateRewriter::ConvertDateWithoutYear(uint32 month, uint32 day, |
| vector<string> *results) const { |
| DCHECK(results); |
| if (!IsValidDateInThisYear(month, day)) { |
| return false; |
| } |
| |
| // "MM/DD" |
| results->push_back(Util::StringPrintf("%2.2d/%2.2d", month, day)); |
| |
| // "M月D日" |
| results->push_back(Util::StringPrintf("%d\xE6\x9C\x88%d\xE6\x97\xA5", |
| month, day)); |
| |
| return true; |
| } |
| |
| bool DateRewriter::RewriteTime(Segment *segment, |
| const char *key, |
| const char *value, |
| const char *description, |
| int type, int diff) const { |
| if (segment->key() != key) { // only exact match |
| return false; |
| } |
| |
| const size_t kMinSize = 10; |
| const size_t size = min(kMinSize, segment->candidates_size()); |
| |
| for (size_t cand_idx = 0; cand_idx < size; ++cand_idx) { |
| const Segment::Candidate &cand = segment->candidate(cand_idx); |
| if (cand.value != value) { |
| continue; |
| } |
| // Date candidates are too many, therefore highest candidate show at most |
| // 3rd. |
| // TODO(nona): learn date candidate even if the date is changed. |
| const size_t kMinimumDateCandidateIdx = 3; |
| const size_t insert_idx = (size < kMinimumDateCandidateIdx) ? |
| size : max(cand_idx + 1, kMinimumDateCandidateIdx); |
| |
| struct tm t_st; |
| vector<string> era; |
| switch (type) { |
| case REWRITE_DATE: { |
| if (!Util::GetTmWithOffsetSecond(&t_st, diff * 86400)) { |
| LOG(ERROR) << "GetTmWithOffsetSecond() failed"; |
| return false; |
| } |
| vector<string> results; |
| ConvertDateWithYear(t_st.tm_year + 1900, t_st.tm_mon + 1, t_st.tm_mday, |
| &results); |
| if (AdToEra(t_st.tm_year + 1900, &era) && !era.empty()) { |
| // "平成Y年M月D日" |
| results.push_back(Util::StringPrintf( |
| "%s" "\xE5\xB9\xB4" "%d" "\xE6\x9C\x88" "%d" "\xE6\x97\xA5", |
| era[0].c_str(), t_st.tm_mon + 1, t_st.tm_mday)); |
| } |
| // "WDAY曜日" |
| results.push_back(Util::StringPrintf("%s" "\xE6\x9B\x9C\xE6\x97\xA5", |
| kWeekDayString[t_st.tm_wday])); |
| |
| for (vector<string>::reverse_iterator rit = results.rbegin(); |
| rit != results.rend(); ++rit) { |
| Insert(cand, insert_idx , *rit, description, segment); |
| } |
| return true; |
| } |
| |
| case REWRITE_MONTH: { |
| if (!Util::GetCurrentTm(&t_st)) { |
| LOG(ERROR) << "GetCurrentTm failed"; |
| return false; |
| } |
| const int month = (t_st.tm_mon + diff + 12) % 12 + 1; |
| // "月" |
| Insert(cand, insert_idx, Util::StringPrintf("%d\xE6\x9C\x88", month), |
| description, segment); |
| Insert(cand, insert_idx, Util::StringPrintf("%d", month), description, |
| segment); |
| return true; |
| } |
| |
| case REWRITE_YEAR: { |
| if (!Util::GetCurrentTm(&t_st)) { |
| LOG(ERROR) << "GetCurrentTm failed"; |
| return false; |
| } |
| const int year = (t_st.tm_year + diff + 1900); |
| if (AdToEra(year, &era) && !era.empty()) { |
| // "年" |
| Insert(cand, insert_idx, |
| Util::StringPrintf("%s\xE5\xB9\xB4", era[0].c_str()), |
| description, segment); |
| } |
| // "年" |
| Insert(cand, insert_idx, Util::StringPrintf("%d\xE5\xB9\xB4", year), |
| description, segment); |
| Insert(cand, insert_idx, Util::StringPrintf("%d", year), description, |
| segment); |
| return true; |
| } |
| |
| case REWRITE_CURRENT_TIME: { |
| if (!Util::GetCurrentTm(&t_st)) { |
| LOG(ERROR) << "GetCurrentTm failed"; |
| return false; |
| } |
| vector<string> times; |
| ConvertTime(t_st.tm_hour, t_st.tm_min, ×); |
| for (vector<string>::reverse_iterator rit = times.rbegin(); |
| rit != times.rend(); ++rit) { |
| Insert(cand, insert_idx, *rit, description, segment); |
| } |
| return true; |
| } |
| |
| case REWRITE_DATE_AND_CURRENT_TIME: { |
| if (!Util::GetCurrentTm(&t_st)) { |
| LOG(ERROR) << "GetCurrentTm failed"; |
| return false; |
| } |
| // Y/MM/DD H:MM |
| const string ymmddhmm = Util::StringPrintf("%d/%2.2d/%2.2d %2d:%2.2d", |
| t_st.tm_year + 1900, |
| t_st.tm_mon + 1, |
| t_st.tm_mday, |
| t_st.tm_hour, |
| t_st.tm_min); |
| Insert(cand, insert_idx, ymmddhmm, description, segment); |
| return true; |
| } |
| } |
| } |
| |
| return false; |
| } |
| |
| bool DateRewriter::RewriteDate(Segment *segment) const { |
| for (size_t i = 0; i < arraysize(kDateData); ++i) { |
| if (RewriteTime(segment, |
| kDateData[i].key, kDateData[i].value, |
| kDateData[i].description, |
| REWRITE_DATE, |
| kDateData[i].diff)) { |
| VLOG(1) << "RewriteDate: " |
| << kDateData[i].key << " " << kDateData[i].value; |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| bool DateRewriter::RewriteMonth(Segment *segment) const { |
| for (size_t i = 0; i < arraysize(kMonthData); ++i) { |
| if (RewriteTime(segment, |
| kMonthData[i].key, kMonthData[i].value, |
| kMonthData[i].description, |
| REWRITE_MONTH, |
| kMonthData[i].diff)) { |
| VLOG(1) << "RewriteMonth: " |
| << kMonthData[i].key << " " << kMonthData[i].value; |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| bool DateRewriter::RewriteYear(Segment *segment) const { |
| for (size_t i = 0; i < arraysize(kYearData); ++i) { |
| if (RewriteTime(segment, |
| kYearData[i].key, kYearData[i].value, |
| kYearData[i].description, |
| REWRITE_YEAR, |
| kYearData[i].diff)) { |
| VLOG(1) << "RewriteYear: " |
| << kYearData[i].key << " " << kYearData[i].value; |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| bool DateRewriter::RewriteWeekday(Segment *segment) const { |
| struct tm t_st; |
| if (!Util::GetCurrentTm(&t_st)) { |
| LOG(ERROR) << "GetCurrentTm failed"; |
| return false; |
| } |
| |
| for (size_t i = 0; i < arraysize(kWeekDayData); ++i) { |
| const int weekday = kWeekDayData[i].diff % 7; |
| const int additional_dates = (weekday + 7 - t_st.tm_wday) % 7; |
| if (RewriteTime(segment, |
| kWeekDayData[i].key, kWeekDayData[i].value, |
| kWeekDayData[i].description, |
| REWRITE_DATE, |
| additional_dates)) { |
| VLOG(1) << "RewriteWeekday: " |
| << kWeekDayData[i].key << " " << kWeekDayData[i].value; |
| return true; |
| } |
| } |
| |
| return false; |
| } |
| |
| bool DateRewriter::RewriteCurrentTime(Segment *segment) const { |
| for (size_t i = 0; i < arraysize(kCurrentTimeData); ++i) { |
| if (RewriteTime(segment, |
| kCurrentTimeData[i].key, kCurrentTimeData[i].value, |
| kCurrentTimeData[i].description, |
| REWRITE_CURRENT_TIME, |
| 0)) { |
| VLOG(1) << "RewriteCurrentTime: " |
| << kCurrentTimeData[i].key << " " |
| << kCurrentTimeData[i].value; |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| bool DateRewriter::RewriteDateAndCurrentTime(Segment *segment) const { |
| for (size_t i = 0; i < arraysize(kDateAndCurrentTimeData); ++i) { |
| if (RewriteTime(segment, |
| kDateAndCurrentTimeData[i].key, |
| kDateAndCurrentTimeData[i].value, |
| kDateAndCurrentTimeData[i].description, |
| REWRITE_DATE_AND_CURRENT_TIME, |
| 0)) { |
| VLOG(1) << "RewriteDateAndCurrentTime: " |
| << kDateAndCurrentTimeData[i].key << " " |
| << kDateAndCurrentTimeData[i].value; |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| bool DateRewriter::RewriteEra(Segment *current_segment, |
| const Segment &next_segment) const { |
| if (current_segment->candidates_size() <= 0 || |
| next_segment.candidates_size() <= 0) { |
| LOG(ERROR) << "Candidate size is 0"; |
| return false; |
| } |
| |
| const string ¤t_key = current_segment->key(); |
| const string &next_value = next_segment.candidate(0).value; |
| |
| // "年" |
| if (next_value != "\xE5\xB9\xB4") { |
| return false; |
| } |
| |
| if (Util::GetScriptType(current_key) != Util::NUMBER) { |
| return false; |
| } |
| |
| const size_t len = Util::CharsLen(current_key); |
| if (len < 3 || len > 4) { |
| LOG(WARNING) << "Too long year"; |
| return false; |
| } |
| |
| string year_str; |
| Util::FullWidthAsciiToHalfWidthAscii(current_key, &year_str); |
| |
| const uint32 year = atoi32(year_str.c_str()); |
| |
| vector<string> results; |
| if (!AdToEra(year, &results)) { |
| return false; |
| } |
| |
| const int kInsertPosition = 2; |
| const int position |
| = min(kInsertPosition, |
| static_cast<int>(current_segment->candidates_size())); |
| |
| // "和暦" |
| const char kDescription[] = "\xE5\x92\x8C\xE6\x9A\xA6"; |
| for (int i = static_cast<int>(results.size()) - 1; i >= 0; --i) { |
| Insert(current_segment->candidate(0), |
| position, |
| results[i], |
| kDescription, |
| current_segment); |
| current_segment->mutable_candidate(position)->attributes |
| &= ~Segment::Candidate::NO_VARIANTS_EXPANSION; |
| } |
| |
| return true; |
| } |
| |
| bool DateRewriter::RewriteAd(Segment *segment) const { |
| const string &key = segment->key(); |
| if (!Util::EndsWith(key, kNenKey)) { |
| return false; |
| } |
| if (segment->candidates_size() == 0) { |
| VLOG(2) << "No candidates are found"; |
| return false; |
| } |
| vector<string> results, descriptions; |
| const bool ret = EraToAd(key, &results, &descriptions); |
| |
| // Insert position is the last of candidates |
| const int position = static_cast<int>(segment->candidates_size()); |
| for (size_t i = 0; i < results.size(); ++i) { |
| Insert(segment->candidate(0), |
| position, |
| results[i], |
| descriptions[i].c_str(), |
| segment); |
| } |
| return ret; |
| } |
| |
| namespace { |
| bool IsFourDigits(const string &value) { |
| return Util::CharsLen(value) == 4 && |
| Util::GetScriptType(value) == Util::NUMBER; |
| } |
| |
| // Gets four digits if possible. |
| // Following trials will be performed in this order. |
| // 1. Checks segment's key. |
| // 2. Checks all the meta candidates. |
| // 3. Checks raw input. |
| // This is mainly for mobile. |
| // On 12keys-toggle-alphabet mode, a user types "2223" to get "cd". |
| // In this case, |
| // - Segment's key is "cd". |
| // - All the meta candidates are based on "cd" (e.g. "CD", "Cd"). |
| // Therefore to get "2223" we should access the raw input. |
| // Prerequisit: |segments| has only one conversion segment. |
| const bool GetFourDigits(const composer::Composer &composer, |
| const Segments &segments, |
| string *output) { |
| DCHECK(output); |
| DCHECK_EQ(1, segments.conversion_segments_size()); |
| const Segment &segment = segments.conversion_segment(0); |
| |
| // 1. Segment's key |
| if (IsFourDigits(segment.key())) { |
| *output = segment.key(); |
| return true; |
| } |
| |
| // 2. Meta candidates |
| for (size_t i = 0; i < segment.meta_candidates_size(); ++i) { |
| if (IsFourDigits(segment.meta_candidate(i).value)) { |
| *output = segment.meta_candidate(i).value; |
| return true; |
| } |
| } |
| |
| // 3. Raw input |
| string raw; |
| // Note that only one segment is in the Segments, but sometimes like |
| // on partial conversion, segment.key() is different from the size of |
| // the whole composition. |
| composer.GetRawSubString(0, Util::CharsLen(segment.key()), &raw); |
| if (IsFourDigits(raw)) { |
| *output = raw; |
| return true; |
| } |
| |
| // No trials succeeded. |
| return false; |
| } |
| } // namespace |
| |
| bool DateRewriter::RewriteFourDigits(const composer::Composer &composer, |
| Segments *segments) const { |
| if (segments->conversion_segments_size() != 1) { |
| // This method rewrites a segment only when the segments has only |
| // one conversion segment. |
| // This is spec matter. |
| // Rewriting multiple segments will not make users happier. |
| return false; |
| } |
| |
| string key; |
| if (!GetFourDigits(composer, *segments, &key)) { |
| // No four digit key is available. |
| return false; |
| } |
| |
| Segment *segment = segments->mutable_conversion_segment(0); |
| |
| string number_str; |
| Util::FullWidthAsciiToHalfWidthAscii(key, &number_str); |
| |
| const uint32 number = atoi32(number_str.c_str()); |
| const uint32 upper_number = number / 100; |
| const uint32 lower_number = number % 100; |
| |
| if (segment->candidates_size() == 0 && |
| segment->meta_candidates_size() == 0) { |
| VLOG(2) << "No (meta) candidates are found"; |
| return false; |
| } |
| |
| const Segment::Candidate &cand = (segment->candidates_size() > 0) ? |
| segment->candidate(0) : segment->meta_candidate(0); |
| |
| bool is_modified = false; |
| vector<string> result; |
| is_modified |= ConvertDateWithoutYear(upper_number, lower_number, &result); |
| |
| for (size_t i = 0; i < result.size(); ++i) { |
| // Always insert after last candidate. |
| const int position = static_cast<int>(segment->candidates_size()); |
| // "日付" |
| Insert(cand, position, result[i], "\xE6\x97\xA5\xE4\xBB\x98", |
| segment); |
| } |
| |
| result.clear(); |
| is_modified |= ConvertTime(upper_number, lower_number, &result); |
| |
| for (size_t i = 0; i < result.size(); ++i) { |
| // Always insert after last candidate. |
| const int position = static_cast<int>(segment->candidates_size()); |
| // "時刻" |
| Insert(cand, position, result[i], "\xE6\x99\x82\xE5\x88\xBB", |
| segment); |
| } |
| return is_modified; |
| } |
| |
| DateRewriter::DateRewriter() {} |
| DateRewriter::~DateRewriter() {} |
| |
| int DateRewriter::capability(const ConversionRequest &request) const { |
| if (request.request().mixed_conversion()) { |
| return RewriterInterface::ALL; |
| } |
| return RewriterInterface::CONVERSION; |
| } |
| |
| bool DateRewriter::Rewrite(const ConversionRequest &request, |
| Segments *segments) const { |
| if (!GET_CONFIG(use_date_conversion)) { |
| VLOG(2) << "no use_date_conversion"; |
| return false; |
| } |
| |
| bool modified = false; |
| |
| // Japanese ERA to AD works for resegmented input only |
| if (segments->conversion_segments_size() == 1) { |
| Segment *seg = segments->mutable_segment(0); |
| if (RewriteAd(seg)) { |
| return true; |
| } |
| } |
| |
| for (size_t i = segments->history_segments_size(); |
| i < segments->segments_size(); ++i) { |
| Segment *seg = segments->mutable_segment(i); |
| if (seg == NULL) { |
| LOG(ERROR) << "Segment is NULL"; |
| return false; |
| } |
| |
| if (RewriteDate(seg) || RewriteWeekday(seg) || |
| RewriteMonth(seg) || RewriteYear(seg) || |
| RewriteCurrentTime(seg) || |
| RewriteDateAndCurrentTime(seg)) { |
| modified = true; |
| } else if (i + 1 < segments->segments_size() && |
| RewriteEra(seg, segments->segment(i + 1))) { |
| modified = true; |
| ++i; // skip one more |
| } |
| } |
| |
| if (request.has_composer()) { |
| modified |= RewriteFourDigits(request.composer(), segments); |
| } |
| |
| return modified; |
| } |
| } // namespace mozc |