320 lines
8.5 KiB
JavaScript
320 lines
8.5 KiB
JavaScript
//絵文字ピッカー
|
||
//最初に読み込む
|
||
$("#emoji-before").addClass("disabled");
|
||
$("#emoji-next").addClass("disabled");
|
||
|
||
//絵文字ボタンのトグル
|
||
function emojiToggle(reaction) {
|
||
var acct_id = $("#post-acct-sel").val();
|
||
var selin = $("#textarea").prop("selectionStart");
|
||
if (!selin) {
|
||
selin = 0;
|
||
}
|
||
if ($("#emoji").hasClass("hide")) {
|
||
$("#emoji").removeClass("hide");
|
||
$("#right-side").show();
|
||
$("#right-side").css("width", "300px");
|
||
$("#left-side").css("width", "calc(100% - 300px)");
|
||
var width = localStorage.getItem("postbox-width");
|
||
if (width) {
|
||
width = width.replace("px", "") * 1 + 300;
|
||
} else {
|
||
width = 600;
|
||
}
|
||
$("#post-box").css("width", width + "px");
|
||
$("#suggest").html("");
|
||
if (!localStorage.getItem("emojis_" + acct_id)) {
|
||
var html = '<button class="btn waves-effect green" style="width:100%; padding:0; margin-top:0;" onclick="emojiGet(\'true\');">' + lang.lang_emoji_get + "</button>";
|
||
$("#emoji-list").html(html);
|
||
} else {
|
||
emojiList("home", reaction);
|
||
}
|
||
} else {
|
||
$("#poll").addClass("hide");
|
||
$("#right-side").hide();
|
||
$("#right-side").css("width", "300px");
|
||
$("#emoji").addClass("hide");
|
||
$("#suggest").html("");
|
||
$("#left-side").css("width", "100%");
|
||
var width = localStorage.getItem("postbox-width");
|
||
if (width) {
|
||
width = width.replace("px", "") * 1;
|
||
} else {
|
||
width = 300;
|
||
}
|
||
$("#post-box").css("width", width + "px");
|
||
}
|
||
}
|
||
|
||
//絵文字リスト挿入
|
||
function emojiGet(parse, started) {
|
||
$("#emoji-list").text("Loading...");
|
||
var acct_id = $("#post-acct-sel").val();
|
||
var domain = localStorage.getItem("domain_" + acct_id);
|
||
if (localStorage.getItem("mode_" + domain) != "misskey") {
|
||
var start = "https://" + domain + "/api/v1/custom_emojis";
|
||
fetch(start, {
|
||
method: "GET",
|
||
headers: {
|
||
"content-type": "application/json"
|
||
}
|
||
})
|
||
.then(function(response) {
|
||
if (!response.ok) {
|
||
response.text().then(function(text) {
|
||
setLog(response.url, response.status, text);
|
||
});
|
||
}
|
||
return response.json();
|
||
})
|
||
.catch(function(error) {
|
||
todo(error);
|
||
setLog(start, "JSON", error);
|
||
console.error(error);
|
||
})
|
||
.then(function(json) {
|
||
if (parse == "true") {
|
||
$("#emoji-list").text("Parsing...");
|
||
var md = {
|
||
categorized: {},
|
||
uncategorized: []
|
||
};
|
||
var if_categorized = false;
|
||
Object.keys(json).forEach(function(key) {
|
||
var emoji = json[key];
|
||
if (emoji.visible_in_picker) {
|
||
var listed = true;
|
||
} else {
|
||
var listed = false;
|
||
}
|
||
if (emoji.category) {
|
||
var cat = emoji.category;
|
||
if (!md["categorized"][cat]) {
|
||
md["categorized"][cat] = [];
|
||
}
|
||
md["categorized"][cat].push({
|
||
shortcode: emoji.shortcode,
|
||
url: emoji.url,
|
||
listed: listed
|
||
});
|
||
if_categorized = true;
|
||
} else {
|
||
md["uncategorized"].push({
|
||
shortcode: emoji.shortcode,
|
||
url: emoji.url,
|
||
listed: listed
|
||
});
|
||
}
|
||
});
|
||
console.log(md);
|
||
//絵文字をマストドン公式と同順にソート
|
||
md["uncategorized"].sort(function(a, b) {
|
||
if (a.shortcode < b.shortcode) return -1;
|
||
if (a.shortcode > b.shortcode) return 1;
|
||
return 0;
|
||
});
|
||
Object.keys(md["categorized"]).forEach(function(key) {
|
||
md["categorized"][key].sort(function(a, b) {
|
||
if (a.shortcode < b.shortcode) return -1;
|
||
if (a.shortcode > b.shortcode) return 1;
|
||
return 0;
|
||
});
|
||
});
|
||
|
||
md["if_categorized"] = if_categorized;
|
||
localStorage.setItem("emojis_" + acct_id, JSON.stringify(md));
|
||
} else {
|
||
localStorage.setItem("emojis_" + acct_id, JSON.stringify(md));
|
||
}
|
||
localStorage.setItem("emojiseek", 0);
|
||
if (!started) {
|
||
emojiList("home");
|
||
}
|
||
});
|
||
} else {
|
||
var start = "https://" + domain + "/api/meta";
|
||
fetch(start, {
|
||
method: "POST",
|
||
headers: {
|
||
"content-type": "application/json"
|
||
}
|
||
})
|
||
.then(function(response) {
|
||
if (!response.ok) {
|
||
response.text().then(function(text) {
|
||
setLog(response.url, response.status, text);
|
||
});
|
||
}
|
||
return response.json();
|
||
})
|
||
.catch(function(error) {
|
||
todo(error);
|
||
setLog(start, "JSON", error);
|
||
console.error(error);
|
||
})
|
||
.then(function(json) {
|
||
if (json.enableEmojiReaction) {
|
||
localStorage.setItem("emojiReaction_" + acct_id, "true");
|
||
} else {
|
||
localStorage.setItem("emojiReaction_" + acct_id, "disabled");
|
||
}
|
||
var emojis = json.emojis;
|
||
var md = { uncategorized: [] };
|
||
Object.keys(emojis).forEach(function(key) {
|
||
var emoji = emojis[key];
|
||
md["uncategorized"].push({
|
||
shortcode: emoji.name,
|
||
url: emoji.url,
|
||
listed: true
|
||
});
|
||
});
|
||
md["if_categorized"] = false;
|
||
if (parse == "true") {
|
||
$("#emoji-list").text("Parsing...");
|
||
//絵文字をマストドン公式と同順にソート
|
||
md["uncategorized"].sort(function(a, b) {
|
||
if (a.shortcode < b.shortcode) return -1;
|
||
if (a.shortcode > b.shortcode) return 1;
|
||
return 0;
|
||
});
|
||
localStorage.setItem("emojis_" + acct_id, JSON.stringify(md));
|
||
} else {
|
||
localStorage.setItem("emojis_" + acct_id, JSON.stringify(md));
|
||
}
|
||
localStorage.setItem("emojiseek", 0);
|
||
if (!started) {
|
||
emojiList("home");
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
//リストの描画
|
||
function emojiList(target, reaction) {
|
||
$("#now-emoji").text(lang.lang_emoji_custom);
|
||
var acct_id = $("#post-acct-sel").val();
|
||
if (reaction && localStorage.getItem("emojiReaction_" + acct_id) != "true") {
|
||
console.error("Disabled");
|
||
clear();
|
||
hide();
|
||
return false;
|
||
}
|
||
var start = localStorage.getItem("emojiseek");
|
||
if (target == "next") {
|
||
var start = start * 1 + 127;
|
||
localStorage.setItem("emojiseek", start);
|
||
} else if (target == "before") {
|
||
var start = start - 127;
|
||
localStorage.setItem("emojiseek", start);
|
||
} else {
|
||
var start = 0;
|
||
localStorage.getItem("emojiseek", 0);
|
||
}
|
||
var html = "";
|
||
var raw = JSON.parse(localStorage.getItem("emojis_" + acct_id));
|
||
console.log(raw);
|
||
if (raw.if_categorized) {
|
||
var obj = [
|
||
{
|
||
divider: true,
|
||
cat: lang.lang_emoji_uncat
|
||
}
|
||
];
|
||
var cats = raw["uncategorized"];
|
||
obj = obj.concat(cats);
|
||
Object.keys(raw["categorized"]).forEach(function(key) {
|
||
var cats = raw["categorized"][key];
|
||
obj = obj.concat([
|
||
{
|
||
divider: true,
|
||
cat: key
|
||
}
|
||
]);
|
||
obj = obj.concat(cats);
|
||
});
|
||
} else {
|
||
var obj = raw["uncategorized"];
|
||
}
|
||
console.log(obj);
|
||
|
||
var num = obj.length;
|
||
if (num < start) {
|
||
var start = 0;
|
||
localStorage.setItem("emojiseek", start);
|
||
}
|
||
var page = Math.ceil(num / 126);
|
||
$("#emoji-sum").text(page);
|
||
var ct = Math.ceil(start / 126);
|
||
if (ct === 0) {
|
||
if (num > 0) {
|
||
var ct = 1;
|
||
}
|
||
$("#emoji-before").addClass("disabled");
|
||
} else {
|
||
$("#emoji-before").removeClass("disabled");
|
||
}
|
||
if (page != 1) {
|
||
$("#emoji-next").removeClass("disabled");
|
||
} else {
|
||
$("#emoji-next").addClass("disabled");
|
||
}
|
||
$("#emoji-count").text(ct);
|
||
for (i = start; i < start + 126; i++) {
|
||
var emoji = obj[i];
|
||
if (emoji) {
|
||
if (reaction) {
|
||
html = html + "<a onclick=\"emojiReaction(':" + emoji.shortcode + ':\')" class="pointer"><img src="' + emoji.url + '" width="20" title="' + emoji.shortcode + '"></a>';
|
||
} else {
|
||
if (emoji.divider) {
|
||
html = html + '<p style="margin-bottom:0">' + emoji.cat + "</p>";
|
||
} else {
|
||
if (emoji.listed) {
|
||
html = html + "<a onclick=\"emojiInsert(':" + emoji.shortcode + ':\')" class="pointer"><img src="' + emoji.url + '" width="20" title="' + emoji.shortcode + '"></a>';
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
$("#emoji-list").html(html);
|
||
}
|
||
|
||
//絵文字など様々なものをテキストボックスに挿入
|
||
function emojiInsert(code, del) {
|
||
var now = $("#textarea").val();
|
||
var selin = $("#textarea").prop("selectionStart");
|
||
if (localStorage.getItem("emoji-zero-width") == "yes") {
|
||
var blank = "";
|
||
} else {
|
||
var blank = " ";
|
||
}
|
||
var before = now.substr(0, selin);
|
||
if (before.slice(-1) != " ") {
|
||
before = before + blank;
|
||
}
|
||
var after = now.substr(selin, now.length);
|
||
if (after.slice(-1) != " ") {
|
||
after = blank + after;
|
||
}
|
||
newt = before + code + after;
|
||
if (!del) {
|
||
$("#textarea").val(newt);
|
||
//emoji();
|
||
} else {
|
||
var regExp = new RegExp(del.replace(/[.*+?^=!:${}()|[\]\/\\]/g, "\\$&"), "g");
|
||
var now = now.replace(regExp, "");
|
||
$("#textarea").val(now + blank + code);
|
||
}
|
||
|
||
$("#textarea").focus();
|
||
}
|
||
//改行挿入
|
||
function brInsert(code) {
|
||
if (!$("#post-box").hasClass("appear")) {
|
||
localStorage.setItem("nohide", true);
|
||
show();
|
||
}
|
||
var now = $("#textarea").val();
|
||
$("#textarea").val(now + code);
|
||
$("#textarea").focus();
|
||
}
|