「TgwsMark」に関する日記

mifumi323/tgwsmark - Packagist - PHP用のライブラリ。この日記で使ってるのと同じやつ。

美文のキャラ倉庫と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 p

Module: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に上げたいとか言ってましたが、思わぬところで問題が出ました。

kawax/niconico: ニコニコ動画API

ニコニコ動画の情報取得に使ってるこのライブラリ、誤動作とか致命的なエラーはないんですが、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とプルリクというより、自分で直すべき案件ですね。

アンパンマンDBとDeepWiki

アンパンマンDB(記事更新)

来週の放送情報。

DeepWiki

DeepWiki | AI documentation you can talk to, for every repo
GitHubのリポジトリからAIで説明書を作るやつ。
出来上がる説明書は英語ですが、読むのもAIにやらせて要約してもらえば最終的に日本語でも理解できます。
むしろAIに読ませる前提ならAIが最も学習しているであろう英語が最適なぐらい。

とりあえずいくつか私のライブラリも説明書作らせてみました。
ぱっと見た感じまあまあいい感じかなーと思うんですが、やっぱりうまく行ってない部分も見られますね。
TgwsMarkとMarkDownの文法が衝突しているあたりでコードブロックが壊れています。
人間が作ったら目で見て気付くものですが、AIがそんなことするわけないので現状は仕方ないかな。
まあ、将来AIが賢くなればこの程度は克服してきそうな気もするけど。
正式なマニュアル扱いするにはもうちょっと読み込んで精査してからかな。

TgwsMarkとドラゴンクエスト10

TgwsMark

はいバージョン3.0.1。
開発終了といった舌の根も乾かぬうちに申し訳ないですが、一点問題を発見したので。
コードブロックが改行の都合で最初に一行開いちゃってたんですよね。

で、修正した結果を実際使ってみたのがこちら。

$tgws_mark = <<<TGWSMARK
*み⭐だ⭐し
ほんぶん👣
TGWSMARK;
$html = \Mifumi323\TgwsMark\TgwsMark::toHtml($tgws_mark);
echo $html;
// 出力:<h2>み⭐だ⭐し</h2><p>ほんぶん👣</p>

これで日記にプログラミングの話題書くのがはかどるぞ!

ドラゴンクエスト10(しろいコキン)

しぐさ・メタキン
しろいコキンもスライム探しイベント行ってきました。
さすがに慣れてきたから得点はそこそこ伸ばせました。
報酬アイテムのほうは、ァォィョッュとだいたい同じ感じで、取りたいものはあらかた取り終えて、取れるものがまだ残っている状況です。

ドラゴンクエスト10(ァォィョッュ)

スライムタワーの列
あのあと街をぶらぶらしていたらスライムタワーになってる集団がいたので、一員になってきました。

TgwsMarkとドラゴンクエスト10

TgwsMark

ほいバージョン3.0.0。
残ってた課題3つ(#8#9#10)もまとめて完了です。
課題も全部なくなったので、何か新しい機能を作る気になるまではひとまず開発終了ですね。
引用機能とか、Markdownへの変換とか、できそうなことはあるけど、今のところ必要はないので、課題も立てないでおきます。

ドラゴンクエスト10(ァォィョッュ)

旅の覇者モンジと大会係員ツムム
第6回 隠れスライムフェスティバル (2025/10/15)|目覚めし冒険者の広場
スライム見つけるやつ、やってきました。
なんか今回、角度がシビアというか、細かい角に遮蔽されて見つけてない扱いになることが多かった気がしますね。

隠れメタルスライム像庭としぐさ・ネタ「スラタワー」隠れスライムベスの像、隠れエンゼルスライム像、しぐさ・ネタ「キンスラ」
とりあえず報酬はだいたい取れたかな。
モンジに交換してもらうやつがいくつかあるけど、結構回数重ねないといけないからやるとしたら時間あるときになるかな。
残り報酬よりも、しろいコキンとミフミンで通常報酬集めるほう優先したいです。

TgwsMark

ほぼ完成と言っていいのではないだろうか!

ここらがメインとなる機能の実装。

このあたりは間違ってたところの修正。

名前、簡略化しました。
もともとHTMLへの変換専用を想定して書き始めたのですが、HTMLタグの出力を全部MarkConverterに投げて差し替え可能にした結果、MarkConverterを全部差し替えればHTML以外も出力できるように(理論的には)なりました。
だとすると名前にHtmlを付ける意味はないし、TgwsMark部分もこの名前空間内なら当たり前すぎるので省略していいってわけです。

こまごまとした変更とか。

結局これをやりたくて分離したようなものです。
やろうとしていることもできることもほ、ぼ同じで、新しいほうが高機能なんだから、古い方の実装を残す意味はないのです。
インターフェースとしては、インスタンスを意識せず簡単に使える口があるというのは大事なので、このクラス自体とtoHtml静的メソッドは残すつもりです。
他の公開メソッドは、本来内部的に使うだけだったのを深く考えずに後悔していただけだから、非推奨にして将来的に廃止してもいいかも。

TgwsMark

いっぱいやったように見えて、割と単純作業!
マークアップごとに機能を差し替え可能にして、このマークアップはこのタグを出したいみたいなことを実現できるようにします。
今のところ差し替えられるのは見出しのHeadingToHnHtmlConverterとHeadingToFixedTagHtmlConverterですね。
h1~h6タグと、それ以外を選べます。

TableOfContentsとTgwsMark

TableOfContents

コミットメッセージにも書いたけど、バージョン情報がタグとcomposer.jsonの二重管理になってややこしいので。
他のリポジトリでは既に対応済みです。

TgwsMark

インスタンス化して使えるようにする課題の実装始めました。
要はLineTypeごとにクラスを作ってそれぞれで処理させることで、クラスを差し替えて柔軟に動作を変えられるようにするという魂胆です。

いつぞややめた課題とは別方面で美しを目指すことになるんで、ちょっと長丁場になるかも。
AIにやらせるにしても、適度な分割が難しくて、細かくすればプロンプト書くよりコーディングのほうが早くなりそうだし、並列作業させればコンフリクト祭りになりそうだし、かといってまとめてやるには複雑すぎて美しの対極に向かいそうだし、ここはひとまず人力か。
ちなみに、行内コード補完程度の軽いやつならある程度やらせてます。
行内程度なら正誤も一目見てわかるし、プロンプト書かないのでほぼ確実にタイプ量削減になるし、いらなきゃ無視して手作業でコード書き続けるだけでいいし。
AIは爆速とか効率とかよりも楽するために使いたいんですよね。

それにしてもこれ、結構根本的な変更になるから、メジャーバージョン上げたほうがいいかもなァ。

課題とは関係ないけど、無意味な入力に変なタグが付かないことを確認するテストです。
カバレッジを上げることがなくてもこういうエッジケースは大事。

これはコミットじゃなくて課題。
空行をいっぱい開けることで要素間に行間を広くすることができるという、文書構造的には無意味だけど日記では使うことがある機能があったんですが、コードブロックは他の要素とは別枠でやっているので、適用されていませんでした。

TgwsMark

はい、昨日言ってたファイル名の件実装してバージョン2.1.0として公開しました。
ただ、コードブロックの中は外とは違うエスケープしたほうがよさそうだなーとか思ったので…

新たな課題立てました。

あと、いつぞや言ってたのと違う方面でコードの柔軟性高めたいなってことで、新たな課題立てました。
上記のエスケープの件も、柔軟性の類になるので、インスタンス化の課題のほうが実装順としては先になる見込みです。

美文のキャラ倉庫とアンパンマンDBとTgwsMarkとドラゴンクエスト10

美文のキャラ倉庫

限りなく没に近いキャラの設定とデザイン発掘。
ふにゃの弟という設定です。

アンパンマンDB(記事更新)

来週の放送情報。
女王様仮装してトリックオアトリートしちゃうの!?

TgwsMark

コードブロック機能実装完了!
めちゃくちゃ大変そうな気がしてたけど、コードブロック中では他の文法は一切出てこないので、ちゃんと切り分けて考えればなんてことないのでした。
と言いたいところだったけど…

ファイル名指定機能まだ作ってなかったよ!

ドラゴンクエスト10(おきがえリポちゃん)

おきがえリポちゃん ~ デビパンクシャツ ~
おきがえリポちゃん ~ デビパンクシャツ ~ (2025/10/21)|目覚めし冒険者の広場
今月の貸衣装。
言葉では言わないけどどう見てもトリックオアトリートしたそうな色合い。

おきがえリポちゃん ~ デビパンクシャツ ~
それ以外は普通の…と言いたかったけど、あえてのダメージ加工ストッキングとか、脇腹が開いてるとか、意外と大胆なところもある。

おきがえリポちゃん ~ デビパンクシャツ ~
男向けには下装備ズボン。
ワンポイントついてて女性向けよりかわいくない?
まあ、ズボンもスカートもドラクエ10の世界では男女兼用だけど。

TgwsMark

この課題、やめました。
“美しい設計”を目指し、感触を確かめるため仮の実装を行い、文法解釈スキップという“美しい設計”に真っ向から対立する概念を整合性を保ったまま美しくするのは難しいという判断に至りました。
どうせここから先やりたいのはせいぜいコードブロック機能か引用程度なので、もう最後までカオスなまま突っ走ることにしました。

せめてもの抵抗程度の美し要素。
状態管理を文字列で行うと、普通の文字列とごっちゃになってわかりにくいですからね。
無茶な全面改定を必要としない改善は続けよう。
AIに頼るにしたって、レビューという仕事は人間に残されるわけだから、なおのこと読みやすくないといけない。

で、まあ、さっき言ってたコードブロック機能を、これから開発始めるところってわけです。

アンパンマンDBとドラゴンクエスト10とTgwsMark

アンパンマンDB(記事更新)

来週の放送情報。
1700回記念ですね。
なんかエモにエモを重ねた感じ。

来週のサブタイトルに出てくる「ポエムさん」追加しました。

ドラゴンクエスト10(ァォィョッュ)

ドワチャッカの謎の飛行物体
UFO写真撮った!

TgwsMark

昨日言ってたやつ、さっそくIssue立てておきました。

で、その実装の前に、以前立ててた課題のほうを終わらせておきました。

ドラゴンクエスト10とアンパンマンDBとTgwsMark

ドラゴンクエスト10(全員)

Tカバーな水着&サニーボード
夏イベント『炎夏の海を駆け抜けろ!2』開催!  (2025/7/14 更新)|目覚めし冒険者の広場
夏イベント全員分やりました!
レース系の期間限定イベントはあまり積極的にはやっていないのですが、海のイベントは基本的に行くので、今回は行く方向で。
とりあえず全員2分10秒台は出せて、サニーボード手に入りました。

2025夏家具(ペンギンのぬいぐるみ / たゆたうクラゲの柱 / アイスクリームランプ)
家具も買いました。
でっかいペンギンかわいいね。

他の写真は以下から。水着は染色次第で化けるね。
写真置き場「2025/07/17」

アンパンマンDB(システム)

キャラ数検索の件、リリースしました。

TgwsMark

最近から、細かい技術の話を日記に書くようにしたのですが、それに使っているTgwsMark、コードブロック機能がないんですよね。
だから自前でpreタグとかcodeタグとか書いてたんですが、そういうタグは認識しないので、段落記法と衝突してしまいます。
だから、コードブロック機能も作っちゃうべきかなーとか思っています。
あと、柔軟性を高める仕組みなんかも作れたら作りたい。

TgwsMarkとQiita

TgwsMark

HTMLタグを直接使わせたくはないけどTgwsMark記法だけは使わせてもいいかななんてユースケースを想定して、課題立ててみました。
まあ、アンパンマンDBのコメント欄に使えてもいいんじゃない?って思ったからなんですけどね。

Qiita


久々に記事作成中。
ここTGWSについてです。
日々いろいろやってるから書くネタはいくらでもあるはずなんですよね。

アキタラヤメル[ポジティブ不老不死さん]とアンパンマンDBとTgwsMark

アキタラヤメル[ポジティブ不老不死さん]

サーバーが変わってPerlCGIが動かなくなって長らく放置されていましたが、復活しました!
いえ、不老不死なんで死んでないんですが、コンテンツとして復活しました!
一応今のサーバーにも別バージョンのPerlが入ってるっぽいんですが、もうほとんど覚えていない言語で今更別バージョンに合わせた大規模改修をする気力もないので、PHPで全面的に書き直しました。

アンパンマンDB(システム)

ペアリストもCSV出力対応しました。
通常のリストの表記に加え、「=」で左辺と右辺を繋いでいます。

TgwsMark

README更新しました。
使い方やら文法やらを書いています。
完全に網羅ってわけじゃないんですが、主に使う部分についてはまあまあ書けた感じです。

アンパンマンDBとTgwsMark

アンパンマンDB(記事更新)

亡くなったことに伴う更新です。

アンパンマンDB(システム)

CSV出力機能調整しました。

まず、リスト項目をHTMLからもうちょっと見やすい形式に変更しました。
管理画面での表記と同じく、改行区切りでの表記となります。
表示とリンク先が違えば>で右にリンク先表示。
本来と別の個別DBへリンクしている場合、:の左に表記。
注釈は通常ページでの見た目通り、()に囲んで表記。
まあ、見やすいとはいっても、もともと複合的なデータなので、CSVに入れるにはちょっと複雑になっています。

それと、これはCSV以前のバグだったんですが、管理人による記事更新直後に検索を行うと、更新前のデータが検索キャッシュとして保存されるバグがありました。
そのため、検索画面と、その結果を使うJSON/CSV出力では、次の更新までずっと古いデータが表示されていました。
これが今まで問題にならなかったのは、記事更新時には更新した記事そのもののキャッシュを真っ先に更新していて、最新記事だけは更新後のデータで検索キャッシュが作られていたからでした。
これがなぜCSV出力のときに問題になったのかというと、CSV出力内容の変更に伴う内部データの変更もキャッシュされており、ずっと変更前の内部データが使われていたからでした。
ということで、古いデータをキャッシュに使わないという方向でこれを修正したというわけです。

TgwsMark

具体的な作業はしてないけど、課題だけ立てときました。
貴方が作ってプルリクしてくれてもいいんですよ。

アンパンマンDBとTgwsMarkとプリンセスピーチ Showtime!

アンパンマンDB(記事更新)

レンタルDVD情報。

TgwsMark

Release 2.0.0 · mifumi323/TgwsMark
結局、リリースタグ付けてなかったのが原因でした。
よそ様のライブラリと比較して、よそ様のライブラリのほうにはcomposer.jsonにversion記載がないのにバージョン指定でインストールできていて、そこで気付きました。

私の他のライブラリも同じようにリリースタグを忘れていて、バージョンアップしたのにバージョンアップできない状態になっていたので、そちらにもリリースタグつけておきました(MifuminatorSearchPhraseParserTwitterLib)。

プリンセスピーチ Showtime!


4階のカンフー-1。
足技中心の近接攻撃の衣装です。
だからまあ、剣士に近い使い勝手だけど、結構コンボが繋がる感じ。
リーチ短めでダメージ受けやすいのと、足場が悪い中での戦いもあったりして、何度かミスになってしまいました。
一度取り逃しも発生して、2週目でキラメキストーンコンプしました。


カウガールのアクションリハーサル。
人入りの樽と爆弾入りの樽が出てきて、人入りの樽だけ投げるやつ。
これまでのアクションリハーサルと比べて、見てから対処しても充分間に合うので、死に覚えゲーみたいな部分は少なく、1回のチャレンジで最高報酬条件の45人を超えることができました。

他の写真は以下から。
プリンセスピーチ Showtime!(2024/06/02)の写真

アンパンマンDBとTgwsMarkとPackagist

アンパンマンDB(記事更新)

正式な曲目が公開されたので反映しました。
『森は枯れても2024』が新録ですね。
映画も森を舞台とした話なので、実際に使われる可能性が高そうです。

TgwsMark

名前空間とか調整して、再公開しました。
これでもうばっちりだと思ったのですが、試しに自分のプロジェクトに入れようとしたら、うまくいきませんでした。
他の人のライブラリとかと見比べても決定的に足りないものはなさそうに見えるけど…。
急ぐ用事ではないし、ちょっと後日考えてみよう。

Packagist(Mifuminator、SearchPhraseParser、TwitterLib)

他のライブラリも名前空間変更したのですが、どうにも微妙な感じです。
一応、メジャーバージョンを上げておいたので、バージョン指定で導入している人には悪影響ないとは思うのですが。

アンパンマンDBとTgwsMark

アンパンマンDB(記事更新)

来週の放送情報。
再放送ですね。
確かロールケーキちゃんの歌に他の人が一切合わせてくれず自分一人で全部歌いきる話だったかと(覚え方の偏りがひどい)。

TgwsMark

ソースコードを調整して、テストも入れて、Packagistに公開…一応したのですが、ちょっと微妙な感じ。

名前空間が「MifuminLib\TgwsMark」で、Packagistのパッケージ名が「mifuminlib/tgwsmark」で、GitHubのリポジトリ名が「mifumi323/TgwsMark」なんですよね。
スラッシュとバックスラッシュとか大文字小文字の違いは、それぞれのネーミングの制約故ですが、「MifuminLib」と「mifumi323」の違いは気持ち悪いです。
問題の前半部分だけで考えると、他のパッケージは、名前空間「MifuminLib」、パッケージ名「mifumi323」、リポジトリ名「mifumi323」でした。
他のパッケージに合わせるならパッケージ名を「mifumi323/tgwsmark」にすればよさそうですが、そもそもこの不一致の発端は、「MifuminLib」という名前空間の妙な前半部分なわけです。
この前半部分、「美文のライブラリ」の意味でつけているのですが、この部分、本来はベンダー名を表しています。
つまりこれ、名前空間的には、「美文のライブラリさんが作ったTgwsMark」という意味になります。
まあ、「PHPUnit\PHPUnit」みたいに、関連する製品群をそれぞれパッケージで提供するためにチーム名的に本人じゃない名前を付けることもありますが、MifuminLibは単に私が作っただけってやつですからね。
なので、いっそのこと全部「mifumi323」に統一しちゃおうかなとか思ってます。
その場合、他のパッケージと不一致になってしまうけど、そこんとこはどうすべきか…。

浮き沈みランチャーとTgwsMark

浮き沈みランチャー

早めに実装したいと言ってから一年が経過しました。
複製機能のほうは実装しました。
「ファイルの場所を開く」のほうが、実は今日やりたかったことの本命です。
で、昨年やりたいと言っていたもう一つ、「削除前に尋ねる · Issue #32 · mifumi323/FLaunch」が手つかずで残っています。
まあこれも、手を付ければあっという間なので、明日にでも実装して適当なタイミングでリリースするかな。

TgwsMark

この日記やアンパンマンDBで使っているMarkdown風の変換機能、オープンソース化しようと企んでいます。
特段すごい技術でもなく、取り立てて需要があるわけでもないですが、見せていい部分を一般公開して、TGWSのサイト側のプログラムの規模をちょっとでも縮小したい意図があります。
サイト内のコードはなるべくサイト独自のものだけに絞りたいというわけですね。
あと、アンパンマンDBのJSON/CSV出力でもTgwsMark記法がそのまま出てくる部分があるので、オープンソース化に伴って、マニュアルを整備したいという考えもあります。

普段この手のライブラリを作るときには「Mifumin○○」みたいな名前を付けがちなんですが、今回はTGWSから抜き出したことに意味があるので、名前に「Tgws」を入れています。
他には、「Markdawn」とか「Markqown」とか、Markdownをもじった名前も考えたのですが、単なるタイポと思われるのも癪なので、部分的に似てるけど明らかに別物とわかる名前にしました。

ちょっと手元での移行作業に時間がかかっていて、今のリポジトリにはREADMEぐらいしかありませんが、近日中に整備して、Composerで入れられるようにしたいと思っています。