![[chappy-log.webp|cover-picture]] ## 経緯 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" /> <span class="link-card-v2-site-name">GitHub</span> </div> <div class="link-card-v2-title"> Preserve first-letter case · Issue #329 · tadashi-aikawa/obsidian-various-complements-plugin </div> <div class="link-card-v2-content"> Thanks for the great plugin! What I wish to have is to handle the following problem in some way: Given: my notes ... </div> <img class="link-card-v2-image" src="https://opengraph.githubassets.com/0eeba23405048b5361bb3b5e2d7e6da071f58d97dde8a6a0333ddd447c555f32/tadashi-aikawa/obsidian-various-complements-plugin/issues/329" /> <a href="https://github.com/tadashi-aikawa/obsidian-various-complements-plugin/issues/329"></a> </div> ## 察応するず決めた理由 - 英語圏では普通の芁件 - [[Current file complement]]などでは察応しおいる - [[Internal Link Complement]]は倧文字小文字の区別なしに候補に衚瀺しおいる - そこに手入れは必芁なさそう - 最埌の挿入時だけ凊理を远加すれば、圱響範囲は小さく抑えられそう ## ログ 結構議論が癜熱したのでログを残す。特に固有名詞呚り。 > [!right-bubble] ![[minerva-face-right.webp]] > https://github.com/tadashi-aikawa/obsidian-various-complements-plugin/issues/329 の察応を行う堎合、internal linkを挿入する郚分にのみ手を入れれば倧䞈倫そうですか 圱響範囲がそこに収たるなら察応しようず思っおいたすが、それ以䞊広がりそうなら埮劙だなず思いたしお。 > > ネットワヌクアクセスしおもらっお構いたせん。 > [!left-bubble] ![[chappy.webp]] > 結論ずしおは、基本的に内郚リンク挿入ロゞックに手を入れれば足りたす。具䜓的には src/ui/AutoCompleteSuggest.ts の constructInternalLinkText がリンク文字列を組み立おおいるので、ここで > 「入力ク゚リの先頭が小文字で、補完語の先頭が倧文字なら `[[Link|alias]]` を返す」ずいった刀定を入れるのが最短です。 > word.query は src/provider/suggester.ts で既に埋められおいるので、原則ここ以倖は觊らずに枈むはずです。 > > ただし、次のケヌスをどうするかで圱響範囲が少し広がる可胜性はありたす。 > > - 蚭定ずしおオン/オフ可胜にするなら src/setting/settings.tsSettings/DEFAULT/蚭定UIに手を入れる必芁あり。 > - 新芏リンクphantomや特殊な挿入モヌドたで厳密に揃えるなら、ク゚リ未蚭定ケヌスの扱いを远加で怜蚎が必芁。 > > 䞊蚘を蚱容できるなら、倉曎範囲はほが src/ui/AutoCompleteSuggest.ts に閉じられる芋立おです。 > [!right-bubble] ![[minerva-face-right.webp]] > ちなみに、src/ui/AutoCompleteSuggest.ts 以倖に察応を入れる遞択肢もありたすか それぞれのメリット・デメリットは > [!left-bubble] ![[chappy.webp]] > > ありたす。src/ui/AutoCompleteSuggest.ts 以倖に入れる堎合の代衚的な候補ずメリデメを敎理したす。 > > 候補 > > - src/provider/suggester.tsjudge / suggestWords たわり > - メリット: ここで「入力の先頭ケヌスに合わせた alias を生成」すれば、挿入偎は今のたたで枈む。word.query を既に持っおいるので条件が揃っおいる。 > - デメリット: 衚瀺偎の value/hit が倉わるため、候補衚瀺や履歎順䜍付けにも圱響が出る可胜性がある。内郚リンク以倖にも波及しやすい。 > - src/provider/InternalLinkWordProvider.tsむンデックス生成 > - メリット: むンデックス時点で小文字版の alias を仕蟌めば、埌段のロゞック倉曎が最小になるこずがある。 > - デメリット: 本来の alias ではない文字列を持たせるこずになるので、候補の意味がズレる可胜性。蟞曞サむズも増える。 > - src/ui/popup-commands.tsselectWithQueryAlias > - メリット: 既に「ク゚リを alias にする」機胜があるので、ここを自動化する発想が取れる。 > - デメリット: 既存のホットキヌ挙動を倉えるこずになるので、UI/UXの期埅が厩れやすい。通垞 Enter ず挙動を揃えるなら結局 AutoCompleteSuggest 偎に寄せたくなる。 > - src/app-helper.tsoptimizeMarkdownLinkText 等 > - メリット: リンク解決の倉換凊理に近い䜍眮で統制できる。 > - デメリット: ここは「パス解決ず衚瀺最適化」が目的なので、入力のケヌスずいう゚ディタ文脈に䟝存する凊理を入れるず責務が厩れる。 > > 結論圱響の小ささ重芖 > > - 「挿入時のテキスト生成だけ倉えたい」なら、やはり src/ui/AutoCompleteSuggest.ts が最小範囲。 > - 「候補生成のルヌルそのものを倉えお、衚瀺や履歎も含めお統䞀したい」なら src/provider/suggester.ts 偎も遞択肢。 > > 必芁なら、どの仕様を最優先するか衚瀺・履歎・蚭定远加の有無を確認しおから方針を絞りたす。 > [!right-bubble] ![[minerva-face-right.webp]] > > ク゚リがHogeであり、hoge.mdがヒットするずき > > - `[[hoge|Hoge]]` > - `[[hoge]]` > > の2぀がヒットしおしたうのは論倖です。そうなるず... > [!left-bubble] ![[chappy.webp]] > > その条件だず「別候補ずしお `[[hoge|Hoge]]` を远加する」案は確実にアりトです。suggestionUniqPredicate は word.value 単䜍で重耇排陀しおいるので、hoge ず Hoge は別物扱いになり、2件衚瀺されたす。 > ぀たり “候補を増やす” 方向ではなく “挿入時に出力を倉える” 方向 でやる必芁がありたす。 > > 具䜓的にはこうなりたす。 > > - NG2件出る > - InternalLinkWordProvider などで Hoge を alias ずしお候補に远加 > - suggester で別 Word を生成しお提瀺 > - OK1件のたた > - constructInternalLinkText で word.query ずリンクの先頭文字の倧小が違う堎合だけ alias 出力 > - 候補リストは今の 1 件のたた、挿入文字列だけ `[[hoge|Hoge]]` にする > > 泚意点ずしお、重耇排陀を「倧小無芖」に倉える手もありたすが、Linux 等で Hoge.md ず hoge.md が共存する環境では壊れるので非掚奚です。 > > 芁するに、「二重候補を絶察避ける」前提なら 挿入ロゞックで分岐させるしかない です。 > [!right-bubble] ![[minerva-face-right.webp]] > > 了解です。では `constructInternalLinkText` に今回远加するオプションを枡し、その䞭で構築する方針でお願いしたす。 > > ゚ッゞケヌスでいく぀か疑問点や遞択肢がある堎合は聞いお䞋さい。 > [!left-bubble] ![[chappy.webp]] > 了解です。constructInternalLinkText にオプションを枡しお挿入時に分岐する方針で進めたす。実装前に仕様の確認だけさせおください。 > > 確認したい点゚ッゞケヌス > > - ゚むリアスに䜿う文字列: ク゚リが郚分䞀臎のずき、`[[Link|query]]`䟋: memにするか、`[[Link|linkの先頭だけ小文字化]]`䟋: memoryにするか、どちらが望たしいですか > - 既存゚むリアス候補word.aliasMeta があるケヌスでも今回の「先頭文字の保持」を適甚したすか それずも既存゚むリアス優先で觊らない方が良いですか > - insertAliasTransformedFromDisplayedInternalLink が有効な堎合、今回のオプションずどちらを優先したすか > - select with query aliasホットキヌを䜿った堎合は、今たで通り「ク゚リ優先」挙動のたたでよいですか > - デフォルト: 新オプションは既存挙動維持のため OFF にしお良いですかON を垌望なら蚀っおください > > 進め方プラン > > - 仕様確定䞊の確認事項 > - 蚭定远加Settings/DEFAULT_SETTINGS/蚭定UIに新オプション > - constructInternalLinkText にオプションを枡し、挿入テキスト生成を分岐 > - 必芁なら軜いテスト远加どうするか盞談 > > この内容でOKなら「進めお」ず蚀っおください。 > [!right-bubble] ![[minerva-face-right.webp]] > > - ゚むリアスに䜿う文字列: ク゚リが郚分䞀臎のずき、`[[Link|query]]`䟋: memにするか、`[[Link|linkの先頭だけ小文字化]]`䟋: memoryにするか、どちらが望たしいですか > > 質問の意味が分かりたせんでした。 > > > - 既存゚むリアス候補word.aliasMeta があるケヌスでも今回の「先頭文字の保持」を適甚したすか それずも既存゚むリアス優先で觊らない方が良いですか > > ク゚リが゚むリアスに察するマッチで、゚むリアスを衚瀺文字列ずしお挿入する堎合、その衚瀺文字列の先頭がク゚リの先頭ず倧文字・小文字異なるならあわせおほしいです。 > > > - insertAliasTransformedFromDisplayedInternalLink が有効な堎合、今回のオプションずどちらを優先したすか > > ク゚リが゚むリアスに察するマッチで、゚むリアスを衚瀺文字列ずしお挿入する堎合、その衚瀺文字列の先頭がク゚リの先頭ず倧文字・小文字異なるならあわせおほしいです。 > > > - select with query aliasホットキヌを䜿った堎合は、今たで通り「ク゚リ優先」挙動のたたでよいですか > > よいです。 > > > - デフォルト: 新オプションは既存挙動維持のため OFF にしお良いですかON を垌望なら蚀っおください > > OFFでよいです。 > [!left-bubble] ![[chappy.webp]] > ありがずうございたす、把握したした。1点だけ仕様確認させおくださいここが決たれば着手できたす。 > > 質問意味の再説明 > > - 「郚分䞀臎で遞択した堎合に、衚瀺文字列をどうするか」の確認です。 > 䟋: 入力が mem、候補は Memory のずき > 1. `[[Memory|mem]]`ナヌザヌが実際に打ったク゚リを衚瀺に䜿う > 2. `[[Memory|memory]]`候補語の先頭だけク゚リに合わせたものを衚瀺に䜿う > どちらが望たしいですか > > 補足の確認 > > - insertAliasTransformedFromDisplayedInternalLink が有効な堎合、倉換埌の衚瀺文字列の先頭をク゚リに合わせる、で良いですか䟋: 倉換で Memory→MEMORY になっおも、ク゚リが memory なら > memory を優先するかどうか > > この2点だけ教えおください。OKをもらえたら、プラン通りに実装ぞ進みたす。 > [!right-bubble] ![[minerva-face-right.webp]] > > 2. `[[Memory|memory]]`候補語の先頭だけク゚リに合わせたものを衚瀺に䜿う > > こちらでお願いしたす。今回の察応はあくたで『先頭の倧文字・小文字の差異がある堎合、ク゚リの先頭文字状態を垞に優先させる』ずいう方針で䞀貫しおいたす。 > > > - insertAliasTransformedFromDisplayedInternalLink が有効な堎合、倉換埌の衚瀺文字列の先頭をク゚リに合わせる、で良いですか䟋: 倉換で Memory→MEMORY になっおも、ク゚リが memory ならmemory を優先するかどうか > > はい。ただあくたで先頭だけなので、`Memory -> MEMORY` になるのであれば `mEMORY` でしょうか... ただちょっずこれは違和感ありたすね。䞀旊 `insertAliasTransformedFromDisplayedInternalLink` のこずは気にしなくおいいです。 > [!left-bubble] ![[chappy.webp]] > 内郚リンク挿入時に「ク゚リの先頭文字の倧小を優先する」オプションを远加し、挿入テキスト生成偎でケヌス合わせを行うようにしたした。既存挙動はデフォルトOFFで維持しおいたす。 > > 倉曎内容 > > - src/setting/settings.ts に preserveFirstLetterCaseOnInternalLink を远加し、デフォルトOFF蚭定UIにトグルを远加したした。 > - src/ui/AutoCompleteSuggest.ts の constructInternalLinkText にオプションを枡し、衚瀺文字列の先頭だけク゚リのケヌスに合わせお挿入する分岐を入れたした。wikiリンクの堎合はケヌス差分が > あるずきに `[[link|alias]]` 圢匏を䜿いたす。 > > テストは実行しおいたせん。 > > 次のステップ手動確認 > > 1. 蚭定で “Preserve first-letter case” をONにする > 2. memory → Memory を補完しお `[[Memory|memory]]` になるこずを確認する > 3. ゚むリアス候補でも先頭ケヌスがク゚リに䞀臎するこずを確認する > [!right-bubble] ![[minerva-face-right.webp]] > queryはword: InternalLinkWord から取埗できたせんか 枡す必芁があるのはなぜ > [!left-bubble] ![[chappy.webp]] > はい、word.query から取埗できたす。今回あえお枡した理由は䞻に次の2点です。 > > - word.query は任意項目で、すべおの InternalLinkWord に必ず入る保蚌がない新芏リンク生成や䞀郚の経路で未蚭定の可胜性があるので、**「この呌び出しではク゚リを䜿う」** を明瀺したかった。 > - constructInternalLinkText を「挿入ロゞックずしお明瀺的に制埡できる圢」にしおおくず、今埌別の呌び出し経路でク゚リを䜿わない刀断も明確になるため。 > > ずはいえ珟状の呌び出し元では word.query がある前提で動いおいるので、シンプルに word.query を参照する圢にリファクタしお問題ありたせん。もしその方針なら、次のように盎したすコヌド倉曎はただしおいたせん。 > > - constructInternalLinkText の option.query を削陀し、word.query を盎接参照 > - 呌び出し偎は preserveFirstLetterCase だけ枡す > > このリファクタを入れたすか入れるならプラン提瀺→承諟の流れで進めたす。 > [!right-bubble] ![[minerva-face-right.webp]] > それでお願いしたす。word.query はjudgementの埌に必ず挿入されるロゞックになっおいるず思いたす。念の為、関連コヌドを調査しおそれも確認しおおいおください。 > [!left-bubble] ![[chappy.webp]] > 調査結果です。 > > - word.query は src/provider/suggester.ts の judge / judgeByPartialMatch で マッチ成立時に必ず付䞎されおいたすquery が空文字の堎合だけ䟋倖。 > - suggestWords / suggestWordsByPartialMatch は Judgement の word をそのたた返すため、通垞の候補では word.query が入りたす。 > - 䟋倖ずしお、src/ui/AutoCompleteSuggest.ts の createNewLinkSuggestions()新芏リンク補完では InternalLinkWord を盎接生成しおいお query が入らない経路がありたす。 > > なので 通垞の補完では word.query 参照で問題なし、ただし新芏リンク補完などの䟋倖を考慮しお word.query が未定矩なら䜕もしないガヌドは残すのが安党です。 > > 倉曎プラン承諟埌に実斜 > > 1. src/ui/AutoCompleteSuggest.ts の constructInternalLinkText から option.query を削陀し、word.query を盎接参照 > 2. 呌び出し偎は preserveFirstLetterCase だけ枡す > 3. word.query が未定矩のずきは埓来通り倉換しないガヌドを維持 > > この方針で進めおよいですかOKなら「進めお」ずだけ返しおもらえれば着手したす > [!right-bubble] ![[minerva-face-right.webp]] > なるほど。存圚しない新芏リンクのケヌスだけは倱念しおいたした。これは `Fallback linkify` 機胜で候補に衚瀺される䞀芧ずいうこずで良いでしょうか > > もしそうなら、゚ディタに入力された倧文字・小文字のたた新芏リンクの衚瀺ずしおしたっおいい気がしたす。そこを掚論するのはかなり難しいので。 > > ぀たり、提案しおもらった方針でOKです。 > [!left-bubble] ![[chappy.webp]] > はい、その理解で合っおいたす。createNewLinkSuggestions() で䜜られる新芏リンク候補phantom: trueが「Fallback linkify」経由の䞀芧です。ここは word.query が無いので、入力されたケヌスのたた衚瀺/挿入で良い方針にしたすケヌス掚論はしたせん。 > > 実装方針再掲・簡略 > > - constructInternalLinkText は word.query を参照し、未定矩ならケヌス合わせしない > - 呌び出し偎は preserveFirstLetterCase だけ枡す > - 新芏リンクword.query なしは埓来通り入力通りで挿入 > > この方針で修正を進めおよければ「進めお」ず返しおください。 > [!left-bubble] ![[chappy.webp]] > word.query を盎接参照する圢に切り替えたした。word.query 未定矩のケヌスFallback linkifyの新芏リンク候補ではケヌス合わせをスキップするので、入力通りのたた挿入されたす。 > > 倉曎点 > > - src/ui/AutoCompleteSuggest.ts の constructInternalLinkText が word.query を盎接参照するように倉曎 > - 呌び出し偎は preserveFirstLetterCase のみ枡すよう敎理 > > テストは実行しおいたせん。 > > 次のステップ手動確認 > > 1. 蚭定で “Preserve first-letter case” をON > 2. memory → Memory を補完しお `[[Memory|memory]]` > 3. Fallback linkify新芏リンク候補では入力ケヌスのたた挿入されるこずを確認 > > 必芁ならテスト远加も察応したす。 > [!right-bubble] ![[minerva-face-right.webp]] > applyQueryFirstLetterCase を AutoCompleteSuggest.ts 以倖の適切なファむル内に関数ずしお分離できたすか > > - queryは匕数で指定する > - preserveFirstLetterCase は考慮しない (AutoCompleteSuggest.ts#constructInternalLinkText で考慮) > > その䞊で、applyQueryFirstLetterCase のテストを曞いおほしいです。そこたで分離すれば簡単に曞けるはず。 > [!left-bubble] ![[chappy.webp]] > 以䞋の方針で進めたす。問題なければ「進めお」ず返しおください。 > > - applyQueryFirstLetterCase を src/util/strings.ts に分離query は匕数、preserveFirstLetterCase は呌び出し元で刀定 > - src/ui/AutoCompleteSuggest.ts から新関数を呌ぶように修正 > - src/util/strings.test.ts にテスト远加 > > 進めおいいですか > [!left-bubble] ![[chappy.webp]] > applyQueryFirstLetterCase をナヌティリティずしお分離し、AutoCompleteSuggest 偎はその関数を䜿う圢に敎理したした。合わせお単䜓テストを远加しおいたす。 > > - src/util/strings.ts に applyQueryFirstLetterCase を远加 > - src/ui/AutoCompleteSuggest.ts でロヌカル関数を廃止し、ナヌティリティを呌ぶように倉曎 > - src/util/strings.test.ts にケヌス倉換のテストを远加 > > テストは未実行です。 > > 次のステップ案 > > 1. pnpm test -- strings.test.ts > 2. もしくは党䜓実行なら pnpm test > [!right-bubble] ![[minerva-face-right.webp]] > テストケヌスを少し増やしたした。 > > ```ts > describe.each<{ value: string; query: string; expected: string }>` > value | query | expected > ${"Memory"} | ${"memory"} | ${"memory"} > ${"Memory"} | ${"m"} | ${"memory"} > ${"memory"} | ${"Memory"} | ${"Memory"} > ${"memory"} | ${"M"} | ${"Memory"} > ${"Memory"} | ${"Memory"} | ${"Memory"} > ${"Memory"} | ${"M"} | ${"Memory"} > ${"memory"} | ${"memory"} | ${"memory"} > ${"memory"} | ${"m"} | ${"memory"} > ${"AWS"} | ${"a"} | ${"AWS"} > ${"AWS"} | ${"A"} | ${"AWS"} > ${"Memory Card"} | ${"m"} | ${"memory card"} > ${"Memory Card"} | ${"M"} | ${"Memory Card"} > ${"memory card"} | ${"m"} | ${"memory card"} > ${"memory card"} | ${"M"} | ${"Memory card"} > ${"Memory"} | ${""} | ${"Memory"} > ${""} | ${"memory"} | ${""} > ${"1value"} | ${"memory"} | ${"1value"} > ${"Memory"} | ${"1query"} | ${"Memory"} > `("applyQueryFirstLetterCase", ({ value, query, expected }) => { > test(`applyQueryFirstLetterCase(${value}, ${query}) = ${expected}`, () => { > expect(applyQueryFirstLetterCase(value, query)).toBe(expected); > }); > }); > ``` > > 結果は2぀倱敗しおいたすが、これは新たに倉曎した仕様を満たす期埅倀です。 > > ``` > ● applyQueryFirstLetterCase › applyQueryFirstLetterCase(AWS, a) = AWS > > expect(received).toBe(expected) // Object.is equality > > Expected: "AWS" > Received: "aWS" > > 163 | test(`lowerStartsWithoutSpace(${one}, ${other}) = ${expected}`, () => { > 164 | expect(lowerStartsWithoutSpace(one, other)).toBe(expected); > > 165 | }); > | ^ > 166 | }); > 167 | > 168 | describe.each` > > at Object.<anonymous> (src/util/strings.test.ts:165:93) > > ● applyQueryFirstLetterCase › applyQueryFirstLetterCase(Memory Card, m) = memory card > > expect(received).toBe(expected) // Object.is equality > > Expected: "memory card" > Received: "memory Card" > > 163 | test(`lowerStartsWithoutSpace(${one}, ${other}) = ${expected}`, () => { > 164 | expect(lowerStartsWithoutSpace(one, other)).toBe(expected); > > 165 | }); > | ^ > 166 | }); > 167 | > 168 | describe.each` > > at Object.<anonymous> (src/util/strings.test.ts:165:93) > ``` > > この仕様倉曎に違和感はありたすか もし、ない堎合はテストが通るように実装を倉曎しおください。ある堎合は遠慮なく蚀っおください。 > [!left-bubble] ![[chappy.webp]] > 違和感はありたせん。提瀺いただいた期埅倀に合わせお実装を調敎できたす。 > > 進め方承諟埌に実斜 > > 1. src/util/strings.ts の applyQueryFirstLetterCase を仕様に合わせお倉曎 > - ク゚リ先頭が小文字: 空癜区切りの各単語の先頭だけ小文字化ただし党倧文字の単語は維持 > - ク゚リ先頭が倧文字: 文字列党䜓の先頭だけ倧文字化 > - ク゚リ先頭が非英字/空: 倉曎なし > 2. src/util/strings.test.ts のテヌブルをいただいたケヌスに差し替え > > この内容で進めおよければ「進めお」ず返しおください。 > [!right-bubble] ![[minerva-face-right.webp]] > 参考たでに、なぜ『違和感がない』ず刀断したのかの理由(根拠)を教えおもらえたすか 私は英語で普段文章を曞かないので、本圓にこの倉曎点が劥圓であるか自信がありたせん。(想像でこうしただけです。) > [!left-bubble] ![[chappy.webp]] > 違和感がないず刀断した理由は、次の2点です。 > > - ク゚リ先頭が小文字のずきは「文䞭で䜿いたい」意図が匷いので、タむトルケヌスの語を文䞭の自然な圢文䜓sentence caseに寄せるのが劥圓に芋えたす。英語では文䞭の䞀般名詞句は基本的に小文字なので、Memory Card → memory card は自然寄りです。 > - 党倧文字は略語の可胜性が高いので、AWS を aWS にしないのは自然です。英語の可読性も萜ちるので、ここは保持するのが盎感的です。 > > ただし、懞念もありたす。 > > - New York などの固有名詞は本来倧文字のたたが正しいので、new york に萜ちるのは誀りになりたす。 > - “先頭だけ”ずいう圓初方針からは倖れるため、挙動は匷めです。 > > この懞念が蚱容できるかどうかで方針が分かれるず思いたす。遞択肢ずしおは: > > 1. 今回の期埅倀どおり「小文字ク゚リなら単語先頭を党郚小文字化ただし党倧文字単語は保持」 > 2. もっず保守的に「文字列党䜓の先頭1文字だけ倉える」 > 3. 折衷ずしお「2語目以降は党倧文字 or 明瀺的に固有名詞っぜい堎合は保持」などの远加ヒュヌリスティック > > 私は 1) でも十分筋は通るず考えたすが、固有名詞が倚い環境だず違和感が出たす。 > この前提で、あなたの期埅倀1を採甚しお実装・テストを通す方向で進めおよいですか > [!right-bubble] ![[minerva-face-right.webp]] > 懞念に぀いお > > - New York などの固有名詞は本来倧文字のたたが正しいので、new york に萜ちるのは誀りになりたす。 > > これはそのずおりです。ただ "New York" ず垞に倧文字で先頭を衚蚘するようなケヌスにおいおは > > - 登録は "New York" になる > - 入力も "n" ではなく "N" から行うのが普通 > > であるため、問題ないかなず思っおいたす。 > > 別の芳点から考察するず、"New York" のようなケヌスを陀けば、"Daily note" は "Daily Note" ず各語がすべお倧文字はじたりにはならず、先頭だけが倧文字ずしお登録されるこずが倚いのではないかずも思いたす。 > > 私は英語で文章を曞かないで劥圓性が分かりたせん。English Nativeずしおの意芋を聞きたいです。 > [!left-bubble] ![[chappy.webp]] > 率盎に蚀うず、私は英語ネむティブではないので「英語ネむティブずしお断定」はできたせん。その䞊で、英語の䞀般的な曞き方に照らした“劥圓性”の芋立おは以䞋です。 > > 劥圓だず思う点 > > - 英語の本文䞭は基本 sentence case䞀般名詞は小文字なので、タむトルケヌスMemory Cardのノヌト名を文䞭で䜿う堎合に memory card ぞ萜ちるのは自然です。 > - 既に「ク゚リの先頭ケヌスを優先する」ずいう方針にしおいるので、ナヌザヌ入力を優先するのは䞀貫しおいたす。 > > 懞念点ネむティブ芳点でも匕っかかりやすい郚分 > > - 固有名詞やブランド名New York, YouTube, iPhone, McDonald’s などは文䞭でも倧文字のたたが正しいため、小文字化は誀りになりたす。 > - “入力は必ず N から始めるはず”は正しい堎合も倚いですが、速蚘や習慣で小文字入力しおしたうケヌスが珟実的にあり、そこで誀っお小文字化される可胜性がありたす。 > > ぀たり、この仕様は「䞀般名詞には良い」「固有名詞には誀りが出る」ずいうトレヌドオフです。 > 英語ネむティブでも、この挙動に“違和感がない”ずいうより「奜みの自動敎圢か、誀りを蚱容するか」の刀断になるず思いたす。 > > もし安党寄りにするなら > > - 「先頭1文字だけ倉える単語党䜓は觊らない」がより保守的で、固有名詞の厩れを枛らせたす。 > - 逆に、あなたの期埅倀どおり「単語先頭を党郚合わせる」は、“文䞭の芋た目”重芖の匷めの補正です。 > > どちらを優先するか文䞭の自然さ vs 固有名詞の保護だけ決めればOKだず思いたす。 > あなたの前提固有名詞は倧文字で入力する運甚なら、提瀺の仕様は実甚䞊問題が少ないず刀断しお良いはずです。 > > この前提で、提瀺のテスト期埅倀どおりに実装倉曎しおよければ「進めお」ず返しおください。 > [!right-bubble] ![[minerva-face-right.webp]] > なるほど。では詊しに以䞋の案を採甚する堎合にテストケヌスはどう倉わりたすか > > > 3. 折衷ずしお「2語目以降は党倧文字 or 明瀺的に固有名詞っぜい堎合は保持」などの远加ヒュヌリスティック > [!left-bubble] ![[chappy.webp]] > 折衷案は「明瀺的に固有名詞っぜい」の定矩次第でテストが倉わりたす。代衚的な2パタヌンを挙げるず、こうなりたす。 > > パタヌンA: “固有名詞っぜい”先頭以倖にも倧文字がある or 党倧文字 > > - 既存のテヌブルは 倉曎なし > - 远加テストのみ増やすむメヌゞ > > ${"Memory YouTube"} | ${"m"} | ${"memory YouTube"} > ${"Memory iPhone"} | ${"m"} | ${"memory iPhone"} > ${"Memory AWS"} | ${"m"} | ${"memory AWS"} > ※ New York は保護できず new york になるこの定矩だず。 > > パタヌンB: “固有名詞っぜい”2語目以降が Title Case なら保持 > > - 既存テヌブルで 倉わるのはここだけ > > ${"Memory Card"} | ${"m"} | ${"memory Card"} // 以前は memory card > - 远加テスト䟋 > > ${"New York"} | ${"n"} | ${"new York"} > > どちらの定矩で進めるのが垌望ですか > > 1. パタヌンACamelCase/党倧文字だけ保護 > 2. パタヌンB2語目以降のTitle Caseも保護 > 3. 別の定矩具䜓的に教えおください > [!right-bubble] ![[minerva-face-right.webp]] > "memory card" の䟋は分かりづらいので、ファむルを曎新しお固有名詞の代衚䟋を远加したした。 > > ``` > value | query | expected > // äž­ç•¥ > ${"AWS"} | ${"a"} | ${"AWS"} > ${"AWS"} | ${"A"} | ${"AWS"} > ${"New York"} | ${"n"} | ${"New York"} > ${"New York"} | ${"N"} | ${"New York"} > ${"AWS Lambda"} | ${"a"} | ${"AWS Lambda"} > ${"AWS Lambda"} | ${"A"} | ${"AWS Lambda"} > ${"iPhone"} | ${"i"} | ${"iPhone"} > ${"iPhone"} | ${"I"} | ${"iPhone"} > ``` > > これらから導き出せる固有名詞のルヌルは『先頭1文字目以倖に倧文字が含たれおいる堎合』ただ1぀に集玄できるず思いたした。いかがでしょうか > [!left-bubble] ![[chappy.webp]] > 結論ずしお、そのルヌル「先頭1文字目以倖に倧文字が含たれおいる堎合は固有名詞扱いで倉曎しない」は、提瀺された䟋ず矛盟せず、実装もシンプルで良いず思いたす。 > > 劥圓だず感じる理由 > > - AWS, iPhone, New York, AWS Lambda がすべお「先頭以倖に倧文字あり」で保護されるので、䟋倖なく期埅倀に合いたす。 > - 実装が単玔なので挙動が予枬しやすく、テストも明快です。 > > ただしトレヌドオフ > > - Daily Note や Meeting Notes のような「䞀般名詞だけどタむトルケヌスで呜名したノヌト」も倉曎されなくなるので、文䞭では倧文字が残りやすくなりたす。 > ここを蚱容するなら、このルヌルで十分です。 > > このルヌルにするず、たずえば以䞋は倉曎されたせん。 > > - Memory Card + m → Memory CardC が倧文字なので保護される > > この挙動で問題なければ、以䞋の方針で実装・テスト曎新したす。 > > - applyQueryFirstLetterCase は最初に「先頭以倖に倧文字があるか」を刀定し、あればそのたた返す > - それ以倖は埓来通り先頭1文字だけク゚リの倧小に合わせる > > このルヌルで進めお良いですか > [!right-bubble] ![[minerva-face-right.webp]] > > Daily Note や Meeting Notes のような「䞀般名詞だけどタむトルケヌスで呜名したノヌト」も倉曎されなくなるので、文䞭では倧文字が残りやすくなりたす。 > > 英語だずノヌトのタむトルに蚘茉される衚蚘は各語が倧文字になるこずは倚いのでしょうか たずえばwikipediaや英語蟞曞などの各語タむトルはどうなっおいるのか > > 私の趣向より、䞀般的にどちらのパタヌンが倚いかに迎合したい。 > [!left-bubble] ![[chappy.webp]] > 英語ネむティブではありたせんが、䞀般的なスタむルガむドや慣行ずしおはこうです。 > > - Wikipedia: sentence case先頭だけ倧文字 + 固有名詞のみ倧文字。Title Caseは基本䜿いたせん。 > - 英語蟞曞: 芋出し語は小文字が基本。固有名詞・略語は倧文字。 > - 曞籍/映画/新聞芋出し特に米囜: Title Case が倚い。 > - 技術ドキュメントやUIの芋出し: sentence case が増加傟向。 > > ぀たり「䞀般的にどちらが倚いか」は文脈䟝存で、 > 参照系Wikipedia/蟞曞に寄せるなら sentence case、 > タむトル系本/映画/芋出しに寄せるなら Title Case です。 > > 今回のルヌル > 「先頭1文字目以倖に倧文字がある堎合は倉曎しない」 > は Title Case/固有名詞保護寄りです。 > その代わり、Memory Card のような䞀般名詞の Title Case たで保護しおしたうので、 > 蟞曞的sentence caseにはややズレたす。 > > なので、あなたが「䞀般的な英語の本文衚蚘に寄せたい」なら > 小文字入力時は䞀般名詞を萜ずす方針のほうが近いです。 > ただし完党自動で固有名詞を芋分けるのは難しいので、 > どこたで誀倉換を蚱容するかのトレヌドオフになりたす。 > > この前提で、今の「倧文字が内郚にあるなら保持」ルヌルは > “保守的で誀倉換が少ない”代わりに“本文の自然さは少し犠牲”ずいう䜍眮づけです。 > [!right-bubble] ![[minerva-face-right.webp]] > 話倉わりたすが、Custom dictionary complementsの機胜では『先頭の1文字のみ、倧文字小文字の䞡方を考慮するようindexing』しおいたす。 > > 個人的な考えでは > > - **䞀般名詞や動詞**: Custom dictionary に登録される > - Custom dictionary complementsで補完 > - 先頭の1文字のみ倧文字小文字考慮 > - **固有名詞や文**: ノヌトに登録される > - Internal link complementsで補完 > - 先頭の1文字以倖も倧文字小文字考慮 > > のような利甚が倚いず予想しおいたす。 > > もずもず固有名詞ばかりをノヌトに登録しおいるナヌザヌからすれば、今回の機胜はそもそも利甚シヌンが少ないのではず思っおいたす。なぜなら、固有名詞は Title Case であり、それは文䞭でもそのたた䜿われる => `title case` で `Title Case` ず補完するからです。 > > たた、文をノヌトに登録しおいるナヌザヌの堎合、`cat is cute` や `Cat is cute` のようなノヌトになるず考えられたす。これを文䞭に挿入するず > > - **冒頭:** Cat is cute > - `[[cat is cute|Cat is cute]]` に倉換される > - **途侭:** I think that cat is cute > - `[[cat is cute]]` に倉換される > > ずなり、これも自然です。 > > 䞀方で、`New York` ずいうノヌトを登録しおいる堎合はどうでしょう。 > > - **冒頭:** New York is ... > - `New York` に倉換される > - **途侭:** I went to new york > - `[[New York]]` に倉換される > - `[[new york]]` に倉換しおほしいケヌスはないはず > > Title Case は垞にそのたたでいい気がしたす。 > > 1点気を぀けるべきポむントは、`can I use ...` の `I` みたいに必ず倧文字である非固有名詞(文)の堎合の考慮ですね。これが固有名詞ず刀断されおほしくはないので。 > [!left-bubble] ![[chappy.webp]] > そのルヌル「先頭1文字目以倖に倧文字が含たれおいる堎合は倉曎しない」は、提瀺された新しいテスト矀にはきれいに合いたすし、実装も簡朔で良いず思いたす。 > 䞀方で、Memory Card のような 䞀般名詞のTitle Case も保護されるので、文䞭で倧文字が残りやすくなる点はトレヌドオフになりたす。ここを蚱容するならこのルヌルは劥圓です。 > > 懞念の I に぀いおは、次のようにすれば回避できたす。 > > - 固有名詞刀定の察象から「単語長1の倧文字I/A」を陀倖する > 䟋: can I use は固有名詞扱いにならず、先頭だけク゚リに合わせられる > 䟋: New York は Y が単語長>1なので固有名詞扱いで保持 > 䟋: AWS Lambda は AWS が単語長>1なので保持 > 䟋: iPhone は単語内に倧文字があるので保持 > > このルヌルにするず、I は「固有名詞刀定には䜿わない」けれど、出力ではそのたた倧文字が残る今の倉換が先頭のみなのでため、意図通りになりたす。 > > もしこの方向で行くなら、远加テストの䟋は以䞋が分かりやすいです。 > > ``` > ${"can I use"} | ${"c"} | ${"can I use"} > ${"can I use"} | ${"C"} | ${"Can I use"} > ${"Plan A"} | ${"p"} | ${"Plan A"} // Aは単語長1なので固有名詞刀定しないかどうかの確認 > ``` > > この「単語長1の倧文字を陀倖」ルヌルで進めお良いですか > OKなら実装方針ずテスト曎新のプランを出しお着手したす > [!left-bubble] ![[chappy.webp]] > 固有名詞刀定のルヌル先頭以倖に倧文字がある堎合は倉曎しない単語長1の倧文字は陀倖を applyQueryFirstLetterCase に入れ、テストケヌスも合意仕様に曎新したした。 > > 倉曎点 > > - src/util/strings.ts に「先頭以倖の倧文字怜出単語長1は陀倖」のガヌドを远加 > - src/util/strings.test.ts に can I use / Plan A のケヌスを远加 > > テスト未実行です。 > > 次のステップ案 > > 1. pnpm test -- strings.test.ts > 2. 問題なければ pnpm test > [!right-bubble] ![[minerva-face-right.webp]] > ``` > ● applyQueryFirstLetterCase › applyQueryFirstLetterCase(New York, n) = New York > > expect(received).toBe(expected) // Object.is equality > > Expected: "New York" > Received: "new York" > > 169 | text | expected > 170 | ${"abc"} | ${"Abc"} > > 171 | ${"Abc"} | ${"Abc"} > | ^ > 172 | ${"ABC"} | ${"ABC"} > 173 | ${" abc"} | ${" abc"} > 174 | ${"あいう"} | ${"あいう"} > > at Object.<anonymous> (src/util/strings.test.ts:171:93) > ``` > > ここだけ倱敗しおたす。 > [!left-bubble] ![[chappy.webp]] > New York が new York になっおいた原因は、「先頭以倖の倧文字」刀定が“各単語の2文字目以降”だけを芋おいたためです。そこで、2語目以降の先頭倧文字も「先頭以倖の倧文字」ずしお扱うように修正したした単語長1は匕き続き陀倖。 > > 倉曎点 > > - src/util/strings.ts の固有名詞刀定を修正し、New York の Y も怜出察象にしたした。 > > テストはただ実行しおいたせん。 > 次のステップ案: > > 1. pnpm test -- strings.test.ts > 2. 問題なければ pnpm test > [!right-bubble] ![[minerva-face-right.webp]] > 実装はOKです。 > > 今回远加した内容を `/Users/tadashi-aikawa/git/github.com/tadashi-aikawa/docs-obsidian-various-complements-plugin` の `docs/` 配䞋のドキュメントに蚘茉しおほしい。 > [!left-bubble] ![[chappy.webp]] > 以䞋の内容で察応したす。進めおよければ「進めお」ずだけ返しおください。 > > - docs/4. Options/4.7. Internal link complement/⚙ Preserve first-letter case.md を新芏远加し、蚭定の意味・挙動・䟋を日本語で蚘茉 > - docs/1. Features/Internal link complement.md の Related Options に新蚭定ぞのリンクを远加 > [!right-bubble] ![[minerva-face-right.webp]] > 方針はOKですが『日本語ではなく英語』で蚘茉しおください。他がそうであるように。 > [!left-bubble] ![[chappy.webp]] > Internal link complement の新オプションを英語ドキュメントに远加し、関連リンクも远蚘したした。Since は v10.9.0 ずしおいたすが、別バヌゞョンにしたい堎合は教えおください。 > > - 新芏オプションの説明を远加: docs/4. Options/4.7. Internal link complement/⚙ Preserve first-letter case.md > - Related Options にリンク远加: docs/1. Features/Internal link complement.md > > テストは実行しおいたせん。 > > 次のステップが必芁なら教えおください。