GNU socialでユーザー名にアンダースコア (_) を使う方法
GNU social (v2.0.0beta0以下)では、ユーザー名に使用できる文字は数字と英小文字のみとなっており、アンダースコア (_) を使えない。_ありのユーザー名 (senookenmoney) で登録すると、勝手に_なしで登録される。
TwitterやMastodonはユーザー名のアンダースコアを許容しており、GNU socialだけ許容しないのは互換性からいってよくない。そこで、ユーザー名にアンダースコアを使う方法を調査した。
ユーザー名のチェックと正規化はlib/profile/nichkname.php::normalizeで行っている。いろいろ試行錯誤した結果、以下のコマンドで、差分を適用するとユーザー名にアンダースコアを使うことができた。
patch -Np 1 <<-'EOT'
diff --git a/lib/profile/nickname.php b/lib/profile/nickname.php
index 194c829164..e1247efb4a 100644
--- a/lib/profile/nickname.php
+++ b/lib/profile/nickname.php
@@ -72,7 +72,7 @@ class Nickname
*
* This, INPUT_FMT and DISPLAY_FMT should not be enclosed in []s.
*/
- const CANONICAL_FMT = '[0-9a-z]{1,64}';
+ const CANONICAL_FMT = '[0-9a-z_]{1,64}';
/**
* Maximum number of characters in a canonical-form nickname.
@@ -136,7 +136,6 @@ class Nickname
// We should also have UTF-8 normalization (å to a etc.)
$str = trim($str);
- $str = str_replace('_', '', $str);
$str = mb_strtolower($str);
EOT
万が一、アンダースコアが除去された状態で登録されてしまったら、DBの以下のテーブルにユーザー名が登録されているので、上記の差分に加えてこれらを編集する。
- user
- invitation
- profile
ひとまず、これでユーザー名にアンダースコアを使えるようにはなる。標準機能として問題に思ったので、別の問題と合わせて本体に問題を登録した (Cannot use underscore (`_`) in nickname and `No matches for action “showfavorites” with arguments “nickname=senookenmoney “` – NotABug.org: Free code hosting)。できればマージしたいところだが、返事がない。様子を見る。ひとまずはローカルパッチで対応する。
リンク