NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name BookTruyen.com QuickPaste // @namespace mkbyme.quickpaste // @version 0.1 // @description QuickPaste for Add Chapter // @author Mkbyme // @match http://*.booktruyen.com/account/add_chapter/* // @grant none // @homepageURL https://www.facebook.com/mkbyme // @supportURL https://www.facebook.com/mkbyme // @license GPL-3.0-or-later // @collaborator mkbyme // @required https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js // @required https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js // @required https://cdnjs.cloudflare.com/ajax/libs/jquery-highlighttextarea/3.1.3/jquery.highlighttextarea.min.js // @updateURL https://openuserjs.org/install/mkbyme/BookTruyen.com_QuickPaste.user.js // ==/UserScript== //create element var CookieOptions = CookieOptions || {}; var $ = $ || window.$ || window.jQuery; var Constant = Constant || {}; /* * Contant */ Constant = { CookiesName: 'qpmkconfig' } /* * Cookies key */ CookieOptions = { SplitTitle: "splitTitle", OptionLoop: "optionLoop", SignEnd: "signEnd", SignStart: "signStart", }; /* * format string */ function format(format) { var args = Array.prototype.slice.call(arguments, 1); return format.replace(/{(\d+)}/g, function (match, number) { return typeof args[number] != 'undefined' ? args[number] : match; }); } /* * create new DOM elements */ function ce(n) { console.log($.highlightTextarea); return document.createElement(n); } /* * inject style to head of html */ function addStyle(style) { var s = ce("style"), h = document.head || document.getElementsByTagName("head")[0]; s.type = "text/css"; s.appendChild(document.createTextNode(style)); h.appendChild(s); } /* * add quickpaste css */ function addCss() { var s = ""; s += "#qpmk{background-color: #2d2d2d;padding: 3px 15px;color: #ebebeb;border-radius: 5px 5px 0px 0px;margin-bottom: 15px;}"; s += "#qpmk>.form-group>div{font-size: 13px;color: #bef385;}"; s += "#qpmk>p{font-size:13px;color: #c7c7c7;text-align: right;}"; addStyle(s); } /* * template inject */ function createInjectHTML() { var h = ""; h += "<div id=\"qpmk\"><h3>Đăng Truyện Nhanh Script</h3><div class=\"form-group\">"; h += "<div>Ví dụ tên Chương 1, Chương 2, Chương n thì điền \"Chương \" để thực hiện dán tự động<br>"; h += "<ol><li>Nhập số chương cần đăng = số_hiện_tại + số_chương_đăng</li>"; h += "<li>Mở tệp chứa nội dung đã convert chọn và copy đoạn chứa số_chương_đăng</li><li>Dán vào DÁN VÀO ĐÂY</li>"; h += "<li>Dà soát tên chương và số chương.</li><li>Nhấn <b>Đăng Chương</b></li></ol>"; h += "<span style=\"color:red\">* </span>Trước khi nhấn nút <b class=\"text-info\">Đăng Chương</b> thì phải thực hiện sao chép nội dung truyện trước.</div>"; h += "<label>Tiêu Đề Chương(để chia tách các chương truyện)</label>"; h += "<input type=\"text\" id=\"qpSplitString\" class=\"form-control\" value=\" Chương \" placeholder=\"Nhập tiêu đề chứa từ cách chương/chapter\"></div>"; //sign h += "<div class=\"form-group\"><label>Chữ Ký (chèn ở đầu mỗi chương)</label><textarea placeholder=\"Nội dung chữ ký, sẽ được thêm vào ở đầu mỗi chương...\" id=\"qpSignStart\" class=\"form-control\" rows=\"2\"></textarea></div>"; h += "<div class=\"form-group\"><label>Chữ Ký (chèn ở cuối mỗi chương)</label><textarea placeholder=\"Nội dung chữ ký, sẽ được thêm vào ở cuối mỗi chương...\" id=\"qpSignEnd\" class=\"form-control\" rows=\"2\"></textarea></div>"; //end sign //option h += "<div class=\"form-group\"><label>Tùy chọn</label>"; h += "<div class=\"form-inline\"><label>Tiêu đề chương lặp <input type=\"checkbox\" id=\"qpOptionLoop\" class=\"form-control\"></label> (dạng Chương 1 abc Chương 1 abc - Nội dung chương)</div>"; h += "<div class=\"form-group\"><input type=\"button\" value=\"Lưu Thiết Lập\" class=\"form-control btn btn-success\" id=\"qpSaveConfig\"></div>"; h += "</div>"; //end option h += "<div class=\"form-group\"><label>Dán Vào Đây(CTRL + V)</label>"; h += "<textarea placeholder=\"dán nội dung vào đây - CTRL + V\" id=\"qpValidate\" class=\"form-control\" rows=\"5\"></textarea></div>"; h += "<span id=\"qpNoti\" style=\"margin:0px 15px;font-weight:bold\"></span>"; h += "<button class=\"btn btn-read\"onclick=\"document.getElementsByName('Newchapper')[0].click();\">Đăng Chương</button><span id=\"qpNoti\" style=\"margin-left:15px;font-weight:bold\"></span>"; h += "<p>© by <a href=\"fb.me/mkbyme\">Mkbyme</a></p></div>"; var example = '<div class="container">' + ' <button type="button" class="btn btn-default btn-success" id="myBtn">Xem ví dụ</button>' + ' <!-- Modal -->' + ' <div class="modal fade" id="myModal" role="dialog">' + ' <div class="modal-dialog modal-lg">' + ' <!-- Modal content-->' + ' <div class="modal-content">' + ' <div class="modal-header">' + ' <button type="button" class="close" data-dismiss="modal">×</button>' + ' <h3><span class="glyphicon glyphicon-info-sign"></span> Ví dụ các loại lặp chương</h3>' + ' </div>' + ' <div class="modal-body">' + ' <p><strong>Ví dụ không cần tích <b>Tùy chọn <span style="color:green">Tiêu đề chương lặp</span></b></strong> (chọn và copy sau đó dán để test)</p>' + '<pre>Chương 10: Lôi Hỏa Thánh Điển\r\n\r\n' + 'Chứng kiến một khối lại một khối tinh xảo bánh ngọt bị Nhiếp Ly, \r\n' + 'Đỗ Trạch cùng Lục Phiêu tiêu diệt gọn gàng, những thế gia kia đám\r\n' + 'đệ tử trong nội tâm đều phiền muộn hư mất, vì cái gì chính mình\r\n' + 'không có đãi ngộ như vậy?\r\n' + '\r\n' + 'Chương 11: Uy hiếp\r\n' + 'Nhiếp Ly nhìn xem nổi trận lôi đình Thẩm Tú, cười nhạt một tiếng nói: \r\n' + '"Thẩm Tú Đạo sư thật đúng là bác học. ' + 'Chẳng lẽ Thẩm Tú Đạo sư xem qua trên thế giới này tất cả sách hay sao?" \r\n' + 'Kiếp trước Thẩm Tú cũng là như vậy man không nói đạo lý.\r\n' + '</pre>' + ' <br />' + ' <p><strong>Ví dụ cần tích <b>Tùy chọn <span style="color:green">Tiêu đề chương lặp</span></b></strong> (chọn và copy sau đó dán để test)</p>' + '<pre>Chương 10: Lôi Hỏa Thánh Điển\r\n\r\n' + 'Chương 10: Lôi Hỏa Thánh Điển\r\n\r\n' + 'Chứng kiến một khối lại một khối tinh xảo bánh ngọt bị Nhiếp Ly, \r\n' + 'Đỗ Trạch cùng Lục Phiêu tiêu diệt gọn gàng, những thế gia kia đám\r\n' + ' đệ tử trong nội tâm đều phiền muộn hư mất, vì cái gì chính mình\r\n' + ' không có đãi ngộ như vậy?\r\n' + ' \r\n' + 'Chương 11: Uy hiếp\r\n\r\n' + 'Chương 11: Uy hiếp\r\n\r\n' + 'Nhiếp Ly nhìn xem nổi trận lôi đình Thẩm Tú, cười nhạt một tiếng nói: \r\n' + '"Thẩm Tú Đạo sư thật đúng là bác học. ' + 'Chẳng lẽ Thẩm Tú Đạo sư xem qua trên thế giới này tất cả sách hay sao?" \r\n' + 'Kiếp trước Thẩm Tú cũng là như vậy man không nói đạo lý.\r\n' + '</pre>' + ' </div>' + ' <div class="modal-footer">' + ' <button type="submit" class="btn btn-default btn-default" data-dismiss="modal"><span class="glyphicon glyphicon-remove"></span> Đóng</button>' + ' ' + ' </div>' + ' </div>' + ' </div>' + ' </div>' + '</div>'; h += example; $(".form-horizontal").before(h); } /* * process copy and paste data */ function process() { $("#qpValidate").on("paste", function (e) { $(this).val(""); setTimeout(function () { var content = $("#qpValidate").val(), splitStr = $("#qpSplitString").val(), splitStrTrim = splitStr.trim(), lstChapterTitle = $("input[name^=title]"), lstChapterContent = $("textarea[name^=content"), isLoopChapterTitle = $("#qpOptionLoop")[0].checked, isError = false, signStartStr = $("#qpSignStart").val(), signEndStr = $("#qpSignEnd").val(); content = content.split("\n" + splitStr).filter(function (entry) { return entry.trim() !== ""; }); if (!isLoopChapterTitle && content.length < lstChapterContent.length) { isError = true; } if (isLoopChapterTitle && (content.length / 2) < lstChapterContent.length) { isError = true; } //error if (isError) { $("#qpNoti").html("Số chương copy chưa đủ, cần sao thêm " + (lstChapterContent.length - 1 - (isLoopChapterTitle === true ? content.length / 2 : content.length)) + " chương nữa, Hãy thử lại! <button class=\"btn btn-danger\" onclick=\"javascript:document.getElementsByName('Newchapper')[0].click();\">Vẫn Đăng</button>").removeClass("text-notify").addClass("text-danger"); $("#qpValidate").val(""); //go on work } //not loop chapter title do var splitStrTrimLower = splitStrTrim.toLowerCase(); var contentLength = isLoopChapterTitle ? (content.length / 2) : content.length; $.each(lstChapterContent, (function (key, value) { if (key < contentLength) { if (key < lstChapterTitle.length) { //loop chapter skip first loop, and take next var idx = isLoopChapterTitle ? (key * 2 + 1) : key; var chapterContent = content[idx].trim().split("\n"), chapterTitleTrim = chapterContent.length > 0 ? chapterContent.shift(0).trim().toLowerCase() : ""; if (chapterTitleTrim.startsWith(splitStrTrimLower)) { $(lstChapterTitle[key]).val(capString(chapterTitleTrim)); $(this).val(signStartStr + "\r\n" + chapterContent.join("\r\n") + "\r\n\r\n" + signEndStr); } else { $(lstChapterTitle[key]).val(capString(splitStrTrim + " " + chapterTitleTrim)); $(this).val(signStartStr + "\r\n" + chapterContent.join("\r\n") + "\r\n\r\n" + signEndStr); } } } else { $("#qpValidate").val("Đã thực hiện được " + key + " /" + (lstChapterContent.length) + " nhập ban đầu, có thể nhấn Vẫn Đăng để tiếp tục"); return false; } })); //after insert do if (!isError) { $("#qpNoti").removeClass("text-danger").addClass("text-notify").text("OK, dà soát lại chương và nhấn Đăng Chương"); $("#qpValidate").val("Đã thực hiện xong, OK"); } }, 500); }); $("#qpSaveConfig").on("click", function (e) { var formatStr = CookieOptions.SplitTitle + "={0}&" + CookieOptions.OptionLoop + "={1}&" + CookieOptions.SignEnd + "={2}&" + CookieOptions.SignStart + "={3}"; var value = format(formatStr, $("#qpSplitString").val(), $("#qpOptionLoop")[0].checked, $("#qpSignEnd").val(), $("#qpSignStart").val()); var cookieStr = Constant.CookiesName + "=" + escape(value) + "; "; var today = new Date(); var expr = new Date(today.getTime() + 30 * 24 * 60 * 60 * 1000); cookieStr += "expires=" + expr.toGMTString() + "; "; cookieStr += "path=/; "; cookieStr += "domain=" + window.location.host + "; "; document.cookie = cookieStr; alert("Đã lưu lại thiết lập"); }); qpreadCookies(); } /* * upper first char of each word in string */ function capString(str) { var buffer = ''; if (str && typeof str === 'string') { var arr = str.split(" ").filter(function (entry) { return entry.trim() !== ""; }); var buffArr = []; for (var i = 0; i < arr.length; i++) { var s = arr[i]; if (s.length > 0) { buffArr.push(s.charAt(0).toUpperCase() + s.slice(1)); } } buffer = buffArr.join(" "); } return buffer; } /* * read cookies */ function qpreadCookies() { var configCookieData = ""; var cookies = document.cookie.split('; '); for (var ii = 0; ii < cookies.length; ii++) { var nameValue = cookies[ii].split('='); if (nameValue && nameValue[0] === Constant.CookiesName) { configCookieData = unescape(nameValue[1]); break; } } if (configCookieData) { var arr = configCookieData.split("&"); var configObject = {}; for (var i = 0, l = arr.length; i < l; i++) { var splitData = []; var str = arr[i]; if (typeof str === 'string' && (splitData = str.split('=')).length === 2) { configObject[splitData[0]] = splitData[1]; } } $("#qpSplitString").val(configObject[CookieOptions.SplitTitle] ? configObject[CookieOptions.SplitTitle] : ""); $("#qpOptionLoop").val(configObject[CookieOptions.OptionLoop] === "true" ? true : false); $("#qpSignEnd").val(configObject[CookieOptions.SignEnd] ? configObject[CookieOptions.SignEnd] : ""); $("#qpSignStart").val(configObject[CookieOptions.SignStart] ? configObject[CookieOptions.SignStart] : ""); delete configObject; } } /* * run */ function init() { addCss(); createInjectHTML(); process(); $("#qpValidate").focus(); //show example $(document).ready(function () { $("#myBtn").click(function () { $("#myModal").modal(); }); }); } init();