//絵文字ピッカー //最初に読み込む $("#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 = '"; $("#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 + "'; } else { if (emoji.divider) { html = html + '
' + emoji.cat + "
"; } else { if (emoji.listed) { html = html + "'; } } } } } $("#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(); }