「単語の最初の文字を大文字に変換」機能について

  1. はじめまして。いつもCDのタグを編集するのに便利に使わせていただいています。
    既出の話でしたら申し訳ないのですが、「単語の最初の文字を大文字に変換」を
    使った際、「'」が入るとその次はまた大文字とされてしまうのは仕様でしょうか?

    例)don't rock'n'roll
      が
      Don'T Rock'N'Roll となります。

    'n'は人によりどう処理してほしいか異なりそうで若干ややこしいかもですが、
    don'tやwon'tは頻出する単語なので、Don'tやWon'tとなったほうがありがたかったりします。
    仕様ということでしたら簡単にマクロでも設定して戻すようにしようと思いますが、いちおうのご報告です。

     |  kikurage  |  返信
  2. はじめまして、なんだかとてもニッチな使い方ですが、Mery をご愛用くださりありがとうございます。
    ご報告いただいた件、確認いたしました。

    > 例)don't rock'n'roll

    Rock'N'Roll はたまたまこれで OK な感じですが Don'T はいただけませんね…
    仕様というわけではなく、単純に ' を含め、記号全般を単語の切れ目と認識しているためですね。シングルクォートは引用符としても使われたりしますし、どういう対応をすればよいのか難しい部分ではありますね。

    > 仕様ということでしたら簡単にマクロでも設定して戻すようにしようと思いますが、いちおうのご報告です。

    うまく対応できるか考えてみますが、マクロでご対応できるのであればそちらのほうが早いかもしれません。

     |  Kuro  |  返信
  3. お返事ありがとうございます。
    いただけない、と言っていただいたので報告させていただいた甲斐がありました。

    いつのころからか忘れましたが習慣で、freedbをあまり信用せずジャケットやジャケット画像を見ながら
    再確認、および大文字小文字もすべてジャケットに合わせる、なんてことをしてまして
    この機能をよく使わせていただいています。

    自分用には一度処理をかけてから、適当な頻出単語だけ個別に置換し直すだけだと思いますが、
    万遍なく可能性を考えると難しいかもしれませんね。
    余計な仕事を増やしてしまったかもしれませんが、これからも開発を頑張っていただけると嬉しいです。
    それでは。

     |  kikurage  |  返信
  4. 一部の文字種に限定すれば JSctipt マクロでもなんとかなりますが、「単語の最初の文字を大文字に変換」の仕様を完全再現しようとするとキビシイですね。
    とりあえず半角/全角英数限定のサンプルを作ってみましたので参考までに。

    //■単語(英数字)の語頭のみ大文字に
    with (Document.Selection) {
      var acp = GetActivePos(), anp = GetAnchorPos(); //選択範囲を記憶
      Text = Text.replace(/(?![''’])[''’0-9A-Za-z0-9A-Za-z]+/g,function(s){
        return s.slice(0,1).toLocaleUpperCase()+s.slice(1).toLocaleLowerCase()});
      SetActivePos(acp); SetAnchorPos(anp); //選択範囲を復元
    }

    ◆例
    don't/rock'n'roll/'cause/'that's right'/don't
     ↓
    (don't)/(rock'n'roll)/'(cause)/'(that's) (right')/(don't) ※(マッチ範囲)
     ↓
    Don't/Rock'n'roll/'Cause/'That's Right'/Don't

    [''’単語構成文字]+ でアポストロフィーを単語構成文字に含めつつ、
    (?![''’]) でアポストロフィーが頭文字にくるのを回避しています。

    ※否定先読み (?!...) を使わない/使えない場合は、下記で代用。
    [単語構成文字][''’単語構成文字]*

    ◆「単語の最初の文字を大文字に変換」との相違点
    あaaa → あAaa
    ※英数字とアポストロフィー以外は単語区切りになるため大文字化される。
    äaaa → äAaa
    ※上記の理由でウムラウトなどには対応していない。
    a → A
    ※選択範囲が1文字だけでも大文字化される。

    「単語の最初の文字を大文字に変換」では単語構成文字に多種多様な文字(ラテン補助文字・ギリシャ文字・キリル文字・ローマ数字・アルメニア文字など諸言語文字・ひらがな・カタカナ・漢字・囲み文字・組み文字 etc...)が含まれているので、完全再現はちょっと諦めました……。
    ECMAScript 仕様の正規表現は \p{L} などが使えないので愚直に文字集合を列挙するしかないのも痛い所です。
    Mery では単語構成文字や単語区切りはどのように定義されているのでしょう?

    > CDのタグを編集
    利用風景がちょっと想像できてないので的外れかもれませんが……「CDのタグ」がMP3やAACなどのタグを指しているのでしたら、MP3タグエディタなどにも変換機能が大体用意されているので活用してみるのも手ですね。

     |  masme  |  返信
  5. 理想的な単語の区切りを自力で実装するのは大変そうですね…

    > Mery では単語構成文字や単語区切りはどのように定義されているのでしょう?

    Mery では Windows API の GetStringTypeEx っていう関数でパラメータに C1_PUNCT を渡すことで単語の区切り文字かどうかを判断しています。Windows API の仕様なので Don'T などの誤判定に柔軟に対応するのは難しい感じではありますが。。。

     |  Kuro  |  返信
  6. masmeさん、わざわざマクロ作っていただいてありがとうございます!
    元データにはfreedbなどを使い、どちらにしろ一度確認するので英文に関してはこれで行けそうです。

    ご指摘の通り、
    EACのようにCD取り込みソフトにも同等の機能があってそちらを使うこともありますし、
    フランス、ドイツ、北欧なども音楽大国でタイトルに特殊文字が入ることも多いので
    タイトル次第で使い分けたいと思います。

    いろいろ考えてみたのですが、この機能、どういったシチュエーションで使われる人が多いのでしょうね
    プログラムを書く人はまず使わないだろうし、英文でも一単語ずつ頭を大文字にすることはないだろうし
    見出しの短文とか、まさにCDタグのタイトル編集に特化された機能ではないかという気がしてきました笑

     |  kikurage  |  返信
スポンサーリンク