xref: /plugin/fontello/script.js (revision e9d41e7da8510f70fdfbcdbad2e81c1515775d3d)
11776c5c5Sdh-tools(function () {
21776c5c5Sdh-tools    'use strict';
31776c5c5Sdh-tools
41776c5c5Sdh-tools    var iconTokenPattern = /<icon:([A-Za-z0-9_-]+)(?:\|(toc|notoc))?>/g;
51776c5c5Sdh-tools
61776c5c5Sdh-tools    function getFontelloInfo() {
71776c5c5Sdh-tools        if (!window.JSINFO || !window.JSINFO.plugin_fontello) return null;
81776c5c5Sdh-tools        return window.JSINFO.plugin_fontello;
91776c5c5Sdh-tools    }
101776c5c5Sdh-tools
111776c5c5Sdh-tools    function tokenShowsInToc(flag, info) {
121776c5c5Sdh-tools        if (flag === 'notoc') return false;
131776c5c5Sdh-tools        if (flag === 'toc') return true;
141776c5c5Sdh-tools
151776c5c5Sdh-tools        return !!info.showInToc;
161776c5c5Sdh-tools    }
171776c5c5Sdh-tools
181776c5c5Sdh-tools    function createIconSpan(cssClass) {
191776c5c5Sdh-tools        var span = document.createElement('span');
201776c5c5Sdh-tools        span.className = 'fontello-icon ' + cssClass;
211776c5c5Sdh-tools        span.setAttribute('aria-hidden', 'true');
221776c5c5Sdh-tools        return span;
231776c5c5Sdh-tools    }
241776c5c5Sdh-tools
251776c5c5Sdh-tools    function replaceTextNodeTokens(textNode, info) {
261776c5c5Sdh-tools        var text = textNode.nodeValue;
271776c5c5Sdh-tools        var fragment = document.createDocumentFragment();
281776c5c5Sdh-tools        var lastIndex = 0;
291776c5c5Sdh-tools        var changed = false;
301776c5c5Sdh-tools        var match;
311776c5c5Sdh-tools
321776c5c5Sdh-tools        iconTokenPattern.lastIndex = 0;
331776c5c5Sdh-tools        while ((match = iconTokenPattern.exec(text)) !== null) {
341776c5c5Sdh-tools            var raw = match[0];
351776c5c5Sdh-tools            var name = match[1];
361776c5c5Sdh-tools            var flag = match[2] || '';
371776c5c5Sdh-tools            var cssClass = info.icons && info.icons[name];
381776c5c5Sdh-tools            var visible = tokenShowsInToc(flag, info);
391776c5c5Sdh-tools
401776c5c5Sdh-tools            if (match.index > lastIndex) {
411776c5c5Sdh-tools                fragment.appendChild(document.createTextNode(text.slice(lastIndex, match.index)));
421776c5c5Sdh-tools            }
431776c5c5Sdh-tools
441776c5c5Sdh-tools            if (cssClass && visible) {
451776c5c5Sdh-tools                fragment.appendChild(createIconSpan(cssClass));
461776c5c5Sdh-tools                changed = true;
471776c5c5Sdh-tools            } else if (cssClass) {
481776c5c5Sdh-tools                changed = true;
491776c5c5Sdh-tools            } else {
501776c5c5Sdh-tools                fragment.appendChild(document.createTextNode(raw));
511776c5c5Sdh-tools            }
521776c5c5Sdh-tools
531776c5c5Sdh-tools            lastIndex = match.index + raw.length;
541776c5c5Sdh-tools        }
551776c5c5Sdh-tools
561776c5c5Sdh-tools        if (!changed) return;
571776c5c5Sdh-tools        if (lastIndex < text.length) {
581776c5c5Sdh-tools            fragment.appendChild(document.createTextNode(text.slice(lastIndex)));
591776c5c5Sdh-tools        }
601776c5c5Sdh-tools
611776c5c5Sdh-tools        textNode.parentNode.replaceChild(fragment, textNode);
621776c5c5Sdh-tools    }
631776c5c5Sdh-tools
641776c5c5Sdh-tools    function replaceTocLinkTokens(link, info) {
651776c5c5Sdh-tools        var walker = document.createTreeWalker(link, NodeFilter.SHOW_TEXT, null, false);
661776c5c5Sdh-tools        var nodes = [];
671776c5c5Sdh-tools        var node;
681776c5c5Sdh-tools
691776c5c5Sdh-tools        while ((node = walker.nextNode()) !== null) {
701776c5c5Sdh-tools            if (node.nodeValue.indexOf('<icon:') !== -1) {
711776c5c5Sdh-tools                nodes.push(node);
721776c5c5Sdh-tools            }
731776c5c5Sdh-tools        }
741776c5c5Sdh-tools
751776c5c5Sdh-tools        nodes.forEach(function (textNode) {
761776c5c5Sdh-tools            replaceTextNodeTokens(textNode, info);
771776c5c5Sdh-tools        });
781776c5c5Sdh-tools    }
791776c5c5Sdh-tools
801776c5c5Sdh-tools    function renderTocIcons() {
811776c5c5Sdh-tools        var info = getFontelloInfo();
821776c5c5Sdh-tools        if (!info || !info.icons) return;
831776c5c5Sdh-tools
841776c5c5Sdh-tools        Array.prototype.forEach.call(document.querySelectorAll('#dw__toc a'), function (link) {
851776c5c5Sdh-tools            replaceTocLinkTokens(link, info);
861776c5c5Sdh-tools        });
871776c5c5Sdh-tools    }
881776c5c5Sdh-tools
891776c5c5Sdh-tools    function scheduleTocIconRendering() {
901776c5c5Sdh-tools        window.setTimeout(renderTocIcons, 0);
911776c5c5Sdh-tools    }
921776c5c5Sdh-tools
931776c5c5Sdh-tools    if (document.readyState === 'loading') {
941776c5c5Sdh-tools        document.addEventListener('DOMContentLoaded', scheduleTocIconRendering);
951776c5c5Sdh-tools    } else {
961776c5c5Sdh-tools        scheduleTocIconRendering();
971776c5c5Sdh-tools    }
981776c5c5Sdh-tools
991776c5c5Sdh-tools    window.addBtnActionFontello = function ($btn, props, edid) {
1001776c5c5Sdh-tools        if (!props.list || !props.list.length) return '';
1011776c5c5Sdh-tools
1021776c5c5Sdh-tools        var pickerid = 'picker' + (pickercounter++);
1031776c5c5Sdh-tools        var $picker = jQuery(document.createElement('div'))
1041776c5c5Sdh-tools            .addClass('picker a11y pk_fontello')
1051776c5c5Sdh-tools            .attr('id', pickerid)
106*e9d41e7dSDaniel Hofer            .attr('aria-hidden', 'true')
1071776c5c5Sdh-tools            .css('position', 'absolute')
108*e9d41e7dSDaniel Hofer            .removeAttr('hidden');
1091776c5c5Sdh-tools
1101776c5c5Sdh-tools        jQuery.each(props.list, function (_, icon) {
1111776c5c5Sdh-tools            var name = icon.name || '';
1121776c5c5Sdh-tools            var cssClass = icon['class'] || '';
1131776c5c5Sdh-tools            var insert = icon.insert || '<icon:' + name + '>';
1141776c5c5Sdh-tools            if (!name || !cssClass) return;
1151776c5c5Sdh-tools
1161776c5c5Sdh-tools            jQuery(document.createElement('button'))
1171776c5c5Sdh-tools                .addClass('pickerbutton fontello-picker-button')
1181776c5c5Sdh-tools                .attr('type', 'button')
1191776c5c5Sdh-tools                .attr('title', name)
1201776c5c5Sdh-tools                .attr('aria-label', name)
1211776c5c5Sdh-tools                .attr('aria-controls', edid)
1221776c5c5Sdh-tools                .on('click', function (event) {
1231776c5c5Sdh-tools                    insertAtCarret(edid, insert);
1241776c5c5Sdh-tools                    pickerClose();
1251776c5c5Sdh-tools                    event.preventDefault();
1261776c5c5Sdh-tools                })
1271776c5c5Sdh-tools                .append(
1281776c5c5Sdh-tools                    jQuery(document.createElement('span'))
1291776c5c5Sdh-tools                        .addClass('fontello-icon ' + cssClass)
1301776c5c5Sdh-tools                        .attr('aria-hidden', 'true')
1311776c5c5Sdh-tools                )
1321776c5c5Sdh-tools                .appendTo($picker);
1331776c5c5Sdh-tools        });
1341776c5c5Sdh-tools
1351776c5c5Sdh-tools        jQuery('body').append($picker);
1361776c5c5Sdh-tools
1371776c5c5Sdh-tools        $btn.on('click', function (event) {
1381776c5c5Sdh-tools            pickerToggle(pickerid, $btn);
139*e9d41e7dSDaniel Hofer            $picker.removeAttr('hidden').prop('hidden', false);
1401776c5c5Sdh-tools            event.preventDefault();
1411776c5c5Sdh-tools        });
1421776c5c5Sdh-tools
1431776c5c5Sdh-tools        return pickerid;
1441776c5c5Sdh-tools    };
1451776c5c5Sdh-tools}());
146