Как я могу изменить редактор Google Pagedown, чтобы использовать значки шрифтов?

Мы используем редактор pagedown с директивой AngularJS. Я считаю, что это то же самое, что и при переполнении стека:

angular.module("ui.pagedown", [])
.directive("pagedownEditor", function ($compile, $timeout, $window, $q) {
    var nextId = 0;
    var converter = Markdown.getSanitizingConverter();
    Markdown.Extra.init(converter, mdExtraOptions);

    converter.hooks.chain("preBlockGamut", function (text, rbg) {
        return text.replace(/^ {0,3}""" *\n((?:.*?\n)+?) {0,3}""" *$/gm, function (whole, inner) {
            return "<blockquote>" + rbg(inner) + "</blockquote>\n";
        });
    });

    return {
        restrict: "E",
        scope: {
            content: "=",
            showPreview: "@",
            help: "&",
            insertImage: "&"
        },
        link: function (scope, element, attrs) {

            var editorUniqueId;

            if (attrs.id == null) {
                editorUniqueId = nextId++;
            } else {
                editorUniqueId = attrs.id;
            }

            // just hide the preview, we still need it for "onPreviewRefresh" hook
            var previewHiddenStyle = scope.showPreview == "false" ? "display: none;" : "";

            var newElement = $compile(
                '<div>' +
                    '<div class="wmd-panel">' +
                            '<div id="wmd-button-bar-' + editorUniqueId + '"></div>' +
                            '<textarea class="wmd-input" id="wmd-input-' + editorUniqueId + '" ng-model="content"></textarea>' +
                    '</div>' +
                    '<div id="wmd-preview-' + editorUniqueId + '" class="pagedown-preview wmd-panel wmd-preview" style="' + previewHiddenStyle + '"></div>' +
                '</div>')(scope);

            // html() doesn't work
            element.append(newElement);

            var help = angular.isFunction(scope.help) ? scope.help : function () {
                // redirect to the guide by default
                $window.open("http://daringfireball.net/projects/markdown/syntax", "_blank");
            };

            var editor = new Markdown.Editor(converter, "-" + editorUniqueId, {
                handler: help
            });

            var editorElement = angular.element(document.getElementById("wmd-input-" + editorUniqueId));

            //add watch for content
            if(scope.showPreview != "false") {
                scope.$watch('content', function () {
                    editor.refreshPreview();
                });
            }
            editor.hooks.chain("onPreviewRefresh", function() {
                // wire up changes caused by user interaction with the pagedown controls
                // and do within $apply
                $timeout(function() {
                    scope.content = editorElement.val();
                });
            });

            if (angular.isFunction(scope.insertImage)) {
                editor.hooks.set("insertImageDialog", function(callback) {
                    // expect it to return a promise or a url string
                    var result = scope.insertImage();

                    // Note that you cannot call the callback directly from the hook; you have to wait for the current scope to be exited.
                    // https://code.google.com/p/pagedown/wiki/PageDown#insertImageDialog
                    $timeout(function() {
                        if (!result) {
                            // must be null to indicate failure
                            callback(null);
                        } else {
                            // safe way to handle either string or promise
                            $q.when(result).then(
                                function success(imgUrl) {
                                    callback(imgUrl);
                                },
                                function error(reason) {
                                    callback(null);
                                }
                            );
                        }
                    });

                    return true;
                });
            }

            editor.run();
        }
    }
})
.directive("pagedownViewer", function ($compile, $sce) {
    var converter = Markdown.getSanitizingConverter();
    Markdown.Extra.init(converter, mdExtraOptions);

    return {
        restrict: "E",
        scope: {
            content: "="
        },
        link: function (scope, element, attrs) {
            var unwatch;
            var run = function run() {
                // stop continuing and watching if scope or the content is unreachable
                if (!scope || (scope.content == undefined || scope.content == null) && unwatch) {
                    unwatch();
                    return;
                }

                scope.sanitizedContent = $sce.trustAsHtml(converter.makeHtml(scope.content));
            };

            unwatch = scope.$watch("content", run);

            run();

            var newElementHtml = "<pre ng-bind-html='sanitizedContent'></pre>";
            var newElement = $compile(newElementHtml)(scope);

            element.append(newElement);
        }
    }
});

http://plnkr.co/edit/1Vxo5UfYpHQdjhWatimU?p=preview

Мы хотели бы изменить это, чтобы использовать набор значков шрифтов вместо использования значков, но мы не уверены, как это сделать.

Есть ли у кого-нибудь идеи относительно того, что мне нужно сделать, чтобы он использовал потрясающий шрифт вместо значков по умолчанию.

Спасибо,


person Alan2    schedule 24.02.2015    source источник
comment
Чтобы было ясно, вы хотели бы заменить верхний ряд значков, то есть полужирный, курсив и т. д., на значки собственного шрифта? Можете ли вы включить значок шрифта awesome в plunkr, а также значки, которыми вы хотели бы его заменить. Скорее всего, это нужно будет сделать, изменив базовый файл Markdown.editor.js. В настоящее время он использует строку .png и кнопки наложения сверху.   -  person AdamSchuld    schedule 07.03.2015
comment
@ Адам - ​​Да, это именно то, что я хотел бы сделать. Я не уверен, насколько легко мне включить элементы шрифта, поскольку я не совсем знаком с использованием plunkr. Я думаю, что любое решение этого вопроса, в котором использовалось бы лучшее предположение о значках, было бы хорошим. Например, использование полужирного значка для полужирного и курсивного значка для курсива. Спасибо   -  person Alan2    schedule 07.03.2015
comment
В настоящее время рендеринг панели кнопок в редакторе Pagedown не настраивается, поэтому для правильного использования потрясающего шрифта вам необходимо разветвить код редактора Pagedown и применить там изменения. Если вы не планируете использовать свой собственный PageDown, вы можете взломать кнопки, но некоторые вещи не будут работать, например стиль, когда они отключены. Я собрал здесь краткий пример: plnkr.co/edit/dg5pgiLpZ5K2Owkpk8pR?p=preview< /а>. Если этого обходного пути вам достаточно, я могу объяснить решение в правильном ответе.   -  person nemesv    schedule 08.03.2015
comment
@nemesv - Спасибо, что нашли время, чтобы привести пример. Я думаю, что форк PageDown был бы полезен для нас. Я предполагаю, что нам просто нужно очень четко представлять, что нужно изменить в будущем, чтобы через год мы могли по-прежнему следить за любыми изменениями в PageDown и не упускать исправления ошибок. Просто чтобы уточнить, обходной путь у вас есть. Было ли это от форка PageDown, который вы изменили. Если да, то это именно то, что мы ищем. Спасибо   -  person Alan2    schedule 08.03.2015


Ответы (2)


В настоящее время редактор PageDown не поддерживает настройку отображения панели кнопок.

Таким образом, у вас остается три варианта:

  • вы просто создаете свой собственный файл изображения кнопок и используете его для значков. Однако в этом случае вы теряете преимущества использования font-awesome.
  • вы делаете форк и добавляете необходимую модификацию в Markdown.Editor.js
  • вы изменяете сгенерированный HTML после рендеринга редактора и удаляете старые кнопки и добавляете новые, но некоторые функции не будут работать, подробнее об этом позже

Решение 1. Создайте собственное изображение кнопки

Редактор PageDown использует одно изображение спрайта для хранения всех кнопок, их состояния наведения и отключения. Таким образом, вы можете изменить это, чтобы иметь свои пользовательские кнопки.

Затем вам просто нужно изменить свой CSS, чтобы использовать значки (здесь я использовал кнопки редактора SO):

.wmd-button > span {
    background-image: url("http://cdn.sstatic.net/stackoverflow/img/wmd-buttons.svg");
}

Плункер

Решение 2: разветвите Markdown.Editor.js:

По сути, вам нужно изменить два метода:

  • функция makeButton, которая генерирует span и применяет позиционирование фона (редактор PageDown использует большое изображение, чтобы содержать все кнопки и их состояния). Здесь вам просто нужно добавить классы FA
  • setupButton, который касается проводки событий, эффекта наведения и отключенного состояния. Здесь вам нужно удалить включенную обработку состояния или необязательную обработку наведения, потому что это также можно сделать в вашем angular-pagedown.css

Таким образом, код makeButton будет выглядеть так:

var makeButton = function (id, title, XShift, textOp, faclass) {
        var button = document.createElement("li");
        button.className = "wmd-button";
        button.style.left = xPosition + "px";
        xPosition += 25;
        var buttonImage = document.createElement("span");
        buttonImage.className = "fa " + faclass;
        button.id = id + postfix;
        button.appendChild(buttonImage);
        button.title = title;
        button.XShift = XShift;
        if (textOp)
            button.textOp = textOp;
        setupButton(button, true);
        buttonRow.appendChild(button);
        return button;
    };

И setupButton будет выглядеть так:

    function setupButton(button, isEnabled) {

        var image = button.getElementsByTagName("span")[0];
        if (isEnabled) {
            image.style.color = "#000000"
            if (!button.isHelp) {
                button.onclick = function () {
                    doClick(this);
                    return false;
                }
            }
        }
        else {
            image.style.color = "#c5c5c5"
            button.onmouseover = button.onmouseout = button.onclick = function () { };
        }
    }

Наконец, вам нужно изменить вызывающий сайт makeButton, чтобы включить необходимые классы шрифтов при создании кнопок:

buttons.bold = makeButton("wmd-bold-button", getString("bold"), "0px", bindCommand("doBold"), "fa-bold");
//...

На стороне CSS вам нужно добавить эффект наведения и удалить фон:

.wmd-button > span {
    text-align: center;
    width: 20px;
    height: 20px;
    display: inline-block;
}
.wmd-button > span:hover {
  background: lightskyblue;
}

Планкер

Решение 3: измените сгенерированный HTML:

Это решение не требует изменения Markdown.Editor, но обработка состояния включения/отключения не будет работать.

По сути, вам нужно добавить классы font-awesome к сгенерированному span: в директиве angular после editor.run();:

 var icons = [
          {md: "wmd-bold-button", fa: "fa-bold"},
          //...
          ]

        icons.forEach(function(i) {
          var e = angular.element(document.getElementById(i.md + "-" + editorUniqueId));
          e.find("span").addClass("fa "+ i.fa);
        });

В этом случае вам также нужно немного изменить CSS:

.wmd-button > span {
     width: 20px;
    height: 20px;
}

.wmd-button > span:hover {
    background: #99cafa;
    width: 20px;
    height: 20px;
}

Плункер

person nemesv    schedule 08.03.2015

Вы можете использовать версию шрифтов библиотеки PageDown.

person MicRum    schedule 30.07.2015