├── .gitignore ├── test-perf.js ├── package.json ├── LICENSE ├── settings.json ├── README.md ├── romaji-name.js └── test.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /test-perf.js: -------------------------------------------------------------------------------- 1 | var romajiName = require("./romaji-name"); 2 | 3 | var search = function() { 4 | console.time("find"); 5 | var name; 6 | for (var i = 0; i < 10; i++) { 7 | name = romajiName.parseName("Utagawa Hiroshige"); 8 | name = romajiName.parseName("Hiroshige Ando"); 9 | } 10 | console.timeEnd("find"); 11 | if (name) { 12 | console.log(name.name); 13 | } else { 14 | console.log("ERROR: Name not found."); 15 | } 16 | }; 17 | 18 | romajiName.init(function() { 19 | search(); 20 | }); 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "romaji-name", 3 | "version": "0.1.15", 4 | "description": "Normalize and fix common issues with Romaji-based Japanese names.", 5 | "main": "romaji-name.js", 6 | "scripts": { 7 | "test": "node test.js" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/jeresig/node-romaji-name.git" 12 | }, 13 | "keywords": [ 14 | "ja", 15 | "jp", 16 | "japanese", 17 | "romaji", 18 | "language" 19 | ], 20 | "author": "John Resig ", 21 | "license": "MIT", 22 | "bugs": { 23 | "url": "https://github.com/jeresig/node-romaji-name/issues" 24 | }, 25 | "dependencies": { 26 | "bulk-replace": "^0.0.1", 27 | "enamdict": "^0.1.8", 28 | "hepburn": "^1.2.1" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 John Resig 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "fixedNames": { 3 | "surname": [ 4 | "asahi", 5 | "asano", 6 | "baido", 7 | "baidoo", 8 | "baidou", 9 | "baidō", 10 | "chiura", 11 | "chikusai", 12 | "eto", 13 | "fang", 14 | "foujita", 15 | "fukaya", 16 | "gigado", 17 | "hanawa", 18 | "hao", 19 | "harada", 20 | "harukawa", 21 | "hasegawa", 22 | "hasumi", 23 | "hayami", 24 | "hayashi", 25 | "hishikawa", 26 | "hongho", 27 | "hoshi", 28 | "ichirakusai", 29 | "ichiyosai", 30 | "isomi", 31 | "ito", 32 | "izumi", 33 | "josen", 34 | "jun", 35 | "kano", 36 | "kaneko", 37 | "karhu", 38 | "kato", 39 | "katsukawa", 40 | "katsushika", 41 | "kawai", 42 | "kawase", 43 | "kinoshita", 44 | "kitagawa", 45 | "kitano", 46 | "kodama", 47 | "koido", 48 | "koito", 49 | "komura", 50 | "kozaki", 51 | "kubo", 52 | "maki", 53 | "maruyama", 54 | "masayuki", 55 | "masuko", 56 | "minami", 57 | "miwa", 58 | "miyagi", 59 | "miyao", 60 | "mukai", 61 | "nakagawa", 62 | "namiki", 63 | "nishimura", 64 | "nishiyama", 65 | "oda", 66 | "odake", 67 | "ogawa", 68 | "ohno", 69 | "ohmoto", 70 | "ohta", 71 | "okura", 72 | "ryoji", 73 | "ryooji", 74 | "ryōji", 75 | "sato", 76 | "seisai", 77 | "seki", 78 | "shima", 79 | "shiou-ping", 80 | "shunbaisai", 81 | "sora", 82 | "tachibana", 83 | "takane", 84 | "tanomura", 85 | "tashiro", 86 | "tomita", 87 | "torii", 88 | "totoya", 89 | "toyohara", 90 | "toyokawa", 91 | "tsukamoto", 92 | "tsukioka", 93 | "uchida", 94 | "urushibara", 95 | "utagawa", 96 | "utsushi", 97 | "yamamoto", 98 | "yashima", 99 | "yongsheng", 100 | "yoshida", 101 | "yoshimi", 102 | "yoshu", 103 | "yooshuu", 104 | "yōshū", 105 | "yuki", 106 | "yusai", 107 | "zenshinsai" 108 | ], 109 | "given": [ 110 | "bertha", 111 | "brian", 112 | "charles", 113 | "cyrus", 114 | "daniel", 115 | "david", 116 | "elizabeth", 117 | "fritz", 118 | "gakutei", 119 | "gen", 120 | "hasui", 121 | "helen", 122 | "hiroshige", 123 | "ikkei", 124 | "julius", 125 | "keiko", 126 | "kunisada", 127 | "kuniyoshi", 128 | "li", 129 | "lilian", 130 | "manjiro", 131 | "matt", 132 | "mary", 133 | "merlyn", 134 | "micah", 135 | "noel", 136 | "paul", 137 | "ray", 138 | "sadanobu", 139 | "sarah", 140 | "seien", 141 | "suezan", 142 | "suizan", 143 | "shunman", 144 | "takeji", 145 | "ted", 146 | "terry", 147 | "terukata", 148 | "tom", 149 | "toyokuni", 150 | "utamaro", 151 | "yoshitoshi", 152 | "yoshitsuya" 153 | ] 154 | } 155 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | romaji-name 2 | ================ 3 | 4 | This is a utility primarily designed for consuming, parsing, and correcting Japanese names written in [rōmaji](https://en.wikipedia.org/wiki/Romanization_of_Japanese) using proper [Hepburn romanization](https://en.wikipedia.org/wiki/Hepburn_romanization) form. 5 | 6 | Beyond fixing common problems with Japanese names written with rōmaji, it's also able to do a number of amazing things: 7 | 8 | 1. It's able to figure out which part of the name is the surname and which is the given name and correct the order, if need be (using the [enamdict](https://npmjs.org/package/enamdict) module). 9 | 2. It's able to fix names that are missing important punctuation or stress marks (such as missing long vowel marks, like **ō**, or `'` for splitting confusing n-vowel usage). 10 | 3. It's able to detect non-Japanese names and leave them intact for future processing. 11 | 4. It's able to provide the kana form of the Japanese name (using [Hiragana](https://en.wikipedia.org/wiki/Hiragana) and the [hepburn](https://npmjs.org/package/hepburn) module). 12 | 5. It's able to correctly split Japanese names, written with Kanji, into their proper given and surnames. 13 | 6. It can detect and properly handle the "generation" portion of the name, both in English and in Japanese (e.g. III, IV, etc.). 14 | 15 | This utility was created to help consume all of the (extremely-poorly-written) Japanese names found when collecting data for the [Ukiyo-e Database and Search Engine](http://ukiyo-e.org/). 16 | 17 | All code is written by [John Resig](http://ejohn.org/) and is released under an MIT license. 18 | 19 | If you like this module this you may also be interested in two other modules that this module depends upon: [enamdict](https://npmjs.org/package/enamdict) and [hepburn](https://npmjs.org/package/hepburn). 20 | 21 | Example 22 | ------- 23 | 24 | ```javascript 25 | var romajiName = require("romaji-name"); 26 | 27 | // Wait for the module to completely load 28 | // (loads the ENAMDICT dictionary) 29 | romajiName.init(function() { 30 | console.log(romajiName.parseName("Kenichi Nakamura")); 31 | console.log(romajiName.parseName("Gakuryo Nakamura")); 32 | console.log(romajiName.parseName("Charles Bartlett")); 33 | }); 34 | ``` 35 | 36 | Which will log out objects that looks something like this: 37 | 38 | ```javascript 39 | // Note the correction of the order of the given/surname 40 | // Also note the correct kana generated and the injection 41 | // of the missing ' 42 | { 43 | original: 'Kenichi Nakamura', 44 | locale: 'ja', 45 | given: 'Ken\'ichi', 46 | given_kana: 'けんいち', 47 | surname: 'Nakamura', 48 | surname_kana: 'なかむら', 49 | name: 'Nakamura Ken\'ichi', 50 | ascii: 'Nakamura Ken\'ichi', 51 | plain: 'Nakamura Ken\'ichi', 52 | kana: 'なかむらけんいち' 53 | } 54 | // Note the correction of the order of the given/surname 55 | // Also note the correction of the missing ō 56 | { 57 | original: 'Gakuryo Nakamura', 58 | locale: 'ja', 59 | given: 'Gakuryō', 60 | given_kana: 'がくりょう', 61 | surname: 'Nakamura', 62 | surname_kana: 'なかむら', 63 | name: 'Nakamura Gakuryō', 64 | ascii: 'Nakamura Gakuryoo', 65 | plain: 'Nakamura Gakuryo', 66 | kana: 'なかむらがくりょう' 67 | } 68 | // Note that it detects that this is likely not a Japanese name 69 | // (and leaves the locale empty, accordingly) 70 | { 71 | original: 'Charles Bartlett', 72 | locale: '', 73 | given: 'Charles', 74 | surname: 'Bartlett', 75 | name: 'Charles Bartlett', 76 | ascii: 'Charles Bartlett', 77 | plain: 'Charles Bartlett' 78 | } 79 | ``` 80 | 81 | Installation 82 | ------------ 83 | 84 | This is available as a node module on npm. You can find it here: https://npmjs.org/package/romaji-name It can be installed by running the following: 85 | 86 | npm install romaji-name 87 | 88 | Documentation 89 | ------------- 90 | 91 | This library provides a large number of utility methods for working with names (especially Japanese names). That being said you'll probably only ever make use of just the few main methods: 92 | 93 | ### `init(Function)` 94 | 95 | Loads the dependent modules (namely, loads the `enamdict` name database). If, for some reason, you don't need to do any surname/given name correction, or correction of stress marks, then you can skip this step (this would likely be a very abnormal usage of this library). 96 | 97 | ### `parseName(String [, Object])` 98 | 99 | Parses a single string name and returns an object representing that name. Optionally you can specify some settings to modify how the name is parsed, see below for a list of all the settings. 100 | 101 | The returned object will have some, or all, of the following properties: 102 | 103 | * `original`: The original string that was passed in to `parseName`. 104 | * `settings`: An object holding the settings that were passed in to the `parseName` method. 105 | * `locale`: A guess at the locale of the name. Only two values exist: `"ja"` and `""`. Note that just because `"ja"` was returned it does not guarantee that the person is actually Japanese, just that the name looks to be Japanese-like (for example: Some Chinese names also return `"ja"`). 106 | * `given`: A string of the Romaji form of the given name. (Will only exist if a Romaji form was originally provided.) 107 | * `given_kana`: A string of the Kana form of the given name. (Will only exist if a Romaji form was originally provided and if the locale is `"ja"`.) 108 | * `given_kanji`: A string of the Kanji form of the given name. (Will only exist if a Kanji form was originally provided.) 109 | * `middle`: 110 | * `surname`: A string of the Romaji form of the surname. (Will only exist if a Romaji form was originally provided.) 111 | * `surname_kana`: A string of the Kana form of the surname. (Will only exist if a Romaji form was originally provided and if the locale is `"ja"`.) 112 | * `surname_kanji`: A string of the Kanji form of the surname. (Will only exist if a Kanji form was originally provided.) 113 | * `generation`: A number representing the generation of the name. For example "John Smith II" would have a generation of `2`. 114 | * `name`: The full name, in properly-stressed romaji, including the generation. For example: `"Nakamura Gakuryō II"`. 115 | * `ascii`: The full name, in ascii text, including the generation. This is a proper ascii representation of the name (with long vowels converted from "ō" into "oo", for example). Example: `"Nakamura Gakuryoo II"`. 116 | * `plain`: The full name, in plain text, including the generation. This is the same as the `name` property but with all stress formatting stripped from it. This could be useful to use in the generation of a URL slug, or some such. It should never be displayed to an end-user as it will almost always be incorrect. Example: `"Nakamura Gakuryo II"`. 117 | * `kana`: The full name, in kana, without the generation. For example: "なかむらがくりょう". 118 | * `kanji`: The full name, in kanji, including the generation. For example: `"戯画堂芦幸 2世"`. 119 | * `unknown`: If the name is a representation of an unknown individual (e.g. it's the string "Unknown", "Not known", or many of the other variations) then this property will exist and be `true`. 120 | * `attributed`: If the name includes a prefix like "Attributed to" then this will be `true`. 121 | * `after`: If the name includes some sort of "After" or "In the style of" or similar prefix then this will be `true`. 122 | * `school`: If the name includes a prefix like "School of", "Pupil of", or similar then this will be `true`. 123 | 124 | **Settings:** 125 | 126 | The following are optional settings that change how the name parsing functions. 127 | 128 | * `flipNonJa`: Names that don't have a "ja" locale should be flipped ("Smith John" becomes "John Smith"). 129 | * `stripParens`: Removes anything that's wrapped in parentheses. Normally this is left intact and any extra information is parsed from it. 130 | * `givenFirst`: Assumes that the first name is always the given name. 131 | 132 | ### `parseName(Object)` 133 | 134 | Same as the normal `parseName` method but accepts an object that's in the same form as the object returned from `parseName`. This is useful as you can take existing `romaji-name`-generated name objects and re-parse them again (to easily upgrade them when new changes are made to the `romaji-name` module). -------------------------------------------------------------------------------- /romaji-name.js: -------------------------------------------------------------------------------- 1 | var fs = require("fs"); 2 | var enamdict = require("enamdict"); 3 | var hepburn = require("hepburn"); 4 | var bulkReplace = require("bulk-replace"); 5 | 6 | // TODO: 7 | // - Move all settings to external settings.json 8 | // - Support string-based formatting of both names and kanji names 9 | 10 | // Thanks to Jed Schmidt! 11 | // https://twitter.com/jedschmidt/status/368179809551388672 12 | // https://ja.wikipedia.org/wiki/%E5%A4%A7%E5%AD%97_(%E6%95%B0%E5%AD%97) 13 | var generations = [ 14 | /([11一壱壹初](?:代目|代|世|sei|daime)|shodai|\b1\b|\bI(\s|$)|[^0-9]1[^0-9])/ig, 15 | /([22二弐貮貳](?:代目|代|世|sei|daime)|nidaime|\b(?:2|II|ll)\b|Ⅱ|[^0-9]2[^0-9])/ig, 16 | /([33三参參](?:代目|代|世|sei|daime)|sandaime|\b(?:3|III)\b|[^0-9]3[^0-9])/ig, 17 | /([44四肆](?:代目|代|世|sei|daime)|yodaime|\b(?:4|IV)\b|[^0-9]4[^0-9])/ig, 18 | /([55五伍](?:代目|代|世|sei|daime)|godaime|\b(?:5\b|V(\s|$))|[^0-9]5[^0-9])/ig, 19 | /([66六陸](?:代目|代|世|sei|daime)|\b(?:6|VI)\b|[^0-9]6[^0-9])/ig, 20 | /([77七柒漆質](?:代目|代|世|sei|daime)|\b(?:7|VII)\b|[^0-9]7[^0-9])/ig, 21 | /([88八捌](?:代目|代|世|sei|daime)|\b(?:8|VIII)\b|[^0-9]8[^0-9])/ig, 22 | /([99九玖](?:代目|代|世|sei|daime)|\b(?:9|IX)\b|[^0-9]9[^0-9])/ig, 23 | /((?:10|10|[十拾])(?:代目|代|世|sei|daime)|\b(?:10\b|[^0-9]10[^0-9]|X(\s|$)))/ig 24 | ]; 25 | 26 | var generationMap = [ "", "", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X"]; 27 | 28 | // Punctuation 29 | // (Both ASCII and Japanese) 30 | // http://www.localizingjapan.com/blog/2012/01/20/regular-expressions-for-japanese-text/ 31 | // Include full width characters? 32 | // Exclude the ' and - marks, they're used in some names 33 | var puncRegex = /[!"#$%&*+,._?\/:;<=>@[\\\]^`{|}~\u3000-\u303F]|(?:^|\s)[\—\-](?:\s|$)/ig; 34 | var aposRegex = /(^|[^nm])'/ig; 35 | 36 | // Stop words 37 | var stopRegex = /\b(?:^.*\bby|formerly|et al|can be read|signed|signature|may be translated as|seal|possibly|illustrations|professor|artists other two|born|artist)\b/ig; 38 | 39 | // Extract an, at least, 2 character long kanji string 40 | var kanjiRegex = /[\u4e00-\u9faf\u3041-\u3096\u30A0-\u30FF][\u4e00-\u9faf\u3041-\u3096\u30A0-\u30FF\s\d\(\)()々]*[\u4e00-\u9faf\u3041-\u3096\u30A0-\u30FF☆?々](?:\s+[ivxIVX]+\b)?/g; 41 | 42 | // Detect unknown artists 43 | var unknownRegex = /unread|unbekannt|no\s+signature|not\s+identified|ansigned|unsigned|numerous|various.*artists|mixed.*artists|anonymous|unknown|unidentified|unidentied|not\s*read|not\s+signed|none|無落款|落款欠|不明|なし/i; 44 | 45 | // Detect after 46 | var afterRegex = /\bafter\b|in the style of|of style the in|original|imitator of|fake/i; 47 | 48 | // Detect attributed 49 | var attrRegex = /to attributed|attributed to|to atributed|atributed to|attributed|\batt\b/ig; 50 | 51 | // Detect school 52 | var schoolRegex = /of school|school of|a pupil of|of pupil a|([\w']+)\s+(?:school|schule|umkreis)/ig; 53 | 54 | // Name split 55 | var nameSplitRegex = /\/| with | or | and | & |・/ig; 56 | 57 | // Typos and entities to convert 58 | var fixTypos = { 59 | "ʼ": "'", 60 | "shegeharu": "shigeharu", 61 | "kasamastu": "kasamatsu", 62 | "kunimasav": "kunimasa v", 63 | "ktasukawa": "katsukawa", 64 | "katuskawa": "katsukawa", 65 | "kumyiski": "kumyoshi", 66 | "hiroshgie": "hiroshige", 67 | "shunkwaku": "shunkaku", 68 | "yackhyo": "yachiyo" 69 | }; 70 | 71 | // All the conceivable bad accents that people could use instead of the typical 72 | // Romaji stress mark. The first character in each list has the proper accent. 73 | var letterToAccents = { 74 | 'a': 'āâáàăắặấåäǟãą', 75 | 'e': 'ēêéèềěëėę', 76 | 'i': 'īîíìïį', 77 | 'o': 'ōôóòöőõȭȯȱøỏ', 78 | 'u': 'ūûúùŭůüųűư' 79 | }; 80 | 81 | // The formatting for when the full names are generated 82 | var localeFormatting = { 83 | "": "given middle surname generation", 84 | "ja": "surname given generation" 85 | }; 86 | 87 | // Build up the maps for later replacements 88 | var accentToLetter = {}; 89 | var accentToASCII = {}; 90 | var accentToGoodAccent = {}; 91 | var asciiToAccent = {}; 92 | var asciiToLetter = {}; 93 | 94 | Object.keys(letterToAccents).forEach(function(letter) { 95 | var accents = letterToAccents[letter]; 96 | var goodAccent = accents.slice(0, 1); 97 | var letterPair = letter + letter; 98 | 99 | accents.split("").forEach(function(accent) { 100 | accentToLetter[accent] = letter; 101 | accentToASCII[accent] = letterPair; 102 | accentToGoodAccent[accent] = goodAccent; 103 | accent = accent.toUpperCase(); 104 | accentToLetter[accent] = letter.toUpperCase(); 105 | accentToASCII[accent] = letter.toUpperCase() + letter; 106 | accentToGoodAccent[accent] = goodAccent.toUpperCase(); 107 | }); 108 | 109 | // The use of 'ii' is commonly accepted, no accent is used 110 | if (letter !== "i") { 111 | asciiToAccent[letterPair] = goodAccent; 112 | } 113 | 114 | // Hack for usage of "ou", treat the same as "oo" 115 | if (letter === "o") { 116 | asciiToAccent["ou"] = goodAccent; 117 | asciiToLetter["ou"] = letter; 118 | } 119 | }); 120 | 121 | // Cached settings 122 | var defaultSettings = { 123 | fixedNames: { 124 | given: [], 125 | surname: [] 126 | } 127 | }; 128 | 129 | var settings = defaultSettings; 130 | 131 | module.exports = { 132 | // Location of the default settings file 133 | settingsFile: __dirname + "/settings.json", 134 | 135 | init: function(extraSettings, callback) { 136 | if (arguments.length === 1) { 137 | callback = extraSettings; 138 | extraSettings = defaultSettings; 139 | } 140 | 141 | enamdict.init(function() { 142 | this.loadSettings(extraSettings, callback); 143 | }.bind(this)); 144 | 145 | return this; 146 | }, 147 | 148 | parseName: function(name, options) { 149 | // Fallback options object 150 | options = options || {}; 151 | 152 | // Assume that we're re-parsing a name object 153 | if (typeof name === "object") { 154 | if (name.settings) { 155 | for (var prop in name.settings) { 156 | if (!(prop in options)) { 157 | options[prop] = name.settings[prop]; 158 | } 159 | } 160 | } 161 | name = name.original || name.name; 162 | } 163 | 164 | // Fallback to an empty string if no name is provided 165 | name = name || ""; 166 | 167 | var nameObj = { 168 | original: name, 169 | locale: "ja" 170 | }; 171 | 172 | if (Object.keys(options).length > 0) { 173 | nameObj.settings = options; 174 | } 175 | 176 | // Simplify the processing by starting in lowercase 177 | var cleaned = name.toLowerCase(); 178 | 179 | // Fix up the punctuation and whitespace before processing 180 | cleaned = this.cleanWhitespace(cleaned); 181 | cleaned = this.fixTypos(cleaned); 182 | 183 | // Optionally remove everything enclosed in parentheses 184 | if (options.stripParens) { 185 | cleaned = this.stripParens(cleaned); 186 | } 187 | 188 | // Bail if it's an unknown artist 189 | cleaned = this.extractUnknown(cleaned, nameObj); 190 | 191 | // Remove other artists 192 | // TODO: Find a way to expose the other artist names 193 | cleaned = this.stripExtraNames(cleaned); 194 | 195 | // Extract extra information (unknown, kanji, generation, etc.) 196 | cleaned = this.extractAfter(cleaned, nameObj); 197 | cleaned = this.extractAttributed(cleaned, nameObj); 198 | cleaned = this.extractSchool(cleaned, nameObj); 199 | cleaned = this.extractGeneration(cleaned, nameObj); 200 | cleaned = this.extractKanji(cleaned, nameObj); 201 | 202 | // Clean up the string 203 | cleaned = this.repairName(cleaned); 204 | cleaned = this.stripParens(cleaned); 205 | cleaned = this.flipName(cleaned); 206 | cleaned = this.stripPunctuation(cleaned); 207 | cleaned = this.stripStopWords(cleaned); 208 | 209 | // Fix some other things we don't care about 210 | cleaned = cleaned.trim(); 211 | 212 | var uncorrectedName = cleaned; 213 | 214 | // Fix lots of bad Romaji usage 215 | cleaned = this.correctAccents(cleaned); 216 | cleaned = this.stripAccentsToASCII(cleaned); 217 | cleaned = this.correctBadRomaji(cleaned); 218 | 219 | // Make sure that ASCII characters are left to convert! 220 | if (/([a-z][a-z'-]*)\s*([a-z' -]*)\s*/.test(cleaned)) { 221 | if (RegExp.$2) { 222 | var surname = RegExp.$1; 223 | var given = RegExp.$2; 224 | } else { 225 | var surname = ""; 226 | var given = RegExp.$1; 227 | } 228 | 229 | // The kanji represents a different name (alias?) 230 | if (nameObj.differs) { 231 | delete nameObj.kanji; 232 | delete nameObj.given_kanji; 233 | delete nameObj.surname_kanji; 234 | delete nameObj.generation; 235 | } 236 | 237 | // Make sure the names are valid romaji before continuing 238 | if ((surname && !this.toKana(surname) && surname.length > 1) || 239 | (given && !this.toKana(given) && given.length > 1)) { 240 | // If one of them is not valid then we assume that we're 241 | // dealing with a western name so we just leave it as-is. 242 | var parts = uncorrectedName.split(/\s+/); 243 | 244 | nameObj.locale = ""; 245 | nameObj.given = parts[0]; 246 | nameObj.surname = ""; 247 | 248 | if (parts.length === 2) { 249 | nameObj.surname = parts[1]; 250 | } else if (parts.length > 2) { 251 | var middle = parts.slice(1, parts.length - 1); 252 | nameObj.middle = middle.map(function(name) { 253 | return name.length === 1 ? name + "." : name; 254 | }).join(" "); 255 | if (nameObj.middle.toLowerCase() === "no") { 256 | delete nameObj.middle; 257 | } 258 | nameObj.surname = parts[parts.length - 1]; 259 | } else if (parts.length === 1) { 260 | // If only one name is provided then it's likely the 261 | // surname, which is more common in non-Japanese locales. 262 | nameObj.surname = nameObj.given; 263 | nameObj.given = ""; 264 | } 265 | 266 | if (options.flipNonJa && nameObj.surname) { 267 | var tmp = nameObj.given; 268 | nameObj.given = nameObj.surname; 269 | nameObj.surname = tmp; 270 | } 271 | 272 | // Use the built-in name fixes as a first list of defense 273 | if (settings.fixedNames.given.indexOf((nameObj.surname || "").toLowerCase()) >= 0 || 274 | settings.fixedNames.surname.indexOf(nameObj.given.toLowerCase()) >= 0) { 275 | var tmp = nameObj.given; 276 | nameObj.given = nameObj.surname; 277 | nameObj.surname = tmp; 278 | } 279 | 280 | this.injectFullName(nameObj); 281 | 282 | return nameObj; 283 | } else { 284 | var parts = given.split(/\s+/); 285 | 286 | if (parts.length > 1) { 287 | var middle = parts.slice(0, parts.length - 1); 288 | nameObj.middle = middle.join(" "); 289 | if (nameObj.middle.toLowerCase() === "no") { 290 | delete nameObj.middle; 291 | } 292 | given = parts[parts.length - 1]; 293 | } 294 | } 295 | 296 | // If givenFirst is specified then we assume that the given 297 | // name is always first. This doesn't matter for non-Japanese 298 | // names (like above) but does matter for Japanese names, 299 | // which are expected to be surname first. 300 | if (options.givenFirst && surname && given) { 301 | var tmp = surname; 302 | surname = given; 303 | given = tmp; 304 | 305 | // Use the built-in name fixes as a first list of defense 306 | } else if (settings.fixedNames.given.indexOf(surname) >= 0 || 307 | settings.fixedNames.surname.indexOf(given) >= 0) { 308 | var tmp = given; 309 | given = surname; 310 | surname = tmp; 311 | } 312 | 313 | var allowSwap = settings.fixedNames.given.indexOf(given) < 0 && 314 | settings.fixedNames.surname.indexOf(surname) < 0; 315 | 316 | // Look up the two parts of the name in ENAMDICT 317 | var givenEntries = enamdict.find(given); 318 | var surnameEntries = enamdict.find(surname); 319 | 320 | if (nameObj.given_kanji || nameObj.surname_kanji) { 321 | allowSwap = false; 322 | 323 | // Assume that the Kanji version of the name is in the right 324 | // order. Make sure that the romaji name matches the Kanji. 325 | if (given && surname && 326 | (givenEntries && 327 | givenEntries.kanji().indexOf(nameObj.surname_kanji) >= 0 || 328 | surnameEntries && 329 | surnameEntries.kanji().indexOf(nameObj.given_kanji) >= 0)) { 330 | var tmp = surnameEntries; 331 | surnameEntries = givenEntries; 332 | givenEntries = tmp; 333 | tmp = surname; 334 | surname = given; 335 | given = tmp; 336 | } 337 | } 338 | 339 | if (given && surname && (givenEntries || surnameEntries)) { 340 | // Fix cases where only one of the two names was found 341 | if (allowSwap && (!givenEntries || !surnameEntries)) { 342 | if (givenEntries) { 343 | // Swap the names if they're in the wrong place 344 | if (givenEntries.type() === "surname") { 345 | var tmp = surname; 346 | surname = given; 347 | given = tmp; 348 | surnameEntries = givenEntries; 349 | givenEntries = null; 350 | } 351 | 352 | } else { 353 | // Swap the names if they're in the wrong place 354 | if (surnameEntries.type() === "given") { 355 | var tmp = given; 356 | given = surname; 357 | surname = tmp; 358 | givenEntries = surnameEntries; 359 | surnameEntries = null; 360 | } 361 | } 362 | 363 | // Otherwise both parts of the name were found 364 | // Fix the case where the names are reversed 365 | } else if (allowSwap && (surnameEntries.type() === "given" || 366 | givenEntries.type() === "surname") && 367 | surnameEntries.type() !== givenEntries.type()) { 368 | var tmp = surnameEntries; 369 | surnameEntries = givenEntries; 370 | givenEntries = tmp; 371 | } 372 | 373 | // Get the romaji names, if they exist in ENAMDICT 374 | // If not, fall back to what was provided 375 | var givenRomaji = this.correctBadRomaji(givenEntries ? 376 | givenEntries.romaji() : given); 377 | var surnameRomaji = this.correctBadRomaji(surnameEntries ? 378 | surnameEntries.romaji() : surname); 379 | 380 | // Generate our own kana using hepburn 381 | var givenKana = this.toKana(givenRomaji || ""); 382 | var surnameKana = this.toKana(surnameRomaji || ""); 383 | 384 | if (givenRomaji) { 385 | nameObj.given = this.convertRepeatedVowel(givenRomaji); 386 | nameObj.given_kana = givenKana; 387 | } 388 | 389 | if (surnameRomaji) { 390 | nameObj.surname = this.convertRepeatedVowel(surnameRomaji); 391 | nameObj.surname_kana = surnameKana; 392 | } 393 | 394 | this.splitKanjiByName(nameObj, givenEntries, surnameEntries); 395 | this.injectFullName(nameObj); 396 | 397 | } else { 398 | if (surname) { 399 | nameObj.surname = this.convertRepeatedVowel(surname); 400 | nameObj.surname_kana = this.toKana(surname); 401 | } 402 | 403 | nameObj.given = this.convertRepeatedVowel(given); 404 | nameObj.given_kana = this.toKana(given); 405 | 406 | this.splitKanjiByName(nameObj, givenEntries); 407 | this.injectFullName(nameObj); 408 | } 409 | 410 | // Otherwise there was only kanji left and we haven't already 411 | // detected which characters belong to the surname or given name 412 | } else if (nameObj.kanji && !nameObj.given_kanji) { 413 | this.splitKanji(nameObj); 414 | this.injectFullName(nameObj); 415 | 416 | // Otherwise we need to build the full kanji from the parts 417 | } else if (nameObj.given_kanji) { 418 | this.injectFullName(nameObj); 419 | } 420 | 421 | // Handle when there's no parseable name 422 | if (!nameObj.name && !nameObj.given && !nameObj.surname && 423 | !nameObj.kanji) { 424 | nameObj.unknown = true; 425 | } 426 | 427 | delete nameObj.differs; 428 | 429 | return nameObj; 430 | }, 431 | 432 | loadSettings: function(extraSettings, callback) { 433 | fs.readFile(this.settingsFile, function(err, data) { 434 | settings = JSON.parse(data.toString("utf8")); 435 | callback(); 436 | }); 437 | }, 438 | 439 | splitKanjiByName: function(nameObj, givenEntries, surnameEntries) { 440 | // Figure out how the kanji name relates to which name part 441 | if (!nameObj.kanji || nameObj.given_kanji) { 442 | return; 443 | } 444 | 445 | var nameKanji = nameObj.kanji; 446 | var givenKanji = givenEntries && givenEntries.kanji(); 447 | var surnameKanji = surnameEntries && 448 | surnameEntries.kanji(); 449 | 450 | if (!givenKanji && !surnameKanji) { 451 | this.splitKanji(nameObj); 452 | return; 453 | } 454 | 455 | if (givenKanji) { 456 | var foundNames = givenKanji.filter(function(kanji) { 457 | return nameKanji.indexOf(kanji) >= 0; 458 | }); 459 | 460 | // Hopefully only one name is found 461 | if (foundNames.length > 0) { 462 | nameObj.given_kanji = foundNames[0]; 463 | } 464 | } 465 | 466 | if (surnameKanji) { 467 | var foundNames = surnameKanji.filter(function(kanji) { 468 | return nameKanji.indexOf(kanji) >= 0; 469 | }); 470 | 471 | // Hopefully only one name is found 472 | if (foundNames.length > 0) { 473 | nameObj.surname_kanji = foundNames[0]; 474 | } 475 | } 476 | 477 | // If only one of the kanji is found 478 | if (nameObj.given_kanji !== nameObj.surname_kanji) { 479 | if (nameObj.given_kanji && 480 | nameObj.given_kanji !== nameKanji) { 481 | nameObj.surname_kanji = nameKanji 482 | .replace(nameObj.given_kanji, ""); 483 | } else if (nameObj.surname_kanji && 484 | nameObj.surname_kanji !== nameKanji) { 485 | nameObj.given_kanji = nameKanji 486 | .replace(nameObj.surname_kanji, ""); 487 | } 488 | } 489 | }, 490 | 491 | splitKanji: function(nameObj) { 492 | if (nameObj.kanji.length <= 2) { 493 | // If it's very short then it's probably not a full 494 | // name, just the given name. 495 | nameObj.given_kanji = nameObj.kanji; 496 | 497 | } else if (nameObj.kanji.length <= 3 && 498 | enamdict.findKanji(nameObj.kanji)) { 499 | // Assume that if we have an exact match that it's 500 | // a valid given name (the surname, alone, is almost never 501 | // specified). 502 | nameObj.given_kanji = nameObj.kanji; 503 | 504 | } else if (nameObj.kanji.length === 4) { 505 | // Almost always a name of length 4 means that there is 506 | // a surname of length 2 and a given name of length 2 507 | nameObj.surname_kanji = nameObj.kanji.substr(0, 2); 508 | nameObj.given_kanji = nameObj.kanji.substr(2); 509 | 510 | } else { 511 | // For everything else we need to slice-and-dice the 512 | // name to make sure that we have the correct name parts 513 | var complete = []; 514 | var partial = []; 515 | 516 | // Split name 1 .. n 517 | for (var pos = 2; pos < nameObj.kanji.length - 1; pos++) { 518 | var surname = nameObj.kanji.substr(0, pos); 519 | var given = nameObj.kanji.substr(pos); 520 | 521 | var match = { 522 | diff: Math.abs(surname.length - given.length), 523 | surname: enamdict.findKanji(surname), 524 | given: enamdict.findKanji(given) 525 | }; 526 | 527 | if (match.surname && match.given) { 528 | complete.push(match); 529 | 530 | } else if (match.surname || match.given) { 531 | partial.push(match); 532 | } 533 | } 534 | 535 | if (complete.length > 0) { 536 | // Find the name with the least-dramatic difference in 537 | // size (e.g. AABB is more likely than ABBB) 538 | complete = complete.sort(function(a, b) { 539 | return Math.abs(a.surname.length - a.given.length) - 540 | Math.abs(b.surname.length - b.given.length); 541 | }); 542 | 543 | nameObj.surname_kanji = complete[0].surname.kanji(); 544 | nameObj.given_kanji = complete[0].given.kanji(); 545 | 546 | // Otherwise if there are an odd number of partial matches then 547 | // we guess and go for the one that evenly splits the name 548 | } else if (partial.length > 0) { 549 | partial = partial.filter(function(name) { 550 | return name.diff === 0; 551 | }); 552 | 553 | if (partial.length > 0) { 554 | var partialSurname = partial[0].surname && 555 | partial[0].surname.kanji(); 556 | var partialGiven = partial[0].given && 557 | partial[0].given.kanji(); 558 | 559 | if (partialSurname) { 560 | partialGiven = nameObj.kanji 561 | .replace(partialSurname, ""); 562 | } else { 563 | partialSurname = nameObj.kanji 564 | .replace(partialGiven, ""); 565 | } 566 | 567 | nameObj.surname_kanji = partialSurname; 568 | nameObj.given_kanji = partialGiven; 569 | } 570 | } 571 | 572 | // Anything else is going to be too ambiguous 573 | } 574 | }, 575 | 576 | genFullName: function(nameObj) { 577 | var name = ""; 578 | var formatting = localeFormatting[nameObj.locale] || ""; 579 | 580 | formatting.split(/\s+/).forEach(function(part) { 581 | var value = nameObj[part]; 582 | 583 | if (part === "generation") { 584 | value = generationMap[value]; 585 | } 586 | 587 | // Only add something if the part is empty and don't add 588 | // a generation if it's just 1 (since it's superflous) 589 | if (value) { 590 | name += (name ? " " : "") + value; 591 | } 592 | }); 593 | 594 | return name.trim(); 595 | }, 596 | 597 | injectFullName: function(nameObj) { 598 | this.capitalizeNames(nameObj); 599 | 600 | var name = this.genFullName(nameObj); 601 | 602 | if ((nameObj.locale === "ja" ? nameObj.given : nameObj.surname) && name) { 603 | nameObj.name = name; 604 | if (nameObj.locale === "ja") { 605 | nameObj.ascii = this.genFullName({ 606 | locale: nameObj.locale, 607 | given: this.stripAccentsToASCII(nameObj.given || ""), 608 | surname: this.stripAccentsToASCII(nameObj.surname || ""), 609 | middle: this.stripAccentsToASCII(nameObj.middle || ""), 610 | generation: nameObj.generation 611 | }); 612 | } else { 613 | nameObj.ascii = nameObj.name; 614 | } 615 | nameObj.plain = this.genFullName({ 616 | locale: nameObj.locale, 617 | given: this.stripAccents(nameObj.given || ""), 618 | surname: this.stripAccents(nameObj.surname || ""), 619 | middle: this.stripAccents(nameObj.middle || ""), 620 | generation: nameObj.generation 621 | }); 622 | } 623 | 624 | if (nameObj.given_kana) { 625 | nameObj.kana = (nameObj.surname_kana || "") + nameObj.given_kana; 626 | } 627 | 628 | var kanjiGeneration = (nameObj.generation ? 629 | " " + nameObj.generation + "世" : ""); 630 | 631 | if (nameObj.given_kanji) { 632 | nameObj.kanji = (nameObj.surname_kanji ? 633 | nameObj.surname_kanji : "") + 634 | nameObj.given_kanji + kanjiGeneration; 635 | } else if (nameObj.kanji) { 636 | nameObj.kanji += kanjiGeneration; 637 | } 638 | 639 | return nameObj; 640 | }, 641 | 642 | capitalizeNames: function(nameObj) { 643 | if (nameObj.given) { 644 | nameObj.given = this.capitalize(nameObj.given); 645 | } 646 | if (nameObj.middle) { 647 | nameObj.middle = this.capitalize(nameObj.middle); 648 | } 649 | if (nameObj.surname) { 650 | nameObj.surname = this.capitalize(nameObj.surname); 651 | } 652 | }, 653 | 654 | capitalize: function(name) { 655 | return name.toLowerCase().replace(/(?:^|\s)./g, function(all) { 656 | return all.toUpperCase(); 657 | }); 658 | }, 659 | 660 | cleanWhitespace: function(name) { 661 | return name.replace(/\r?\n/g, " ").trim(); 662 | }, 663 | 664 | fixTypos: function(name) { 665 | return bulkReplace(name, fixTypos); 666 | }, 667 | 668 | flipName: function(name, split) { 669 | split = split || /,\s*/; 670 | return name.split(split).reverse().join(" "); 671 | }, 672 | 673 | repairName: function(name) { 674 | // Placeholder characters that will be replaced in a name 675 | // This almost always happens on poorly formatted web sites. 676 | name = name.replace(/([aeiou])_/g, "$1$1"); 677 | 678 | // This is definitely a hack but it seems to be the case 679 | // for many of these particular problems. 680 | return name.replace(/[?_]/g, "o"); 681 | }, 682 | 683 | stripStopWords: function(name) { 684 | return name.replace(stopRegex, ""); 685 | }, 686 | 687 | stripExtraNames: function(name) { 688 | return name.split(nameSplitRegex)[0]; 689 | }, 690 | 691 | stripPunctuation: function(name) { 692 | return name 693 | .replace(puncRegex, " ") 694 | .replace(aposRegex, function(all, before) { 695 | return before; 696 | }).trim(); 697 | }, 698 | 699 | stripAccents: function(name) { 700 | return bulkReplace(name, accentToLetter); 701 | }, 702 | 703 | stripAccentsToASCII: function(name) { 704 | return bulkReplace(name, accentToASCII); 705 | }, 706 | 707 | correctAccents: function(name) { 708 | return bulkReplace(name, accentToGoodAccent); 709 | }, 710 | 711 | correctBadRomaji: function(name) { 712 | return hepburn.cleanRomaji(name).toLowerCase(); 713 | }, 714 | 715 | convertRepeatedVowel: function(name) { 716 | return bulkReplace(name, asciiToAccent); 717 | }, 718 | 719 | stripParens: function(name) { 720 | // Start by removing parens and the contents inside of them 721 | return name.replace(/\s*[\((][^\))]*[\))]\s*/g, " ") 722 | // Strip any remaining parens separately 723 | .replace(/[\((\))]/g, ""); 724 | }, 725 | 726 | extractAttributed: function(name, nameObj) { 727 | name = name.replace(attrRegex, function(all) { 728 | nameObj.attributed = true; 729 | return ""; 730 | }); 731 | 732 | return name; 733 | }, 734 | 735 | extractAfter: function(name, nameObj) { 736 | name = name.replace(afterRegex, function(all) { 737 | nameObj.after = true; 738 | return ""; 739 | }); 740 | 741 | return name; 742 | }, 743 | 744 | extractSchool: function(name, nameObj) { 745 | var self = this; 746 | 747 | name = name.replace(schoolRegex, function(all) { 748 | nameObj.school = true; 749 | if (RegExp.$1) { 750 | name = ""; 751 | nameObj.surname = RegExp.$1; 752 | self.injectFullName(nameObj); 753 | } 754 | return ""; 755 | }); 756 | 757 | return name; 758 | }, 759 | 760 | extractUnknown: function(name, nameObj) { 761 | if (unknownRegex.test(name)) { 762 | name = ""; 763 | nameObj.unknown = true; 764 | nameObj.locale = ""; 765 | } 766 | 767 | return name; 768 | }, 769 | 770 | fixRepeatedKanji: function(name) { 771 | return name.replace(/(.)々/g, "$1$1"); 772 | }, 773 | 774 | extractKanji: function(name, nameObj) { 775 | var self = this; 776 | var kanji = ""; 777 | 778 | name = name.replace(kanjiRegex, function(all) { 779 | if (!kanji) { 780 | kanji = self.stripParens(self.stripPunctuation( 781 | self.fixRepeatedKanji(all))).trim(); 782 | } 783 | return ""; 784 | }); 785 | 786 | if (kanji) { 787 | // Extract generation info from kanji if it exists 788 | kanji = this.extractGeneration(kanji, nameObj).trim(); 789 | // Strip extraneous whitespace from the kanji 790 | kanji = kanji.replace(/\s+/g, " ").trim(); 791 | 792 | var parts = kanji.split(/\s+/); 793 | 794 | // Surname and given name are already specified 795 | if (parts.length === 2) { 796 | // Handle case where there are multiple space-separated names 797 | if (parts[0].length >= 4 && parts[1].length >= 4) { 798 | kanji = parts[0]; 799 | 800 | nameObj.kanji = kanji; 801 | } else { 802 | nameObj.surname_kanji = parts[0]; 803 | nameObj.given_kanji = parts[1]; 804 | } 805 | } else { 806 | nameObj.kanji = kanji; 807 | } 808 | } 809 | 810 | return name; 811 | }, 812 | 813 | extractGeneration: function(name, nameObj) { 814 | var generation; 815 | 816 | // Don't look for the generation inside parens 817 | var trimName = this.stripParens(name); 818 | 819 | generations.forEach(function(genRegex, i) { 820 | if (!generation && genRegex.test(trimName)) { 821 | generation = i + 1; 822 | 823 | // Handle the case where the name is written: 824 | // Given Generation Surname 825 | var invertedName = new RegExp("([a-z'-]+)\\s+" + RegExp.$1 + 826 | "\\s+([a-z'-]+)", "i"); 827 | 828 | if (invertedName.test(name)) { 829 | name = name.replace(invertedName, "$2 $1"); 830 | 831 | } else { 832 | name = name.replace(genRegex, function(all, name, extra) { 833 | return typeof extra === "string" && extra || ""; 834 | }); 835 | } 836 | } 837 | }); 838 | 839 | // Specifying 1st generation is redundant 840 | if (generation === 1) { 841 | generation = undefined; 842 | } 843 | 844 | if (generation) { 845 | nameObj.generation = generation; 846 | } 847 | 848 | return name; 849 | }, 850 | 851 | toKana: function(name) { 852 | // TODO: Should oo -> ou to match the conventions of ENAMDICT? 853 | var ret = hepburn.toHiragana(name.replace(/-/g, "")); 854 | return /[a-z]/i.test(ret) ? "" : ret; 855 | } 856 | }; 857 | -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | var assert = require("assert"); 2 | var romajiName = require("./romaji-name"); 3 | 4 | romajiName.init(function() { 5 | var tests = [ 6 | { original: 'GYOKUZAN OKADA 岡田 玉山Ⅱ', 7 | locale: 'ja', 8 | surname_kanji: '岡田', 9 | given_kanji: '玉山', 10 | generation: 2, 11 | given: 'Gyokuzan', 12 | given_kana: 'ぎょくざん', 13 | surname: 'Okada', 14 | surname_kana: 'おかだ', 15 | name: 'Okada Gyokuzan II', 16 | ascii: 'Okada Gyokuzan II', 17 | plain: 'Okada Gyokuzan II', 18 | kana: 'おかだぎょくざん', 19 | kanji: '岡田玉山 2世' }, 20 | { original: 'MICHIMASA NONOMURA 野々村 通正', 21 | locale: 'ja', 22 | surname_kanji: '野野村', 23 | given_kanji: '通正', 24 | given: 'Michimasa', 25 | given_kana: 'みちまさ', 26 | surname: 'Nonomura', 27 | surname_kana: 'ののむら', 28 | name: 'Nonomura Michimasa', 29 | ascii: 'Nonomura Michimasa', 30 | plain: 'Nonomura Michimasa', 31 | kana: 'ののむらみちまさ', 32 | kanji: '野野村通正' }, 33 | { original: 'KOUSHI RYUURYUUSANJIN 柳々山人 郊子', 34 | locale: 'ja', 35 | surname_kanji: '柳柳山人', 36 | given_kanji: '郊子', 37 | given: 'Ryūryūsanjin', 38 | given_kana: 'りゅうりゅうさんじん', 39 | surname: 'Kōshi', 40 | surname_kana: 'こおし', 41 | name: 'Kōshi Ryūryūsanjin', 42 | ascii: 'Kooshi Ryuuryuusanjin', 43 | plain: 'Koshi Ryuryusanjin', 44 | kana: 'こおしりゅうりゅうさんじん', 45 | kanji: '柳柳山人郊子' }, 46 | { original: 'GAKUTEI HARUNOBU 岳亭(八島)春信 初代', 47 | locale: 'ja', 48 | surname_kanji: '岳亭', 49 | given_kanji: '春信', 50 | given: 'Harunobu', 51 | given_kana: 'はるのぶ', 52 | surname: 'Gakutei', 53 | surname_kana: 'がくてい', 54 | name: 'Gakutei Harunobu', 55 | ascii: 'Gakutei Harunobu', 56 | plain: 'Gakutei Harunobu', 57 | kana: 'がくていはるのぶ', 58 | kanji: '岳亭春信' }, 59 | { original: 'YOSHITOSHI TAISO(TSUKIOKA) 大蘇(月岡)芳年', 60 | locale: 'ja', 61 | surname_kanji: '大蘇', 62 | given_kanji: '芳年', 63 | given: 'Yoshitoshi', 64 | given_kana: 'よしとし', 65 | surname: 'Taisō', 66 | surname_kana: 'たいそお', 67 | name: 'Taisō Yoshitoshi', 68 | ascii: 'Taisoo Yoshitoshi', 69 | plain: 'Taiso Yoshitoshi', 70 | kana: 'たいそおよしとし', 71 | kanji: '大蘇芳年' }, 72 | { original: 'YOSHINOBU FUJII 藤井 吉信', 73 | locale: 'ja', 74 | surname_kanji: '藤井', 75 | given_kanji: '吉信', 76 | given: 'Yoshinobu', 77 | given_kana: 'よしのぶ', 78 | surname: 'Fujii', 79 | surname_kana: 'ふじい', 80 | name: 'Fujii Yoshinobu', 81 | ascii: 'Fujii Yoshinobu', 82 | plain: 'Fujii Yoshinobu', 83 | kana: 'ふじいよしのぶ', 84 | kanji: '藤井吉信' }, 85 | { original: 'Asano Takeji (浅野竹二)', 86 | locale: 'ja', 87 | kanji: '浅野竹二', 88 | given: 'Takeji', 89 | given_kana: 'たけじ', 90 | surname: 'Asano', 91 | surname_kana: 'あさの', 92 | given_kanji: '竹二', 93 | surname_kanji: '浅野', 94 | name: 'Asano Takeji', 95 | ascii: 'Asano Takeji', 96 | plain: 'Asano Takeji', 97 | kana: 'あさのたけじ' }, 98 | { original: '長谷川 小信 初代', 99 | locale: 'ja', 100 | surname_kanji: '長谷川', 101 | given_kanji: '小信', 102 | kanji: '長谷川小信' }, 103 | { original: '四代目 歌川 広重 YODAIME UTAGAWA HIROSHIGE', 104 | locale: 'ja', 105 | generation: 4, 106 | surname_kanji: '歌川', 107 | given_kanji: '広重', 108 | kanji: '歌川広重 4世', 109 | given: 'Hiroshige', 110 | given_kana: 'ひろしげ', 111 | surname: 'Utagawa', 112 | surname_kana: 'うたがわ', 113 | name: 'Utagawa Hiroshige IV', 114 | ascii: 'Utagawa Hiroshige IV', 115 | plain: 'Utagawa Hiroshige IV', 116 | kana: 'うたがわひろしげ' }, 117 | { original: '一筆斎 文調 IPPITSUSAI BUNCHOU', 118 | locale: 'ja', 119 | surname_kanji: '一筆斎', 120 | given_kanji: '文調', 121 | kanji: '一筆斎文調', 122 | given: 'Bunchō', 123 | given_kana: 'ぶんちょお', 124 | surname: 'Ippitsusai', 125 | surname_kana: 'いっぴつさい', 126 | name: 'Ippitsusai Bunchō', 127 | ascii: 'Ippitsusai Bunchoo', 128 | plain: 'Ippitsusai Buncho', 129 | kana: 'いっぴつさいぶんちょお' }, 130 | { original: 'Maruyama Ōyō', 131 | locale: 'ja', 132 | given: 'Ōyō', 133 | given_kana: 'おおよお', 134 | surname: 'Maruyama', 135 | surname_kana: 'まるやま', 136 | name: 'Maruyama Ōyō', 137 | ascii: 'Maruyama Ooyoo', 138 | plain: 'Maruyama Oyo', 139 | kana: 'まるやまおおよお' }, 140 | { original: '鳥居 清忠 4代目 Torii Kiyotada 4daime', 141 | locale: 'ja', 142 | generation: 4, 143 | surname_kanji: '鳥居', 144 | given_kanji: '清忠', 145 | kanji: '鳥居清忠 4世', 146 | given: 'Kiyotada', 147 | given_kana: 'きよただ', 148 | surname: 'Torii', 149 | surname_kana: 'とりい', 150 | name: 'Torii Kiyotada IV', 151 | ascii: 'Torii Kiyotada IV', 152 | plain: 'Torii Kiyotada IV', 153 | kana: 'とりいきよただ' }, 154 | { original: '昇亭 北寿 Shotei Hokuju', 155 | locale: 'ja', 156 | surname_kanji: '昇亭', 157 | given_kanji: '北寿', 158 | kanji: '昇亭北寿', 159 | given: 'Hokujū', 160 | given_kana: 'ほくじゅう', 161 | surname: 'Shōtei', 162 | surname_kana: 'しょおてい', 163 | name: 'Shōtei Hokujū', 164 | ascii: 'Shootei Hokujuu', 165 | plain: 'Shotei Hokuju', 166 | kana: 'しょおていほくじゅう' }, 167 | { original: 'Torii Kiyonobu II (鳥居清信 II)', 168 | locale: 'ja', 169 | generation: 2, 170 | kanji: '鳥居清信 2世', 171 | given: 'Kiyonobu', 172 | given_kana: 'きよのぶ', 173 | surname: 'Torii', 174 | surname_kana: 'とりい', 175 | given_kanji: '清信', 176 | surname_kanji: '鳥居', 177 | name: 'Torii Kiyonobu II', 178 | ascii: 'Torii Kiyonobu II', 179 | plain: 'Torii Kiyonobu II', 180 | kana: 'とりいきよのぶ' }, 181 | { original: '渓斎英泉 歌川広重', 182 | locale: 'ja', 183 | kanji: '渓斎英泉', 184 | surname_kanji: '渓斎', 185 | given_kanji: '英泉' }, 186 | { original: '歌川豊国・歌川豊広', 187 | locale: 'ja', 188 | kanji: '歌川豊国', 189 | surname_kanji: '歌川', 190 | given_kanji: '豊国' }, 191 | { original: '喜田川歌麿', 192 | locale: 'ja', 193 | kanji: '喜田川歌麿', 194 | surname_kanji: '喜田川', 195 | given_kanji: '歌麿' }, 196 | { original: '一筆斎文調', 197 | locale: 'ja', 198 | kanji: '一筆斎文調', 199 | surname_kanji: '一筆斎', 200 | given_kanji: '文調' }, 201 | { original: '喜多川歌麿', 202 | locale: 'ja', 203 | kanji: '喜多川歌麿', 204 | surname_kanji: '喜多川', 205 | given_kanji: '歌麿' }, 206 | { original: 'Utagawa Toyokuni 3sei', 207 | locale: 'ja', 208 | generation: 3, 209 | given: 'Toyokuni', 210 | given_kana: 'とよくに', 211 | surname: 'Utagawa', 212 | surname_kana: 'うたがわ', 213 | name: 'Utagawa Toyokuni III', 214 | ascii: 'Utagawa Toyokuni III', 215 | plain: 'Utagawa Toyokuni III', 216 | kana: 'うたがわとよくに' }, 217 | { original: '歌川 豊国 3世', 218 | locale: 'ja', 219 | generation: 3, 220 | surname_kanji: '歌川', 221 | given_kanji: '豊国', 222 | kanji: '歌川豊国 3世' }, 223 | { original: 'Sawa Sekkyō 沢雪キョウ', 224 | locale: 'ja', 225 | kanji: '雪キョウ沢', 226 | given: 'Sawa', 227 | given_kana: 'さわ', 228 | surname: 'Sekkyō', 229 | surname_kana: 'せっきょお', 230 | given_kanji: '沢', 231 | surname_kanji: '雪キョウ', 232 | name: 'Sekkyō Sawa', 233 | ascii: 'Sekkyoo Sawa', 234 | plain: 'Sekkyo Sawa', 235 | kana: 'せっきょおさわ' }, 236 | { original: 'Hatta Koshu (八田古秀)', 237 | locale: 'ja', 238 | kanji: '八田古秀', 239 | given: 'Kōshū', 240 | given_kana: 'こおしゅう', 241 | surname: 'Hatta', 242 | surname_kana: 'はった', 243 | surname_kanji: '八田', 244 | given_kanji: '古秀', 245 | name: 'Hatta Kōshū', 246 | ascii: 'Hatta Kooshuu', 247 | plain: 'Hatta Koshu', 248 | kana: 'はったこおしゅう' }, 249 | { original: 'Chōmei Ryoji', 250 | locale: 'ja', 251 | given: 'Chōmei', 252 | given_kana: 'ちょおめい', 253 | surname: 'Ryōji', 254 | surname_kana: 'りょおじ', 255 | name: 'Ryōji Chōmei', 256 | ascii: 'Ryooji Choomei', 257 | plain: 'Ryoji Chomei', 258 | kana: 'りょおじちょおめい' }, 259 | { original: 'Kajiwara Hisako artist) - 梶原 緋佐子', 260 | locale: 'ja', 261 | surname_kanji: '梶原', 262 | given_kanji: '緋佐子', 263 | kanji: '梶原緋佐子', 264 | given: 'Hisako', 265 | given_kana: 'ひさこ', 266 | surname: 'Kajiwara', 267 | surname_kana: 'かじわら', 268 | name: 'Kajiwara Hisako', 269 | ascii: 'Kajiwara Hisako', 270 | plain: 'Kajiwara Hisako', 271 | kana: 'かじわらひさこ' }, 272 | { original: 'Born Sato Kunio', 273 | locale: 'ja', 274 | given: 'Kunio', 275 | given_kana: 'くにお', 276 | surname: 'Sato', 277 | surname_kana: 'さと', 278 | name: 'Sato Kunio', 279 | ascii: 'Sato Kunio', 280 | plain: 'Sato Kunio', 281 | kana: 'さとくにお' }, 282 | { original: 'Unidentied Chinese printmaker', 283 | locale: '', 284 | unknown: true }, 285 | { original: 'Shotei fake', 286 | locale: 'ja', 287 | after: true, 288 | given: 'Shotei', 289 | given_kana: 'しょてい', 290 | name: 'Shotei', 291 | ascii: 'Shotei', 292 | plain: 'Shotei', 293 | kana: 'しょてい' }, 294 | { original: 'Torii School', 295 | locale: 'ja', 296 | school: true, 297 | surname: 'Torii' }, 298 | { original: 'Ryusai SHEGEHARU', 299 | locale: 'ja', 300 | given: 'Shigeharu', 301 | given_kana: 'しげはる', 302 | surname: 'Ryūsai', 303 | surname_kana: 'りゅうさい', 304 | name: 'Ryūsai Shigeharu', 305 | ascii: 'Ryuusai Shigeharu', 306 | plain: 'Ryusai Shigeharu', 307 | kana: 'りゅうさいしげはる' }, 308 | { original: 'Hanabusa Itcho_', 309 | locale: 'ja', 310 | given: 'Itchō', 311 | given_kana: 'いっちょお', 312 | surname: 'Hanabusa', 313 | surname_kana: 'はなぶさ', 314 | name: 'Hanabusa Itchō', 315 | ascii: 'Hanabusa Itchoo', 316 | plain: 'Hanabusa Itcho', 317 | kana: 'はなぶさいっちょお' }, 318 | { original: 'Ho_chu_', 319 | locale: 'ja', 320 | given: 'Hōchū', 321 | given_kana: 'ほおちゅう', 322 | name: 'Hōchū', 323 | ascii: 'Hoochuu', 324 | plain: 'Hochu', 325 | kana: 'ほおちゅう' }, 326 | { original: 'Ito Jakuchu', 327 | locale: 'ja', 328 | given: 'Jakuchū', 329 | given_kana: 'じゃくちゅう', 330 | surname: 'Ito', 331 | surname_kana: 'いと', 332 | name: 'Ito Jakuchū', 333 | ascii: 'Ito Jakuchuu', 334 | plain: 'Ito Jakuchu', 335 | kana: 'いとじゃくちゅう' }, 336 | { original: 'Jakuchu Ito', 337 | locale: 'ja', 338 | given: 'Jakuchū', 339 | given_kana: 'じゃくちゅう', 340 | surname: 'Ito', 341 | surname_kana: 'いと', 342 | name: 'Ito Jakuchū', 343 | ascii: 'Ito Jakuchuu', 344 | plain: 'Ito Jakuchu', 345 | kana: 'いとじゃくちゅう' }, 346 | { original: 'artists other two and Katsushika Taito II', 347 | locale: 'ja', 348 | unknown: true }, 349 | { original: 'Foujita', 350 | locale: '', 351 | given: '', 352 | surname: 'Foujita', 353 | name: 'Foujita', 354 | ascii: 'Foujita', 355 | plain: 'Foujita' }, 356 | { original: 'Jacoulet', 357 | locale: '', 358 | given: '', 359 | surname: 'Jacoulet', 360 | name: 'Jacoulet', 361 | ascii: 'Jacoulet', 362 | plain: 'Jacoulet' }, 363 | { original: 'Illustrations attributed to Gountei Sadahide (Japanese, 1807–1873)', 364 | locale: 'ja', 365 | attributed: true, 366 | given: 'Sadahide', 367 | given_kana: 'さだひで', 368 | surname: 'Gōntei', 369 | surname_kana: 'ごおんてい', 370 | name: 'Gōntei Sadahide', 371 | ascii: 'Goontei Sadahide', 372 | plain: 'Gontei Sadahide', 373 | kana: 'ごおんていさだひで' }, 374 | { original: 'Printed by Professor Clifford Harvey', 375 | locale: '', 376 | given: 'Clifford', 377 | surname: 'Harvey', 378 | name: 'Clifford Harvey', 379 | ascii: 'Clifford Harvey', 380 | plain: 'Clifford Harvey' }, 381 | { original: 'Katsukawa Shunʼei', 382 | locale: 'ja', 383 | given: 'Shun\'ei', 384 | given_kana: 'しゅんえい', 385 | surname: 'Katsukawa', 386 | surname_kana: 'かつかわ', 387 | name: 'Katsukawa Shun\'ei', 388 | ascii: 'Katsukawa Shun\'ei', 389 | plain: 'Katsukawa Shun\'ei', 390 | kana: 'かつかわしゅんえい' }, 391 | { original: 'Numerous', locale: '', unknown: true }, 392 | { original: 'Katsushika Hokusai to atributed', 393 | locale: 'ja', 394 | attributed: true, 395 | given: 'Hokusai', 396 | given_kana: 'ほくさい', 397 | surname: 'Katsushika', 398 | surname_kana: 'かつしか', 399 | name: 'Katsushika Hokusai', 400 | ascii: 'Katsushika Hokusai', 401 | plain: 'Katsushika Hokusai', 402 | kana: 'かつしかほくさい' }, 403 | { original: 'Katsushika Hokusai of pupil A', 404 | locale: 'ja', 405 | school: true, 406 | given: 'Hokusai', 407 | given_kana: 'ほくさい', 408 | surname: 'Katsushika', 409 | surname_kana: 'かつしか', 410 | name: 'Katsushika Hokusai', 411 | ascii: 'Katsushika Hokusai', 412 | plain: 'Katsushika Hokusai', 413 | kana: 'かつしかほくさい' }, 414 | { original: 'Imitator of Albrecht Dürer (20th century)', 415 | locale: '', 416 | after: true, 417 | given: 'Albrecht', 418 | surname: 'Dürer', 419 | name: 'Albrecht Dürer', 420 | ascii: 'Albrecht Dürer', 421 | plain: 'Albrecht Durer' }, 422 | { original: 'Kasamatsu Shiro_', 423 | locale: 'ja', 424 | given: 'Shirō', 425 | given_kana: 'しろお', 426 | surname: 'Kasamatsu', 427 | surname_kana: 'かさまつ', 428 | name: 'Kasamatsu Shirō', 429 | ascii: 'Kasamatsu Shiroo', 430 | plain: 'Kasamatsu Shiro', 431 | kana: 'かさまつしろお' }, 432 | { original: 'Utagawa Schule / Utagawa school', 433 | locale: 'ja', 434 | school: true, 435 | surname: 'Utagawa' }, 436 | { original: 'unbekannt / unknown / michi', 437 | locale: '', 438 | unknown: true }, 439 | { original: 'possibly Kubo Shunman (Japanese, 1757–1820)', 440 | locale: 'ja', 441 | given: 'Shunman', 442 | given_kana: 'しゅんまん', 443 | surname: 'Kubo', 444 | surname_kana: 'くぼ', 445 | name: 'Kubo Shunman', 446 | ascii: 'Kubo Shunman', 447 | plain: 'Kubo Shunman', 448 | kana: 'くぼしゅんまん' }, 449 | { original: 'Kanbun artist', 450 | locale: 'ja', 451 | given: 'Kanbun', 452 | given_kana: 'かんぶん', 453 | name: 'Kanbun', 454 | ascii: 'Kanbun', 455 | plain: 'Kanbun', 456 | kana: 'かんぶん' }, 457 | { original: 'Sakazosu or Sakazoshu', 458 | locale: 'ja', 459 | given: 'Sakazosu', 460 | given_kana: 'さかぞす', 461 | name: 'Sakazosu', 462 | ascii: 'Sakazosu', 463 | plain: 'Sakazosu', 464 | kana: 'さかぞす' }, 465 | { original: 'Utagawa Toyokuni with Arisaka Hokuba & Katsukawa Shun\'ei', 466 | locale: 'ja', 467 | given: 'Toyokuni', 468 | given_kana: 'とよくに', 469 | surname: 'Utagawa', 470 | surname_kana: 'うたがわ', 471 | name: 'Utagawa Toyokuni', 472 | ascii: 'Utagawa Toyokuni', 473 | plain: 'Utagawa Toyokuni', 474 | kana: 'うたがわとよくに' }, 475 | { original: 'Kawanabe Ky?sai', 476 | locale: 'ja', 477 | given: 'Kyōsai', 478 | given_kana: 'きょおさい', 479 | surname: 'Kawanabe', 480 | surname_kana: 'かわなべ', 481 | name: 'Kawanabe Kyōsai', 482 | ascii: 'Kawanabe Kyoosai', 483 | plain: 'Kawanabe Kyosai', 484 | kana: 'かわなべきょおさい' }, 485 | { original: 'Shunk?sai Hokush?', 486 | locale: 'ja', 487 | given: 'Shunkosai', 488 | given_kana: 'しゅんこさい', 489 | surname: 'Hokushō', 490 | surname_kana: 'ほくしょお', 491 | name: 'Hokushō Shunkosai', 492 | ascii: 'Hokushoo Shunkosai', 493 | plain: 'Hokusho Shunkosai', 494 | kana: 'ほくしょおしゅんこさい' }, 495 | { original: 'Seal KIYO', 496 | locale: 'ja', 497 | given: 'Kiyo', 498 | given_kana: 'きよ', 499 | name: 'Kiyo', 500 | ascii: 'Kiyo', 501 | plain: 'Kiyo', 502 | kana: 'きよ' }, 503 | { original: 'Kanagawa K', 504 | locale: 'ja', 505 | given: 'K', 506 | given_kana: '', 507 | surname: 'Kanagawa', 508 | surname_kana: 'かながわ', 509 | name: 'Kanagawa K', 510 | ascii: 'Kanagawa K', 511 | plain: 'Kanagawa K' }, 512 | { original: 'Can be read Daiko', 513 | locale: 'ja', 514 | given: 'Daiko', 515 | given_kana: 'だいこ', 516 | name: 'Daiko', 517 | ascii: 'Daiko', 518 | plain: 'Daiko', 519 | kana: 'だいこ' }, 520 | { original: 'Keirin Signed', 521 | locale: 'ja', 522 | given: 'Keirin', 523 | given_kana: 'けいりん', 524 | name: 'Keirin', 525 | ascii: 'Keirin', 526 | plain: 'Keirin', 527 | kana: 'けいりん' }, 528 | { original: 'Signed K. Yukiko', 529 | locale: 'ja', 530 | given: 'Yukiko', 531 | given_kana: 'ゆきこ', 532 | surname: 'K', 533 | surname_kana: '', 534 | name: 'K Yukiko', 535 | ascii: 'K Yukiko', 536 | plain: 'K Yukiko', 537 | kana: 'ゆきこ' }, 538 | { original: 'Signature may be translated as RYOMI', 539 | locale: 'ja', 540 | given: 'Ryomi', 541 | given_kana: 'りょみ', 542 | name: 'Ryomi', 543 | ascii: 'Ryomi', 544 | plain: 'Ryomi', 545 | kana: 'りょみ' }, 546 | { original: 'Unread', locale: '', unknown: true }, 547 | { original: 'Signature and seal not read', 548 | locale: '', 549 | unknown: true }, 550 | { original: 'No signature', locale: '', unknown: true }, 551 | { original: 'Not identified', locale: '', unknown: true }, 552 | { original: 'Unsigned Shunga', locale: '', unknown: true }, 553 | { original: 'UNSIGNED', locale: '', unknown: true }, 554 | { original: 'ANSIGNED', locale: '', unknown: true }, 555 | { original: 'Koho Ohuchi', 556 | locale: 'ja', 557 | given: 'Kōhō', 558 | given_kana: 'こおほお', 559 | surname: 'Ōuchi', 560 | surname_kana: 'おおうち', 561 | name: 'Ōuchi Kōhō', 562 | ascii: 'Oouchi Koohoo', 563 | plain: 'Ouchi Koho', 564 | kana: 'おおうちこおほお' }, 565 | { original: 'SYOTEI Hokuzyu', 566 | locale: 'ja', 567 | given: 'Shōtei', 568 | given_kana: 'しょおてい', 569 | surname: 'Hokujū', 570 | surname_kana: 'ほくじゅう', 571 | name: 'Hokujū Shōtei', 572 | ascii: 'Hokujuu Shootei', 573 | plain: 'Hokuju Shotei', 574 | kana: 'ほくじゅうしょおてい' }, 575 | { original: 'SENCYUSYA Kuniuma', 576 | locale: 'ja', 577 | surname: 'Senchusha', 578 | surname_kana: 'せんちゅしゃ', 579 | given: 'Kuniuma', 580 | given_kana: 'くにうま', 581 | name: 'Senchusha Kuniuma', 582 | ascii: 'Senchusha Kuniuma', 583 | plain: 'Senchusha Kuniuma', 584 | kana: 'せんちゅしゃくにうま' }, 585 | { original: 'Kohusai', 586 | locale: 'ja', 587 | given: 'Kōusai', 588 | given_kana: 'こおうさい', 589 | name: 'Kōusai', 590 | ascii: 'Koousai', 591 | plain: 'Kousai', 592 | kana: 'こおうさい' }, 593 | { original: 'CYOBUNSAI Eishi', 594 | locale: 'ja', 595 | given: 'Eishi', 596 | given_kana: 'えいし', 597 | surname: 'Chōbunsai', 598 | surname_kana: 'ちょおぶんさい', 599 | name: 'Chōbunsai Eishi', 600 | ascii: 'Choobunsai Eishi', 601 | plain: 'Chobunsai Eishi', 602 | kana: 'ちょおぶんさいえいし' }, 603 | { original: 'UTAGAWA Yoshihuji', 604 | locale: 'ja', 605 | given: 'Yoshifuji', 606 | given_kana: 'よしふじ', 607 | surname: 'Utagawa', 608 | surname_kana: 'うたがわ', 609 | name: 'Utagawa Yoshifuji', 610 | ascii: 'Utagawa Yoshifuji', 611 | plain: 'Utagawa Yoshifuji', 612 | kana: 'うたがわよしふじ' }, 613 | { original: 'SYOSAI Ikkei', 614 | locale: 'ja', 615 | given: 'Ikkei', 616 | given_kana: 'いっけい', 617 | surname: 'Shōsai', 618 | surname_kana: 'しょおさい', 619 | name: 'Shōsai Ikkei', 620 | ascii: 'Shoosai Ikkei', 621 | plain: 'Shosai Ikkei', 622 | kana: 'しょおさいいっけい' }, 623 | { original: 'KATSUKAWA Syunnei', 624 | locale: 'ja', 625 | given: 'Shun\'ei', 626 | given_kana: 'しゅんえい', 627 | surname: 'Katsukawa', 628 | surname_kana: 'かつかわ', 629 | name: 'Katsukawa Shun\'ei', 630 | ascii: 'Katsukawa Shun\'ei', 631 | plain: 'Katsukawa Shun\'ei', 632 | kana: 'かつかわしゅんえい' }, 633 | { original: 'Isoda Koryu_sai', 634 | locale: 'ja', 635 | given: 'Koryūsai', 636 | given_kana: 'こりゅうさい', 637 | surname: 'Isoda', 638 | surname_kana: 'いそだ', 639 | name: 'Isoda Koryūsai', 640 | ascii: 'Isoda Koryuusai', 641 | plain: 'Isoda Koryusai', 642 | kana: 'いそだこりゅうさい' }, 643 | { original: 'Toyokuni III & Hiroshige', 644 | locale: 'ja', 645 | generation: 3, 646 | given: 'Toyokuni', 647 | given_kana: 'とよくに', 648 | name: 'Toyokuni III', 649 | ascii: 'Toyokuni III', 650 | plain: 'Toyokuni III', 651 | kana: 'とよくに' }, 652 | { original: 'Hiroshige/Toyokuni III', 653 | locale: 'ja', 654 | settings: { stripParens: true }, 655 | given: 'Hiroshige', 656 | given_kana: 'ひろしげ', 657 | name: 'Hiroshige', 658 | ascii: 'Hiroshige', 659 | plain: 'Hiroshige', 660 | kana: 'ひろしげ' }, 661 | { original: 'Hiroshige and Toyokuni III', 662 | locale: 'ja', 663 | given: 'Hiroshige', 664 | given_kana: 'ひろしげ', 665 | name: 'Hiroshige', 666 | ascii: 'Hiroshige', 667 | plain: 'Hiroshige', 668 | kana: 'ひろしげ' }, 669 | { original: 'Ichiryusai HIROSHIGE ET AL', 670 | locale: 'ja', 671 | given: 'Hiroshige', 672 | given_kana: 'ひろしげ', 673 | surname: 'Ichiryūsai', 674 | surname_kana: 'いちりゅうさい', 675 | name: 'Ichiryūsai Hiroshige', 676 | ascii: 'Ichiryuusai Hiroshige', 677 | plain: 'Ichiryusai Hiroshige', 678 | kana: 'いちりゅうさいひろしげ' }, 679 | { original: 'Formerly Attributed to Utagawa Hiroshige (Japanese, 1797–1858)', 680 | locale: 'ja', 681 | attributed: true, 682 | given: 'Hiroshige', 683 | given_kana: 'ひろしげ', 684 | surname: 'Utagawa', 685 | surname_kana: 'うたがわ', 686 | name: 'Utagawa Hiroshige', 687 | ascii: 'Utagawa Hiroshige', 688 | plain: 'Utagawa Hiroshige', 689 | kana: 'うたがわひろしげ' }, 690 | { original: 'Shuntei (att)', 691 | locale: 'ja', 692 | attributed: true, 693 | given: 'Shuntei', 694 | given_kana: 'しゅんてい', 695 | name: 'Shuntei', 696 | ascii: 'Shuntei', 697 | plain: 'Shuntei', 698 | kana: 'しゅんてい' }, 699 | { original: 'Woodblock for a print designed by Utagawa Toyokuni I (Japanese, 1769–1825)', 700 | locale: 'ja', 701 | given: 'Toyokuni', 702 | given_kana: 'とよくに', 703 | surname: 'Utagawa', 704 | surname_kana: 'うたがわ', 705 | name: 'Utagawa Toyokuni', 706 | ascii: 'Utagawa Toyokuni', 707 | plain: 'Utagawa Toyokuni', 708 | kana: 'うたがわとよくに' }, 709 | { original: 'Original print designed by Utagawa Hiroshige (Japanese, 1797–1858)', 710 | locale: 'ja', 711 | after: true, 712 | given: 'Hiroshige', 713 | given_kana: 'ひろしげ', 714 | surname: 'Utagawa', 715 | surname_kana: 'うたがわ', 716 | name: 'Utagawa Hiroshige', 717 | ascii: 'Utagawa Hiroshige', 718 | plain: 'Utagawa Hiroshige', 719 | kana: 'うたがわひろしげ' }, 720 | { original: 'In the Style of Utagawa Hiroshige (Japanese, 1797–1858)', 721 | locale: 'ja', 722 | after: true, 723 | given: 'Hiroshige', 724 | given_kana: 'ひろしげ', 725 | surname: 'Utagawa', 726 | surname_kana: 'うたがわ', 727 | name: 'Utagawa Hiroshige', 728 | ascii: 'Utagawa Hiroshige', 729 | plain: 'Utagawa Hiroshige', 730 | kana: 'うたがわひろしげ' }, 731 | { original: '', locale: 'ja', unknown: true }, 732 | { original: '-', locale: 'ja', unknown: true }, 733 | { original: '耕けい', 734 | locale: 'ja', 735 | kanji: '耕けい' }, 736 | { original: '無落款', locale: '', unknown: true }, 737 | { original: '無落款', locale: '', unknown: true }, 738 | { original: '不明', locale: '', unknown: true }, 739 | { original: 'なし', locale: '', unknown: true }, 740 | { original: 'None', 741 | locale: '', 742 | unknown: true }, 743 | { original: 'Kiyotada VII', 744 | locale: 'ja', 745 | generation: 7, 746 | given: 'Kiyotada', 747 | given_kana: 'きよただ', 748 | name: 'Kiyotada VII', 749 | ascii: 'Kiyotada VII', 750 | plain: 'Kiyotada VII', 751 | kana: 'きよただ' }, 752 | { original: 'Not signed', 753 | locale: '', 754 | unknown: true }, 755 | { original: '年豊?', 756 | locale: 'ja', 757 | kanji: '年豊?' }, 758 | { original: '芳?', 759 | locale: 'ja', 760 | kanji: '芳?', 761 | given_kanji: '芳?' }, 762 | { original: '国☆', 763 | locale: 'ja', 764 | kanji: '国☆', 765 | given_kanji: '国☆' }, 766 | { original: 'Various artists', 767 | locale: '', 768 | unknown: true }, 769 | { original: 'M. Uchiyama', 770 | locale: 'ja', 771 | given: 'M', 772 | given_kana: 'ん', 773 | surname: 'Uchiyama', 774 | surname_kana: 'うちやま', 775 | name: 'Uchiyama M', 776 | ascii: 'Uchiyama M', 777 | plain: 'Uchiyama M', 778 | kana: 'うちやまん' }, 779 | { original: 'Kanda, M.', 780 | locale: 'ja', 781 | given: 'M', 782 | given_kana: 'ん', 783 | surname: 'Kanda', 784 | surname_kana: 'かんだ', 785 | name: 'Kanda M', 786 | ascii: 'Kanda M', 787 | plain: 'Kanda M', 788 | kana: 'かんだん' }, 789 | { original: 'School of Harunobu (Suzuki Harunobu 1725–1770)', 790 | locale: 'ja', 791 | school: true, 792 | given: 'Harunobu', 793 | given_kana: 'はるのぶ', 794 | name: 'Harunobu', 795 | ascii: 'Harunobu', 796 | plain: 'Harunobu', 797 | kana: 'はるのぶ' }, 798 | { original: 'Torii School', 799 | locale: 'ja', 800 | school: true, 801 | surname: 'Torii' }, 802 | { original: 'Attributed to Zeshin 91807-91)', 803 | locale: 'ja', 804 | attributed: true, 805 | given: 'Zeshin', 806 | given_kana: 'ぜしん', 807 | name: 'Zeshin', 808 | ascii: 'Zeshin', 809 | plain: 'Zeshin', 810 | kana: 'ぜしん' }, 811 | { original: 'Attributed to Hirezaki Eiho', 812 | locale: 'ja', 813 | attributed: true, 814 | given: 'Eihō', 815 | given_kana: 'えいほお', 816 | surname: 'Hirezaki', 817 | surname_kana: 'ひれざき', 818 | name: 'Hirezaki Eihō', 819 | ascii: 'Hirezaki Eihoo', 820 | plain: 'Hirezaki Eiho', 821 | kana: 'ひれざきえいほお' }, 822 | { original: 'After Yamamura, Toyonari', 823 | locale: 'ja', 824 | after: true, 825 | given: 'Toyonari', 826 | given_kana: 'とよなり', 827 | surname: 'Yamamura', 828 | surname_kana: 'やまむら', 829 | name: 'Yamamura Toyonari', 830 | ascii: 'Yamamura Toyonari', 831 | plain: 'Yamamura Toyonari', 832 | kana: 'やまむらとよなり' }, 833 | { original: 'After Buncho', 834 | locale: 'ja', 835 | after: true, 836 | given: 'Buncho', 837 | given_kana: 'ぶんちょ', 838 | name: 'Buncho', 839 | ascii: 'Buncho', 840 | plain: 'Buncho', 841 | kana: 'ぶんちょ' }, 842 | { original: 'Artist unidentified', locale: '', unknown: true }, 843 | { original: 'Artist unknown', locale: '', unknown: true }, 844 | { original: 'Anonymous', locale: '', unknown: true }, 845 | { original: 'Signature on title page not read', 846 | locale: '', 847 | unknown: true }, 848 | { original: '歌川広重 (2代目)', 849 | locale: 'ja', 850 | generation: 2, 851 | kanji: '歌川広重 2世', 852 | surname_kanji: '歌川', 853 | given_kanji: '広重' }, 854 | { original: 'Torii Kiyomine', 855 | locale: 'ja', 856 | surname: 'Torii', 857 | surname_kana: 'とりい', 858 | given: 'Kiyomine', 859 | given_kana: 'きよみね', 860 | name: 'Torii Kiyomine', 861 | ascii: 'Torii Kiyomine', 862 | plain: 'Torii Kiyomine', 863 | kana: 'とりいきよみね'}, 864 | { original: 'Kunisada 1, Utagawa 歌川国貞-豊国三代', 865 | locale: 'ja', 866 | kanji: '歌川国貞', 867 | given: 'Kunisada', 868 | given_kana: 'くにさだ', 869 | surname: 'Utagawa', 870 | surname_kana: 'うたがわ', 871 | given_kanji: '国貞', 872 | surname_kanji: '歌川', 873 | name: 'Utagawa Kunisada', 874 | ascii: 'Utagawa Kunisada', 875 | plain: 'Utagawa Kunisada', 876 | kana: 'うたがわくにさだ' }, 877 | { original: 'Yamashita Shintaro (1881-1966) — 山下 新太郎', 878 | locale: 'ja', 879 | surname_kanji: '山下', 880 | given_kanji: '新太郎', 881 | kanji: '山下新太郎', 882 | given: 'Shintarō', 883 | given_kana: 'しんたろお', 884 | surname: 'Yamashita', 885 | surname_kana: 'やました', 886 | name: 'Yamashita Shintarō', 887 | ascii: 'Yamashita Shintaroo', 888 | plain: 'Yamashita Shintaro', 889 | kana: 'やましたしんたろお' }, 890 | { original: 'Shima Tamami — 島 珠実', 891 | locale: 'ja', 892 | surname_kanji: '島', 893 | given_kanji: '珠実', 894 | given: 'Tamami', 895 | given_kana: 'たまみ', 896 | surname: 'Shima', 897 | surname_kana: 'しま', 898 | name: 'Shima Tamami', 899 | ascii: 'Shima Tamami', 900 | plain: 'Shima Tamami', 901 | kana: 'しまたまみ', 902 | kanji: '島珠実' }, 903 | { original: '柳川重信〈2〉', 904 | locale: 'ja', 905 | kanji: '柳川重信 2世', 906 | generation: 2, 907 | surname_kanji: '柳川', 908 | given_kanji: '重信' }, 909 | { original: 'Gigadō Ashiyuki 戯画堂 芦幸', 910 | locale: 'ja', 911 | surname_kanji: '戯画堂', 912 | given_kanji: '芦幸', 913 | kanji: '戯画堂芦幸', 914 | surname: 'Gigadō', 915 | surname_kana: 'ぎがどお', 916 | given: 'Ashiyuki', 917 | given_kana: 'あしゆき', 918 | name: 'Gigadō Ashiyuki', 919 | ascii: 'Gigadoo Ashiyuki', 920 | plain: 'Gigado Ashiyuki', 921 | kana: 'ぎがどおあしゆき' }, 922 | { original: 'Gigadō Ashiyuki 戯画堂芦幸', 923 | locale: 'ja', 924 | kanji: '戯画堂芦幸', 925 | surname: 'Gigadō', 926 | surname_kana: 'ぎがどお', 927 | given: 'Ashiyuki', 928 | given_kana: 'あしゆき', 929 | name: 'Gigadō Ashiyuki', 930 | ascii: 'Gigadoo Ashiyuki', 931 | plain: 'Gigado Ashiyuki', 932 | kana: 'ぎがどおあしゆき' }, 933 | { original: 'Toyoshige II (豊重 二代)', 934 | locale: 'ja', 935 | generation: 2, 936 | kanji: '豊重 2世', 937 | given: 'Toyoshige', 938 | given_kana: 'とよしげ', 939 | given_kanji: '豊重', 940 | name: 'Toyoshige II', 941 | ascii: 'Toyoshige II', 942 | plain: 'Toyoshige II', 943 | kana: 'とよしげ' }, 944 | { original: 'Hiroshige II 歌川広重 (2代目)', 945 | locale: 'ja', 946 | kanji: '歌川広重 2世', 947 | generation: 2, 948 | given: 'Hiroshige', 949 | given_kana: 'ひろしげ', 950 | given_kanji: '広重', 951 | surname_kanji: '歌川', 952 | name: 'Hiroshige II', 953 | ascii: 'Hiroshige II', 954 | plain: 'Hiroshige II', 955 | kana: 'ひろしげ' }, 956 | { original: 'Ike no Taiga (池大雅)', 957 | locale: 'ja', 958 | kanji: '池大雅', 959 | given: 'Taiga', 960 | given_kana: 'たいが', 961 | surname: 'Ike', 962 | surname_kana: 'いけ', 963 | given_kanji: '大雅', 964 | surname_kanji: '池', 965 | name: 'Ike Taiga', 966 | ascii: 'Ike Taiga', 967 | plain: 'Ike Taiga', 968 | kana: 'いけたいが' }, 969 | { original: 'Romeo V. Tabuena', 970 | locale: '', 971 | given: 'Romeo', 972 | surname: 'Tabuena', 973 | middle: 'V.', 974 | name: 'Romeo V. Tabuena', 975 | ascii: 'Romeo V. Tabuena', 976 | plain: 'Romeo V. Tabuena' }, 977 | { original: 'Oskar J. A. V. RIESENTHAL', 978 | locale: '', 979 | given: 'Oskar', 980 | surname: 'Riesenthal', 981 | middle: 'J. A. V.', 982 | name: 'Oskar J. A. V. Riesenthal', 983 | ascii: 'Oskar J. A. V. Riesenthal', 984 | plain: 'Oskar J. A. V. Riesenthal' }, 985 | { original: 'Oskar J. A. RIESENTHAL', 986 | locale: '', 987 | given: 'Oskar', 988 | surname: 'Riesenthal', 989 | middle: 'J. A.', 990 | name: 'Oskar J. A. Riesenthal', 991 | ascii: 'Oskar J. A. Riesenthal', 992 | plain: 'Oskar J. A. Riesenthal' }, 993 | { original: 'Juliette May Fraser', 994 | locale: '', 995 | given: 'Juliette', 996 | surname: 'Fraser', 997 | middle: 'May', 998 | name: 'Juliette May Fraser', 999 | ascii: 'Juliette May Fraser', 1000 | plain: 'Juliette May Fraser' }, 1001 | { original: 'Shun-ei Katsukawa', 1002 | locale: 'ja', 1003 | given: 'Shun-ei', 1004 | given_kana: 'しゅねい', 1005 | surname: 'Katsukawa', 1006 | surname_kana: 'かつかわ', 1007 | name: 'Katsukawa Shun-ei', 1008 | ascii: 'Katsukawa Shun-ei', 1009 | plain: 'Katsukawa Shun-ei', 1010 | kana: 'かつかわしゅねい' }, 1011 | { original: 'Tori-jo', 1012 | locale: 'ja', 1013 | given: 'Tori-jo', 1014 | given_kana: 'とりじょ', 1015 | name: 'Tori-jo', 1016 | ascii: 'Tori-jo', 1017 | plain: 'Tori-jo', 1018 | kana: 'とりじょ' }, 1019 | { original: 'Hachisuka Kuniaki II (国明二代)', 1020 | locale: 'ja', 1021 | generation: 2, 1022 | kanji: '国明 2世', 1023 | given: 'Kuniaki', 1024 | given_kana: 'くにあき', 1025 | surname: 'Hachisuka', 1026 | surname_kana: 'はちすか', 1027 | given_kanji: '国明', 1028 | name: 'Hachisuka Kuniaki II', 1029 | ascii: 'Hachisuka Kuniaki II', 1030 | plain: 'Hachisuka Kuniaki II', 1031 | kana: 'はちすかくにあき' }, 1032 | { original: 'Sakamoto Hanjiro (坂本繁二郎)', 1033 | locale: 'ja', 1034 | kanji: '坂本繁二郎', 1035 | given: 'Hanjirō', 1036 | given_kana: 'はんじろお', 1037 | surname: 'Sakamoto', 1038 | surname_kana: 'さかもと', 1039 | given_kanji: '繁二郎', 1040 | surname_kanji: '坂本', 1041 | name: 'Sakamoto Hanjirō', 1042 | ascii: 'Sakamoto Hanjiroo', 1043 | plain: 'Sakamoto Hanjiro', 1044 | kana: 'さかもとはんじろお' }, 1045 | { original: 'Utagawa Kunisada II (二代歌川国貞)', 1046 | locale: 'ja', 1047 | kanji: '歌川国貞 2世', 1048 | generation: 2, 1049 | given: 'Kunisada', 1050 | given_kana: 'くにさだ', 1051 | surname: 'Utagawa', 1052 | surname_kana: 'うたがわ', 1053 | given_kanji: '国貞', 1054 | surname_kanji: '歌川', 1055 | name: 'Utagawa Kunisada II', 1056 | ascii: 'Utagawa Kunisada II', 1057 | plain: 'Utagawa Kunisada II', 1058 | kana: 'うたがわくにさだ' }, 1059 | { original: 'Tokuu', 1060 | locale: 'ja', 1061 | given: 'Tokū', 1062 | given_kana: 'とくう', 1063 | name: 'Tokū', 1064 | ascii: 'Tokuu', 1065 | plain: 'Toku', 1066 | kana: 'とくう' }, 1067 | { original: 'Ryûkôsai', 1068 | locale: 'ja', 1069 | given: 'Ryūkōsai', 1070 | given_kana: 'りゅうこおさい', 1071 | name: 'Ryūkōsai', 1072 | ascii: 'Ryuukoosai', 1073 | plain: 'Ryukosai', 1074 | kana: 'りゅうこおさい' }, 1075 | { original: 'Utagawa Kunitomi (国富 Toyokuni II)', 1076 | locale: 'ja', 1077 | kanji: '国富', 1078 | given: 'Kunitomi', 1079 | given_kana: 'くにとみ', 1080 | surname: 'Utagawa', 1081 | surname_kana: 'うたがわ', 1082 | given_kanji: '国富', 1083 | name: 'Utagawa Kunitomi', 1084 | ascii: 'Utagawa Kunitomi', 1085 | plain: 'Utagawa Kunitomi', 1086 | kana: 'うたがわくにとみ' }, 1087 | { original: 'Kunisada IV Utagawa', 1088 | locale: 'ja', 1089 | generation: 4, 1090 | given: 'Kunisada', 1091 | given_kana: 'くにさだ', 1092 | surname: 'Utagawa', 1093 | surname_kana: 'うたがわ', 1094 | name: 'Utagawa Kunisada IV', 1095 | ascii: 'Utagawa Kunisada IV', 1096 | plain: 'Utagawa Kunisada IV', 1097 | kana: 'うたがわくにさだ' }, 1098 | { original: 'Utagawa Kunisada IV (1800-1900)', 1099 | locale: 'ja', 1100 | generation: 4, 1101 | given: 'Kunisada', 1102 | given_kana: 'くにさだ', 1103 | surname: 'Utagawa', 1104 | surname_kana: 'うたがわ', 1105 | name: 'Utagawa Kunisada IV', 1106 | ascii: 'Utagawa Kunisada IV', 1107 | plain: 'Utagawa Kunisada IV', 1108 | kana: 'うたがわくにさだ' }, 1109 | { original: 'Utagawa Kuniyoshi (歌川国芳) (Kuniyoshi, Utagawa)', 1110 | locale: 'ja', 1111 | settings: { stripParens: true }, 1112 | given: 'Kuniyoshi', 1113 | given_kana: 'くによし', 1114 | surname: 'Utagawa', 1115 | surname_kana: 'うたがわ', 1116 | name: 'Utagawa Kuniyoshi', 1117 | ascii: 'Utagawa Kuniyoshi', 1118 | plain: 'Utagawa Kuniyoshi', 1119 | kana: 'うたがわくによし' }, 1120 | { original: 'Hiroshige', 1121 | locale: 'ja', 1122 | settings: { givenFirst: true }, 1123 | given: 'Hiroshige', 1124 | given_kana: 'ひろしげ', 1125 | name: 'Hiroshige', 1126 | ascii: 'Hiroshige', 1127 | plain: 'Hiroshige', 1128 | kana: 'ひろしげ' }, 1129 | // Fo is not valid! 1130 | { original: 'Tsuguharu Foujita', 1131 | locale: '', 1132 | given: 'Tsuguharu', 1133 | surname: 'Foujita', 1134 | name: 'Tsuguharu Foujita', 1135 | ascii: 'Tsuguharu Foujita', 1136 | plain: 'Tsuguharu Foujita' }, 1137 | { original: 'Shibata Zeshin (柴田是眞)', 1138 | locale: 'ja', 1139 | kanji: '柴田是眞', 1140 | given: 'Zeshin', 1141 | given_kana: 'ぜしん', 1142 | surname: 'Shibata', 1143 | surname_kana: 'しばた', 1144 | surname_kanji: '柴田', 1145 | given_kanji: '是眞', 1146 | name: 'Shibata Zeshin', 1147 | ascii: 'Shibata Zeshin', 1148 | plain: 'Shibata Zeshin', 1149 | kana: 'しばたぜしん' }, 1150 | { original: 'FUKAZAWA Gunji', 1151 | locale: 'ja', 1152 | given: 'Gunji', 1153 | given_kana: 'ぐんじ', 1154 | surname: 'Fukazawa', 1155 | surname_kana: 'ふかざわ', 1156 | name: 'Fukazawa Gunji', 1157 | ascii: 'Fukazawa Gunji', 1158 | plain: 'Fukazawa Gunji', 1159 | kana: 'ふかざわぐんじ' }, 1160 | { original: 'Torii Kiyonaga', 1161 | locale: 'ja', 1162 | given: 'Kiyonaga', 1163 | given_kana: 'きよなが', 1164 | surname: 'Torii', 1165 | surname_kana: 'とりい', 1166 | name: 'Torii Kiyonaga', 1167 | ascii: 'Torii Kiyonaga', 1168 | plain: 'Torii Kiyonaga', 1169 | kana: 'とりいきよなが' }, 1170 | { original: 'Toyokuni UTAGAWA', 1171 | locale: 'ja', 1172 | settings: { givenFirst: true }, 1173 | given: 'Toyokuni', 1174 | given_kana: 'とよくに', 1175 | surname: 'Utagawa', 1176 | surname_kana: 'うたがわ', 1177 | name: 'Utagawa Toyokuni', 1178 | ascii: 'Utagawa Toyokuni', 1179 | plain: 'Utagawa Toyokuni', 1180 | kana: 'うたがわとよくに' }, 1181 | { original: 'Toyokuni UTAGAWA', 1182 | locale: 'ja', 1183 | given: 'Toyokuni', 1184 | given_kana: 'とよくに', 1185 | surname: 'Utagawa', 1186 | surname_kana: 'うたがわ', 1187 | name: 'Utagawa Toyokuni', 1188 | ascii: 'Utagawa Toyokuni', 1189 | plain: 'Utagawa Toyokuni', 1190 | kana: 'うたがわとよくに' }, 1191 | { original: 'Charles W Bartlett', 1192 | locale: '', 1193 | given: 'Charles', 1194 | surname: 'Bartlett', 1195 | middle: 'W.', 1196 | name: 'Charles W. Bartlett', 1197 | ascii: 'Charles W. Bartlett', 1198 | plain: 'Charles W. Bartlett' }, 1199 | { original: 'Toyokuni IV', 1200 | locale: 'ja', 1201 | generation: 4, 1202 | given: 'Toyokuni', 1203 | given_kana: 'とよくに', 1204 | name: 'Toyokuni IV', 1205 | ascii: 'Toyokuni IV', 1206 | plain: 'Toyokuni IV', 1207 | kana: 'とよくに' }, 1208 | { original: 'Hiroshige Utagawa', 1209 | locale: 'ja', 1210 | given: 'Hiroshige', 1211 | given_kana: 'ひろしげ', 1212 | surname: 'Utagawa', 1213 | surname_kana: 'うたがわ', 1214 | name: 'Utagawa Hiroshige', 1215 | ascii: 'Utagawa Hiroshige', 1216 | plain: 'Utagawa Hiroshige', 1217 | kana: 'うたがわひろしげ' }, 1218 | { original: 'Hiroshige Andō', 1219 | locale: 'ja', 1220 | given: 'Hiroshige', 1221 | given_kana: 'ひろしげ', 1222 | surname: 'Andō', 1223 | surname_kana: 'あんどお', 1224 | name: 'Andō Hiroshige', 1225 | ascii: 'Andoo Hiroshige', 1226 | plain: 'Ando Hiroshige', 1227 | kana: 'あんどおひろしげ' }, 1228 | { original: 'Kunitsuru Utagawa', 1229 | locale: 'ja', 1230 | given: 'Kunitsuru', 1231 | given_kana: 'くにつる', 1232 | surname: 'Utagawa', 1233 | surname_kana: 'うたがわ', 1234 | name: 'Utagawa Kunitsuru', 1235 | ascii: 'Utagawa Kunitsuru', 1236 | plain: 'Utagawa Kunitsuru', 1237 | kana: 'うたがわくにつる' }, 1238 | { original: 'Toyoshige II, Utagawa', 1239 | locale: 'ja', 1240 | generation: 2, 1241 | given: 'Toyoshige', 1242 | given_kana: 'とよしげ', 1243 | surname: 'Utagawa', 1244 | surname_kana: 'うたがわ', 1245 | name: 'Utagawa Toyoshige II', 1246 | ascii: 'Utagawa Toyoshige II', 1247 | plain: 'Utagawa Toyoshige II', 1248 | kana: 'うたがわとよしげ' }, 1249 | { original: 'Utagawa Kunitomi I (国富)', 1250 | locale: 'ja', 1251 | kanji: '国富', 1252 | given: 'Kunitomi', 1253 | given_kana: 'くにとみ', 1254 | surname: 'Utagawa', 1255 | surname_kana: 'うたがわ', 1256 | given_kanji: '国富', 1257 | name: 'Utagawa Kunitomi', 1258 | ascii: 'Utagawa Kunitomi', 1259 | plain: 'Utagawa Kunitomi', 1260 | kana: 'うたがわくにとみ' }, 1261 | { original: 'Kiyonobu II (清信 二代)', 1262 | locale: 'ja', 1263 | generation: 2, 1264 | kanji: '清信 2世', 1265 | given: 'Kiyonobu', 1266 | given_kana: 'きよのぶ', 1267 | given_kanji: '清信', 1268 | name: 'Kiyonobu II', 1269 | ascii: 'Kiyonobu II', 1270 | plain: 'Kiyonobu II', 1271 | kana: 'きよのぶ' }, 1272 | { original: '清信 二代', 1273 | locale: 'ja', 1274 | generation: 2, 1275 | kanji: '清信 2世', 1276 | given_kanji: '清信' }, 1277 | { original: 'Shun\'ei Katsukawa', 1278 | locale: 'ja', 1279 | given: 'Shun\'ei', 1280 | given_kana: 'しゅんえい', 1281 | surname: 'Katsukawa', 1282 | surname_kana: 'かつかわ', 1283 | name: 'Katsukawa Shun\'ei', 1284 | ascii: 'Katsukawa Shun\'ei', 1285 | plain: 'Katsukawa Shun\'ei', 1286 | kana: 'かつかわしゅんえい' }, 1287 | { original: 'Eishôsai Chōki', 1288 | locale: 'ja', 1289 | given: 'Chōki', 1290 | given_kana: 'ちょおき', 1291 | surname: 'Eishōsai', 1292 | surname_kana: 'えいしょおさい', 1293 | name: 'Eishōsai Chōki', 1294 | ascii: 'Eishoosai Chooki', 1295 | plain: 'Eishosai Choki', 1296 | kana: 'えいしょおさいちょおき' }, 1297 | { original: 'Choki Eishosai', 1298 | locale: 'ja', 1299 | given: 'Chōki', 1300 | given_kana: 'ちょおき', 1301 | surname: 'Eishōsai', 1302 | surname_kana: 'えいしょおさい', 1303 | name: 'Eishōsai Chōki', 1304 | ascii: 'Eishoosai Chooki', 1305 | plain: 'Eishosai Choki', 1306 | kana: 'えいしょおさいちょおき' }, 1307 | { original: 'Sharaku Toshusai', 1308 | locale: 'ja', 1309 | given: 'Sharaku', 1310 | given_kana: 'しゃらく', 1311 | surname: 'Tōshūsai', 1312 | surname_kana: 'とおしゅうさい', 1313 | name: 'Tōshūsai Sharaku', 1314 | ascii: 'Tooshuusai Sharaku', 1315 | plain: 'Toshusai Sharaku', 1316 | kana: 'とおしゅうさいしゃらく' }, 1317 | { original: 'Shunei Katsukawa', 1318 | locale: 'ja', 1319 | given: 'Shun\'ei', 1320 | given_kana: 'しゅんえい', 1321 | surname: 'Katsukawa', 1322 | surname_kana: 'かつかわ', 1323 | name: 'Katsukawa Shun\'ei', 1324 | ascii: 'Katsukawa Shun\'ei', 1325 | plain: 'Katsukawa Shun\'ei', 1326 | kana: 'かつかわしゅんえい' }, 1327 | { original: 'Charles Bartlett', 1328 | locale: '', 1329 | given: 'Charles', 1330 | surname: 'Bartlett', 1331 | name: 'Charles Bartlett', 1332 | ascii: 'Charles Bartlett', 1333 | plain: 'Charles Bartlett' }, 1334 | { original: 'Ma ZHONGJUN', 1335 | locale: '', 1336 | given: 'Ma', 1337 | surname: 'Zhongjun', 1338 | name: 'Ma Zhongjun', 1339 | ascii: 'Ma Zhongjun', 1340 | plain: 'Ma Zhongjun' }, 1341 | { original: 'Mai Li', 1342 | locale: '', 1343 | given: 'Li', 1344 | surname: 'Mai', 1345 | name: 'Li Mai', 1346 | ascii: 'Li Mai', 1347 | plain: 'Li Mai' }, 1348 | { original: 'Shokosai Hanbei (松好斎半兵衛)', 1349 | locale: 'ja', 1350 | kanji: '松好斎半兵衛', 1351 | given: 'Hanbei', 1352 | given_kana: 'はんべい', 1353 | surname: 'Shōkosai', 1354 | surname_kana: 'しょおこさい', 1355 | given_kanji: '半兵衛', 1356 | surname_kanji: '松好斎', 1357 | name: 'Shōkosai Hanbei', 1358 | ascii: 'Shookosai Hanbei', 1359 | plain: 'Shokosai Hanbei', 1360 | kana: 'しょおこさいはんべい' }, 1361 | { original: '(松好斎半兵衛)', 1362 | locale: 'ja', 1363 | kanji: '松好斎半兵衛', 1364 | surname_kanji: '松好斎', 1365 | given_kanji: '半兵衛' }, 1366 | { original: '歌川広重', 1367 | locale: 'ja', 1368 | kanji: '歌川広重', 1369 | surname_kanji: '歌川', 1370 | given_kanji: '広重' }, 1371 | { original: '歌川 国郷', 1372 | locale: 'ja', 1373 | kanji: '歌川国郷', 1374 | surname_kanji: '歌川', 1375 | given_kanji: '国郷' }, 1376 | { original: '柴田是眞', 1377 | locale: 'ja', 1378 | kanji: '柴田是眞', 1379 | surname_kanji: '柴田', 1380 | given_kanji: '是眞' }, 1381 | { original: '風折有丈', 1382 | locale: 'ja', 1383 | kanji: '風折有丈', 1384 | surname_kanji: '風折', 1385 | given_kanji: '有丈' }, 1386 | { 1387 | "original": "KAMO NO SUKETAME 鴨 祐為", 1388 | "locale": "ja", 1389 | "surname_kanji": "鴨", 1390 | "given_kanji": "祐為", 1391 | "given": "Suketame", 1392 | "given_kana": "すけため", 1393 | "surname": "Kamo", 1394 | "surname_kana": "かも", 1395 | "name": "Kamo Suketame", 1396 | "ascii": "Kamo Suketame", 1397 | "plain": "Kamo Suketame", 1398 | "kana": "かもすけため", 1399 | "kanji": "鴨祐為" 1400 | }, 1401 | { 1402 | original: 'HASEGAWA SADANOBU 3代目 長谷川 貞信', 1403 | locale: 'ja', 1404 | generation: 3, 1405 | surname_kanji: '長谷川', 1406 | given_kanji: '貞信', 1407 | given: 'Sadanobu', 1408 | given_kana: 'さだのぶ', 1409 | surname: 'Hasegawa', 1410 | surname_kana: 'はせがわ', 1411 | name: 'Hasegawa Sadanobu III', 1412 | ascii: 'Hasegawa Sadanobu III', 1413 | plain: 'Hasegawa Sadanobu III', 1414 | kana: 'はせがわさだのぶ', 1415 | kanji: '長谷川貞信 3世' 1416 | }, 1417 | { 1418 | original: 'SHODAI UTAGAWA TOYOKUNI 初代 歌川豊国', 1419 | locale: 'ja', 1420 | kanji: '歌川豊国', 1421 | given: 'Toyokuni', 1422 | given_kana: 'とよくに', 1423 | surname: 'Utagawa', 1424 | surname_kana: 'うたがわ', 1425 | given_kanji: '豊国', 1426 | surname_kanji: '歌川', 1427 | name: 'Utagawa Toyokuni', 1428 | ascii: 'Utagawa Toyokuni', 1429 | plain: 'Utagawa Toyokuni', 1430 | kana: 'うたがわとよくに' 1431 | }, 1432 | ]; 1433 | 1434 | tests.forEach(function(expected) { 1435 | var actual = romajiName.parseName(expected); 1436 | try { 1437 | assert.deepEqual(actual, expected); 1438 | } catch(e) { 1439 | console.log("Actual:", actual); 1440 | console.log("Expected:", expected); 1441 | throw e; 1442 | } 1443 | }); 1444 | 1445 | (function() { 1446 | var expected = { original: 'Toyokuni UTAGAWA', 1447 | locale: 'ja', 1448 | settings: { givenFirst: false }, 1449 | given: 'Toyokuni', 1450 | given_kana: 'とよくに', 1451 | surname: 'Utagawa', 1452 | surname_kana: 'うたがわ', 1453 | name: 'Utagawa Toyokuni', 1454 | ascii: 'Utagawa Toyokuni', 1455 | plain: 'Utagawa Toyokuni', 1456 | kana: 'うたがわとよくに' }; 1457 | var actual = romajiName.parseName(expected, { 1458 | givenFirst: true 1459 | }); 1460 | expected.settings.givenFirst = true; 1461 | try { 1462 | assert.deepEqual(actual, expected); 1463 | } catch(e) { 1464 | console.log("Actual:", actual); 1465 | console.log("Expected:", expected); 1466 | throw e; 1467 | } 1468 | })(); 1469 | 1470 | console.log(romajiName.parseName("Yoshida Hanbei 吉田半兵衛")); 1471 | }); 1472 | --------------------------------------------------------------------------------