Превосходный текстовый фрагмент конвертирует camelCase в snake_case - PullRequest
0 голосов
/ 22 декабря 2018

Привет! Я пытаюсь создать превосходный фрагмент текста и хочу преобразовать слово camelCase в snake_case.Я знаю, что есть плагины, которые позволяют вам конвертировать строку в snake_case, но я хочу сделать это с помощью фрагментов возвышенного текста.

У меня есть фрагмент, как показано ниже.

<snippet>
    <content><![CDATA[
/**
 * ${TM_FILEPATH/^.+\/(\w+)\.php$/${1}/} belongs to many (many-to-many) ${1/^((.+)ies)|(.+[^s])s$/\u(?1$2y:$3)/}.
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
 */
public function $1()
{
    return \$this->belongsToMany('App\\${1/^((.+)ies)|(.+[^s])s$/\u(?1$2y:$3)/}', '${TM_FILEPATH/^.+\/(\w+)\.php$/\l${1}/}_$1', '${TM_FILEPATH/^.+\/(\w+)\.php$/\l${1}/}_id', '${1/^((.+)ies)|(.+[^s])s$/\l(?1$2y:$3)/}_id');
}
]]></content>
    <!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
    <tabTrigger>btm</tabTrigger>
    <!-- Optional: Set a scope to limit where the snippet will trigger -->
    <scope>source.php</scope>
    <description>Eloquent belongsToMany() (pivot) relation</description>
</snippet>

И каквывод, который он мне дает.

 /**
     * UserMessages belongs to many (many-to-many) Role.
     *
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
     */
    public function roles()
    {
        return $this->belongsToMany('App\Role', 'userMessages_roles', 'userMessages_id', 'role_id');
    }

В итоге я хочу, чтобы userMessages был user_messages.Любая идея, как это сделать.

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Ниже приведен пример фрагмента, который выполняет что-то вроде этого, основанное на вашем примере, но сокращенное для ясности (также я изменил область действия на embedding.php, чтобы он вызывал синтаксис, который я использую для PHP).Вы должны быть в состоянии приспособить это к вашим потребностям в вашем примере с большим фрагментом кода.

<snippet>
    <content><![CDATA[
// ${1/^([A-Z])|(?:([A-Z]))/(?1\l$1:)(?2_\l$2:)/g}
public function ${1}()
{
    $0
}
]]></content>
    <tabTrigger>btm</tabTrigger>
    <scope>embedding.php</scope>
    <description>Eloquent belongsToMany() (pivot) relation</description>
</snippet>

Example of snippet in use

Основу этого можно увидеть в фрагменты страницы в неофициальной документации .Расширение переменной во фрагменте принимает вид ${variable/regex/format_string/options}.В регулярном выражении используются регулярные выражения библиотеки boost и строки формата .

Boost поддерживает условную замену в виде (?Ntrue:false), где для группы захвата Nтекст замены - true, если совпадение захватило что-то, или false, если это не так.

Здесь мы используем чередование в регулярном выражении, чтобы иметь две группы захвата, чтобы мы могли предоставить две разные замены в зависимости отна котором из предметов совпадает.Первая группа захвата захватывает ведущий верхний регистр и просто преобразует его в нижний регистр, а вторая (не привязанная к началу строки) делает то же самое и также предшествует совпадению с подчеркиванием.

0 голосов
/ 23 декабря 2018

Perl предлагает модификатор \L в нижнем регистре захвата при замене.Захваты заключаются в скобки () и могут иметь обратную ссылку на $ 1, $ 2 и т. Д.

Так что все, что нужно, это найти строчный символ, за которым следует верхний регистр, который затем должен быть в нижнем регистре.

sub camel_case_to_underscore {
    my $method_name = shift;   
    $method_name =~s /([a-z])([A-Z])/$1_\L$2/g;
    return lcfirst $method_name;
}

Флаг g заменяет глобально, поэтому все вхождения в строке.

Обратите внимание, что эта функция также строчные буквы первой буквы строки, я предполагаю, что это то, что вы хотите.

...