/* */ CALL RxFuncAdd 'SysLoadFuncs', 'REXXUTIL', 'SysLoadFuncs' CALL SysLoadFuncs CALL RxFuncAdd 'ULSLoadFuncs', 'RXULS', 'ULSLoadFuncs' CALL ULSLoadFuncs settings.!edict = 'edict' settings.!kdict = 'kanjidic' PARSE ARG target target = STRIP( target ) IF target == '' THEN RETURN IF STREAM( settings.!edict, 'C', 'QUERY EXISTS') == '' THEN DO SAY 'Required dictionary' settings.!edict 'not found.' RETURN END IF STREAM( settings.!edict, 'C', 'QUERY EXISTS') == '' THEN DO SAY 'Required dictionary' settings.!kdict 'not found.' RETURN END /* Remove partial characters */ len = LENGTH( target ) IF len == 1 THEN /* Single-byte character, just return as-is */ RETURN target ELSE IF len // 2 == 1 THEN target = LEFT( target, len-1 ) yomi = ULSConvertCodepage( target, 932, 954,, 'G', 'N') IF yomi == '' THEN DO SAY ULSERR RETURN END IF len == 2 THEN CALL GetKanji yomi ELSE CALL GetWords yomi SAY candidates.0 'candidates found:' DO i = 1 TO candidates.0 SAY candidates.i END RETURN GetWords: PROCEDURE EXPOSE settings. candidates. PARSE ARG yomi hira_yomi = ULSTransform( yomi, 'hiragana', 954, 'ja_JP') kata_yomi = ULSTransform( yomi, 'katakana', 954, 'ja_JP') ok = SysFileSearch( hira_yomi, settings.!edict, 'matches.') c = 0 DO i = 1 TO matches.0 PARSE VAR matches.i _kanji '['_reading']' . IF _reading == '' THEN DO _reading = WORD( _kanji, 1 ) _kanji = _reading END IF _reading == hira_yomi THEN DO c = c + 1 candidates.c = STRIP( ULSConvertCodepage( _kanji, 954, 932,, 'G', 'N')) END END ok = SysFileSearch( kata_yomi, settings.!edict, 'matches.') DO i = 1 TO matches.0 PARSE VAR matches.i _kanji '['_reading']' . IF _reading == '' THEN DO _reading = WORD( _kanji, 1 ) _kanji = _reading END IF _reading == kata_yomi THEN DO c = c + 1 candidates.c = STRIP( ULSConvertCodepage( _kanji, 954, 932,, 'G', 'N')) END END candidates.0 = c RETURN GetKanji: PROCEDURE EXPOSE settings. candidates. PARSE ARG yomi hira_yomi = ULSTransform( yomi, 'hiragana', 954, 'ja_JP') kata_yomi = ULSTransform( yomi, 'katakana', 954, 'ja_JP') candidates.0 = 0 ok = SysFileSearch( hira_yomi, settings.!kdict, 'matches.') c = 0 DO i = 1 TO matches.0 kinfo = ParseKanjiEntry( hira_yomi, matches.i ) IF kinfo <> '' THEN DO c = c + 1 kcand.c = STRIP( ULSConvertCodepage( kinfo, 954, 932,, 'G', 'N')) END END ok = SysFileSearch( kata_yomi, settings.!kdict, 'matches.') DO i = 1 TO matches.0 kinfo = ParseKanjiEntry( kata_yomi, matches.i ) IF kinfo <> '' THEN DO c = c + 1 kcand.c = STRIP( ULSConvertCodepage( kinfo, 954, 932,, 'G', 'N')) END END kcand.0 = c IF c > 0 THEN DO /* Sort the results by kanji and remove any duplicates */ CALL SysStemSort 'kcand.', 'A' c = 0 DO i = 1 TO kcand.0 PARSE VAR kcand.i _kanji . IF i > 0 THEN DO h = i-1 PARSE VAR kcand.h _prevkanji . IF _prevkanji == _kanji THEN ITERATE END c = c + 1 candidates.c = kcand.i END candidates.0 = c /* Sort by frequency and then strip out the frequency numbers. */ CALL SysStemSort 'candidates.', 'A',,,, 4 DO i = 1 TO candidates.0 PARSE VAR candidates.i _kanji . candidates.i = _kanji END END RETURN ParseKanjiEntry: PROCEDURE PARSE ARG yomi, entry PARSE VAR entry _kanji _kinfo '{' . IF _kinfo == '' THEN RETURN /* Parse out the kanji, the frequency number, and the readings */ freq = 'F9999' readings = '' DO i = 1 TO WORDS( _kinfo ) field = WORD( _kinfo, i ) fldid = LEFT( field, 1 ) IF VERIFY( fldid, 'UNBCSGHFPKLIQMEY') <> 0 THEN DO IF fldid == '-' THEN field = SUBSTR( field, 2 ) PARSE VAR field stem'.'okuri readings = readings stem END ELSE IF fldid == 'F' THEN DO PARSE VAR field 'F'_fno . freq = 'F' || LEFT( _fno, 4, '0') END END /* Make sure we have a match with at least one reading */ result = '' DO i = 1 TO WORDS( readings ) IF WORD( readings, i ) == yomi THEN DO result = _kanji freq LEAVE END END RETURN result