Greasy Fork is available in English.

BookTruyen.com QuickPaste

QuickPaste for Add Chapter

// ==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
// ==/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">&times;</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, 1-Nhấn Tiếp Tục sau đó nhấn 2-Đă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();