5

現在、ウィキ ドキュメント内の他のページへのリンクを自動的に作成するスクリプトを作成しようとしています。

function createLinks(startingSymbol, endingSymbol, text, links){
    //this needs to be implemented somehow - replace every match of the list of links with a link
}
createLinks("[[", "]]", "This is the text to wikify", ["wikify", "text"]);
//this function would return "This is the [[text]] to [[wikify]]" as its output.

最も明白な解決策は、文字列のすべての一致を単純に に置き換えることですがtext[[text]]そうするといくつかの問題に遭遇します。文字列. この問題を回避する方法はありますか?"some problems""problems""[[some [[problems]]]]"

4

2 に答える 2

1

必要なことをほぼ正確に実行するスクリプトの動作デモを作成しました。

http://jsfiddle.net/8JcZC/2/

alert(wikifyText("[[", "]]", "There are cars, be careful, carefully, and with great care!!", ["text", "hoogahjush", "wikify", "car", "careful", "carefully", "great care"]));

function wikifyText(startString, endString, text, list){
    //sort list into ascending order
    list.sort(function(a, b){
        return a.length - b.length; // ASC -> a - b; DESC -> b - a
    });
    //replace every element in the array with the wikified text
    for(var i = 0; i < list.length; i++){
        text = text.replace(list[i], startString + list[i] + endString);
    }
    return text;
}

注意: 場合によっては、このスクリプトは他の単語の一部である単語をウィキ化することがあります。たとえば、単語"careful"がリストになく、単語がリストcarにある場合、単語"car"は次のように単語内でウィキ化され"careful"ます"[[car]]eful"。この制限を回避できることを願っています。

于 2012-12-30T02:16:22.130 に答える
1

正規表現を動的に構築することに基づく別のアプローチを次に示します。

function wikifyText (startString, endString, text, list) {
    list = list.map( function (str) {
        return str.replace( /([^a-z0-9_])/g, '\\$1' );
    });
    list.sort();
    list.reverse();
    var re = new RegExp( '\\b(' + list.join('|') + ')\\b', 'g' );
    return text.replace( re, startString + '$1' + endString );
}

( JSFiddle )

\b正規表現の両端にあるアンカーは、このバージョンが部分的な単語をウィキ化しようとするのを防ぎますが、必要に応じてこの制限を緩和できます。たとえば、正規表現の構成を次のように置き換えます。

    var re = new RegExp( '\\b(' + list.join('|') + ')(?=(e?s)?\\b)', 'g' );

ウィキ化された最後の単語 ( JSFiddle )の末尾にsor接尾辞を付けることができます。MediaWiki は、ページが表示されるときに、リンク テキストの一部としてそのような接尾辞を自動的に含めることに注意してください。es


編集:これは、MediaWiki のページ タイトルのように、各フレーズの最初の文字の大文字と小文字を区別しないバージョンです。また、\bアンカーをもう少し Unicode に適したソリューションに置き換えます。

function wikifyText (startString, endString, text, list) {
    list = list.map( function (str) {
        var first = str.charAt(0);
        str = first.toUpperCase() + first.toLowerCase() + str.substr(1);
        str = str.replace( /(\W)/ig, '\\$1' );
        return str.replace( /^(\\?.\\?.)/, '[$1]' );
    });
    list.sort();
    list.reverse();
    var re = new RegExp( '(^|\\W)(' + list.join('|') + ')(?=(e?s)?\\W)', 'g' );
    return text.replace( re, '$1' + startString + '$2' + endString );
}

( JSFiddle )

JavaScript 正規表現が、大文字と小文字を区別しないセクション、後読み、または Unicode 文字クラスなどの標準の PCRE 機能をサポートしていれば、これはずっと面倒ではありません。

特に、これらの欠落している最後の機能のために、このソリューションでさえまだ完全に\WUnicode 対応ではありません: 特に、句読点だけでなくすべての非 ASCII 文字を含む に一致する任意の文字の後または前でリンクを開始または終了することができます。、文字さえ。(ただし、リンク内の非 ASCII 文字は正しく処理されます。) 実際には、これが大きな問題になるとは思いません。

于 2012-12-30T02:38:57.770 に答える