//BBCodeとMarkdownの入力・パーサー
//BOXのトグルボタン
function mdToggle(){
$(".markdown").toggleClass("hide");
$(".anti-markdown").toggleClass("hide");
if($(".markdown").hasClass("hide")){
localStorage.setItem("md","hide");
}else{
localStorage.removeItem("md");
}
}
//最初に読み込みます(MD対応インスタンスかチェック)
if(localStorage.getItem("md")=="hide"){
$(".markdown").addClass("hide");
$(".anti-markdown").removeClass("hide");
}
//タグを選んだ時に(BB版)
function tagsel(tag){
if(tag=="large" || tag=="size" || tag=="color" || tag=="colorhex"){
var sub=$("#"+tag).val();
var sub = sub.replace( /#/g , "" ) ;
surroundHTML(tag+"="+sub,tag);
}else if(tag=="flip=vertical" || tag=="flip=horizontal"){
surroundHTML(tag,"flip");
}else{
surroundHTML(tag,tag);
}
$("#textarea").focus();
}
//HTMLをエスケープしてXSSを防ぐ
function escape_html (string) {
if(typeof string !== 'string') {
return string;
}
return string.replace(/[&'`"<>]/g, function(match) {
return {
'&': '&',
"'": ''',
'`': '`',
'"': '"',
'<': '<',
'>': '>',
}[match]
});
}
//PHPのnl2brと同様
function nl2br(str) {
str = str.replace(/\r\n/g, "
");
str = str.replace(/(\n|\r)/g, "
");
return str;
}
//テキストボックスで選択したやつをタグで囲む(BB版)
function surroundHTML(tagS,tagE) {
var target = document.getElementById("textarea");
var pos = getAreaRange(target);
var val = target.value;
var range = val.slice(pos.start, pos.end);
var beforeNode = val.slice(0, pos.start);
var afterNode = val.slice(pos.end);
var insertNode;
if (range || pos.start != pos.end) {
insertNode = '[' + tagS + ']' + range + '[/' + tagE + ']';
target.value = beforeNode + insertNode + afterNode;
}
else if (pos.start == pos.end) {
insertNode = '[' + tagS + ']' + '[/' + tagE + ']';
target.value = beforeNode + insertNode + afterNode;
}
}
function markdown(tag,ck,br){
surroundMD(tag,tag,ck);
$("#textarea").focus();
}
function surroundMD(tagS,tagE,ck,br) {
var target = document.getElementById("textarea");
var pos = getAreaRange(target);
var val = target.value;
var range = val.slice(pos.start, pos.end);
var beforeNode = val.slice(0, pos.start);
var afterNode = val.slice(pos.end);
var insertNode;
if(br=="yes"){
var br="\n";
}else{
var br="";
}
if ((range || pos.start != pos.end )&& ck=="yes") {
insertNode = tagS + range + tagE ;
target.value = beforeNode + insertNode + br + afterNode;
}
else if (pos.start == pos.end || ck=="no") {
insertNode = tagS + range;
target.value = beforeNode + insertNode + br + afterNode;
}
}
//テキストボックスの前後チェック
function getAreaRange(obj) {
var pos = new Object();
if(window.getSelection()) {
pos.start = obj.selectionStart;
pos.end = obj.selectionEnd;
}
return pos;
}
//Markdownのリンク挿入
function markdownLink(){
var linkIns="["+$("#linkt").val()+"]"+"("+$("#link2").val()+")";
if(linkIns!="[]()"){
$("#textarea").val($("#textarea").val()+linkIns);
$("#linkt").val("");
$("#link2").val("");
$("#textarea").focus();
}
}
//Markdownのimg挿入
function markdownImage(){
var imgIns="!["+$("#image").val()+"]"+"("+$("#image2").val()+")";
if(imgIns!="![]()"){
$("#textarea").val($("#textarea").val()+imgIns);
$("#image").val("");
$("#image2").val("");
$("#textarea").focus();
}
}
//文字数をチェック(hタグ用)
function str_count(all, part) {
return (all.match(new RegExp(part, "g")) || []).length;
}
//プレビュー
function preview(){
$("#preview-field").show();
$("#toot-field").hide();
$("#preview-btn").hide();
var bb=escape_html($("#textarea").val());
//quote
var bb=bb.replace(/>(.+)$/g,'
$1<\/blockquote>'); //spin var bb=bb.replace(/\[spin\](.+)\[\/spin\]/g,'$1<\/span>'); //pulse var bb=bb.replace(/\[pulse\](.+)\[\/pulse\]/g,'$1<\/span>'); //large var bb=bb.replace(/\[large=([0-9]{1,2})x\](.+)\[\/large\]/g,'$2<\/span>'); //vertical var bb=bb.replace(/\[flip=vertical\](.+)\[\/flip\]/g,'$1<\/span>'); //horizontal var bb=bb.replace(/\[flip=horizontal\](.+)\[\/flip\]/g,'$1<\/span>'); //b var bb=bb.replace(/\[b\](.+)\[\/b\]/g,'$1<\/b>'); //i var bb=bb.replace(/\[i\](.+)\[\/i\]/g,'$1<\/i>'); //u var bb=bb.replace(/\[u\](.+)\[\/u\]/g,'$1<\/u>'); //s var bb=bb.replace(/\[s\](.+)\[\/s\]/g,'$1<\/s>'); //size var bb=bb.replace(/\[size=([0-9]{1,2})\](.+)\[\/size\]/g,'$2<\/span>'); //colorhex var bb=bb.replace(/\[colorhex=([A-Fa-f0-9]+)\](.+)\[\/colorhex\]/g,'$2<\/span>'); //code var bb=bb.replace(/`(.+)`/g,'$1<\/code>'); //index var m; m=bb.match(/^#{1,6}(.+)$/gm); if(m){ for(let i = 0; i < m.length; i++) { var t=m[i].match(/^#{1,6}(.+)$/); var indexct='
'+t[1]+' '; var bb=bb.replace(new RegExp(m[i], ""),indexct); } } //img var bb=bb.replace(/!\[(.+)\]\((https:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)\)/g,''); //link var bb=bb.replace(/\[(.+)\]\((https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)\)/g,'$1<\/a>'); $("#md-preview").html(nl2br(bb)); } //Editで戻る function previewEdit(){ $("#preview-field").hide(); $("#toot-field").show(); $("#preview-btn").show(); $("#md-preview").html(""); }