|
19 | 19 | {%- if badge_enabled -%}
|
20 | 20 | <script>
|
21 | 21 | document.addEventListener('DOMContentLoaded', function(event) {
|
22 |
| - var els = document.querySelectorAll('pre code') |
23 |
| - |
24 |
| - function addLangData(block) { |
25 |
| - var outer = block.parentElement.parentElement.parentElement; |
26 |
| - var lang = block.getAttribute('data-lang'); |
27 |
| - for (var i = 0; i < outer.classList.length; i++) { |
28 |
| - var cls = outer.classList[i]; |
| 22 | + function getLangFromClass(elem) { |
| 23 | + for (cls of elem.classList) { |
29 | 24 | if (cls.startsWith('language-')) {
|
30 |
| - lang = cls; |
31 |
| - break; |
| 25 | + return cls.substr(9); |
32 | 26 | }
|
33 | 27 | }
|
34 |
| - if (!lang) { |
35 |
| - cls = block.getAttribute('class'); |
36 |
| - lang = cls ? cls : ''; |
37 |
| - } |
38 |
| - if (lang.startsWith('language-')) { |
39 |
| - lang = lang.substr(9); |
40 |
| - } |
41 |
| - block.parentNode.setAttribute('data-lang', lang); |
| 28 | + return null; |
42 | 29 | }
|
43 | 30 |
|
44 |
| - function addBadge(block) { |
45 |
| - var enabled = ('{{ badge_enabled }}' || 'true').toLowerCase(); |
46 |
| - if (enabled == 'true') { |
47 |
| - var pre = block.parentElement; |
48 |
| - pre.classList.add('badge'); |
49 |
| - } |
50 |
| - } |
| 31 | + function addBadge(preElem, lang) { |
| 32 | + let badgeWrapper = document.createElement('div'); |
| 33 | + badgeWrapper.classList.add('badge-wrapper') |
51 | 34 |
|
52 |
| - function handle(block) { |
53 |
| - addLangData(block); |
54 |
| - addBadge(block) |
55 |
| - } |
| 35 | + let badge = document.createElement('div'); |
| 36 | + badge.classList.add('badge'); |
| 37 | + badge.append(lang); |
56 | 38 |
|
57 |
| - for (var i = 0; i < els.length; i++) { |
58 |
| - var el = els[i]; |
59 |
| - handle(el); |
| 39 | + preElem.replaceWith(badgeWrapper); |
| 40 | + badgeWrapper.append(badge, preElem); |
60 | 41 | }
|
| 42 | + |
| 43 | + // Kramdown code blocks |
| 44 | + document.querySelectorAll('.highlighter-rouge').forEach((e) => { |
| 45 | + let pre = e.querySelector('pre'); |
| 46 | + if (pre !== null) { |
| 47 | + let lang = getLangFromClass(e); |
| 48 | + if (lang !== null) { |
| 49 | + addBadge(pre, lang); |
| 50 | + } |
| 51 | + } |
| 52 | + }); |
| 53 | + |
| 54 | + // Liquid code blocks |
| 55 | + document.querySelectorAll('pre > code').forEach((e) => { |
| 56 | + let lang = e.getAttribute('data-lang'); |
| 57 | + if (lang !== null) { |
| 58 | + addBadge(e.parentElement, lang); |
| 59 | + } |
| 60 | + }); |
61 | 61 | });
|
62 | 62 | </script>
|
63 | 63 |
|
64 | 64 | <style>
|
65 |
| - /* code language badge */ |
66 |
| - pre.badge::before { |
67 |
| - content: attr(data-lang); |
68 |
| - color: {{badge_color}}; |
69 |
| - background-color: {{badge_background_color}}; |
70 |
| - padding: 0 .5em; |
71 |
| - border-radius: 0 2px; |
72 |
| - text-transform: {{badge_text_transform}}; |
73 |
| - text-align: center; |
74 |
| - min-width: 32px; |
75 |
| - display: inline-block; |
| 65 | + .badge-wrapper { |
| 66 | + position: relative; |
| 67 | + } |
| 68 | + |
| 69 | + .badge-wrapper .badge { |
76 | 70 | position: absolute;
|
| 71 | + top: 0; |
77 | 72 | right: 0;
|
78 |
| - } |
79 | 73 |
|
80 |
| - /* fix wrong badge display for firefox browser */ |
81 |
| - code > table pre::before { |
82 |
| - display: none; |
| 74 | + min-width: 32px; |
| 75 | + padding: 0 .5em; |
| 76 | + border-bottom-left-radius: 2px; |
| 77 | + text-align: center; |
| 78 | + |
| 79 | + color: {{badge_color}}; |
| 80 | + background-color: {{badge_background_color}}; |
| 81 | + text-transform: {{badge_text_transform}}; |
83 | 82 | }
|
84 | 83 | </style>
|
85 | 84 | {%- endif -%}
|
0 commit comments