thedesk/app/js/post/bb-md.js

316 lines
9.1 KiB
JavaScript
Raw Permalink Normal View History

2018-01-28 23:22:43 +11:00
//BBCodeとMarkdownの入力・パーサー
2018-02-09 03:43:11 +11:00
//アカウント変えた時にBBとかMDとか
2019-05-19 17:39:30 +10:00
function mdCheck() {
2018-02-09 03:43:11 +11:00
var acct_id = $("#post-acct-sel").val();
2019-05-19 17:39:30 +10:00
var profimg = localStorage.getItem("prof_" + acct_id);
if (!profimg) {
profimg = "../../img/missing.svg";
2018-08-21 04:26:14 +10:00
}
2019-05-19 17:39:30 +10:00
$("#acct-sel-prof").attr("src", profimg);
if (localStorage.getItem("post_" + acct_id)) {
$("#toot-post-btn").text(localStorage.getItem("post_" + acct_id) + "(" + localStorage.getItem("domain_" + acct_id) + ")");
} else {
$("#toot-post-btn").text(lang.lang_toot + "(" + localStorage.getItem("domain_" + acct_id) + ")");
}
if (!localStorage.getItem("bb_" + acct_id) && !localStorage.getItem("md_" + acct_id)) {
$(".markdown").addClass("hide");
2018-02-09 03:43:11 +11:00
$(".anti-markdown").addClass("hide");
2019-05-19 17:39:30 +10:00
} else {
2018-06-18 00:26:45 +10:00
$(".anti-markdown").removeClass("hide");
2019-05-19 17:39:30 +10:00
}
if ($(".markdown").hasClass("hide")) {
localStorage.setItem("md", "hide");
} else {
2018-02-09 03:43:11 +11:00
localStorage.removeItem("md");
}
2018-03-20 15:55:25 +11:00
var domain = localStorage.getItem("domain_" + acct_id);
2019-05-19 17:39:30 +10:00
if (domain == "itabashi.0j0.jp") {
2018-04-09 00:17:33 +10:00
$("#limited-button").removeClass("hide");
2019-05-19 17:39:30 +10:00
} else {
2018-04-09 00:17:33 +10:00
$("#limited-button").addClass("hide");
2018-03-20 15:55:25 +11:00
}
2019-05-19 17:39:30 +10:00
if (domain == "kirishima.cloud") {
2018-03-31 13:39:06 +11:00
$("#faicon-btn").show();
2019-05-19 17:39:30 +10:00
} else {
2018-03-31 13:39:06 +11:00
$("#faicon-btn").hide();
}
2019-05-19 17:39:30 +10:00
if (domain == "imastodon.net") {
2018-05-20 16:17:10 +10:00
trendTag();
2019-05-19 17:39:30 +10:00
} else {
2018-05-20 16:17:10 +10:00
$("#trendtag").html("");
}
2019-05-19 17:39:30 +10:00
if (localStorage.getItem("mode_" + domain) == "misskey") {
2019-06-07 02:11:04 +10:00
M.toast({ html: lang.lang_bbmd_misskey, displayLength: 5000 })
2018-07-30 21:03:49 +10:00
}
2019-05-19 17:39:30 +10:00
if (idata[domain + "_letters"]) {
$("#textarea").attr("data-length", idata[domain + "_letters"])
} else {
2018-04-16 23:58:14 +10:00
$("#textarea").attr("data-length", 500)
}
2019-05-19 17:39:30 +10:00
if (idata[domain + "_glitch"] === "true") {
2018-09-06 02:47:27 +10:00
$("#local-button").removeClass("hide");
2019-05-19 17:39:30 +10:00
} else {
2018-12-09 05:46:01 +11:00
$("#local-button").addClass("hide");
2018-09-06 02:47:27 +10:00
}
2018-06-18 00:26:45 +10:00
var multi = localStorage.getItem("multi");
if (multi) {
var obj = JSON.parse(multi);
2019-05-19 17:39:30 +10:00
if (obj[acct_id].background && obj[acct_id].background != "def" && obj[acct_id].text && obj[acct_id].text != "def") {
2018-06-18 00:26:45 +10:00
$("#toot-post-btn").removeClass("indigo");
2019-05-19 17:39:30 +10:00
$("#toot-post-btn").css("background-color", "#" + obj[acct_id].background);
$("#toot-post-btn").css("color", obj[acct_id].text);
} else {
$("#toot-post-btn").css("background-color", "");
$("#toot-post-btn").css("color", "");
2018-06-18 00:26:45 +10:00
$("#toot-post-btn").addClass("indigo");
}
}
loadVis();
2018-02-09 03:43:11 +11:00
}
2018-01-28 23:22:43 +11:00
//BOXのトグルボタン
2019-05-19 17:39:30 +10:00
function mdToggle() {
2018-01-28 23:22:43 +11:00
$(".markdown").toggleClass("hide");
$(".anti-markdown").toggleClass("hide");
2019-05-19 17:39:30 +10:00
if ($(".markdown").hasClass("hide")) {
localStorage.setItem("md", "hide");
} else {
2018-01-28 23:22:43 +11:00
localStorage.removeItem("md");
}
2019-05-19 17:39:30 +10:00
2018-01-28 23:22:43 +11:00
}
//最初に読み込みます(MD対応インスタンスかチェック)
2019-05-19 17:39:30 +10:00
if (localStorage.getItem("md") == "hide") {
2018-01-28 23:22:43 +11:00
$(".markdown").addClass("hide");
$(".anti-markdown").removeClass("hide");
}
//タグを選んだ時に(BB版)
2019-05-19 17:39:30 +10:00
function tagsel(tag) {
var acct_id = $("#post-acct-sel").val();
if (!localStorage.getItem("bb_" + acct_id)) {
return false;
}
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 {
'&': '&amp;',
"'": '&#x27;',
'`': '&#x60;',
'"': '&quot;',
'<': '&lt;',
'>': '&gt;',
}[match]
});
2018-01-28 23:22:43 +11:00
}
//テキストボックスで選択したやつをタグで囲む(BB版)
2019-05-19 17:39:30 +10:00
function surroundHTML(tagS, tagE) {
2018-02-09 03:43:11 +11:00
var acct_id = $("#post-acct-sel").val();
2019-05-19 17:39:30 +10:00
if (!localStorage.getItem("bb_" + acct_id)) {
return false;
}
2018-01-28 23:22:43 +11:00
var target = document.getElementById("textarea");
var pos = getAreaRange(target);
var val = target.value;
var range = val.slice(pos.start, pos.end);
2019-05-19 17:39:30 +10:00
var beforeNode = val.slice(0, pos.start);
var afterNode = val.slice(pos.end);
2018-01-28 23:22:43 +11:00
var insertNode;
2019-05-19 17:39:30 +10:00
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;
}
2018-01-28 23:22:43 +11:00
}
2019-05-19 17:39:30 +10:00
function markdown(tag, ck, br, space) {
if (space == "before") {
tagE = tag;
tag = " " + tag;
} else {
tagE = tag;
}
surroundMD(tag, tagE, ck, br);
$("#textarea").focus();
}
function surroundMD(tagS, tagE, ck, br) {
2018-02-09 03:43:11 +11:00
var acct_id = $("#post-acct-sel").val();
2019-05-19 17:39:30 +10:00
if (!localStorage.getItem("md_" + acct_id)) {
return false;
}
2018-01-28 23:22:43 +11:00
var target = document.getElementById("textarea");
var pos = getAreaRange(target);
var val = target.value;
var range = val.slice(pos.start, pos.end);
2019-05-19 17:39:30 +10:00
var beforeNode = val.slice(0, pos.start);
var afterNode = val.slice(pos.end);
2018-01-28 23:22:43 +11:00
var insertNode;
2019-05-19 17:39:30 +10:00
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;
2018-01-28 23:22:43 +11:00
}
}
//テキストボックスの前後チェック
function getAreaRange(obj) {
var pos = new Object();
2019-05-19 17:39:30 +10:00
if (window.getSelection()) {
2018-01-28 23:22:43 +11:00
pos.start = obj.selectionStart;
2019-05-19 17:39:30 +10:00
pos.end = obj.selectionEnd;
2018-01-28 23:22:43 +11:00
}
return pos;
}
//Markdownのリンク挿入
2019-05-19 17:39:30 +10:00
function markdownLink() {
2018-02-09 03:43:11 +11:00
var acct_id = $("#post-acct-sel").val();
2019-05-19 17:39:30 +10:00
if (!localStorage.getItem("md_" + acct_id)) {
return false;
}
var linkIns = "[" + $("#linkt").val() + "]" + "(" + $("#link2").val() + ")";
if (linkIns != "[]()") {
$("#textarea").val($("#textarea").val() + linkIns);
$("#linkt").val("");
$("#link2").val("");
$("#textarea").focus();
2018-01-28 23:22:43 +11:00
}
}
//Markdownのimg挿入
2019-05-19 17:39:30 +10:00
function markdownImage() {
2018-02-09 03:43:11 +11:00
var acct_id = $("#post-acct-sel").val();
2019-05-19 17:39:30 +10:00
if (!localStorage.getItem("md_" + acct_id)) {
return false;
}
var imgIns = "![" + $("#image").val() + "]" + "(" + $("#image2").val() + ")";
if (imgIns != "![]()") {
$("#textarea").val($("#textarea").val() + imgIns);
$("#image").val("");
$("#image2").val("");
$("#textarea").focus();
2018-01-28 23:22:43 +11:00
}
}
//文字数をチェック(hタグ用)
function str_count(all, part) {
2019-05-19 17:39:30 +10:00
return (all.match(new RegExp(part, "g")) || []).length;
2018-01-28 23:22:43 +11:00
}
//プレビュー
2019-05-19 17:39:30 +10:00
function preview() {
$("#preview-field").show();
$("#toot-field").hide();
$("#preview-btn").hide();
var bb = escape_html($("#textarea").val());
2018-01-28 23:22:43 +11:00
//quote
2019-05-19 17:39:30 +10:00
var bb = bb.replace(/>(.+)$/g, '<blockquote>$1<\/blockquote>');
2018-01-28 23:22:43 +11:00
//spin
2019-05-19 17:39:30 +10:00
var bb = bb.replace(/\[spin\](.+)\[\/spin\]/g, '<span class="fa fa-spin">$1<\/span>');
2018-01-28 23:22:43 +11:00
//pulse
2019-05-19 17:39:30 +10:00
var bb = bb.replace(/\[pulse\](.+)\[\/pulse\]/g, '<span class="bbcode-pulse-loading">$1<\/span>');
2018-01-28 23:22:43 +11:00
//large
2019-05-19 17:39:30 +10:00
var bb = bb.replace(/\[large=([0-9]{1,2})x\](.+)\[\/large\]/g, '<span class="fa fa-$1x">$2<\/span>');
2018-01-28 23:22:43 +11:00
//vertical
2019-05-19 17:39:30 +10:00
var bb = bb.replace(/\[flip=vertical\](.+)\[\/flip\]/g, '<span class="fa fa-flip-vertical">$1<\/span>');
2018-01-28 23:22:43 +11:00
//horizontal
2019-05-19 17:39:30 +10:00
var bb = bb.replace(/\[flip=horizontal\](.+)\[\/flip\]/g, '<span class="fa fa-flip-horizontal">$1<\/span>');
2018-01-28 23:22:43 +11:00
//b
2019-05-19 17:39:30 +10:00
var bb = bb.replace(/\[b\](.+)\[\/b\]/g, '<b>$1<\/b>');
2018-01-28 23:22:43 +11:00
//i
2019-05-19 17:39:30 +10:00
var bb = bb.replace(/\[i\](.+)\[\/i\]/g, '<i>$1<\/i>');
2018-01-28 23:22:43 +11:00
//u
2019-05-19 17:39:30 +10:00
var bb = bb.replace(/\[u\](.+)\[\/u\]/g, '<u>$1<\/u>');
2018-01-28 23:22:43 +11:00
//s
2019-05-19 17:39:30 +10:00
var bb = bb.replace(/\[s\](.+)\[\/s\]/g, '<s>$1<\/s>');
2018-01-28 23:22:43 +11:00
//size
2019-05-19 17:39:30 +10:00
var bb = bb.replace(/\[size=([0-9]{1,2})\](.+)\[\/size\]/g, '<span style="font-size:$1px">$2<\/span>');
2018-01-28 23:22:43 +11:00
//colorhex
2019-05-19 17:39:30 +10:00
var bb = bb.replace(/\[colorhex=([A-Fa-f0-9]+)\](.+)\[\/colorhex\]/g, '<span style="color:#$1">$2<\/span>');
2018-01-28 23:22:43 +11:00
//code
2019-05-19 17:39:30 +10:00
var bb = bb.replace(/`(.+)`/g, '<code>$1<\/code>');
2018-02-13 06:16:46 +11:00
//head
2018-01-28 23:22:43 +11:00
var m;
2019-05-19 17:39:30 +10:00
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 = '<h' + str_count(m[i], "#") + '>' + t[1] + '</h' + str_count(m[i], "#") + '>';
var bb = bb.replace(new RegExp(m[i], ""), indexct);
}
2018-01-28 23:22:43 +11:00
}
2018-02-13 06:16:46 +11:00
//list(ul)
var li;
2019-05-19 17:39:30 +10:00
li = bb.match(/^\- (.+)$/gm);
if (li) {
for (let l = 0; l < li.length; l++) {
var u = li[l].match(/^\- (.+)$/);
var listUl = '<li>' + u[1] + '</li>';
if (l == 0) {
listUl = '<ul>' + listUl;
}
if (l == li.length - 1) {
listUl = listUl + '</ul>';
}
var bb = bb.replace(new RegExp(li[l], ""), listUl);
2018-02-13 06:16:46 +11:00
}
}
//list(ol)
var li;
2019-05-19 17:39:30 +10:00
li = bb.match(/^1\. (.+)$/gm);
if (li) {
for (let l = 0; l < li.length; l++) {
var u = li[l].match(/^1\. (.+)$/);
var listUl = '<li>' + u[1] + '</li>';
if (l === 0) {
listUl = '<ol>' + listUl;
}
if (l === li.length - 1) {
listUl = listUl + '</ol>';
}
var bb = bb.replace(new RegExp(li[l], ""), listUl);
2018-02-13 06:16:46 +11:00
}
}
2018-01-28 23:22:43 +11:00
//img
2019-05-19 17:39:30 +10:00
var bb = bb.replace(/!\[(.+)\]\((https:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)\)/g, '<img src="$2" text="$1" style="width:100%">');
2018-01-28 23:22:43 +11:00
//link
2019-05-19 17:39:30 +10:00
var bb = bb.replace(/\[(.+)\]\((https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)\)/g, '<a href="$2" target="_blank">$1<\/a>');
bb = nl2br(bb);
bb = bb.replace(new RegExp("</li><br />", "g"), "");
2018-02-13 06:16:46 +11:00
$("#md-preview").html(bb);
2019-05-19 17:39:30 +10:00
}
//Editで戻る
function previewEdit() {
$("#preview-field").hide();
$("#toot-field").show();
$("#preview-btn").show();
$("#md-preview").html("");
}