美文のキャラ倉庫とkawax/niconicoと日記
美文のキャラ倉庫
基本データ表示のためのLuaスクリプトほぼできた!
どうせサイトを公開したらスクリプトも全体公開になるのでソースコード置いときます。
(長いから折りたたむよ)
Module:BasicData
local p = {}
function p.process(frame)
local args = frame:getParent().args
local result = p.generate(args)
return frame:preprocess(result)
end
function p.generate(args)
local string_utils = require('Module:StringUtils')
local fields = {
{ key = 'ふりがな', val = args['ふりがな'] },
{ key = '正式名称', val = args['正式名称'] },
{ key = 'フルネーム', val = args['フルネーム'] },
{ key = '英字表記', val = args['英字表記'] },
{ key = '他の名前', val = args['他の名前'] },
{ key = '公式サイト', val = args['公式サイト'] },
{ key = '登場作品', val = args['登場作品'] },
{ key = '種族', val = args['種族'] },
{ key = '性別', val = args['性別'] },
{ key = '年齢', val = args['年齢'] },
{ key = '大きさ', val = args['大きさ'] },
{ key = '一人称', val = args['一人称'] },
{ key = '二人称', val = args['二人称'] },
}
local info_rows = {}
local cargo_rows = {}
for _, field in ipairs(fields) do
-- 値が存在し、空文字列でない場合のみ行を生成
if field.val and field.val ~= '' then
local key = field.key
local value = field.val
if key == 'ふりがな' then
local sortkey = string_utils.sortkey(value)
table.insert(cargo_rows, string.format('Furigana = %s', value))
table.insert(cargo_rows, string.format('FuriganaSort = %s', sortkey))
if args['表示用ふりがな'] and args['表示用ふりがな'] ~= '' then
value = args['表示用ふりがな']
end
value = string.format('%s{{DEFAULTSORT:%s}}', value, sortkey)
elseif key == '登場作品' then
local titles = mw.text.split(value, '、', true)
local converted_titles = {}
for _, title in ipairs(titles) do
if title == 'ふにゃ(ゲーム)' then
table.insert(converted_titles, '[[ふにゃ(ゲーム)|ふにゃ]][[Category:登場作品:ふにゃ]]')
else
table.insert(converted_titles, string.format('[[%s]][[Category:登場作品:%s]]', title, title))
end
end
value = table.concat(converted_titles, '、')
elseif key == '種族' then
local kinds = mw.text.split(value, '、', true)
local converted_kinds = {}
for _, kind in ipairs(kinds) do
table.insert(converted_kinds, string.format('[[%s]][[Category:種族:%s]]', kind, kind))
end
value = table.concat(converted_kinds, '、')
elseif key == '性別' then
value = string.format('%s[[Category:性別:%s]]', value, value)
end
table.insert(info_rows, string.format('<tr><th>%s</th><td>%s</td></tr>', key, value))
end
end
local result = ""
if next(info_rows) then
result = string.format("%s<table class=\"wikitable\">%s</table>", result, table.concat(info_rows, ""))
end
if next(cargo_rows) then
result = string.format("%s{{#cargo_store:_table = BasicData|%s}}", result, table.concat(cargo_rows, "|"))
end
return result
end
return pModule:StringUtils
local p = {}
function p.sortkey(furigana)
if furigana == "" then return "" end
local sortkey_table = {
{"が", "か"}, {"ぎ", "き"}, {"ぐ", "く"}, {"げ", "け"}, {"ご", "こ"},
{"ざ", "さ"}, {"じ", "し"}, {"ず", "す"}, {"ぜ", "せ"}, {"ぞ", "そ"},
{"だ", "た"}, {"ぢ", "ち"}, {"づ", "つ"}, {"で", "て"}, {"ど", "と"},
{"ば", "は"}, {"び", "ひ"}, {"ぶ", "ふ"}, {"べ", "へ"}, {"ぼ", "ほ"},
{"ぱ", "は"}, {"ぴ", "ひ"}, {"ぷ", "ふ"}, {"ぺ", "へ"}, {"ぽ", "ほ"},
{"ゔ", "う"},
{"ぁ", "あ"}, {"ぃ", "い"}, {"ぅ", "う"}, {"ぇ", "え"}, {"ぉ", "お"},
{"ゃ", "や"}, {"ゅ", "ゆ"}, {"ょ", "よ"}, {"っ", "つ"}, {"ゎ", "わ"},
{"あー", "ああ"}, {"いー", "いい"}, {"うー", "うう"}, {"えー", "ええ"}, {"おー", "おお"},
{"かー", "かあ"}, {"きー", "きい"}, {"くー", "くう"}, {"けー", "けえ"}, {"こー", "こお"},
{"さー", "さあ"}, {"しー", "しい"}, {"すー", "すう"}, {"せー", "せえ"}, {"そー", "そお"},
{"たー", "たあ"}, {"ちー", "ちい"}, {"つー", "つう"}, {"てー", "てえ"}, {"とー", "とお"},
{"なー", "なあ"}, {"にー", "にい"}, {"ぬー", "ぬう"}, {"ねー", "ねえ"}, {"のー", "のお"},
{"はー", "はあ"}, {"ひー", "ひい"}, {"ふー", "ふう"}, {"へー", "へえ"}, {"ほー", "ほお"},
{"まー", "まあ"}, {"みー", "みい"}, {"むー", "むう"}, {"めー", "めえ"}, {"もー", "もお"},
{"やー", "やあ"}, {"ゆー", "ゆう"}, {"よー", "よお"},
{"らー", "らあ"}, {"りー", "りい"}, {"るー", "るう"}, {"れー", "れえ"}, {"ろー", "ろお"},
{"わー", "わあ"}, {"ゐー", "ゐい"}, {"ゑー", "ゑえ"}, {"をー", "をお"},
}
for i, v in pairs(sortkey_table) do
local from = v[1]
local to = v[2]
furigana = string.gsub(furigana, from, to)
end
return furigana
end
return pまあ、おおむね引数で渡された項目を表に表示して、一部項目に特殊対応を入れている程度です。
ソートキー生成は、アンパンマンDB用にPHPで作っていたものをLuaに移植したもの。
文字列連結を繰り返すと遅くなるらしいので、ある程度はテーブルやstring.formatを使って連結を減らしています。
どこまで効果あるのか知らないですけどね。
欲を言えば、年齢や大きさも特殊対応入れたい。
昔作ったC#用単位・数値変換クラスをLuaに移植して、年齢順一覧とか大きさ順一覧とか作りたいんですよね。
ただ、ここで欲張ると公開がさらに先になっちゃいますからね。
kawax/niconico(TGWS内部処理)
PHPのバージョンを8.5に上げたいとか言ってましたが、思わぬところで問題が出ました。
ニコニコ動画の情報取得に使ってるこのライブラリ、誤動作とか致命的なエラーはないんですが、PHP8.4でDEPRECATEDが出るようになったのです。
場所を修正方法は把握していて、niconico/src/Search/Query.phpの16行目と、同29行目のパラメータです。
これが、null許可しないと明示されているのに初期値null扱いされているので、将来のバージョンでエラーにするから今のうちに直しとけよという警告を出してくれているというわけです。
昔のバージョンでは、null許可すると明示しなくても初期値nullにしておけば、暗黙的にnull許可扱いにしてくれていたんですが、それをやめることになったんですね。
だから、修正方針としては以下のように、型指定に「?」を付けて、null許可を明示します。
- public function __construct(array $query = null)
+ public function __construct(?array $query = null)- public static function create(array $query = null): static
+ public static function create(?array $query = null): static…というIssueとプルリクを明日出しとこう。そうしよう。
日記
さっきDIFFっぽいもの書きましたが、DIFFとしてのシンタックスハイライトは入れていません。
「```diff-php」とやればPHPのDIFFが出ると期待したんですが、コードブロック機能が壊れてしまいました。
なので、今は「```php」として、普通のPHPコード扱いでシンタックスハイライトを入れています。
今使っているシンタックスハイライトがDIFFに対応しているのかはわからないのですが、コードブロック機能が壊れるのは避けたほうがよさそうな気がします。
このコードブロック機能は私が作ったTgwsMarkの機能なんで、Issueとプルリクというより、自分で直すべき案件ですね。