/** アニメ作品リストデータベースのCSVデータから汎用テキストIME辞書を生成する 読みをひらがなに直し公式のGoogle向け辞書データよりも互換性を向上させ、 さらに註釈情報を追加して情報量を増強した辞書を自動生成するツール RFC4180準拠のCSVファイルをGitHubからダウンロードして変換します。 「ヴ」はSKK日本語入力FEPやMS-IMEでの利用を想定してカタカナで記録します。 ついでに註釈情報も追加してGitHubの辞書よりも情報量を大幅に増やしときました。 既にCSVファイルがダウンロード済みの場合はダウンロードは行いません。 最新の辞書に更新したい時は、CSVファイルを手動で削除してから実行してください。 【使いかた】 1. このページを「名前をつけて保存」します。 2. 保存したプログラム(animedb.js)をエクスプローラでダブルクリックして実行します。 3. 変換された辞書データ「アニメ作品リスト辞書.txt」が出力されます。 4. 辞書フォルダに辞書ファイルを置けば完了です。 5. おわり このプログラムはCC0 PUBLIC DOMAINです */ URL = "https://raw.githubusercontent.com/anilogia/animedb/master/csv/animes.csv" TEMPFILE = "animes.csv" SAVEFILE = "アニメ作品リスト辞書.txt" ENCODING = "utf-16le" // "utf-8" W = WScript X = ActiveXObject S = new X("WScript.Shell") F = new X("Scripting.FileSystemObject") F.FileExists(TEMPFILE) || !ds(URL, TEMPFILE) || W.Quit(S.Popup("ダウンロードに失敗しました", 0, "Error")) animedb(TEMPFILE, SAVEFILE) /// CSVから註釈つき汎用テキスト辞書形式に変換する function animedb(infile, outfile) { var a = ld(infile), o = ["! https://github.com/anilogia/animedb/"], d = {}, l, z, t, co, sp for (l in a) { l = a[l].replace(/"(?:[^"]|"")+"|[^,"]+|,/g, function(c) { return c == "," ? "\t" : /^\"/.test(c) ? c.slice(1, -1).replace(/""/g, "\"") : c }) z = l.split("\t") t = z[6] // 無効データ判定 if (t == "ruby") continue // 読みの正規化 t = t.replace(/[ァ-ン]/g, function (c) { return String.fromCharCode(c.charCodeAt(0) - 96) }) .replace(/ /g, "") // .replace(/ヴ/g, "う゛") // 他のSKKで使いたい場合はこの行を有効化せよ /// @note 「同じのある」「同じのがある」はフィルタすべき (報告済 元データ由来と判明) /// @note 「AはB」の読みが「AわB」になってるものがあった (報告済 修正済) /// @note 「〜」と「-」にWindowsで入力不可能な文字が混在 (報告済 修正済) /// @note 「ローゼン メイデン」とかタイトルに空白が入りまくってるのが気になる。 /// @note TV版と劇場版とでタイトルが同じだと片方が除外されてしまっているのが気になる。 // 変換候補の正規化 z[4] = z[4] .replace(/\u301C/g, "〜") .replace(/\u2013/g, "-") // 註釈 [XX版][ (XXXX[/XX[/XX]][ - XXXX/XX/XX])][ URL][ MEMO] co = "", sp = "" if (z[1] && z[1] != "不明" && z[1] != "その他") co += z[1] + "版", sp = " " if (z[7]) { co += sp + "(" + z[7], sp = " " if (z[8]) { co += "/" + z[8] if (z[9]) co += "/" + z[9] } if (z[10]) co += " - " + z[10] + "/" + z[11] + "/" + z[12] co += ")" } if (z[17]) co += sp + z[17], sp = " " if (z[18] && z[18].indexOf("同じ")) co += sp + z[18] // 同じタイトルを除外 i = t + "\t" + z[4] if (i in d) { // if d[i].length >= co.length then continue else scan and remove t in array o continue } d[i] = co z = [t, z[4], "固有名詞"] if (co) z.push(co) o.push(z.join("\t")) } sv(outfile, o) } /// ダウンロード function ds(u, f) { var h = new X("MSXML2.ServerXMLHTTP"), s = 1 try { h.setOption(2, 13056) h.open("GET", u, 0) h.send() s = h.status } catch (e) {} if (s == 200) with (new X("ADODB.Stream")) { Type = 1 Open() Write(h.responseBody) SaveToFile(f, 2) s = 0 } return s } /// ロード function ld(f, a) { with (new X("ADODB.Stream")) { Charset = "iso-8859-1", Open(), LoadFromFile(f), a = ReadText(1), Close(), Charset = "utf-8", // "_autodetect" Open(), LoadFromFile(f), a = ReadText(-1).split(/\r|\n|\r\n/), Close() } return a } /// セーブ function sv(f, a) { with (new X("ADODB.Stream")) { Charset = ENCODING, Open(), WriteText(a.join("\r\n"), 1), SaveToFile(f, 2), Close() } }