SCPメタタイトル検索(SCP財団と連動)

概要・動作説明
SCP記事のメタタイトル検索及びTaleの検索を行います。
テキストボックスに検索したいタイトルを入れ、検索ボタンを押すかエンターキーを押してください。

ワードとワードの間をスペースで開ける事ができます。スペースを入れた文字を検索させると検索上位にAND検索の結果が下位にOR検索の結果が表示されます。

検索結果URLを使えば、検索結果を他の人に伝える事ができます。
未対応記事
既にページが作成されており、なおかつ現在検索に対応していないシリーズ一覧です。随時対応させていきます。

検索フォーム

Q & A

開発者
このシステムはC-takeC-takephysicslikephysicslikeが開発しました。このシステムについての仕様及び要望等に関しては開発者にお尋ねください。

こっちの検索もよろしく→複数タグ検索システム
この実験サイト用のシステムは若干コードが違うので下記の技術ノートはちょっとだけでたらめです(でもC-takeC-takeぐらいしか編集しないので直す気はありません)
技術ノート

技術ノート
ここでは新規に一覧ページが追加された時に、そのページを本システムに反映させる方法を記します。

本システムでは追加されたページ一覧の種類に応じて3つの反映方法があります。3つに分かれている理由は一覧の種類によってページの解析方法が異なる為です。下記のリンクより、追加されたページに合わせた反映方法をご参照ください。

上記3つの方法に応じてページを反映させた場合は本システムの上から数えて最初にあるHTMLブロックに書かれている

var pageNumber = 15;

という数値を1つ増やしてください。
CtrlキーとFキーを同時押しし、ページ内検索で「pageNumber」を調べるのが一番手っ取り早いでしょう。

wikidotにサインインしていなくても本システムを利用できるようにする為、この変数はいわゆるマジックナンバーを使用しています。

詳細ソースコード

検索システムに戻る

SCP及びSCP-EX一覧の追加
SCP及びSCP-EXの一覧を追加するには下記の構文をコピーし、本ページの一番下に挿入してください。編集箇所は赤字で記した2ヶ所です。

[[module ListPages fullname="scp-series" separate="yes" limit="250"]]
[[%%content{0}%%html]]
<div id="target" style="display:none;">
%%content%%
</div>
<script type="text/javascript" src="http://shitake-crude-production.wikidot.com/scpmetatitlesearch/code/1"></script>
<script type="text/javascript" src="http://shitake-crude-production.wikidot.com/scpmetatitlesearch/code/2"></script>
<script type="text/javascript" src="http://shitake-crude-production.wikidot.com/scpmetatitlesearch/code/3"></script>
<script type="text/javascript">
var DataNum = 3;
var serachAry;
var exclusionWord = getExclusionWord("%%fullname%%");
document.addEventListener("DOMContentLoaded", analysisSCPListSyntax);
</script>
@@[[/html]]@
[[/module]]

各変更箇所を説明します。
1.ページの名前の変更

[[module ListPages fullname="scp-series" separate="yes" limit="250"]]

ここには追加されたページ一覧の名前を挿入してください。例えば今回追加された一覧が"scp-series-jp-3"であった場合、この部分は下記の用に書き換えてください。

[[module ListPages fullname="scp-series-jp-3" separate="yes" limit="250"]]

2.データ番号の変更

DataNum = 3;

ここにはデータ番号をご記入ください。上記の構文をページの最下部に挿入する際、その上にこの構文と似た構文が書かれているのを発見すると思います。もしそこに18と書かれていた場合は、この箇所には

DataNum = 19;

と記入してください。

技術ノートに戻る
検索システムに戻る

joke-SCP一覧の追加
SCP及びSCP-EXの一覧を追加するには下記の構文をコピーし、本ページの一番下に挿入してください。編集箇所は赤字で記した2ヶ所です。

[[module ListPages fullname="joke-scps" separate="yes" limit="250"]]
[[%%content{0}%%html]]
<div id="target" style="display:none;">
%%content%%
</div>
<script type="text/javascript" src="http://shitake-crude-production.wikidot.com/scpmetatitlesearch/code/1"></script>
<script type="text/javascript" src="http://shitake-crude-production.wikidot.com/scpmetatitlesearch/code/2"></script>
<script type="text/javascript" src="http://shitake-crude-production.wikidot.com/scpmetatitlesearch/code/3"></script>
<script type="text/javascript">
var serachAry;
var DataNum = 10;
document.addEventListener("DOMContentLoaded",analysisJokeSCP);
</script>
[[/html]]
[[/module]]

各変更箇所を説明します。
1.ページの名前の変更

[[module ListPages fullname="joke-scps" separate="yes" limit="250"]]

ここには追加されたページ一覧の名前を挿入してください。例えば今回追加された一覧が"joke-scps-ko"であった場合、この部分は下記の用に書き換えてください。

[[module ListPages fullname="joke-scps-ko" separate="yes" limit="250"]]

2.データ番号の変更

var DataNum = 10;

ここにはデータ番号をご記入ください。上記の構文をページの最下部に挿入する際、その上にこの構文と似た構文が書かれているのを発見すると思います。もしそこに18と書かれていた場合は、この箇所には

var DataNum = 19;

と記入してください。

技術ノートに戻る
検索システムに戻る

Tale一覧の追加
SCP及びSCP-EXの一覧を追加するには下記の構文をコピーし、本ページの一番下に挿入してください。編集箇所は赤字で記した2ヶ所です。

※ただしこれはTales一覧(En)及びTale-JPの一覧のフォーマットを解析する構文です。従って現在のTale-KO及びTale-FRは解析できません。フォーマットがTale-JPのものと同一になった後に適用してください。

[[module ListPages fullname="foundation-tales" separate="yes" limit="250"]]
[[%%content{0}%%html]]
<div id="target" style="display:none;">
%%content%%
</div>
<script type="text/javascript" src="http://shitake-crude-production.wikidot.com/scpmetatitlesearch/code/1"></script>
<script type="text/javascript" src="http://shitake-crude-production.wikidot.com/scpmetatitlesearch/code/2"></script>
<script type="text/javascript" src="http://shitake-crude-production.wikidot.com/scpmetatitlesearch/code/3"></script>
<script type="text/javascript">
var DataNum = 15;
var serachAry;
document.addEventListener("DOMContentLoaded", analysisTaleSyntax);
</script>
[[/html]]
[[/module]]

各変更箇所を説明します。
1.ページの名前の変更

[[module ListPages fullname="red|foundation-tales" separate="yes" limit="250"]]

ここには追加されたページ一覧の名前を挿入してください。例えば今回追加された一覧が"foundation-tales-ko"であった場合、この部分は下記の用に書き換えてください。

[[module ListPages fullname="foundation-tales-ko" separate="yes" limit="250"]]

2.データ番号の変更

var DataNum = 15;

ここにはデータ番号をご記入ください。上記の構文をページの最下部に挿入する際、その上にこの構文と似た構文が書かれているのを発見すると思います。もしそこに18と書かれていた場合は、この箇所には

var DataNum = 19;

と記入してください。

技術ノートに戻る
検索システムに戻る

ソースコード一覧


検索フォーム

[[html]]
<style type="text/css">
@import url(http://scp-jp.wdfiles.com/local--files/japanese-syntax/scp-jpdotCss.css);
</style>
<script type="text/javascript" src="http://scp-jp.wdfiles.com/local--files/japanese-syntax/scpHTMLblockCtrl_ver1_ex.js"></script>
<script type="text/javascript" src="http://shitake-crude-production.wikidot.com/scpmetatitlesearch/code/4"></script>
<div id="LordBlock" style="text-align:center;">
-起動準備中-
</div>
<div id="target" style="display:none;text-align:center;">
<input type="text" maxlength="200" size="40" id="test" onkeydown="(function(elm,event){if(event.keyCode==13)testS(elm)})(this,event)"/><button style="cursor:pointer;" onclick="testS(test)">検索</button><br />
<!- ここのラジオスイッチの状態で検索項目を決定する ->
<form id="searchType">
<input type="radio" name="type" style="cursor:pointer;" value="scp" checked /></input>SCPのみ <input type="radio" name="type" style="cursor:pointer;" value="tale" />Taleのみ <input type="radio" name="type" style="cursor:pointer;" value="all" />SCP&Tale
</form>
</div>
<div id="result">
</div>
<div style="text-align:center;font-weight:bold;display:none;" id="resultURL"><span>検索結果URL</span><textarea style="width:80%;height:3em;padding:1em;display:block;margin:auto;" readonly></textarea></div>
<div id="scpHTMLblockResizeSwitch"></div>
<script type="text/javascript">
var pageNumber = 22;
var serachAry = new Array();
var searchAryTale = new Array();
var pageCount=0;
var resultArea;
var getMesage = new Array();
var typeselecter;
var LordBlock;
var baseURL = "http://shitake-crude-production.wikidot.com/scpmetatitlesearch";
document.addEventListener("DOMContentLoaded",function(){

typeselecter = document.getElementById("searchType");

//おっ!プログラム動いているなと思わせるハッタリの為のスタイル変更(実際動いているけど)
LordBlock = document.getElementById("LordBlock");
LordBlock.removeAttribute("style");
LordBlock.setAttribute("style","text-align:center;background-color:#223;color:#5F5;font-weight:bold;padding:1em");
LordBlock.innerHTML = "-検索用データ読み込み中-";

//結果表示欄
resultArea = document.getElementById("result");

//データ集計
window.addEventListener("message",function(event){

//受け取ったデータが検索用データでなければ動作終了
if(typeof(event.data) == "string")return;
var bro = window.parent.window.frames;

//検索用データを受け取った場合受信完了のメッセージをデータ送信元に送る
bro[event.data[event.data.length -2]+event.data[event.data.length -1]].postMessage("success","*" );

//上記で受け取ったデータと同じデータを既に受け取っているか検査。受け取っている場合動作終了
for(var i = 0;i < getMesage.length;i++){

if(event.data[event.data.length-2] == getMesage[i]){

return;

}
}
//受け取ったデータの数を記録及び表示
pageCount++;
LordBlock.innerHTML = "-検索用データ読み込み中- " + pageCount + " / " + pageNumber;
getMesage.push(event.data[event.data.length -2]);
//受け取ったデータからデータ種類識別用の情報削除
event.data.pop();
event.data.pop();

//受け取ったデータがSCP一覧かTaleかの記録を取得
var type = event.data[event.data.length-1];
event.data.pop();
//SCP一覧かTaleかによってデータ集計元の分岐
switch(type){

case "SCP":
serachAry = serachAry.concat(event.data);
break;
case "Tale":
searchAryTale = searchAryTale.concat(event.data);
break;

}

//規定数のデータを集計し終えた場合、検索フォームの表示
if(pageCount >= pageNumber){

document.getElementById("target").style.display = "block";
LordBlock.style.display = "none";
correctIframeSize();
var url = document.referrer.split(baseURL).join("");
//この検索システムがあるページのURLに規定のパラメーターがある場合、検索を自動起動
var check = url.search("searchmetatitle/");
if(check < 0)return;
var url = document.referrer.split(baseURL).join("");
var targetTitle = extractSpecificParameter(url,check,"searchmetatitle/");
targetTitle = decodeURIExtension(targetTitle);
document.getElementById("test").value = targetTitle.split("|").join(" ");
check = url.search("type/");
for(var j = 0;j < typeselecter.type.length;j++){

if(typeselecter.type[j].value == extractSpecificParameter(url,check,"type/"))typeselecter.type[j].checked = true;

}
searchSubTitle(targetTitle);
}
});
});

function searchSubTitle(sentence){

/*検索実行前に準備及び検索条件を設定する*/
//完全一致検索結果を格納する配列
var searchResultE = new Array();
//SCP番号検索結果を格納する配列
var searchResultEq2 = new Array();
//AND検索結果を格納する配列
var serarchResultS = new Array();
//OR検索結果を格納する配列
var serarchResult = new Array();
//送られた文字列を単語ごとに分ける
sentence = sentence.split("|");
var s = new Array();
for(var i = 0;i < sentence .length;i++){

//OR検索時に障害となる"-"一語(何にでも当てはまる文字)を排除。
//また正規表現において特殊な文字だった場合にその前にエスケープ文字(\)をつけて検索単語登録

if(sentence[i] != "-"){

s.push(setEscapeCode(sentence[i]));

}
}
if(s.length < 1)return;
//AND検索及びOR検索に使う正規表現を生成し格納
var sRe = createRegexForAndSearch(s);
var Re = new RegExp(s.join("|"), 'i');

//SCP番号検索の準備
var isScpNum = false;
var targetScpNum = "SCP-173";
//SCP-<支部記号>-<番号>という形式をとる支部をここに登録
var middleBranch = ["CN"];
var checkBranch = new RegExp(middleBranch.join("|"), 'i');
//もし検索語が1語でありなおかつ文頭が"SCP"と一致するのであれば。SCP-<番号>という形式に変換しSCP番号検索用の検索語に登録
if(sentence.length == 1){

if(sentence[0].indexOf("SCP") == 0){

targetScpNum = replasticSCPNumber(sentence[0]);
//検索時にSCP番号検索も行うと登録
isScpNum = true;

}
}
//完全一致検索用に渡された語を復元(ただし全角スペースは半角スペースになる)
sentence = sentence.join(" ");
//SCPのみかTaleのみかもしくは両方の検索を行うかをラジオスイッチの状況によって決定
var type;

for(i = 0;i < typeselecter.type.length;i++){

if(typeselecter.type[i].checked)type = typeselecter.type[i].value;

}
/*検索準備完了*/

/*検索開始*/
var j;
var EqCheck = false;
//SCP記事検索
if(type == "scp" || type=="all"){

for(i = 0;i < serachAry.length;i++){

EqCheck = false;
for(j = 0;j < serachAry[i].length;j++){

//完全一致検索
if(serachAry[i][j] == sentence){

searchResultEq.push(createLink(serachAry[i]));
EqCheck = true;

}else if((isScpNum) && (j==0)){

//完全一致検索から漏れ、なおかつSCP番号検索を行う設定の場合はSCP番号検索を行う。SCP番号を全てSCP-<番号>(支部名なし)の形式に変換し完全一致検索
if(replasticSCPNumber(serachAry[i][j])==targetScpNum){

searchResultEq2.push(createLink(serachAry[i]));
EqCheck = true;

}
}
if(EqCheck)break;
}
//完全一致及びSCP番号検索に漏れた場合のみAND検索及びOR検索を行う
if(!EqCheck){

//AND検索用及びOR検索用の正規表現とのmatch判定
if(serachAry[i][1].match(sRe)){

serarchResultS.push(createLink(serachAry[i]));

}else{

if(serachAry[i][1].match(Re))serarchResult.push(createLink(serachAry[i]));

}
}
}
}
//Tale検索、SCP番号検索がない以外は上記と同じ
if(type == "tale" || type=="all"){

for(i = 0;i < searchAryTale.length;i++){

if(searchAryTale[i][1] == s){

searchResultEq.push(createLink(searchAryTale[i]));

}else if(searchAryTale[i][1].match(sRe)){

serarchResultS.push(createLink(searchAryTale[i]));

}else{

if(searchAryTale[i][1].match(Re))serarchResult.push(createLink(searchAryTale[i]));

}
}
}
//完全一致、SCP番号、AND、ORの検索結果を1つの配列に結合
searchResultEq2 = searchResultEq.concat(searchResultEq2);
serarchResultS = searchResultEq2.concat(serarchResultS);
serarchResult = serarchResultS.concat(serarchResult);
/*検索終了*/

/*検索結果の表示*/
//検索結果表示欄を空白にする
resultArea.innerHTML = "";
//ヒットがあったかどうかの情報を表示
var div = document.createElement("div");
div.setAttribute("style","text-align:center;font-weight:bold;");
if(serarchResult.length > 0){

div.innerHTML = "-検索結果 該当:"+serarchResult.length+"件";

}else{

div.innerHTML = "-該当なし-";
div.style.color="#A00";

}
resultArea.appendChild(div);
//検索結果を15個ずつDIV要素に格納する。
var count = -1;
for(i = 0;i < serarchResult.length;i++){

if((i % 15) == 0)createDiv();
div.innerHTML = div.innerHTML + serarchResult[i];

}
var prev;
var next;
var clear;
for(i = 0;i <= count;i++){

div = document.getElementById("resultList" + i);
clear = document.createElement("div");
div.appendChild(clear);
if(i != 0){

//ページ前送りボタン
prev = document.createElement("button");
prev.setAttribute("onclick","(function(elm,prev){elm.style.display='none';prev.style.display = 'block';})(resultList" + i +",resultList"+(i-1)+")");
prev.setAttribute("style","display:block;float:left;cursor:pointer;");
prev.innerHTML = "Prev";
div.appendChild(prev);

}
if(i != count){
//ページの後送りボタン

next = document.createElement("button");
next.setAttribute("onclick","(function(elm,next){elm.style.display='none';next.style.display = 'block';})(resultList" + i +",resultList"+(i+1)+")");
next.setAttribute("style","display:block;float:right;cursor:pointer;");
next.innerHTML = "Next";
div.appendChild(next);

}
//ついでにページ数情報格納
clear = document.createElement("div");
clear.setAttribute("style","clear:both");
div.appendChild(clear);
clear = document.createElement("div");
clear.setAttribute("style","text-align:center;");
clear.innerHTML = (i+1) + " / " + (count+1);
div.appendChild(clear);
}

var resultURLBase = document.getElementById("resultURL");
if(resultURLBase.style.display =="none")resultURLBase.style.display ="block";
resultURLBase.childNodes[1].value = baseURL + "/searchmetatitle/" + sentence.split(" ").join("|") + "/type/" + type;
//難解構文WikiのcorrectIframeSizeの使い方がわからない方へ
correctIframeSize();
//ここではページの書き換えした直後にcorrectIframeSize()を書いています
//このようにページの書き換え直後に書くのがcorrectIframeSize()の使い方です
/*検索結果表示終了*/


/*補助関数*/
function createDiv(){
//検索結果を15個ずつ収めるdivを新規作成

count++;
div = document.createElement("div");
div.setAttribute("id","resultList" + count);
div.setAttribute("style","width:80%;margin:auto;");
if(count > 0){

div.style.display = "none";

}
resultArea.appendChild(div);
}
function createLink(arycell){

//検索用データから記事へのリンクを生成
var base = "http://ja.scp-jp.net/";
var check = arycell[0].indexOf("http:");
if(check >= 0){

base = "";
arycell[0] = arycell[0].substring(check,arycell[0].length);

}
return '<a href="'+base+arycell[0]+'" target="_blank">'+arycell[1]+'</a><br />'
}
function replasticSCPNumber(scpNum){

//各支部のSCP番号を一律SCP-<番号>(支部記号無し)に変換する
scpNum = scpNum.toUpperCase().split("-");
if(scpNum.length < 3)return scpNum.join("-");
if(scpNum[1].match(checkBranch)){

return scpNum[0] + "-" + scpNum[2];

}else{

return scpNum[0] + "-" + scpNum[1];

}
}
}

//検索ボタンによる検索開始
function testS(elm){

if(pageCount < pageNumber)return;
var s = elm.value;
if(s.split(/ | /).join("").length == 0)return;
s = s.split(/ | /).join("|");
searchSubTitle(s);


}

//URLの特定のパラメーターの値を取得する
function extractSpecificParameter(parameter,check,target){

check += target.length;
for(var i = check;i < parameter.length;i++){

if(parameter.charAt(i) == "/")break;
if(parameter.charAt(i) == "#")break;


}
return parameter.substring(check,i);

}
</script>
[[/html]]

wikidotページ解析汎用型
var HomeTopBase = "http://ja.scp-wiki.net/";
 
//wikidotの特殊構文を取り外す
function replasticTitle(title){
    var replastic = document.createElement("div");
    replastic.innerHTML = title;
    title = replastic.innerText;
    return replastic.innerText;
}
 
    var wikidotSyntaxList = {
        "**":["<b>","</b>","basic"],
        "--":["<span style='text-decoration: line-through;'>","</span>","basic"],
        "//":["<em>","<em>","basic"],
        "__":["<span style='text-decoration: underline;'>","</span>","basic"],
        "^^":["<sup>","</sup>","basic"],
        ",,":["<sub>","</sub>","basic"],
        "##":["<span style='color:","</span>","colorT"],    
    }
    var bagCheck = 0;
function trasrateWikidotToHtml(sentence){
 
    for(var i in wikidotSyntaxList){
        switch(wikidotSyntaxList[i][2]){
            case "basic":
                sentence = basicTransrateWikidotToHtml(sentence,i);
            break;
            case "colorT":
                sentence = colorTransrateWikidot(sentence);
            break;            
        }
 
    }
sentence = trasrateTT(sentence);
    return trasrateWikidotTags(sentence);
 
    function trasrateWikidotTags(sentence){
        var plasticField = document.createElement("div");
        sentence = sentence.split("[[").join("<");
        sentence = sentence.split("]]").join(">");
        plasticField.innerHTML = sentence;
        var size = plasticField.getElementsByTagName("size");
        var newSpan;
        while(size.length > 0){
            newSpan = document.createElement("span");
            newSpan.innerHTML = size[0].innerHTML; 
            newSpan.setAttribute("style","font-size:"+size[0].attributes[0].name);
            plasticField.replacedNode(newSpan,size[0]);
        }
        return plasticField.innerHTML;
    }
 
    function basicTransrateWikidotToHtml(sentence,symbol){
        var symbolEscape = setEscapeCode(symbol);
        var RegBase = symbolEscape + "[^"+symbolEscape+"]*"+symbolEscape;
 
        var RegAct = new RegExp(RegBase);
        while(sentence.match(RegAct)){
                sentence = sentence.replace(RegAct,function(match){
                var ex = match.split(symbol);
                return wikidotSyntaxList[symbol][0] + ex[1] + wikidotSyntaxList[symbol][1];
            });
        }
        return sentence;
    }
 
    function colorTransrateWikidot(sentence){
        var symbolEscape = setEscapeCode("##");
        var RegBase = symbolEscape + "[^"+symbolEscape+"]*"+symbolEscape;
        var RegAct = new RegExp(RegBase);
        while(sentence.match(RegAct)){
                sentence = sentence.replace(RegAct,function(match){
                var ex =  match.split("##").join("");
                ex = ex.split("|");
                return wikidotSyntaxList["##"][0]+ex[0]+";'>" + ex[1] + wikidotSyntaxList["##"][1];
            });
        }
        return sentence;
    }
    function setEscapeCode(sentence){
    var escape = "\\";
    sentence=sentence.replace(/\.|\^|\?|\$|\[|\]|\*|\+|\\|\-|\,/g,  function(match) {
        return escape.charAt(0) + match;
    });
    return sentence;
}
    function trasrateTT(sentence){
        var RegBase = "\{\{[^\}\}]*\}\}";
        var RegAct = new RegExp(RegBase);
        while(sentence.match(RegAct)){
                    sentence = sentence.replace(RegAct,function(match){
                    var ex = match.split("{{").join("<tt>");
                    return ex.split("}}").join("</tt>");
                });
            return sentence;
        }
        return sentence;
    }
}
//リスト付きバックリンク構文を解析しデータを作る
function replasticListBackLink(ary,n){
    ary[n] = ary[n].split("* [[[").join("");
    ary[n] = ary[n].split("]]]");
    ary[n][1] = trasrateWikidotToHtml(ary[n][1]);
    replasticDataArray(ary[n]);
}
 
//[[[pagename]]]-metatitle 及び [[[pagename|linkname]]]-metatitleの様な構文を解析しデータを作る
function replasticDataArray(ary){
var forSearchName = replasticTitle(ary[1]);
    ary.push([getPureMetaTitle(forSearchName),ary[1]]);
    if(ary[0].indexOf("|") > 0){
        var backTitle = ary[0].split("|");
        ary[0] = [replasticPageName(backTitle[0]),backTitle[1]];
 
        ary[1] = backTitle[1]+forSearchName;
    }else{
ary[0] = replasticPageName(ary[0]);
ary[0] = [ary[0],ary[0]];
        ary[1] = (ary[0][0]+forSearchName);
    }
}
 
//通常のリンク[ ~ ]構文を解析しデータを作る
function createDataNormalLink(ary,num){
    var sentence = ary[num];
    sentence = sentence.split("[").join("");
    ary[num] = new Array();
    var target = sentence.indexOf("]");
    var linkSeparete = sentence.substring(0,target);
    linkSeparete = linkSeparete.split(" ");
    ary[num].push([linkSeparete[0],linkSeparete[1]]);
    var htmlSyntax =  trasrateWikidotToHtml(sentence.substring(target+1,sentence.length));
var forSearch = replasticTitle(htmlSyntax);
    ary[num].push(linkSeparete[1] + forSearch);
    ary[num].push([getPureMetaTitle(forSearch),htmlSyntax]);
}
 
function getPureMetaTitle(sentence){
    var targetWord;
    for(var i = 0;i < 3;i++){
        targetWord = ((i%2)==0)?" ":"-";
        if(sentence.charAt(i)!=targetWord)break;
    }
    return sentence.substring(i,sentence.length);
}
 
function replasticPageName(sentence){
var startDomain = sentence.indexOf(HomeTopBase);
    if(startDomain >= 0){
        sentence = sentence.substring((HomeTopBase.length+startDomain),sentence.length);
    }
    var sentenceRe = sentence.split(" ");
    while(sentenceRe[sentenceRe.length-1].length < 1)sentenceRe.pop();
    sentenceRe = sentenceRe.join("-");
sentenceRe = sentenceRe.split(".").join("");
    return sentenceRe.split("'").join("-");
}
 
function replasticHeadTagsBLL(ary,i){
if(ary[i].indexOf("[[[")<0)return;
if(ary[i].indexOf("* [[span")==0){
var scpNum = ary[i].substring(ary[i].indexOf("[[[")+3,ary[i].indexOf("]]]"));
var tagSP = ary[i].substring(2,(ary[i].indexOf("]]")+2)).split("[[").join("<");
tagSP  = tagSP.split("]]").join(">");
ary[i] = "* [[["+scpNum+" | "+tagSP+scpNum+"</span>]]]" + ary[i].substring(ary[i].indexOf("]]]")+3,ary[i].length);
}
 
}

wikidoto構文を解析して得たデータを検索フォームに送る
var trySendData = true;
var DataSearchNum = 0;
var copyData;
var sendStep = 0;
var frameElements;
function setPostData(){
    /*自身ページ番号等を登録*/
    DataSearchNum = DataNum;
    serachAry.push(DataNum);
    copyData = serachAry.concat();
    serachAry.push(0);
 
    copyData.push(DataSearchNum);//サインアウト状態の時に送るデータを生成
 
    frameElements = window.parent.window.frames;
 
    //メッセージ受信時の動作を登録
    window.addEventListener("message",function(event){
        if(typeof(event.data) != "string")return;
        var analysis = event.data.split(",");
        if(analysis[0] == "success"){
        //検索フォームからデータ受信完了のメッセージを受信した時、機能停止
            if(Number(analysis[1])==DataNum){
            //受信完了メッセージが自分宛だった場合機能停止
                trySendData = false;
            }else{
            //誤送信であった場合、正しい送信位置を計算して代わりに受信データを送信
                var targetFrame = Number(analysis[1]);
                var addNumber = Number(analysis[2])+targetFrame-DataNum;
                frameElements[targetFrame + addNumber].postMessage("success,"+targetFrame+","+addNumber,"*" );
            }
        }else if(event.data.indexOf("searchMySelf")==0){
        //サインアウト時対策、自身からメッセージが来た際、自身のiframe番号を取得
        if(Number(analysis[1]) == DataNum){
        copyData[copyData.length-1] = Number(analysis[2])-DataNum;
DataSearchNum=0;
        sendStep++;
        }
        }
    });
    postMessageRetry(frameElements.length);
}
 
function postMessageRetry(borothrNum){
    if(trySendData){
        //サインイン状態の時、確実に検索フォームがある位置に検索用データを送信する
        frameElements[0].window.postMessage(serachAry,"*" );
        switch(sendStep){
        case 0:
        //サインアウト時対策:自身のiframe番号を探す
  if(DataSearchNum >= frameElements.length) DataSearchNum =  frameElements.length-1;    frameElements[DataSearchNum].window.postMessage("searchMySelf,"+DataNum+","+DataSearchNum,"*" );
        break;
        case 1:
        //サインアウト時対策:どこにいるか不明な検索フォームを探索しながら検索用データを渡す
        frameElements[DataSearchNum].window.postMessage(copyData,"*" );
        break;
        }
        DataSearchNum++;
        if(DataSearchNum >= borothrNum)DataSearchNum=0;
        setTimeout(function(){postMessageRetry(borothrNum)},20);
    }else{
        //機能停止
        document.open();
        document.write("");
        document.close();
    }
}

各個別のリストページ構文解析
var branchSeries = ["jp","ko","it","de","cn","ru","fr","th","pl","es"];
var scpEnURL = ["http://www.scp-wiki.net/","http://scp-jp.wdfiles.com/local--files/main/us.png"]; 
 
var branchURLlist = {
        "-ru":["http://scpfoundation.ru/","http://scp-jp.wdfiles.com/local--files/main/ru.png"],
        "-ko":["http://ko.scp-wiki.net/","http://scp-jp.wdfiles.com/local--files/main/kr.png"],
        "-cn":["http://scp-wiki-cn.wikidot.com/","http://scp-jp.wdfiles.com/local--files/main/cn.png"],
        "-fr":["http://fondationscp.wikidot.com/","http://scp-jp.wdfiles.com/local--files/main/fr.png"],
        "-pl":["http://scp-pl.wikidot.com/","http://scp-jp.wdfiles.com/local--files/main/pl.png"],
        "-es":["http://lafundacionscp.wikidot.com/","http://scp-jp.wdfiles.com/local--files/main/es.png"],
        "-th":["http://scp-th.wikidot.com/","http://scp-jp.wdfiles.com/local--files/main/th.png"],
        "-de":["http://scp-wiki-de.wikidot.com/","http://scp-jp.wdfiles.com/local--files/main/de.png"],
        "-it":["http://fondazionescp.wikidot.com/","http://scp-jp.wdfiles.com/local--files/main/it.png"],
        "-jp":["http://ja.scp-wiki.net/","http://scp-jp.wdfiles.com/local--files/main/jp.png"]
    };
 
function getBranchTopURL(sentence){
    var branchOr = branchSeries.join("|\-");
    branchOr = "\-" + branchOr;
    branchOr = new RegExp(branchOr);
    var get = sentence.match(branchOr);
    if(!get)return scpEnURL;
    return branchURLlist[get];
}
//SCP一覧ページを解析する上でブラックリスト入りさせねばならないSCP-[支部]-EXのリンクを生成
function getExclusionWord(pagename){
    var branch = "";
    for(var i = 0;i<branchSeries.length;i++){
        if(pagename.indexOf("-"+branchSeries[i]) >= 0){
            branch = "-"+branchSeries[i].toUpperCase() 
            break;
        }
    }
    return "SCP"+branch+"-EX";
}
 
//SCP及びSCP-EX一覧の解析
function analysisSCPListSyntax(branch){
if(!isMSBrowser())return;
    var TopURL = getBranchTopURL(branch);
    var targetAndMiddlePlasticField = document.getElementById("target");
    var targetSentence = targetAndMiddlePlasticField.innerHTML;
    var targetSentenceAry = targetSentence.split("\n");
    var newAry = new Array();
    for(var i = 0;i < targetSentenceAry.length;i++){
replasticHeadTagsBLL(targetSentenceAry,i);
if(targetSentenceAry[i].indexOf("* [[[http://ja.scp-wiki.net/scp-") == 0)targetSentenceAry[i]=targetSentenceAry[i].split("http://ja.scp-wiki.net/").join("");
        if((targetSentenceAry[i].indexOf("* [[[SCP") == 0)||(targetSentenceAry[i].indexOf("* [[[scp") == 0)){
            if(targetSentenceAry[i].indexOf(exclusionWord)<0){
            newAry.push(targetSentenceAry[i]);
            replasticListBackLink(newAry,newAry.length-1);
            newAry[newAry.length-1].push(TopURL[0]);
           newAry[newAry.length-1].push(TopURL[1]);
            }
        }
    }
    serachAry = newAry;
    serachAry.push("SCP");
    setPostData();
}
 
//jokeSCP一覧の解析
function analysisJokeSCP(branch){
if(!isMSBrowser())return;
    var TopURL = getBranchTopURL(branch);
    var targetAndMiddlePlasticField = document.getElementById("target");
    var targetSentence = targetAndMiddlePlasticField.innerHTML;
    var targetSentenceAry = targetSentence.split("\n");
    var newAry = new Array();
    var lastChild = 0;
    for(var i = 0;i < targetSentenceAry.length;i++){
        if(targetSentenceAry[i].indexOf("* [") == 0){
            newAry.push(targetSentenceAry[i]);
            lastChild = newAry.length -1;
            if(newAry[lastChild].indexOf("* [/") == 0){
                newAry[lastChild] = newAry[lastChild].split("* [/").join("[");
                createDataNormalLink(newAry,lastChild);
                newAry[newAry.length-1].push(TopURL[0]);
newAry[newAry.length-1].push(TopURL[1]);
}else if(newAry[lastChild].indexOf("* [http://ja.scp-wiki.net/") == 0){
                newAry[lastChild] = newAry[lastChild].split("* [http://ja.scp-wiki.net/").join("[");
                createDataNormalLink(newAry,lastChild);
                newAry[newAry.length-1].push(TopURL[0]);
newAry[newAry.length-1].push(TopURL[1]);
            }else if(newAry[lastChild].indexOf("* [[[") == 0){
                replasticListBackLink(newAry,lastChild);
                newAry[newAry.length-1].push(TopURL[0]);
newAry[newAry.length-1].push(TopURL[1]);
            }else{
                newAry.pop();
            }
        }
    }
    serachAry = newAry;
    serachAry.push("SCP");
    setPostData();
}
 
function getTitle(url,callback,ary){
var xhr=new XMLHttpRequest()
xhr.onload = function() { 
var title=this.responseXML.title||"no title"
callback(url,title)
}
xhr.open("GET", url ,true); 
xhr.responseType="document"; 
xhr.send(); 
}
 
function setTitleTale(title,ary){
ary[1] = title;
 
}
 
//Tale一覧の解析
function analysisTaleSyntax(branch){
if(!isMSBrowser())return;
    var TopURL = getBranchTopURL(branch);
    var targetAndMiddlePlasticField = document.getElementById("target");
    var targetSentence = targetAndMiddlePlasticField.innerHTML;
    var targetSentenceAry = targetSentence.split("\n");
    var newAry = new Array();
    var separate;
    var lastChild = 0;
    for(var i = 0;i < targetSentenceAry.length;i++){
        if(targetSentenceAry[i].indexOf("||[[[") == 0){
            separate = targetSentenceAry[i].split("||");
            newAry.push(separate[1]);
            lastChild = newAry.length-1;
            newAry[lastChild] = newAry[lastChild].split("[[[").join("");
            newAry[lastChild] = newAry[lastChild].split("]]]").join("");
            if(newAry[lastChild].indexOf("|") >= 0){
                newAry[lastChild] = newAry[lastChild].split("|");
var frame = document.createElement("iframe");
getTitle("http://ja.scp-wiki.net/" + replasticPageName(newAry[lastChild][0]),setTitleTale,newAry[lastChild]);
 
            }else{
                newAry[lastChild] = [newAry[lastChild],newAry[lastChild]];
            }
            newAry[lastChild][1] = replasticTitle(newAry[lastChild][1]);
            newAry[lastChild][0] = replasticPageName(newAry[lastChild][0]);
            newAry[lastChild].push(TopURL[0]);
            newAry[lastChild].push(TopURL[1]);
        }
    }
    serachAry = newAry;
    serachAry.push("Tale");
    setPostData();
}
 
function analysisProposal(branch){
if(!isMSBrowser())return;
    var TopURL = getBranchTopURL(branch);
    var targetAndMiddlePlasticField = document.getElementById("target");
    var targetSentence = targetAndMiddlePlasticField.innerHTML;
    var targetSentenceAry = targetSentence.split("\n");
    var newAry = new Array();
    var lastChild = 0;
var separate;
    for(var i = 0;i < targetSentenceAry.length;i++){
        if(targetSentenceAry[i].indexOf("[[[") == 0){
separate = targetSentenceAry[i].split("[[[").join("");
separate = separate.split("]]]");
separate[1] = trasrateWikidotToHtml(separate[1]);
replasticDataArray(separate);
separate.push(TopURL[0]);
separate.push(TopURL[1]);
newAry.push(separate);
    }
}
    serachAry = newAry;
    serachAry.push("SCP");
    setPostData();
 
}
 
function isMSBrowser(){
var browser = getBrowserForMusicPlayer();
return (browser != "safari" && browser != "chrome" && browser != "firefox")
}
 
function getBrowserForMusicPlayer() {
        var ua = navigator.userAgent;
        var result = 'unknown';
        if ( ua.indexOf('Edge') !== -1 ) {
        result = 'edge';
        } else if ( ua.indexOf('Chrome') !== -1 ) {
        result = 'chrome';
        } else if ( ua.indexOf('Safari') !== -1 ) {
        result = 'safari';
        }
        if ( ua.indexOf('Firefox') !== -1 ) {
        result = 'firefox';
        }
        if ( ua.indexOf('MSIE 8') !== -1 ) {
        result = 'ie8';
        } else if ( ua.indexOf('MSIE 9') !== -1 ) {
        result = 'ie9';
        } else if ( ua.indexOf('MSIE 10') !== -1 ) {
        result = 'ie10';
        } else if ( ua.indexOf('Trident') !== -1 ) {
        result = 'ie11';
        }
        return result;
    }

正規表現
//より柔軟な形でURLの文字コードを通常文字に戻す
function decodeURIExtension(target){
/*この関数の
参考:
yukioc氏
JavaScriptでURLをちょっと賢く解読する。 CodingFirst
http://iyukki.blog56.fc2.com/blog-entry-120.html*/
    target=target.replace(/%(?:25)+([0-9A-F][0-9A-F])/g,function(whole,m1){
        return "%"+m1;
    });
    var utf8uri = new RegExp(
        "%[0-7][0-9A-F]|"+
        "%C[2-9A-F]%[89AB][0-9A-F]|%D[0-9A-F]%[89AB][0-9A-F]|"+
        "%E[0-F](?:%[89AB][0-9A-F]){2}|"+
        "%F[0-7](?:%[89AB][0-9A-F]){3}|"+
        "%F[89AB](?:%[89AB][0-9A-F]){4}|"+
        "%F[CD](?:%[89AB][0-9A-F]){5}","ig");
    target=target.replace(utf8uri,function(whole){
        return decodeURI(whole);
    });
    return target;
}
 
//正規表現における特殊文字にエスケープ文字をつけ無効化する
function setEscapeCode(sentence){
    var escape = "\\";
    sentence=sentence.replace(/\.|\^|\?|\$|\[|\]|\*|\+|\\\-/g,  function(match) {
        return escape.charAt(0) + match;
    });
    return sentence;
}
 
//And検索にマッチする正規表現を作る
function createRegexForAndSearch(ary){
    var andS = "^";
    for(var i = 0;i < ary.length;i++){
        andS += "(?=.*" + ary[i] + ")";
    }
    return new RegExp(andS);
}
 
function isMSBrowser(){
var browser = getBrowserForMusicPlayer();
return (browser != "safari" && browser != "chrome" && browser != "firefox")
}
 
/*ブラウザー取得*/
function getBrowserForMusicPlayer() {
        /Fuck you!Edge!I hate you!Fuck!/
        var ua = navigator.userAgent;
        var result = 'unknown';
        if ( ua.indexOf('Edge') !== -1 ) {
        result = 'edge';
        } else if ( ua.indexOf('Chrome') !== -1 ) {
        result = 'chrome';
        } else if ( ua.indexOf('Safari') !== -1 ) {
        result = 'safari';
        }
        if ( ua.indexOf('Firefox') !== -1 ) {
        result = 'firefox';
        }
        if ( ua.indexOf('MSIE 8') !== -1 ) {
        result = 'ie8';
        } else if ( ua.indexOf('MSIE 9') !== -1 ) {
        result = 'ie9';
        } else if ( ua.indexOf('MSIE 10') !== -1 ) {
        result = 'ie10';
        } else if ( ua.indexOf('Trident') !== -1 ) {
        result = 'ie11';
        }
        return result;
    }

技術ノートに戻る
検索システムに戻る

特に指定がない限り、このサイトのコンテンツには次のライセンスが適用されます: Creative Commons Attribution-ShareAlike 3.0 License