漢字の構成要素を指定して漢字を検索するAppleScriptです。
ライブラリやデータを含むAppleScriptバンドルをダウンロードできるようにしておきます。
–> Download kanjiSearchFromPartsV4 (Inlcuding AppleScript Libraries)
macOS標準搭載の「関連文字に変換」に似たような動作を行います。「関連文字に変換」では、いったん漢字を構成要素に分解し、分解した要素をもとに共通漢字を検索するユーザーインタフェースになっていますが、こちらはダイレクトに構成要素部品を示して、そこから共通部品を持つ文字を検索します。
{"氵", "艹", "田"}
をパラメータに指定して実行すると、
--> {"藩"}
という結果を返します。同様に、
{"⻖", "生"}
をパラメータに指定して実行すると、
--> {"隆"}
という結果を出します。日本語を学習中の他国語の話者の方とか、子供、漢字をそろそろ思い出せなくなってきているお年寄りなどにニーズがあると思われるプログラムです。
元になっている「kanjiVG」データの特性なのですが、大人がよく理解して使う分には問題ないものの、義務教育過程の小中学生が使うと、学校で教える漢字部品の指定の仕方と異なるので、「宿題のために使えてもテストの点数が落ちる」といった弊害があるかもしれません。
あとは、GUIがあったほうが使いやすいプログラムだと思われるため、電卓(計算機)のようなイージーなインタフェースをつけて道具に仕立てたほうがよいのでしょう。
本プログラムリストは、スクリプトエディタに転送できますが、バンドル形式で保存してデータやライブラリを含んだ形にしないと実行できないため、実行のためには本記事冒頭にあるダウンロードリンクからバンドルのアーカイブをダウンロードしてください。
AppleScript名:構成要素を指定して漢字検索 v4.scptd |
— – Created by: Takaaki Naganoya – Created on: 2021/02/21 — – Copyright © 2021 Piyomaru Software, All Rights Reserved — use AppleScript version "2.7" use framework "Foundation" use scripting additions use jkLib : script "jyoyoKanjiLib" –常用漢字一覧を返してくるAppleScriptライブラリ property NSString : a reference to current application’s NSString property NSCountedSet : a reference to current application’s NSCountedSet property NSJSONSerialization : a reference to current application’s NSJSONSerialization property NSUTF8StringEncoding : a reference to current application’s NSUTF8StringEncoding script jsonStr property aJsonDict : missing value –JSONから読み取ったNSDictionary property jKanji : missing value –常用漢字データ(NSArray) end script –図形としての構成要素を指定して漢字検索(厳密にいえば部首ではない) set p1List to {"氵", "艹", "田"} set c1Res to searchKanjiFromElementListJ(p1List) of me –> {"藩"} set p2List to {"⻖", "生"} –こざとへん。データ内のこざとへんとおおざとの区別がよくわからなかった set c2Res to searchKanjiFromElementListJ(p2List) of me –> {"隆"} –検索に使える部首のキー文字の一覧を返す –set qList to listupQueryKeysForKanji() of me –> {"工", "棘", "左", "位", "婁", "攴", …} on searchKanjiFromElementListJ(aQueryList as list) script spd property aList : {} property bList : {} end script set aLen to length of aQueryList if aLen = 1 then return searchKanjiFromElementJ(first item of aQueryList) of me set (aList of spd) to {} set (bList of spd) to {} repeat with i in aQueryList set j to contents of i set tmpRes to searchKanjiFromElementJ(j) of me set the end of (aList of spd) to tmpRes end repeat return searchDuplicateItemsOnlyIn2DList((aList of spd)) of me end searchKanjiFromElementListJ on searchDuplicateItemsOnlyIn2DList(allList as list) set aLen to length of allList set aList to contents of first item of allList set bList to contents of rest of allList repeat with i in bList set j to contents of i –aListとbListを連結したListで重複が存在するかをチェック set aArray to (current application’s NSArray’s arrayWithArray:aList) set bArray to (current application’s NSArray’s arrayWithArray:j) set cArray to (aArray’s arrayByAddingObjectsFromArray:bArray) set aList to returnDuplicatesOnly(cArray, aLen) of me end repeat return aList end searchDuplicateItemsOnlyIn2DList on searchKanjiFromElementJ(aQueryStr) if (aJsonDict of jsonStr) = missing value then my init() if (jKanji of jsonStr) = missing value then my initJ() set aRes to (aJsonDict of jsonStr)’s valueForKey:aQueryStr if aRes = missing value then return missing value set cArray to aRes’s arrayByAddingObjectsFromArray:(jKanji of jsonStr) set cRes to returnDuplicatesOnly(cArray) of me return cRes end searchKanjiFromElementJ on searchKanjiFromElement(aQueryStr) if (aJsonDict of jsonStr) = missing value then my init() set aRes to (aJsonDict of jsonStr)’s valueForKey:aQueryStr if aRes = missing value then return missing value return aRes as list end searchKanjiFromElement on listupQueryKeysForKanji() if (aJsonDict of jsonStr) = missing value then my init() set aRes to (aJsonDict of jsonStr)’s allKeys() return aRes as list end listupQueryKeysForKanji on initJ() set (jKanji of jsonStr) to current application’s NSArray’s arrayWithArray:(retJyouyouKanji() of jkLib) end initJ on init() –https://github.com/yagays/kanjivg-radical set aPath to (POSIX path of (path to me)) & "Contents/Resources/element2kanji.json" set jsonString to NSString’s alloc()’s initWithContentsOfFile:(aPath) encoding:(NSUTF8StringEncoding) |error|:(missing value) set jsonData to jsonString’s dataUsingEncoding:(NSUTF8StringEncoding) set (aJsonDict of jsonStr) to NSJSONSerialization’s JSONObjectWithData:jsonData options:0 |error|:(missing value) end init on returnDuplicatesOnly(anArray) set aSet to NSCountedSet’s alloc()’s initWithArray:anArray set bList to (aSet’s allObjects()) as list set dupList to {} repeat with i in bList set aRes to (aSet’s countForObject:i) if aRes > 1 then set the end of dupList to (contents of i) end if end repeat return dupList end returnDuplicatesOnly |
More from my site
(Visited 51 times, 1 visits today)