add extension
Browse files- .gitattributes +2 -0
- .gitignore +0 -1
- src/_extensions/codewindow/_extension.yml +12 -0
- src/_extensions/codewindow/codewindow.css +48 -0
- src/_extensions/codewindow/codewindow.js +112 -0
- src/_extensions/jmbuhr/qrcode/_extension.yml +6 -0
- src/_extensions/jmbuhr/qrcode/assets/qrcode.js +614 -0
- src/_extensions/jmbuhr/qrcode/qrcode.lua +104 -0
- src/_extensions/martinomagnifico/verticator/_extension.yml +22 -0
- src/_extensions/martinomagnifico/verticator/verticator.css +186 -0
- src/_extensions/martinomagnifico/verticator/verticator.js +439 -0
- src/_extensions/quarto-ext/fontawesome/_extension.yml +7 -0
- src/_extensions/quarto-ext/fontawesome/assets/css/all.css +0 -0
- src/_extensions/quarto-ext/fontawesome/assets/css/latex-fontsize.css +30 -0
- src/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Brands-Regular-400.ttf +3 -0
- src/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Brands-Regular-400.woff2 +3 -0
- src/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Regular-400.ttf +3 -0
- src/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Regular-400.woff2 +3 -0
- src/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Solid-900.ttf +3 -0
- src/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Solid-900.woff2 +3 -0
- src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.ttf +3 -0
- src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.woff2 +3 -0
- src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.ttf +3 -0
- src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.woff2 +3 -0
- src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.ttf +3 -0
- src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.woff2 +3 -0
- src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.ttf +3 -0
- src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.woff2 +3 -0
- src/_extensions/quarto-ext/fontawesome/fontawesome.lua +84 -0
.gitattributes
CHANGED
@@ -40,3 +40,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
40 |
*.webp filter=lfs diff=lfs merge=lfs -text
|
41 |
*.bmp filter=lfs diff=lfs merge=lfs -text
|
42 |
*.gif filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
40 |
*.webp filter=lfs diff=lfs merge=lfs -text
|
41 |
*.bmp filter=lfs diff=lfs merge=lfs -text
|
42 |
*.gif filter=lfs diff=lfs merge=lfs -text
|
43 |
+
*.ttf filter=lfs diff=lfs merge=lfs -text
|
44 |
+
*.woff2 filter=lfs diff=lfs merge=lfs -text
|
.gitignore
CHANGED
@@ -3,7 +3,6 @@
|
|
3 |
.DS_Store
|
4 |
.venv/**
|
5 |
src/_site/
|
6 |
-
src/_extensions
|
7 |
*_files
|
8 |
*.zip
|
9 |
*.pdf
|
|
|
3 |
.DS_Store
|
4 |
.venv/**
|
5 |
src/_site/
|
|
|
6 |
*_files
|
7 |
*.zip
|
8 |
*.pdf
|
src/_extensions/codewindow/_extension.yml
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
title: codewindow
|
2 |
+
author: Emil Hvitfeldt
|
3 |
+
version: 1.2.0
|
4 |
+
quarto-required: ">=1.4.0"
|
5 |
+
contributes:
|
6 |
+
revealjs-plugins:
|
7 |
+
- name: RevealCodewindow
|
8 |
+
script:
|
9 |
+
- codewindow.js
|
10 |
+
stylesheet:
|
11 |
+
- codewindow.css
|
12 |
+
|
src/_extensions/codewindow/codewindow.css
ADDED
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/* TODO: CSS for plugin */
|
2 |
+
|
3 |
+
.codewindow {
|
4 |
+
overflow-wrap: anywhere;
|
5 |
+
margin-bottom: 36px;
|
6 |
+
font-size: 0.45em;
|
7 |
+
font-family: monospace;
|
8 |
+
background: white;
|
9 |
+
border-radius: 10px;
|
10 |
+
box-shadow: #26394d 0px 20px 30px -10px;
|
11 |
+
}
|
12 |
+
|
13 |
+
.codewindow .header {
|
14 |
+
display: flex;
|
15 |
+
background: #e2e8f0;
|
16 |
+
border-top-left-radius: 10px;
|
17 |
+
border-top-right-radius: 10px;
|
18 |
+
padding-left: 16px;
|
19 |
+
gap: 16px;
|
20 |
+
height: 30px;
|
21 |
+
}
|
22 |
+
|
23 |
+
.codewindow .header .file {
|
24 |
+
margin-top: 5px;
|
25 |
+
padding-left: 20px;
|
26 |
+
padding-right: 20px;
|
27 |
+
display: flex;
|
28 |
+
background: white;
|
29 |
+
border-top-left-radius: 10px;
|
30 |
+
border-top-right-radius: 10px;
|
31 |
+
height: 90%;
|
32 |
+
align-items: center;
|
33 |
+
gap: 4px;
|
34 |
+
}
|
35 |
+
|
36 |
+
.codewindow .textarea {
|
37 |
+
padding: 21px;
|
38 |
+
}
|
39 |
+
|
40 |
+
.codewindow .textarea .sourceCode {
|
41 |
+
background: unset;
|
42 |
+
border: unset;
|
43 |
+
font-size: unset;
|
44 |
+
}
|
45 |
+
|
46 |
+
.codewindow .textarea pre {
|
47 |
+
font-size: unset;
|
48 |
+
}
|
src/_extensions/codewindow/codewindow.js
ADDED
@@ -0,0 +1,112 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
window.RevealCodewindow = function () {
|
2 |
+
return {
|
3 |
+
id: "RevealCodewindow",
|
4 |
+
init: function(deck) {
|
5 |
+
initCodewindow(deck);
|
6 |
+
}
|
7 |
+
};
|
8 |
+
};
|
9 |
+
|
10 |
+
|
11 |
+
const initCodewindow = function(Reveal) {
|
12 |
+
|
13 |
+
const svg_buttons = `<svg viewBox="0 0 420 100" style="width:55px"><circle fill="#ff5f57" cx="50" cy="50" r="50"/><circle fill="#febc2e" cx="210" cy="50" r="50"/><circle fill="#28c840" cx="370" cy="50" r="50"/></svg>`
|
14 |
+
|
15 |
+
const svg_sass = `<svg viewBox="0 0 512 384" style="height:1em"><path fill="#CF649A" d="M440.6 220.6c-17.9.1-33.4 4.4-46.4 10.8-4.8-9.5-9.6-17.8-10.4-24-.9-7.2-2-11.6-.9-20.2s6.1-20.8 6.1-21.8c-.1-.9-1.1-5.3-11.4-5.4-10.3-.1-19.2 2-20.2 4.7s-3 8.9-4.3 15.3c-1.8 9.4-20.6 42.7-31.3 60.2-3.5-6.8-6.5-12.8-7.1-17.6-.9-7.2-2-11.6-.9-20.2s6.1-20.8 6.1-21.8c-.1-.9-1.1-5.3-11.4-5.4-10.3-.1-19.2 2-20.2 4.7s-2.1 9.1-4.3 15.3c-2.1 6.2-27.1 61.8-33.6 76.3-3.3 7.4-6.2 13.3-8.3 17.3s-.1.3-.3.7c-1.8 3.4-2.8 5.3-2.8 5.3v.1c-1.4 2.5-2.9 4.9-3.6 4.9-.5 0-1.5-6.7.2-15.9 3.7-19.3 12.7-49.4 12.6-50.5 0-.5 1.7-5.8-5.8-8.5-7.3-2.7-9.9 1.8-10.5 1.8-.6 0-1.1 1.6-1.1 1.6s8.1-33.9-15.5-33.9c-14.8 0-35.2 16.1-45.3 30.8-6.4 3.5-20 10.9-34.4 18.8-5.5 3-11.2 6.2-16.6 9.1l-1.1-1.2c-28.6-30.5-81.5-52.1-79.3-93.1.8-14.9 6-54.2 101.6-101.8 78.3-39 141-28.3 151.9-4.5 15.5 34-33.5 97.2-114.9 106.3-31 3.5-47.3-8.5-51.4-13-4.3-4.7-4.9-4.9-6.5-4-2.6 1.4-1 5.6 0 8.1 2.4 6.3 12.4 17.5 29.4 23.1 14.9 4.9 51.3 7.6 95.3-9.4 49.3-19.1 87.8-72.1 76.5-116.4-11.5-45.1-86.3-59.9-157-34.8-42.1 15-87.7 38.4-120.5 69.1C4 117.9-2.2 149.7.4 162.9c9.1 47.1 74 77.8 100 100.5-1.3.7-2.5 1.4-3.6 2-13 6.4-62.5 32.3-74.9 59.7-14 31 2.2 53.3 13 56.3 33.4 9.3 67.6-7.4 86.1-34.9 18.4-27.5 16.2-63.2 7.7-79.5l-.3-.6 10.2-6c6.6-3.9 13.1-7.5 18.8-10.6-3.2 8.7-5.5 19-6.7 34-1.4 17.6 5.8 40.4 15.3 49.4 4.2 3.9 9.2 4 12.3 4 11 0 16-9.1 21.5-20 6.8-13.3 12.8-28.7 12.8-28.7s-7.5 41.7 13 41.7c7.5 0 15-9.7 18.4-14.7v.1s.2-.3.6-1c.8-1.2 1.2-1.9 1.2-1.9v-.2c3-5.2 9.7-17.1 19.7-36.8 12.9-25.4 25.3-57.2 25.3-57.2s1.2 7.8 4.9 20.6c2.2 7.6 7 15.9 10.7 24-3 4.2-4.8 6.6-4.8 6.6l.1.1c-2.4 3.2-5.1 6.6-7.9 10-10.2 12.2-22.4 26.1-24 30.1-1.9 4.7-1.5 8.2 2.2 11 2.7 2 7.5 2.4 12.6 2 9.2-.6 15.6-2.9 18.8-4.3 5-1.8 10.7-4.5 16.2-8.5 10-7.4 16.1-17.9 15.5-31.9-.3-7.7-2.8-15.3-5.9-22.5.9-1.3 1.8-2.6 2.7-4 15.8-23.1 28-48.5 28-48.5s1.2 7.8 4.9 20.6c1.9 6.5 5.7 13.6 9.1 20.6-14.8 12.1-24.1 26.1-27.3 35.3-5.9 17-1.3 24.7 7.4 26.5 3.9.8 9.5-1 13.7-2.8 5.2-1.7 11.5-4.6 17.3-8.9 10-7.4 19.6-17.7 19.1-31.6-.3-6.4-2-12.7-4.3-18.7 12.6-5.2 28.9-8.2 49.6-5.7 44.5 5.2 53.3 33 51.6 44.6-1.7 11.6-11 18-14.1 20-3.1 1.9-4.1 2.6-3.8 4 .4 2.1 1.8 2 4.5 1.6 3.7-.6 23.4-9.5 24.2-30.9 1.2-27.5-24.9-57.5-71.2-57.2zM97.4 336.3c-14.7 16.1-35.4 22.2-44.2 17-9.5-5.5-5.8-29.2 12.3-46.3 11-10.4 25.3-20 34.7-25.9 2.1-1.3 5.3-3.2 9.1-5.5.6-.4 1-.6 1-.6.7-.4 1.5-.9 2.3-1.4 6.7 24.4.3 45.8-15.2 62.7zm107.5-73.1c-5.1 12.5-15.9 44.6-22.4 42.8-5.6-1.5-9-25.8-1.1-49.8 4-12.1 12.5-26.5 17.5-32.1 8.1-9 16.9-12 19.1-8.3 2.6 4.8-9.9 39.6-13.1 47.4zm88.7 42.4c-2.2 1.1-4.2 1.9-5.1 1.3-.7-.4.9-1.9.9-1.9s11.1-11.9 15.5-17.4c2.5-3.2 5.5-6.9 8.7-11.1v1.2c0 14.4-13.8 24-20 27.9zM362 290c-1.6-1.2-1.4-4.9 4-16.5 2.1-4.6 6.9-12.3 15.2-19.6 1 3 1.6 5.9 1.5 8.6-.1 18-12.9 24.7-20.7 27.5z"/></svg>`
|
16 |
+
|
17 |
+
const svg_r = `<svg viewBox="0 0 724 561" style = "height: 1em;"><defs><linearGradient id="gradientFill-1" x1="0" x2="1" y1="0" y2="1" gradientUnits="objectBoundingBox" spreadMethod="pad"><stop offset="0" stop-color="rgb(203,206,208)" stop-opacity="1"/><stop offset="1" stop-color="rgb(132,131,139)" stop-opacity="1"/></linearGradient><linearGradient id="gradientFill-2" x1="0" x2="1" y1="0" y2="1" gradientUnits="objectBoundingBox" spreadMethod="pad"><stop offset="0" stop-color="rgb(39,109,195)" stop-opacity="1"/><stop offset="1" stop-color="rgb(22,92,170)" stop-opacity="1"/></linearGradient></defs><path d="M361.453,485.937 C162.329,485.937 0.906,377.828 0.906,244.469 C0.906,111.109 162.329,3.000 361.453,3.000 C560.578,3.000 722.000,111.109 722.000,244.469 C722.000,377.828 560.578,485.937 361.453,485.937 ZM416.641,97.406 C265.289,97.406 142.594,171.314 142.594,262.484 C142.594,353.654 265.289,427.562 416.641,427.562 C567.992,427.562 679.687,377.033 679.687,262.484 C679.687,147.971 567.992,97.406 416.641,97.406 Z" fill="url(#gradientFill-1)" fill-rule="evenodd"/><path d="M550.000,377.000 C550.000,377.000 571.822,383.585 584.500,390.000 C588.899,392.226 596.510,396.668 602.000,402.500 C607.378,408.212 610.000,414.000 610.000,414.000 L696.000,559.000 L557.000,559.062 L492.000,437.000 C492.000,437.000 478.690,414.131 470.500,407.500 C463.668,401.969 460.755,400.000 454.000,400.000 C449.298,400.000 420.974,400.000 420.974,400.000 L421.000,558.974 L298.000,559.026 L298.000,152.938 L545.000,152.938 C545.000,152.938 657.500,154.967 657.500,262.000 C657.500,369.033 550.000,377.000 550.000,377.000 ZM496.500,241.024 L422.037,240.976 L422.000,310.026 L496.500,310.002 C496.500,310.002 531.000,309.895 531.000,274.877 C531.000,239.155 496.500,241.024 496.500,241.024 Z" fill="url(#gradientFill-2)" fill-rule="evenodd"/></svg>`
|
18 |
+
|
19 |
+
const svg_python = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" style = "height: 1em; width: 1em;"><defs><linearGradient id="A" x1="811.527" y1="574.895" x2="665.255" y2="573.732" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#366a96"/><stop offset="1" stop-color="#3679b0"/></linearGradient><linearGradient id="B" x1="862.824" y1="642.176" x2="573.276" y2="642.176" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffc836"/><stop offset="1" stop-color="#ffe873"/></linearGradient></defs><g transform="matrix(.1617 0 0 .158089 -107.53764 -81.66187)"><path d="M716.255 544.487c0-13.623 3.653-21.034 23.822-24.563 13.693-2.4 31.25-2.7 47.627 0 12.935 2.135 23.822 11.77 23.822 24.563v44.945c0 13.182-10.57 23.98-23.822 23.98h-47.627c-16.164 0-29.787 13.782-29.787 29.363v21.564h-16.376c-13.852 0-21.917-9.988-25.305-23.964-4.57-18.776-4.376-29.963 0-47.945 3.794-15.687 15.917-23.964 29.77-23.964h65.52v-6h-47.645v-17.98z" fill="url(#A)"/><path d="M811.527 688.32c0 13.623-11.823 20.523-23.822 23.964-18.052 5.188-32.54 4.394-47.627 0-12.6-3.67-23.822-11.17-23.822-23.964v-44.945c0-12.935 10.782-23.98 23.822-23.98h47.627c15.864 0 29.787-13.71 29.787-29.963v-20.964h17.858c13.87 0 20.4 10.305 23.822 23.964 4.764 18.97 4.976 33.157 0 47.945-4.817 14.364-9.97 23.964-23.822 23.964H763.9v6h47.627v17.98z" fill="url(#B)"/><path d="M728.166 541.505c0-4.976 3.988-9 8.93-9 4.923 0 8.93 4.023 8.93 9 0 4.96-4.006 8.982-8.93 8.982-4.94 0-8.93-4.023-8.93-8.982zm53.59 149.798c0-4.96 4.006-8.982 8.93-8.982 4.94 0 8.93 4.023 8.93 8.982 0 4.976-3.988 9-8.93 9-4.923 0-8.93-4.023-8.93-9z" fill="#fff"/></g></svg>`
|
20 |
+
|
21 |
+
const svg_html = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height:1em"><path fill="#E44D26" d="M107.644 470.877 74.633 100.62h362.734l-33.046 370.199L255.778 512z"/><path fill="#F16529" d="m256 480.523 120.03-33.277 28.24-316.352H256z"/><path fill="#EBEBEB" d="M256 268.217h-60.09l-4.15-46.501H256v-45.411H142.132l1.087 12.183 11.161 125.139H256zm0 117.936-.199.053-50.574-13.656-3.233-36.217h-45.585l6.362 71.301 93.02 25.823.209-.058z"/><path d="M108.382 0h23.077v22.8h21.11V0h23.078v69.044H152.57v-23.12h-21.11v23.12h-23.077V0zm97.612 22.896h-20.316V0h63.72v22.896h-20.325v46.148h-23.078V22.896zM259.511 0h24.063l14.802 24.26L313.163 0h24.072v69.044h-22.982V34.822l-15.877 24.549h-.397l-15.888-24.549v34.222h-22.58V0zm89.209 0h23.084v46.222h32.453v22.822H348.72V0z"/><path fill="#FFF" d="M255.843 268.217v45.41h55.918l-5.271 58.894-50.647 13.67v47.244l93.094-25.801.683-7.672 10.671-119.551 1.108-12.194h-12.237zm0-91.912v45.411h109.688l.911-10.207 2.069-23.021 1.086-12.183z"/></svg>`
|
22 |
+
|
23 |
+
const svg_css = `<svg xmlns="http://www.w3.org/2000/svg" style="height:1em" viewBox="0 0 362.734 512"><path style="fill:#264de4" d="m437.367 100.62-33.046 370.199L255.778 512l-148.134-41.123L74.633 100.62z" transform="translate(-74.633)"/><path style="fill:#2965f1" d="m376.03 447.246 28.24-316.352H256v349.629z" transform="translate(-74.633)"/><path style="fill:#ebebeb" d="m150.31 268.217 4.07 45.41H256v-45.41zM256 176.305H142.132l4.128 45.411H256zm0 257.094v-47.246l-.199.053-50.574-13.656-3.233-36.217h-45.585l6.362 71.301 93.02 25.823z" transform="translate(-74.633)"/><path d="M85.367 0h55v23h-32v23h32v23h-55zm66 0h55v20h-32v4h32v46h-55V49h32v-4h-32zm66 0h55v20h-32v4h32v46h-55V49h32v-4h-32z"/><path style="fill:#fff" d="m311.761 313.627-5.271 58.894-50.647 13.67v47.244l93.094-25.801.683-7.672 10.671-119.551 1.108-12.194 8.198-91.912H255.843v45.411h63.988l-4.132 46.501h-59.856v45.41z" transform="translate(-74.633)"/></svg>`
|
24 |
+
|
25 |
+
const svg_js = `<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 512 512" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg" style="color: #edc624;"><path d="M208 88.001h-80v212.498c0 52.58-18.032 67.261-49.412 67.261-14.705 0-27.948-2.521-38.25-6.063L32 423.904C46.7 428.966 69.259 432 86.907 432 158.955 432 208 398.129 208 301.02V88.001zM382.463 80C305.02 80 256 123.998 256 182.154c0 50.083 37.751 81.44 92.641 101.665 39.7 14.158 55.392 26.808 55.392 47.539 0 22.756-18.139 37.425-52.448 37.425-31.863 0-60.789-10.64-80.394-21.255v-.021L256 410.727c18.639 10.638 53.441 21.255 91.167 21.255C437.854 431.98 480 383.43 480 326.284c0-48.55-26.958-79.9-85.278-102.163-43.139-17.191-61.27-26.795-61.27-48.542 0-17.2 15.688-32.869 48.043-32.869 31.846 0 53.744 10.707 66.505 17.291l19.125-64C447.125 87.22 420.188 80 382.463 80z"></path></svg>`
|
26 |
+
|
27 |
+
const svg_quarto = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 121.8 118.8" xml:space="preserve" style="height:1em"><path d="M56 54.4V1.5C27.9 3.5 5.6 26.2 4.1 54.4H56zm7 0h52.9C114.4 25.9 91.5 3 63 1.5v52.9zm-7 7H4.2c2 27.7 24.1 49.9 51.8 51.8V61.4zm7 0v51.9c28.2-1.5 50.9-23.8 52.8-51.9H63z" fill-rule="evenodd" clip-rule="evenodd" fill="#74AADB"/></svg>`
|
28 |
+
|
29 |
+
const svg_julia = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 325 300" style="height:1em"><path style="stroke:none;fill-rule:nonzero;fill:#cb3c33;fill-opacity:1" d="M150.898 225c0 41.422-33.578 75-75 75-41.421 0-75-33.578-75-75s33.579-75 75-75c41.422 0 75 33.578 75 75"/><path style="stroke:none;fill-rule:nonzero;fill:#389826;fill-opacity:1" d="M237.5 75c0 41.422-33.578 75-75 75s-75-33.578-75-75 33.578-75 75-75 75 33.578 75 75"/><path style="stroke:none;fill-rule:nonzero;fill:#9558b2;fill-opacity:1" d="M324.102 225c0 41.422-33.579 75-75 75-41.422 0-75-33.578-75-75s33.578-75 75-75c41.421 0 75 33.578 75 75"/></svg>`
|
30 |
+
|
31 |
+
window.addEventListener( 'ready', function(event) {
|
32 |
+
|
33 |
+
var content;
|
34 |
+
var new_content;
|
35 |
+
var empty_file;
|
36 |
+
|
37 |
+
// Remove configured margin of the presentation
|
38 |
+
var codewindows = document.getElementsByClassName("codewindow");
|
39 |
+
|
40 |
+
for (var i = 0; i < codewindows.length; i++) {
|
41 |
+
content = codewindows[i];
|
42 |
+
|
43 |
+
empty_file = true;
|
44 |
+
|
45 |
+
new_content = document.createElement("div");
|
46 |
+
new_content.classList.add("codewindow");
|
47 |
+
|
48 |
+
header = document.createElement("div");
|
49 |
+
header.classList.add("header");
|
50 |
+
header.innerHTML = svg_buttons;
|
51 |
+
|
52 |
+
file = document.createElement("div");
|
53 |
+
|
54 |
+
file.classList.add("file");
|
55 |
+
if (content.classList.contains("sass")) {
|
56 |
+
file.innerHTML += svg_sass;
|
57 |
+
empty_file = false;
|
58 |
+
}
|
59 |
+
if (content.classList.contains("r")) {
|
60 |
+
file.innerHTML += svg_r;
|
61 |
+
empty_file = false;
|
62 |
+
}
|
63 |
+
if (content.classList.contains("python")) {
|
64 |
+
file.innerHTML += svg_python;
|
65 |
+
empty_file = false;
|
66 |
+
}
|
67 |
+
if (content.classList.contains("html")) {
|
68 |
+
file.innerHTML += svg_html;
|
69 |
+
empty_file = false;
|
70 |
+
}
|
71 |
+
if (content.classList.contains("css")) {
|
72 |
+
file.innerHTML += svg_css;
|
73 |
+
empty_file = false;
|
74 |
+
}
|
75 |
+
if (content.classList.contains("js")) {
|
76 |
+
file.innerHTML += svg_js;
|
77 |
+
empty_file = false;
|
78 |
+
}
|
79 |
+
if (content.classList.contains("quarto")) {
|
80 |
+
file.innerHTML += svg_quarto;
|
81 |
+
empty_file = false;
|
82 |
+
}
|
83 |
+
if (content.classList.contains("julia")) {
|
84 |
+
file.innerHTML += svg_julia;
|
85 |
+
empty_file = false;
|
86 |
+
}
|
87 |
+
|
88 |
+
file_name = content.querySelector("p");
|
89 |
+
if (file_name !== null) {
|
90 |
+
file.innerHTML += file_name.innerText;
|
91 |
+
empty_file = false;
|
92 |
+
}
|
93 |
+
|
94 |
+
textarea = document.createElement("div");
|
95 |
+
textarea.classList.add("textarea");
|
96 |
+
textarea.appendChild(content.querySelector("div,iframe"));
|
97 |
+
|
98 |
+
if (!empty_file) {
|
99 |
+
header.appendChild(file);
|
100 |
+
}
|
101 |
+
|
102 |
+
new_content.appendChild(header);
|
103 |
+
new_content.appendChild(textarea);
|
104 |
+
|
105 |
+
codewindows[i].innerHTML = new_content.innerHTML;
|
106 |
+
|
107 |
+
if (content.attributes.width !== undefined) {
|
108 |
+
codewindows[i].style.width = content.attributes.width.value;
|
109 |
+
}
|
110 |
+
}
|
111 |
+
});
|
112 |
+
};
|
src/_extensions/jmbuhr/qrcode/_extension.yml
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
title: Qrcode
|
2 |
+
author: Jannik Buhr
|
3 |
+
version: 0.0.1
|
4 |
+
contributes:
|
5 |
+
shortcodes:
|
6 |
+
- qrcode.lua
|
src/_extensions/jmbuhr/qrcode/assets/qrcode.js
ADDED
@@ -0,0 +1,614 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* @fileoverview
|
3 |
+
* - Using the 'QRCode for Javascript library'
|
4 |
+
* - Fixed dataset of 'QRCode for Javascript library' for support full-spec.
|
5 |
+
* - this library has no dependencies.
|
6 |
+
*
|
7 |
+
* @author davidshimjs
|
8 |
+
* @see <a href="http://www.d-project.com/" target="_blank">http://www.d-project.com/</a>
|
9 |
+
* @see <a href="http://jeromeetienne.github.com/jquery-qrcode/" target="_blank">http://jeromeetienne.github.com/jquery-qrcode/</a>
|
10 |
+
*/
|
11 |
+
var QRCode;
|
12 |
+
|
13 |
+
(function () {
|
14 |
+
//---------------------------------------------------------------------
|
15 |
+
// QRCode for JavaScript
|
16 |
+
//
|
17 |
+
// Copyright (c) 2009 Kazuhiko Arase
|
18 |
+
//
|
19 |
+
// URL: http://www.d-project.com/
|
20 |
+
//
|
21 |
+
// Licensed under the MIT license:
|
22 |
+
// http://www.opensource.org/licenses/mit-license.php
|
23 |
+
//
|
24 |
+
// The word "QR Code" is registered trademark of
|
25 |
+
// DENSO WAVE INCORPORATED
|
26 |
+
// http://www.denso-wave.com/qrcode/faqpatent-e.html
|
27 |
+
//
|
28 |
+
//---------------------------------------------------------------------
|
29 |
+
function QR8bitByte(data) {
|
30 |
+
this.mode = QRMode.MODE_8BIT_BYTE;
|
31 |
+
this.data = data;
|
32 |
+
this.parsedData = [];
|
33 |
+
|
34 |
+
// Added to support UTF-8 Characters
|
35 |
+
for (var i = 0, l = this.data.length; i < l; i++) {
|
36 |
+
var byteArray = [];
|
37 |
+
var code = this.data.charCodeAt(i);
|
38 |
+
|
39 |
+
if (code > 0x10000) {
|
40 |
+
byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18);
|
41 |
+
byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12);
|
42 |
+
byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6);
|
43 |
+
byteArray[3] = 0x80 | (code & 0x3F);
|
44 |
+
} else if (code > 0x800) {
|
45 |
+
byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12);
|
46 |
+
byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6);
|
47 |
+
byteArray[2] = 0x80 | (code & 0x3F);
|
48 |
+
} else if (code > 0x80) {
|
49 |
+
byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6);
|
50 |
+
byteArray[1] = 0x80 | (code & 0x3F);
|
51 |
+
} else {
|
52 |
+
byteArray[0] = code;
|
53 |
+
}
|
54 |
+
|
55 |
+
this.parsedData.push(byteArray);
|
56 |
+
}
|
57 |
+
|
58 |
+
this.parsedData = Array.prototype.concat.apply([], this.parsedData);
|
59 |
+
|
60 |
+
if (this.parsedData.length != this.data.length) {
|
61 |
+
this.parsedData.unshift(191);
|
62 |
+
this.parsedData.unshift(187);
|
63 |
+
this.parsedData.unshift(239);
|
64 |
+
}
|
65 |
+
}
|
66 |
+
|
67 |
+
QR8bitByte.prototype = {
|
68 |
+
getLength: function (buffer) {
|
69 |
+
return this.parsedData.length;
|
70 |
+
},
|
71 |
+
write: function (buffer) {
|
72 |
+
for (var i = 0, l = this.parsedData.length; i < l; i++) {
|
73 |
+
buffer.put(this.parsedData[i], 8);
|
74 |
+
}
|
75 |
+
}
|
76 |
+
};
|
77 |
+
|
78 |
+
function QRCodeModel(typeNumber, errorCorrectLevel) {
|
79 |
+
this.typeNumber = typeNumber;
|
80 |
+
this.errorCorrectLevel = errorCorrectLevel;
|
81 |
+
this.modules = null;
|
82 |
+
this.moduleCount = 0;
|
83 |
+
this.dataCache = null;
|
84 |
+
this.dataList = [];
|
85 |
+
}
|
86 |
+
|
87 |
+
QRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+","+col);}
|
88 |
+
return this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row<this.moduleCount;row++){this.modules[row]=new Array(this.moduleCount);for(var col=0;col<this.moduleCount;col++){this.modules[row][col]=null;}}
|
89 |
+
this.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(test,maskPattern);if(this.typeNumber>=7){this.setupTypeNumber(test);}
|
90 |
+
if(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);}
|
91 |
+
this.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}}
|
92 |
+
return pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row<this.modules.length;row++){var y=row*cs;for(var col=0;col<this.modules[row].length;col++){var x=col*cs;var dark=this.modules[row][col];if(dark){qr_mc.beginFill(0,100);qr_mc.moveTo(x,y);qr_mc.lineTo(x+cs,y);qr_mc.lineTo(x+cs,y+cs);qr_mc.lineTo(x,y+cs);qr_mc.endFill();}}}
|
93 |
+
return qr_mc;},setupTimingPattern:function(){for(var r=8;r<this.moduleCount-8;r++){if(this.modules[r][6]!=null){continue;}
|
94 |
+
this.modules[r][6]=(r%2==0);}
|
95 |
+
for(var c=8;c<this.moduleCount-8;c++){if(this.modules[6][c]!=null){continue;}
|
96 |
+
this.modules[6][c]=(c%2==0);}},setupPositionAdjustPattern:function(){var pos=QRUtil.getPatternPosition(this.typeNumber);for(var i=0;i<pos.length;i++){for(var j=0;j<pos.length;j++){var row=pos[i];var col=pos[j];if(this.modules[row][col]!=null){continue;}
|
97 |
+
for(var r=-2;r<=2;r++){for(var c=-2;c<=2;c++){if(r==-2||r==2||c==-2||c==2||(r==0&&c==0)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}}}},setupTypeNumber:function(test){var bits=QRUtil.getBCHTypeNumber(this.typeNumber);for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;}
|
98 |
+
for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}}
|
99 |
+
for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}}
|
100 |
+
this.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex<data.length){dark=(((data[byteIndex]>>>bitIndex)&1)==1);}
|
101 |
+
var mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;}
|
102 |
+
this.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}}
|
103 |
+
row+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;i<dataList.length;i++){var data=dataList[i];buffer.put(data.mode,4);buffer.put(data.getLength(),QRUtil.getLengthInBits(data.mode,typeNumber));data.write(buffer);}
|
104 |
+
var totalDataCount=0;for(var i=0;i<rsBlocks.length;i++){totalDataCount+=rsBlocks[i].dataCount;}
|
105 |
+
if(buffer.getLengthInBits()>totalDataCount*8){throw new Error("code length overflow. ("
|
106 |
+
+buffer.getLengthInBits()
|
107 |
+
+">"
|
108 |
+
+totalDataCount*8
|
109 |
+
+")");}
|
110 |
+
if(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);}
|
111 |
+
while(buffer.getLengthInBits()%8!=0){buffer.putBit(false);}
|
112 |
+
while(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;}
|
113 |
+
buffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;}
|
114 |
+
buffer.put(QRCodeModel.PAD1,8);}
|
115 |
+
return QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r<rsBlocks.length;r++){var dcCount=rsBlocks[r].dataCount;var ecCount=rsBlocks[r].totalCount-dcCount;maxDcCount=Math.max(maxDcCount,dcCount);maxEcCount=Math.max(maxEcCount,ecCount);dcdata[r]=new Array(dcCount);for(var i=0;i<dcdata[r].length;i++){dcdata[r][i]=0xff&buffer.buffer[i+offset];}
|
116 |
+
offset+=dcCount;var rsPoly=QRUtil.getErrorCorrectPolynomial(ecCount);var rawPoly=new QRPolynomial(dcdata[r],rsPoly.getLength()-1);var modPoly=rawPoly.mod(rsPoly);ecdata[r]=new Array(rsPoly.getLength()-1);for(var i=0;i<ecdata[r].length;i++){var modIndex=i+modPoly.getLength()-ecdata[r].length;ecdata[r][i]=(modIndex>=0)?modPoly.get(modIndex):0;}}
|
117 |
+
var totalCodeCount=0;for(var i=0;i<rsBlocks.length;i++){totalCodeCount+=rsBlocks[i].totalCount;}
|
118 |
+
var data=new Array(totalCodeCount);var index=0;for(var i=0;i<maxDcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<dcdata[r].length){data[index++]=dcdata[r][i];}}}
|
119 |
+
for(var i=0;i<maxEcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<ecdata[r].length){data[index++]=ecdata[r][i];}}}
|
120 |
+
return data;};var QRMode={MODE_NUMBER:1<<0,MODE_ALPHA_NUM:1<<1,MODE_8BIT_BYTE:1<<2,MODE_KANJI:1<<3};var QRErrorCorrectLevel={L:1,M:0,Q:3,H:2};var QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var QRUtil={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:(1<<10)|(1<<8)|(1<<5)|(1<<4)|(1<<2)|(1<<1)|(1<<0),G18:(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<5)|(1<<2)|(1<<0),G15_MASK:(1<<14)|(1<<12)|(1<<10)|(1<<4)|(1<<1),getBCHTypeInfo:function(data){var d=data<<10;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)>=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));}
|
121 |
+
return((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));}
|
122 |
+
return(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;}
|
123 |
+
return digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error("bad maskPattern:"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i<errorCorrectLength;i++){a=a.multiply(new QRPolynomial([1,QRMath.gexp(i)],0));}
|
124 |
+
return a;},getLengthInBits:function(mode,type){if(1<=type&&type<10){switch(mode){case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:return 8;case QRMode.MODE_KANJI:return 8;default:throw new Error("mode:"+mode);}}else if(type<27){switch(mode){case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw new Error("mode:"+mode);}}else if(type<41){switch(mode){case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw new Error("mode:"+mode);}}else{throw new Error("type:"+type);}},getLostPoint:function(qrCode){var moduleCount=qrCode.getModuleCount();var lostPoint=0;for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount;col++){var sameCount=0;var dark=qrCode.isDark(row,col);for(var r=-1;r<=1;r++){if(row+r<0||moduleCount<=row+r){continue;}
|
125 |
+
for(var c=-1;c<=1;c++){if(col+c<0||moduleCount<=col+c){continue;}
|
126 |
+
if(r==0&&c==0){continue;}
|
127 |
+
if(dark==qrCode.isDark(row+r,col+c)){sameCount++;}}}
|
128 |
+
if(sameCount>5){lostPoint+=(3+sameCount-5);}}}
|
129 |
+
for(var row=0;row<moduleCount-1;row++){for(var col=0;col<moduleCount-1;col++){var count=0;if(qrCode.isDark(row,col))count++;if(qrCode.isDark(row+1,col))count++;if(qrCode.isDark(row,col+1))count++;if(qrCode.isDark(row+1,col+1))count++;if(count==0||count==4){lostPoint+=3;}}}
|
130 |
+
for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount-6;col++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row,col+1)&&qrCode.isDark(row,col+2)&&qrCode.isDark(row,col+3)&&qrCode.isDark(row,col+4)&&!qrCode.isDark(row,col+5)&&qrCode.isDark(row,col+6)){lostPoint+=40;}}}
|
131 |
+
for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount-6;row++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row+1,col)&&qrCode.isDark(row+2,col)&&qrCode.isDark(row+3,col)&&qrCode.isDark(row+4,col)&&!qrCode.isDark(row+5,col)&&qrCode.isDark(row+6,col)){lostPoint+=40;}}}
|
132 |
+
var darkCount=0;for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount;row++){if(qrCode.isDark(row,col)){darkCount++;}}}
|
133 |
+
var ratio=Math.abs(100*darkCount/moduleCount/moduleCount-50)/5;lostPoint+=ratio*10;return lostPoint;}};var QRMath={glog:function(n){if(n<1){throw new Error("glog("+n+")");}
|
134 |
+
return QRMath.LOG_TABLE[n];},gexp:function(n){while(n<0){n+=255;}
|
135 |
+
while(n>=256){n-=255;}
|
136 |
+
return QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<<i;}
|
137 |
+
for(var i=8;i<256;i++){QRMath.EXP_TABLE[i]=QRMath.EXP_TABLE[i-4]^QRMath.EXP_TABLE[i-5]^QRMath.EXP_TABLE[i-6]^QRMath.EXP_TABLE[i-8];}
|
138 |
+
for(var i=0;i<255;i++){QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]]=i;}
|
139 |
+
function QRPolynomial(num,shift){if(num.length==undefined){throw new Error(num.length+"/"+shift);}
|
140 |
+
var offset=0;while(offset<num.length&&num[offset]==0){offset++;}
|
141 |
+
this.num=new Array(num.length-offset+shift);for(var i=0;i<num.length-offset;i++){this.num[i]=num[i+offset];}}
|
142 |
+
QRPolynomial.prototype={get:function(index){return this.num[index];},getLength:function(){return this.num.length;},multiply:function(e){var num=new Array(this.getLength()+e.getLength()-1);for(var i=0;i<this.getLength();i++){for(var j=0;j<e.getLength();j++){num[i+j]^=QRMath.gexp(QRMath.glog(this.get(i))+QRMath.glog(e.get(j)));}}
|
143 |
+
return new QRPolynomial(num,0);},mod:function(e){if(this.getLength()-e.getLength()<0){return this;}
|
144 |
+
var ratio=QRMath.glog(this.get(0))-QRMath.glog(e.get(0));var num=new Array(this.getLength());for(var i=0;i<this.getLength();i++){num[i]=this.get(i);}
|
145 |
+
for(var i=0;i<e.getLength();i++){num[i]^=QRMath.gexp(QRMath.glog(e.get(i))+ratio);}
|
146 |
+
return new QRPolynomial(num,0).mod(e);}};function QRRSBlock(totalCount,dataCount){this.totalCount=totalCount;this.dataCount=dataCount;}
|
147 |
+
QRRSBlock.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];QRRSBlock.getRSBlocks=function(typeNumber,errorCorrectLevel){var rsBlock=QRRSBlock.getRsBlockTable(typeNumber,errorCorrectLevel);if(rsBlock==undefined){throw new Error("bad rs block @ typeNumber:"+typeNumber+"/errorCorrectLevel:"+errorCorrectLevel);}
|
148 |
+
var length=rsBlock.length/3;var list=[];for(var i=0;i<length;i++){var count=rsBlock[i*3+0];var totalCount=rsBlock[i*3+1];var dataCount=rsBlock[i*3+2];for(var j=0;j<count;j++){list.push(new QRRSBlock(totalCount,dataCount));}}
|
149 |
+
return list;};QRRSBlock.getRsBlockTable=function(typeNumber,errorCorrectLevel){switch(errorCorrectLevel){case QRErrorCorrectLevel.L:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+0];case QRErrorCorrectLevel.M:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+1];case QRErrorCorrectLevel.Q:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+2];case QRErrorCorrectLevel.H:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+3];default:return undefined;}};function QRBitBuffer(){this.buffer=[];this.length=0;}
|
150 |
+
QRBitBuffer.prototype={get:function(index){var bufIndex=Math.floor(index/8);return((this.buffer[bufIndex]>>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i<length;i++){this.putBit(((num>>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);}
|
151 |
+
if(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));}
|
152 |
+
this.length++;}};var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]];
|
153 |
+
|
154 |
+
function _isSupportCanvas() {
|
155 |
+
return typeof CanvasRenderingContext2D != "undefined";
|
156 |
+
}
|
157 |
+
|
158 |
+
// android 2.x doesn't support Data-URI spec
|
159 |
+
function _getAndroid() {
|
160 |
+
var android = false;
|
161 |
+
var sAgent = navigator.userAgent;
|
162 |
+
|
163 |
+
if (/android/i.test(sAgent)) { // android
|
164 |
+
android = true;
|
165 |
+
var aMat = sAgent.toString().match(/android ([0-9]\.[0-9])/i);
|
166 |
+
|
167 |
+
if (aMat && aMat[1]) {
|
168 |
+
android = parseFloat(aMat[1]);
|
169 |
+
}
|
170 |
+
}
|
171 |
+
|
172 |
+
return android;
|
173 |
+
}
|
174 |
+
|
175 |
+
var svgDrawer = (function() {
|
176 |
+
|
177 |
+
var Drawing = function (el, htOption) {
|
178 |
+
this._el = el;
|
179 |
+
this._htOption = htOption;
|
180 |
+
};
|
181 |
+
|
182 |
+
Drawing.prototype.draw = function (oQRCode) {
|
183 |
+
var _htOption = this._htOption;
|
184 |
+
var _el = this._el;
|
185 |
+
var nCount = oQRCode.getModuleCount();
|
186 |
+
var nWidth = Math.floor(_htOption.width / nCount);
|
187 |
+
var nHeight = Math.floor(_htOption.height / nCount);
|
188 |
+
|
189 |
+
this.clear();
|
190 |
+
|
191 |
+
function makeSVG(tag, attrs) {
|
192 |
+
var el = document.createElementNS('http://www.w3.org/2000/svg', tag);
|
193 |
+
for (var k in attrs)
|
194 |
+
if (attrs.hasOwnProperty(k)) el.setAttribute(k, attrs[k]);
|
195 |
+
return el;
|
196 |
+
}
|
197 |
+
|
198 |
+
var svg = makeSVG("svg" , {'viewBox': '0 0 ' + String(nCount) + " " + String(nCount), 'width': '100%', 'height': '100%', 'fill': _htOption.colorLight});
|
199 |
+
svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink");
|
200 |
+
_el.appendChild(svg);
|
201 |
+
|
202 |
+
svg.appendChild(makeSVG("rect", {"fill": _htOption.colorLight, "width": "100%", "height": "100%"}));
|
203 |
+
svg.appendChild(makeSVG("rect", {"fill": _htOption.colorDark, "width": "1", "height": "1", "id": "template"}));
|
204 |
+
|
205 |
+
for (var row = 0; row < nCount; row++) {
|
206 |
+
for (var col = 0; col < nCount; col++) {
|
207 |
+
if (oQRCode.isDark(row, col)) {
|
208 |
+
var child = makeSVG("use", {"x": String(col), "y": String(row)});
|
209 |
+
child.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template")
|
210 |
+
svg.appendChild(child);
|
211 |
+
}
|
212 |
+
}
|
213 |
+
}
|
214 |
+
};
|
215 |
+
Drawing.prototype.clear = function () {
|
216 |
+
while (this._el.hasChildNodes())
|
217 |
+
this._el.removeChild(this._el.lastChild);
|
218 |
+
};
|
219 |
+
return Drawing;
|
220 |
+
})();
|
221 |
+
|
222 |
+
var useSVG = document.documentElement.tagName.toLowerCase() === "svg";
|
223 |
+
|
224 |
+
// Drawing in DOM by using Table tag
|
225 |
+
var Drawing = useSVG ? svgDrawer : !_isSupportCanvas() ? (function () {
|
226 |
+
var Drawing = function (el, htOption) {
|
227 |
+
this._el = el;
|
228 |
+
this._htOption = htOption;
|
229 |
+
};
|
230 |
+
|
231 |
+
/**
|
232 |
+
* Draw the QRCode
|
233 |
+
*
|
234 |
+
* @param {QRCode} oQRCode
|
235 |
+
*/
|
236 |
+
Drawing.prototype.draw = function (oQRCode) {
|
237 |
+
var _htOption = this._htOption;
|
238 |
+
var _el = this._el;
|
239 |
+
var nCount = oQRCode.getModuleCount();
|
240 |
+
var nWidth = Math.floor(_htOption.width / nCount);
|
241 |
+
var nHeight = Math.floor(_htOption.height / nCount);
|
242 |
+
var aHTML = ['<table style="border:0;border-collapse:collapse;">'];
|
243 |
+
|
244 |
+
for (var row = 0; row < nCount; row++) {
|
245 |
+
aHTML.push('<tr>');
|
246 |
+
|
247 |
+
for (var col = 0; col < nCount; col++) {
|
248 |
+
aHTML.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:' + nWidth + 'px;height:' + nHeight + 'px;background-color:' + (oQRCode.isDark(row, col) ? _htOption.colorDark : _htOption.colorLight) + ';"></td>');
|
249 |
+
}
|
250 |
+
|
251 |
+
aHTML.push('</tr>');
|
252 |
+
}
|
253 |
+
|
254 |
+
aHTML.push('</table>');
|
255 |
+
_el.innerHTML = aHTML.join('');
|
256 |
+
|
257 |
+
// Fix the margin values as real size.
|
258 |
+
var elTable = _el.childNodes[0];
|
259 |
+
var nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2;
|
260 |
+
var nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2;
|
261 |
+
|
262 |
+
if (nLeftMarginTable > 0 && nTopMarginTable > 0) {
|
263 |
+
elTable.style.margin = nTopMarginTable + "px " + nLeftMarginTable + "px";
|
264 |
+
}
|
265 |
+
};
|
266 |
+
|
267 |
+
/**
|
268 |
+
* Clear the QRCode
|
269 |
+
*/
|
270 |
+
Drawing.prototype.clear = function () {
|
271 |
+
this._el.innerHTML = '';
|
272 |
+
};
|
273 |
+
|
274 |
+
return Drawing;
|
275 |
+
})() : (function () { // Drawing in Canvas
|
276 |
+
function _onMakeImage() {
|
277 |
+
this._elImage.src = this._elCanvas.toDataURL("image/png");
|
278 |
+
this._elImage.style.display = "block";
|
279 |
+
this._elCanvas.style.display = "none";
|
280 |
+
}
|
281 |
+
|
282 |
+
// Android 2.1 bug workaround
|
283 |
+
// http://code.google.com/p/android/issues/detail?id=5141
|
284 |
+
if (this._android && this._android <= 2.1) {
|
285 |
+
var factor = 1 / window.devicePixelRatio;
|
286 |
+
var drawImage = CanvasRenderingContext2D.prototype.drawImage;
|
287 |
+
CanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) {
|
288 |
+
if (("nodeName" in image) && /img/i.test(image.nodeName)) {
|
289 |
+
for (var i = arguments.length - 1; i >= 1; i--) {
|
290 |
+
arguments[i] = arguments[i] * factor;
|
291 |
+
}
|
292 |
+
} else if (typeof dw == "undefined") {
|
293 |
+
arguments[1] *= factor;
|
294 |
+
arguments[2] *= factor;
|
295 |
+
arguments[3] *= factor;
|
296 |
+
arguments[4] *= factor;
|
297 |
+
}
|
298 |
+
|
299 |
+
drawImage.apply(this, arguments);
|
300 |
+
};
|
301 |
+
}
|
302 |
+
|
303 |
+
/**
|
304 |
+
* Check whether the user's browser supports Data URI or not
|
305 |
+
*
|
306 |
+
* @private
|
307 |
+
* @param {Function} fSuccess Occurs if it supports Data URI
|
308 |
+
* @param {Function} fFail Occurs if it doesn't support Data URI
|
309 |
+
*/
|
310 |
+
function _safeSetDataURI(fSuccess, fFail) {
|
311 |
+
var self = this;
|
312 |
+
self._fFail = fFail;
|
313 |
+
self._fSuccess = fSuccess;
|
314 |
+
|
315 |
+
// Check it just once
|
316 |
+
if (self._bSupportDataURI === null) {
|
317 |
+
var el = document.createElement("img");
|
318 |
+
var fOnError = function() {
|
319 |
+
self._bSupportDataURI = false;
|
320 |
+
|
321 |
+
if (self._fFail) {
|
322 |
+
self._fFail.call(self);
|
323 |
+
}
|
324 |
+
};
|
325 |
+
var fOnSuccess = function() {
|
326 |
+
self._bSupportDataURI = true;
|
327 |
+
|
328 |
+
if (self._fSuccess) {
|
329 |
+
self._fSuccess.call(self);
|
330 |
+
}
|
331 |
+
};
|
332 |
+
|
333 |
+
el.onabort = fOnError;
|
334 |
+
el.onerror = fOnError;
|
335 |
+
el.onload = fOnSuccess;
|
336 |
+
el.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // the Image contains 1px data.
|
337 |
+
return;
|
338 |
+
} else if (self._bSupportDataURI === true && self._fSuccess) {
|
339 |
+
self._fSuccess.call(self);
|
340 |
+
} else if (self._bSupportDataURI === false && self._fFail) {
|
341 |
+
self._fFail.call(self);
|
342 |
+
}
|
343 |
+
};
|
344 |
+
|
345 |
+
/**
|
346 |
+
* Drawing QRCode by using canvas
|
347 |
+
*
|
348 |
+
* @constructor
|
349 |
+
* @param {HTMLElement} el
|
350 |
+
* @param {Object} htOption QRCode Options
|
351 |
+
*/
|
352 |
+
var Drawing = function (el, htOption) {
|
353 |
+
this._bIsPainted = false;
|
354 |
+
this._android = _getAndroid();
|
355 |
+
|
356 |
+
this._htOption = htOption;
|
357 |
+
this._elCanvas = document.createElement("canvas");
|
358 |
+
this._elCanvas.width = htOption.width;
|
359 |
+
this._elCanvas.height = htOption.height;
|
360 |
+
el.appendChild(this._elCanvas);
|
361 |
+
this._el = el;
|
362 |
+
this._oContext = this._elCanvas.getContext("2d");
|
363 |
+
this._bIsPainted = false;
|
364 |
+
this._elImage = document.createElement("img");
|
365 |
+
this._elImage.alt = "Scan me!";
|
366 |
+
this._elImage.style.display = "none";
|
367 |
+
this._el.appendChild(this._elImage);
|
368 |
+
this._bSupportDataURI = null;
|
369 |
+
};
|
370 |
+
|
371 |
+
/**
|
372 |
+
* Draw the QRCode
|
373 |
+
*
|
374 |
+
* @param {QRCode} oQRCode
|
375 |
+
*/
|
376 |
+
Drawing.prototype.draw = function (oQRCode) {
|
377 |
+
var _elImage = this._elImage;
|
378 |
+
var _oContext = this._oContext;
|
379 |
+
var _htOption = this._htOption;
|
380 |
+
|
381 |
+
var nCount = oQRCode.getModuleCount();
|
382 |
+
var nWidth = _htOption.width / nCount;
|
383 |
+
var nHeight = _htOption.height / nCount;
|
384 |
+
var nRoundedWidth = Math.round(nWidth);
|
385 |
+
var nRoundedHeight = Math.round(nHeight);
|
386 |
+
|
387 |
+
_elImage.style.display = "none";
|
388 |
+
this.clear();
|
389 |
+
|
390 |
+
for (var row = 0; row < nCount; row++) {
|
391 |
+
for (var col = 0; col < nCount; col++) {
|
392 |
+
var bIsDark = oQRCode.isDark(row, col);
|
393 |
+
var nLeft = col * nWidth;
|
394 |
+
var nTop = row * nHeight;
|
395 |
+
_oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;
|
396 |
+
_oContext.lineWidth = 1;
|
397 |
+
_oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;
|
398 |
+
_oContext.fillRect(nLeft, nTop, nWidth, nHeight);
|
399 |
+
|
400 |
+
// 안티 앨리어싱 방지 처리
|
401 |
+
_oContext.strokeRect(
|
402 |
+
Math.floor(nLeft) + 0.5,
|
403 |
+
Math.floor(nTop) + 0.5,
|
404 |
+
nRoundedWidth,
|
405 |
+
nRoundedHeight
|
406 |
+
);
|
407 |
+
|
408 |
+
_oContext.strokeRect(
|
409 |
+
Math.ceil(nLeft) - 0.5,
|
410 |
+
Math.ceil(nTop) - 0.5,
|
411 |
+
nRoundedWidth,
|
412 |
+
nRoundedHeight
|
413 |
+
);
|
414 |
+
}
|
415 |
+
}
|
416 |
+
|
417 |
+
this._bIsPainted = true;
|
418 |
+
};
|
419 |
+
|
420 |
+
/**
|
421 |
+
* Make the image from Canvas if the browser supports Data URI.
|
422 |
+
*/
|
423 |
+
Drawing.prototype.makeImage = function () {
|
424 |
+
if (this._bIsPainted) {
|
425 |
+
_safeSetDataURI.call(this, _onMakeImage);
|
426 |
+
}
|
427 |
+
};
|
428 |
+
|
429 |
+
/**
|
430 |
+
* Return whether the QRCode is painted or not
|
431 |
+
*
|
432 |
+
* @return {Boolean}
|
433 |
+
*/
|
434 |
+
Drawing.prototype.isPainted = function () {
|
435 |
+
return this._bIsPainted;
|
436 |
+
};
|
437 |
+
|
438 |
+
/**
|
439 |
+
* Clear the QRCode
|
440 |
+
*/
|
441 |
+
Drawing.prototype.clear = function () {
|
442 |
+
this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height);
|
443 |
+
this._bIsPainted = false;
|
444 |
+
};
|
445 |
+
|
446 |
+
/**
|
447 |
+
* @private
|
448 |
+
* @param {Number} nNumber
|
449 |
+
*/
|
450 |
+
Drawing.prototype.round = function (nNumber) {
|
451 |
+
if (!nNumber) {
|
452 |
+
return nNumber;
|
453 |
+
}
|
454 |
+
|
455 |
+
return Math.floor(nNumber * 1000) / 1000;
|
456 |
+
};
|
457 |
+
|
458 |
+
return Drawing;
|
459 |
+
})();
|
460 |
+
|
461 |
+
/**
|
462 |
+
* Get the type by string length
|
463 |
+
*
|
464 |
+
* @private
|
465 |
+
* @param {String} sText
|
466 |
+
* @param {Number} nCorrectLevel
|
467 |
+
* @return {Number} type
|
468 |
+
*/
|
469 |
+
function _getTypeNumber(sText, nCorrectLevel) {
|
470 |
+
var nType = 1;
|
471 |
+
var length = _getUTF8Length(sText);
|
472 |
+
|
473 |
+
for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) {
|
474 |
+
var nLimit = 0;
|
475 |
+
|
476 |
+
switch (nCorrectLevel) {
|
477 |
+
case QRErrorCorrectLevel.L :
|
478 |
+
nLimit = QRCodeLimitLength[i][0];
|
479 |
+
break;
|
480 |
+
case QRErrorCorrectLevel.M :
|
481 |
+
nLimit = QRCodeLimitLength[i][1];
|
482 |
+
break;
|
483 |
+
case QRErrorCorrectLevel.Q :
|
484 |
+
nLimit = QRCodeLimitLength[i][2];
|
485 |
+
break;
|
486 |
+
case QRErrorCorrectLevel.H :
|
487 |
+
nLimit = QRCodeLimitLength[i][3];
|
488 |
+
break;
|
489 |
+
}
|
490 |
+
|
491 |
+
if (length <= nLimit) {
|
492 |
+
break;
|
493 |
+
} else {
|
494 |
+
nType++;
|
495 |
+
}
|
496 |
+
}
|
497 |
+
|
498 |
+
if (nType > QRCodeLimitLength.length) {
|
499 |
+
throw new Error("Too long data");
|
500 |
+
}
|
501 |
+
|
502 |
+
return nType;
|
503 |
+
}
|
504 |
+
|
505 |
+
function _getUTF8Length(sText) {
|
506 |
+
var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a');
|
507 |
+
return replacedText.length + (replacedText.length != sText ? 3 : 0);
|
508 |
+
}
|
509 |
+
|
510 |
+
/**
|
511 |
+
* @class QRCode
|
512 |
+
* @constructor
|
513 |
+
* @example
|
514 |
+
* new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie");
|
515 |
+
*
|
516 |
+
* @example
|
517 |
+
* var oQRCode = new QRCode("test", {
|
518 |
+
* text : "http://naver.com",
|
519 |
+
* width : 128,
|
520 |
+
* height : 128
|
521 |
+
* });
|
522 |
+
*
|
523 |
+
* oQRCode.clear(); // Clear the QRCode.
|
524 |
+
* oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode.
|
525 |
+
*
|
526 |
+
* @param {HTMLElement|String} el target element or 'id' attribute of element.
|
527 |
+
* @param {Object|String} vOption
|
528 |
+
* @param {String} vOption.text QRCode link data
|
529 |
+
* @param {Number} [vOption.width=256]
|
530 |
+
* @param {Number} [vOption.height=256]
|
531 |
+
* @param {String} [vOption.colorDark="#000000"]
|
532 |
+
* @param {String} [vOption.colorLight="#ffffff"]
|
533 |
+
* @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H]
|
534 |
+
*/
|
535 |
+
QRCode = function (el, vOption) {
|
536 |
+
this._htOption = {
|
537 |
+
width : 256,
|
538 |
+
height : 256,
|
539 |
+
typeNumber : 4,
|
540 |
+
colorDark : "#000000",
|
541 |
+
colorLight : "#ffffff",
|
542 |
+
correctLevel : QRErrorCorrectLevel.H
|
543 |
+
};
|
544 |
+
|
545 |
+
if (typeof vOption === 'string') {
|
546 |
+
vOption = {
|
547 |
+
text : vOption
|
548 |
+
};
|
549 |
+
}
|
550 |
+
|
551 |
+
// Overwrites options
|
552 |
+
if (vOption) {
|
553 |
+
for (var i in vOption) {
|
554 |
+
this._htOption[i] = vOption[i];
|
555 |
+
}
|
556 |
+
}
|
557 |
+
|
558 |
+
if (typeof el == "string") {
|
559 |
+
el = document.getElementById(el);
|
560 |
+
}
|
561 |
+
|
562 |
+
if (this._htOption.useSVG) {
|
563 |
+
Drawing = svgDrawer;
|
564 |
+
}
|
565 |
+
|
566 |
+
this._android = _getAndroid();
|
567 |
+
this._el = el;
|
568 |
+
this._oQRCode = null;
|
569 |
+
this._oDrawing = new Drawing(this._el, this._htOption);
|
570 |
+
|
571 |
+
if (this._htOption.text) {
|
572 |
+
this.makeCode(this._htOption.text);
|
573 |
+
}
|
574 |
+
};
|
575 |
+
|
576 |
+
/**
|
577 |
+
* Make the QRCode
|
578 |
+
*
|
579 |
+
* @param {String} sText link data
|
580 |
+
*/
|
581 |
+
QRCode.prototype.makeCode = function (sText) {
|
582 |
+
this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel);
|
583 |
+
this._oQRCode.addData(sText);
|
584 |
+
this._oQRCode.make();
|
585 |
+
this._el.title = sText;
|
586 |
+
this._oDrawing.draw(this._oQRCode);
|
587 |
+
this.makeImage();
|
588 |
+
};
|
589 |
+
|
590 |
+
/**
|
591 |
+
* Make the Image from Canvas element
|
592 |
+
* - It occurs automatically
|
593 |
+
* - Android below 3 doesn't support Data-URI spec.
|
594 |
+
*
|
595 |
+
* @private
|
596 |
+
*/
|
597 |
+
QRCode.prototype.makeImage = function () {
|
598 |
+
if (typeof this._oDrawing.makeImage == "function" && (!this._android || this._android >= 3)) {
|
599 |
+
this._oDrawing.makeImage();
|
600 |
+
}
|
601 |
+
};
|
602 |
+
|
603 |
+
/**
|
604 |
+
* Clear the QRCode
|
605 |
+
*/
|
606 |
+
QRCode.prototype.clear = function () {
|
607 |
+
this._oDrawing.clear();
|
608 |
+
};
|
609 |
+
|
610 |
+
/**
|
611 |
+
* @name QRCode.CorrectLevel
|
612 |
+
*/
|
613 |
+
QRCode.CorrectLevel = QRErrorCorrectLevel;
|
614 |
+
})();
|
src/_extensions/jmbuhr/qrcode/qrcode.lua
ADDED
@@ -0,0 +1,104 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
-- for development:
|
2 |
+
local p = quarto.log.warning
|
3 |
+
|
4 |
+
---Format string like in bash or python,
|
5 |
+
---e.g. f('Hello ${one}', {one = 'world'})
|
6 |
+
---@param s string The string to format
|
7 |
+
---@param kwargs {[string]: string} A table with key-value replacemen pairs
|
8 |
+
---@return string
|
9 |
+
local function f(s, kwargs)
|
10 |
+
return (s:gsub('($%b{})', function(w) return kwargs[w:sub(3, -2)] or w end))
|
11 |
+
end
|
12 |
+
|
13 |
+
|
14 |
+
---Merge user provided options with defaults
|
15 |
+
---@param userOptions table
|
16 |
+
---@return string JSON string to pass to molstar
|
17 |
+
local function mergeOptions(url, userOptions)
|
18 |
+
local defaultOptions = {
|
19 |
+
text = url,
|
20 |
+
width = 128,
|
21 |
+
height = 128,
|
22 |
+
colorDark = "#000000",
|
23 |
+
colorLight = "#ffffff",
|
24 |
+
}
|
25 |
+
if userOptions == nil then
|
26 |
+
return quarto.json.encode(defaultOptions)
|
27 |
+
end
|
28 |
+
|
29 |
+
for k, v in pairs(userOptions) do
|
30 |
+
local value = pandoc.utils.stringify(v)
|
31 |
+
if value == 'true' then value = true end
|
32 |
+
if value == 'false' then value = false end
|
33 |
+
defaultOptions[k] = value
|
34 |
+
end
|
35 |
+
|
36 |
+
return quarto.json.encode(defaultOptions)
|
37 |
+
end
|
38 |
+
|
39 |
+
|
40 |
+
---@return string
|
41 |
+
local function wrapInlineDiv(options)
|
42 |
+
return [[
|
43 |
+
<div id="${id}" class="qrcode"></div>
|
44 |
+
<script type="text/javascript">
|
45 |
+
var qrcode = new QRCode("${id}", ]]
|
46 |
+
.. options .. [[);
|
47 |
+
</script>
|
48 |
+
]]
|
49 |
+
end
|
50 |
+
|
51 |
+
---@return string
|
52 |
+
local function wrapInlineTex(url, opts)
|
53 |
+
return [[
|
54 |
+
\qrcode[]] .. opts .. [[]{]] .. url .. [[}
|
55 |
+
]]
|
56 |
+
end
|
57 |
+
|
58 |
+
return {
|
59 |
+
['qrcode'] = function(args, kwargs, _)
|
60 |
+
if quarto.doc.is_format("html:js") then
|
61 |
+
quarto.doc.add_html_dependency {
|
62 |
+
name = 'qrcodejs',
|
63 |
+
version = 'v1.0.0',
|
64 |
+
scripts = { './assets/qrcode.js' },
|
65 |
+
}
|
66 |
+
local url = pandoc.utils.stringify(args[1])
|
67 |
+
local id = 'qrcode'
|
68 |
+
local maybeId = args[2]
|
69 |
+
if maybeId ~= nil then
|
70 |
+
id = pandoc.utils.stringify(maybeId)
|
71 |
+
end
|
72 |
+
local options = mergeOptions(url, kwargs)
|
73 |
+
local text = wrapInlineDiv(options)
|
74 |
+
return pandoc.RawBlock(
|
75 |
+
'html',
|
76 |
+
f(text, { id = id })
|
77 |
+
)
|
78 |
+
elseif quarto.doc.is_format("pdf") then
|
79 |
+
quarto.doc.use_latex_package("qrcode")
|
80 |
+
local url = pandoc.utils.stringify(args[1])
|
81 |
+
local opts = ""
|
82 |
+
for k, v in pairs(kwargs) do
|
83 |
+
if string.match(k, "^pdf") then
|
84 |
+
k = string.sub(k, 4)
|
85 |
+
opts = opts .. k .. "=" .. v .. ", "
|
86 |
+
end
|
87 |
+
end
|
88 |
+
for _, v in ipairs(args) do
|
89 |
+
if string.match(v, "^pdf") then
|
90 |
+
v = string.sub(v, 4)
|
91 |
+
opts = opts .. v .. ", "
|
92 |
+
end
|
93 |
+
end
|
94 |
+
if string.len(opts) then
|
95 |
+
opts = string.sub(opts, 1, string.len(opts) - 2)
|
96 |
+
end
|
97 |
+
local text = wrapInlineTex(url, opts)
|
98 |
+
return pandoc.RawBlock(
|
99 |
+
'tex',
|
100 |
+
text
|
101 |
+
)
|
102 |
+
end
|
103 |
+
end,
|
104 |
+
}
|
src/_extensions/martinomagnifico/verticator/_extension.yml
ADDED
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
title: Verticator
|
2 |
+
author: Martijn De Jongh (Martino)
|
3 |
+
version: 1.2.3
|
4 |
+
quarto-required: ">=1.2.198"
|
5 |
+
contributes:
|
6 |
+
revealjs-plugins:
|
7 |
+
-
|
8 |
+
name: Verticator
|
9 |
+
script: verticator.js
|
10 |
+
stylesheet: verticator.css
|
11 |
+
config:
|
12 |
+
verticator:
|
13 |
+
themetag: 'h1'
|
14 |
+
color: ''
|
15 |
+
inversecolor: ''
|
16 |
+
skipuncounted: false
|
17 |
+
clickable: true
|
18 |
+
position: 'auto'
|
19 |
+
offset: '3vmin'
|
20 |
+
autogenerate: true
|
21 |
+
tooltip: false
|
22 |
+
scale: 1
|
src/_extensions/martinomagnifico/verticator/verticator.css
ADDED
@@ -0,0 +1,186 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
ul.verticator {
|
2 |
+
opacity: 0;
|
3 |
+
will-change: color;
|
4 |
+
color: white;
|
5 |
+
color: var(--v-forcecolor, var(--v-color, var(--c-theme-color, white)));
|
6 |
+
-webkit-transition: opacity 300ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
7 |
+
-o-transition: opacity 300ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
8 |
+
transition: opacity 300ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
9 |
+
list-style: none;
|
10 |
+
right: auto;
|
11 |
+
left: auto;
|
12 |
+
margin: 0;
|
13 |
+
top: 50%;
|
14 |
+
-webkit-transform: translateY(-50%) translateZ(0);
|
15 |
+
transform: translateY(-50%) translateZ(0);
|
16 |
+
z-index: 10;
|
17 |
+
position: absolute;
|
18 |
+
display: -webkit-box;
|
19 |
+
display: -ms-flexbox;
|
20 |
+
display: flex;
|
21 |
+
-webkit-box-orient: vertical;
|
22 |
+
-webkit-box-direction: normal;
|
23 |
+
-ms-flex-direction: column;
|
24 |
+
flex-direction: column;
|
25 |
+
padding: 12px;
|
26 |
+
padding: calc(12px * var(--verticator-scale));
|
27 |
+
}
|
28 |
+
ul.verticator.visible {
|
29 |
+
opacity: 0.6;
|
30 |
+
}
|
31 |
+
ul.verticator.visible:hover {
|
32 |
+
opacity: 1;
|
33 |
+
}
|
34 |
+
ul.verticator.no-click {
|
35 |
+
pointer-events: none;
|
36 |
+
}
|
37 |
+
ul.verticator li {
|
38 |
+
display: block;
|
39 |
+
position: relative;
|
40 |
+
will-change: color;
|
41 |
+
color: inherit;
|
42 |
+
margin: 0;
|
43 |
+
-webkit-transition: opacity 300ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
44 |
+
-o-transition: opacity 300ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
45 |
+
transition: opacity 300ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
46 |
+
opacity: 0;
|
47 |
+
}
|
48 |
+
ul.verticator li:before {
|
49 |
+
display: none;
|
50 |
+
}
|
51 |
+
ul.verticator li a {
|
52 |
+
color: inherit;
|
53 |
+
will-change: color;
|
54 |
+
display: -webkit-box;
|
55 |
+
display: -ms-flexbox;
|
56 |
+
display: flex;
|
57 |
+
-webkit-box-align: center;
|
58 |
+
-ms-flex-align: center;
|
59 |
+
align-items: center;
|
60 |
+
-webkit-box-pack: center;
|
61 |
+
-ms-flex-pack: center;
|
62 |
+
justify-content: center;
|
63 |
+
text-decoration: none;
|
64 |
+
width: calc(18px * var(--verticator-scale));
|
65 |
+
height: calc(18px * var(--verticator-scale));
|
66 |
+
}
|
67 |
+
ul.verticator li a:after {
|
68 |
+
content: "";
|
69 |
+
will-change: color;
|
70 |
+
color: inherit;
|
71 |
+
background-color: currentColor;
|
72 |
+
display: block;
|
73 |
+
width: calc(12px * var(--verticator-scale));
|
74 |
+
height: calc(12px * var(--verticator-scale));
|
75 |
+
opacity: 0.6;
|
76 |
+
-webkit-transform: translateZ(0) scale(0.4);
|
77 |
+
transform: translateZ(0) scale(0.4);
|
78 |
+
border-radius: 100%;
|
79 |
+
-webkit-transition: opacity 200ms cubic-bezier(0.26, 0.86, 0.44, 0.985), -webkit-transform 300ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
80 |
+
transition: opacity 200ms cubic-bezier(0.26, 0.86, 0.44, 0.985), -webkit-transform 300ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
81 |
+
-o-transition: transform 300ms cubic-bezier(0.26, 0.86, 0.44, 0.985), opacity 200ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
82 |
+
transition: transform 300ms cubic-bezier(0.26, 0.86, 0.44, 0.985), opacity 200ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
83 |
+
transition: transform 300ms cubic-bezier(0.26, 0.86, 0.44, 0.985), opacity 200ms cubic-bezier(0.26, 0.86, 0.44, 0.985), -webkit-transform 300ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
|
84 |
+
-webkit-transition-delay: 50ms;
|
85 |
+
-o-transition-delay: 50ms;
|
86 |
+
transition-delay: 50ms;
|
87 |
+
}
|
88 |
+
ul.verticator li a:hover {
|
89 |
+
color: inherit;
|
90 |
+
}
|
91 |
+
ul.verticator li a:hover:after {
|
92 |
+
opacity: 1;
|
93 |
+
-webkit-transform: translateZ(0) scale(0.75);
|
94 |
+
transform: translateZ(0) scale(0.75);
|
95 |
+
}
|
96 |
+
ul.verticator li.active a {
|
97 |
+
cursor: default;
|
98 |
+
}
|
99 |
+
ul.verticator li.active a:after {
|
100 |
+
-webkit-transform: translateZ(0) scale(1);
|
101 |
+
transform: translateZ(0) scale(1);
|
102 |
+
opacity: 1;
|
103 |
+
}
|
104 |
+
ul.verticator.visible li {
|
105 |
+
opacity: 1;
|
106 |
+
}
|
107 |
+
|
108 |
+
.print-pdf .verticator,
|
109 |
+
.overview .verticator {
|
110 |
+
display: none;
|
111 |
+
}
|
112 |
+
|
113 |
+
.verticator {
|
114 |
+
--verticator-tooltip-scale: 1;
|
115 |
+
}
|
116 |
+
|
117 |
+
.verticator .tooltip {
|
118 |
+
position: absolute;
|
119 |
+
top: 9px;
|
120 |
+
right: 30px;
|
121 |
+
top: calc(9px * var(--verticator-scale));
|
122 |
+
right: calc(30px * var(--verticator-scale) + 1.5px * var(--verticator-tooltip-scale) * var(--verticator-tooltip-scale));
|
123 |
+
-webkit-transform: translate3d(0, -50%, 1px);
|
124 |
+
transform: translate3d(0, -50%, 1px);
|
125 |
+
-webkit-box-shadow: calc(4px * var(--verticator-scale)) calc(6px * var(--verticator-scale)) calc(16px * var(--verticator-scale)) rgba(0, 0, 0, 0.25);
|
126 |
+
box-shadow: calc(4px * var(--verticator-scale)) calc(6px * var(--verticator-scale)) calc(16px * var(--verticator-scale)) rgba(0, 0, 0, 0.25);
|
127 |
+
pointer-events: none;
|
128 |
+
background: white;
|
129 |
+
font-size: calc(1.25rem * var(--verticator-tooltip-scale) * var(--verticator-scale));
|
130 |
+
padding: 0.4em 0.6em;
|
131 |
+
border-radius: 0.2em;
|
132 |
+
min-width: 30px;
|
133 |
+
max-width: 15em;
|
134 |
+
display: block;
|
135 |
+
-webkit-font-smoothing: antialiased;
|
136 |
+
color: black;
|
137 |
+
}
|
138 |
+
.verticator .tooltip span {
|
139 |
+
white-space: nowrap;
|
140 |
+
display: block;
|
141 |
+
overflow: hidden;
|
142 |
+
-o-text-overflow: ellipsis;
|
143 |
+
text-overflow: ellipsis;
|
144 |
+
line-height: 1.25;
|
145 |
+
}
|
146 |
+
.verticator .tooltip::after {
|
147 |
+
content: "";
|
148 |
+
display: block;
|
149 |
+
width: 0.66em;
|
150 |
+
height: 0.66em;
|
151 |
+
background: white;
|
152 |
+
position: absolute;
|
153 |
+
right: 0;
|
154 |
+
top: 50%;
|
155 |
+
-webkit-transform: translate3d(45%, -50%, -1px) rotate(45deg);
|
156 |
+
transform: translate3d(45%, -50%, -1px) rotate(45deg);
|
157 |
+
}
|
158 |
+
|
159 |
+
.verticator.left .tooltip {
|
160 |
+
right: auto;
|
161 |
+
left: calc(30px * var(--verticator-scale) + 1.5px * var(--verticator-tooltip-scale) * var(--verticator-tooltip-scale));
|
162 |
+
-webkit-box-shadow: calc(-4px * var(--verticator-scale)) calc(6px * var(--verticator-scale)) calc(16px * var(--verticator-scale)) rgba(0, 0, 0, 0.25);
|
163 |
+
box-shadow: calc(-4px * var(--verticator-scale)) calc(6px * var(--verticator-scale)) calc(16px * var(--verticator-scale)) rgba(0, 0, 0, 0.25);
|
164 |
+
}
|
165 |
+
.verticator.left .tooltip::after {
|
166 |
+
right: auto;
|
167 |
+
left: 0;
|
168 |
+
-webkit-transform: translate3d(-45%, -50%, -1px) rotate(45deg);
|
169 |
+
transform: translate3d(-45%, -50%, -1px) rotate(45deg);
|
170 |
+
}
|
171 |
+
|
172 |
+
.verticator li a + .tooltip {
|
173 |
+
pointer-events: none;
|
174 |
+
display: block;
|
175 |
+
opacity: 0;
|
176 |
+
-webkit-transition: opacity 0.125s ease-in-out;
|
177 |
+
-o-transition: opacity 0.125s ease-in-out;
|
178 |
+
transition: opacity 0.125s ease-in-out;
|
179 |
+
-webkit-transition-delay: 0.0625s;
|
180 |
+
-o-transition-delay: 0.0625s;
|
181 |
+
transition-delay: 0.0625s;
|
182 |
+
}
|
183 |
+
|
184 |
+
.verticator li a:hover + .tooltip {
|
185 |
+
opacity: 1;
|
186 |
+
}
|
src/_extensions/martinomagnifico/verticator/verticator.js
ADDED
@@ -0,0 +1,439 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
/*****************************************************************
|
3 |
+
* @author: Martijn De Jongh (Martino), [email protected]
|
4 |
+
* https://github.com/Martinomagnifico
|
5 |
+
*
|
6 |
+
* Verticator.js for Reveal.js
|
7 |
+
* Version 1.2.3
|
8 |
+
*
|
9 |
+
* @license
|
10 |
+
* MIT licensed
|
11 |
+
*
|
12 |
+
* Thanks to:
|
13 |
+
* - Hakim El Hattab, Reveal.js
|
14 |
+
******************************************************************/
|
15 |
+
|
16 |
+
|
17 |
+
(function (global, factory) {
|
18 |
+
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
19 |
+
typeof define === 'function' && define.amd ? define(factory) :
|
20 |
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Verticator = factory());
|
21 |
+
})(this, (function () { 'use strict';
|
22 |
+
|
23 |
+
var Plugin = function Plugin() {
|
24 |
+
var lightClass = "has-light-background";
|
25 |
+
var darkClass = "has-dark-background";
|
26 |
+
var themeColorVar = "--c-theme-color";
|
27 |
+
var vertiColorVar = "--v-color";
|
28 |
+
var forceColorVar = "--v-forcecolor";
|
29 |
+
var activeclass = 'active';
|
30 |
+
|
31 |
+
var loadStyle = function loadStyle(url, title, callback) {
|
32 |
+
var head = document.querySelector('head');
|
33 |
+
var style = document.querySelector("[title=\"".concat(title, "\"]"));
|
34 |
+
|
35 |
+
if (typeof style == 'undefined' || style == null) {
|
36 |
+
style = document.createElement('link');
|
37 |
+
style.rel = 'stylesheet';
|
38 |
+
style.href = url;
|
39 |
+
style.title = title;
|
40 |
+
|
41 |
+
var finish = function finish() {
|
42 |
+
if (typeof callback === 'function') {
|
43 |
+
callback.call();
|
44 |
+
callback = null;
|
45 |
+
}
|
46 |
+
};
|
47 |
+
|
48 |
+
style.onload = finish;
|
49 |
+
|
50 |
+
style.onreadystatechange = function () {
|
51 |
+
if (this.readyState === 'loaded') {
|
52 |
+
finish();
|
53 |
+
}
|
54 |
+
};
|
55 |
+
|
56 |
+
head.appendChild(style);
|
57 |
+
}
|
58 |
+
};
|
59 |
+
|
60 |
+
var findThemeColors = function findThemeColors(parent, tag) {
|
61 |
+
var themeColors = {};
|
62 |
+
var colorSection = document.createElement("section");
|
63 |
+
var sectionChild = document.createElement(tag);
|
64 |
+
parent.getElementsByClassName('slides')[0].appendChild(colorSection).appendChild(sectionChild);
|
65 |
+
themeColors.regular = getComputedStyle(sectionChild).getPropertyValue('color');
|
66 |
+
colorSection.classList.add(lightClass);
|
67 |
+
themeColors.inverse = getComputedStyle(sectionChild).getPropertyValue('color');
|
68 |
+
|
69 |
+
if (themeColors.regular == themeColors.inverse) {
|
70 |
+
themeColors.theme = "light";
|
71 |
+
colorSection.classList.remove(lightClass);
|
72 |
+
colorSection.classList.add(darkClass);
|
73 |
+
themeColors.inverse = getComputedStyle(sectionChild).getPropertyValue('color');
|
74 |
+
} else {
|
75 |
+
themeColors.theme = "dark";
|
76 |
+
}
|
77 |
+
|
78 |
+
colorSection.remove();
|
79 |
+
return themeColors;
|
80 |
+
};
|
81 |
+
|
82 |
+
var swapColors = function swapColors(needToSwap, options, colors, revealElement, theVerticator) {
|
83 |
+
if (needToSwap) {
|
84 |
+
revealElement.style.setProperty(themeColorVar, colors.themeinverse);
|
85 |
+
|
86 |
+
if (options.inversecolor || options.oppositecolor) {
|
87 |
+
theVerticator.style.setProperty(vertiColorVar, colors.verticatorinverse);
|
88 |
+
} else {
|
89 |
+
theVerticator.style.removeProperty(vertiColorVar);
|
90 |
+
}
|
91 |
+
} else {
|
92 |
+
revealElement.style.setProperty(themeColorVar, colors.themeregular);
|
93 |
+
|
94 |
+
if (options.color) {
|
95 |
+
theVerticator.style.setProperty(vertiColorVar, colors.verticatorregular);
|
96 |
+
} else {
|
97 |
+
theVerticator.style.removeProperty(vertiColorVar);
|
98 |
+
}
|
99 |
+
}
|
100 |
+
};
|
101 |
+
|
102 |
+
var verticate = function verticate(deck, options) {
|
103 |
+
var userScale = options.scale;
|
104 |
+
userScale = userScale > 2 ? 2 : userScale < 0.5 ? 0.5 : userScale;
|
105 |
+
var revealElement = deck.getRevealElement();
|
106 |
+
var theVerticator = revealElement.querySelector('ul.verticator');
|
107 |
+
|
108 |
+
if (!theVerticator) {
|
109 |
+
if (!options.autogenerate) return;
|
110 |
+
var ul = document.createElement('ul');
|
111 |
+
ul.className += "verticator";
|
112 |
+
revealElement.insertBefore(ul, revealElement.childNodes[0]);
|
113 |
+
theVerticator = revealElement.querySelector('ul.verticator');
|
114 |
+
}
|
115 |
+
|
116 |
+
if (!options.clickable) {
|
117 |
+
theVerticator.classList.add('no-click');
|
118 |
+
}
|
119 |
+
|
120 |
+
var revealScale = deck.getScale();
|
121 |
+
var totalScale = revealScale > 1 ? revealScale * userScale : userScale;
|
122 |
+
theVerticator.style.setProperty('--verticator-scale', totalScale.toFixed(2));
|
123 |
+
var tooltipScaleDamper = 1 / Math.sqrt(totalScale);
|
124 |
+
theVerticator.style.setProperty('--verticator-tooltip-scale', tooltipScaleDamper.toFixed(2));
|
125 |
+
var colors = {};
|
126 |
+
var themeColors = findThemeColors(revealElement, options.themetag ? options.themetag : 'section');
|
127 |
+
colors.theme = themeColors.theme;
|
128 |
+
colors.themeregular = themeColors.regular;
|
129 |
+
colors.themeinverse = themeColors.inverse;
|
130 |
+
colors.verticatorregular = options.color ? options.color : themeColors.regular;
|
131 |
+
colors.verticatorinverse = options.inversecolor ? options.inversecolor : options.oppositecolor ? options.oppositecolor : themeColors.inverse;
|
132 |
+
|
133 |
+
if (options.debug) {
|
134 |
+
console.log("Theme regular color is: \"".concat(colors.themeregular, "\""));
|
135 |
+
console.log("Theme inverse color is: \"".concat(colors.themeinverse, "\""));
|
136 |
+
|
137 |
+
if (options.color) {
|
138 |
+
console.log("Verticator regular color is: \"".concat(colors.verticatorregular, "\""));
|
139 |
+
}
|
140 |
+
|
141 |
+
if (options.inversecolor || options.oppositecolor) {
|
142 |
+
console.log("Verticator inverse color is: \"".concat(colors.verticatorinverse, "\""));
|
143 |
+
}
|
144 |
+
}
|
145 |
+
|
146 |
+
revealElement.style.setProperty(themeColorVar, colors.themeregular);
|
147 |
+
|
148 |
+
if (options.color) {
|
149 |
+
theVerticator.style.setProperty(vertiColorVar, colors.verticatorregular);
|
150 |
+
}
|
151 |
+
|
152 |
+
var sectionState = {};
|
153 |
+
sectionState.dark = revealElement.classList.contains(darkClass);
|
154 |
+
sectionState.light = revealElement.classList.contains(lightClass);
|
155 |
+
sectionState.rtl = revealElement.classList.contains('rtl');
|
156 |
+
var revealElementObserver = new MutationObserver(function (mutations) {
|
157 |
+
mutations.forEach(function (mutation) {
|
158 |
+
mutation.target;
|
159 |
+
|
160 |
+
if (mutation.attributeName === 'class') {
|
161 |
+
var hasLightBg = mutation.target.classList.contains(lightClass);
|
162 |
+
var hasDarkBg = mutation.target.classList.contains(darkClass);
|
163 |
+
var leftAligned = mutation.target.classList.contains('rtl');
|
164 |
+
|
165 |
+
if (sectionState.dark !== hasDarkBg || sectionState.light !== hasLightBg) {
|
166 |
+
if (colors.theme == "dark" && sectionState.light !== hasLightBg) {
|
167 |
+
sectionState.light = hasLightBg;
|
168 |
+
swapColors(hasLightBg, options, colors, revealElement, theVerticator);
|
169 |
+
}
|
170 |
+
|
171 |
+
if (colors.theme == "light" && sectionState.dark !== hasDarkBg) {
|
172 |
+
sectionState.dark = hasDarkBg;
|
173 |
+
swapColors(hasDarkBg, options, colors, revealElement, theVerticator);
|
174 |
+
}
|
175 |
+
}
|
176 |
+
|
177 |
+
if (options.position == "auto") {
|
178 |
+
if (sectionState.rtl !== leftAligned) {
|
179 |
+
sectionState.rtl = leftAligned;
|
180 |
+
|
181 |
+
if (leftAligned) {
|
182 |
+
theVerticator.style.left = options.offset;
|
183 |
+
theVerticator.style.right = "auto";
|
184 |
+
theVerticator.classList.add('left');
|
185 |
+
} else {
|
186 |
+
theVerticator.style.right = options.offset;
|
187 |
+
theVerticator.style.left = "auto";
|
188 |
+
theVerticator.classList.remove('left');
|
189 |
+
}
|
190 |
+
}
|
191 |
+
}
|
192 |
+
}
|
193 |
+
});
|
194 |
+
});
|
195 |
+
revealElementObserver.observe(revealElement, {
|
196 |
+
attributes: true,
|
197 |
+
attributeFilter: ['class']
|
198 |
+
});
|
199 |
+
deck.on('slidechanged', function (event) {
|
200 |
+
if (event.currentSlide.dataset.verticator) {
|
201 |
+
if (event.currentSlide.dataset.verticator == "regular") {
|
202 |
+
theVerticator.style.setProperty(forceColorVar, colors.verticatorregular);
|
203 |
+
|
204 |
+
if (options.debug) {
|
205 |
+
console.log("Verticator forced to: \"".concat(colors.verticatorregular, "\""));
|
206 |
+
}
|
207 |
+
} else if (event.currentSlide.dataset.verticator == "inverse") {
|
208 |
+
theVerticator.style.setProperty(forceColorVar, colors.verticatorinverse);
|
209 |
+
|
210 |
+
if (options.debug) {
|
211 |
+
console.log("Verticator forced to: \"".concat(colors.verticatorinverse, "\""));
|
212 |
+
}
|
213 |
+
} else {
|
214 |
+
theVerticator.style.setProperty(forceColorVar, deck.getCurrentSlide().dataset.verticator);
|
215 |
+
|
216 |
+
if (options.debug) {
|
217 |
+
console.log("Verticator forced to: \"".concat(deck.getCurrentSlide().dataset.verticator, "\""));
|
218 |
+
}
|
219 |
+
}
|
220 |
+
} else {
|
221 |
+
theVerticator.style.removeProperty(forceColorVar);
|
222 |
+
}
|
223 |
+
});
|
224 |
+
deck.on('resize', function (event) {
|
225 |
+
revealScale = event.scale;
|
226 |
+
totalScale = revealScale > 1 ? revealScale * userScale : userScale;
|
227 |
+
theVerticator.style.setProperty('--verticator-scale', totalScale.toFixed(2));
|
228 |
+
});
|
229 |
+
|
230 |
+
if (options.offset != '3vmin') {
|
231 |
+
theVerticator.style.right = options.offset;
|
232 |
+
}
|
233 |
+
|
234 |
+
theVerticator.style.right = options.offset;
|
235 |
+
|
236 |
+
if (options.position !== "auto") {
|
237 |
+
var opposite = options.position == "left" ? "right" : "left";
|
238 |
+
theVerticator.style[options.position] = options.offset;
|
239 |
+
theVerticator.style[opposite] = "auto";
|
240 |
+
|
241 |
+
if (options.position == "left" && options.tooltip !== false) {
|
242 |
+
theVerticator.classList.add('left');
|
243 |
+
}
|
244 |
+
}
|
245 |
+
|
246 |
+
var selectionArray = function selectionArray(container, selectors) {
|
247 |
+
var selections = container.querySelectorAll(selectors);
|
248 |
+
var selectionarray = Array.prototype.slice.call(selections);
|
249 |
+
return selectionarray;
|
250 |
+
};
|
251 |
+
|
252 |
+
var clickBullet = function clickBullet(event) {
|
253 |
+
if (event.target.matches('.verticator li a')) {
|
254 |
+
var currIndexh = deck.getIndices().h;
|
255 |
+
var currIndexf = deck.getIndices().v;
|
256 |
+
var i = getNodeindex(event.target.parentNode);
|
257 |
+
event.preventDefault();
|
258 |
+
deck.slide(currIndexh, i, currIndexf);
|
259 |
+
}
|
260 |
+
};
|
261 |
+
|
262 |
+
var activateBullet = function activateBullet(event) {
|
263 |
+
var listItems = selectionArray(theVerticator, 'li');
|
264 |
+
var bestMatch = options.indexbase - 1;
|
265 |
+
listItems.forEach(function (listItem, i) {
|
266 |
+
if (parseInt(listItem.dataset.index) <= event.indexv + options.indexbase) {
|
267 |
+
bestMatch = i;
|
268 |
+
}
|
269 |
+
|
270 |
+
listItem.classList.remove(activeclass);
|
271 |
+
});
|
272 |
+
|
273 |
+
if (bestMatch >= 0) {
|
274 |
+
listItems[bestMatch].classList.add(activeclass);
|
275 |
+
}
|
276 |
+
};
|
277 |
+
|
278 |
+
var ttName = function ttName(element) {
|
279 |
+
if (element.dataset.verticatorTooltip && (element.dataset.verticatorTooltip == "none" || element.dataset.verticatorTooltip == "false") || element.classList.contains('no-verticator-tooltip')) {
|
280 |
+
return;
|
281 |
+
} else if (options.tooltip != "auto" && element.getAttribute("".concat(options.tooltip))) {
|
282 |
+
return element.getAttribute("".concat(options.tooltip));
|
283 |
+
} else if (options.tooltip == "auto") {
|
284 |
+
for (var _i = 0, _arr = ["data-verticator-tooltip", "data-name", "title"]; _i < _arr.length; _i++) {
|
285 |
+
var attr = _arr[_i];
|
286 |
+
|
287 |
+
if (element.getAttribute(attr)) {
|
288 |
+
return element.getAttribute(attr);
|
289 |
+
}
|
290 |
+
}
|
291 |
+
|
292 |
+
for (var _i2 = 0, _arr2 = ["h1", "h2", "h3", "h4"]; _i2 < _arr2.length; _i2++) {
|
293 |
+
var slctr = _arr2[_i2];
|
294 |
+
|
295 |
+
if (element.querySelector(slctr)) {
|
296 |
+
return element.querySelector(slctr).textContent;
|
297 |
+
}
|
298 |
+
}
|
299 |
+
} else return false;
|
300 |
+
};
|
301 |
+
|
302 |
+
var createBullets = function createBullets(event, sections) {
|
303 |
+
theVerticator.classList.remove('visible');
|
304 |
+
var listHtml = '';
|
305 |
+
sections.forEach(function (section) {
|
306 |
+
var i = section[0];
|
307 |
+
var tooltipname = section[1];
|
308 |
+
var link = "href=\"#/".concat(event.indexh + options.indexbase, "/").concat(i + options.indexbase, "\"");
|
309 |
+
var dataname = tooltipname ? "data-name=\"".concat(tooltipname, "\"") : '';
|
310 |
+
var tooltip = tooltipname ? "<div class=\"tooltip\"><span>".concat(tooltipname, "</span></div>") : '';
|
311 |
+
listHtml += "<li data-index=\"".concat(i + options.indexbase, "\"><a ").concat(options.clickable ? link : '').concat(dataname, "></a>").concat(tooltip, "</li>");
|
312 |
+
});
|
313 |
+
theVerticator.innerHTML = listHtml;
|
314 |
+
activateBullet(event);
|
315 |
+
setTimeout(function () {
|
316 |
+
theVerticator.classList.add('visible');
|
317 |
+
}, 300);
|
318 |
+
};
|
319 |
+
|
320 |
+
var slideAppear = function slideAppear(event) {
|
321 |
+
var slide = event.currentSlide;
|
322 |
+
var parent = slide.parentNode;
|
323 |
+
var sections = Array.from(parent.children).map(function (elem, index) {
|
324 |
+
return [index, elem];
|
325 |
+
}).filter(function (indexedElem) {
|
326 |
+
var issection = indexedElem[1].tagName == 'SECTION' && indexedElem[1].parentNode.tagName == 'SECTION';
|
327 |
+
var isuncounted = options.skipuncounted && indexedElem[1].getAttribute('data-visibility') == 'uncounted';
|
328 |
+
return issection && !isuncounted;
|
329 |
+
}).map(function (indexedElem) {
|
330 |
+
var ttname = '';
|
331 |
+
|
332 |
+
if (options.tooltip) {
|
333 |
+
ttname = ttName(indexedElem[1]);
|
334 |
+
}
|
335 |
+
|
336 |
+
return [indexedElem[0], ttname];
|
337 |
+
});
|
338 |
+
|
339 |
+
if (sections.length < 2) {
|
340 |
+
theVerticator.classList.remove('visible');
|
341 |
+
theVerticator.innerHTML = '';
|
342 |
+
} else {
|
343 |
+
if (event.previousSlide) {
|
344 |
+
var lastParent = event.previousSlide.parentNode;
|
345 |
+
|
346 |
+
if (parent != lastParent) {
|
347 |
+
createBullets(event, sections);
|
348 |
+
}
|
349 |
+
} else {
|
350 |
+
createBullets(event, sections);
|
351 |
+
}
|
352 |
+
|
353 |
+
activateBullet(event);
|
354 |
+
}
|
355 |
+
};
|
356 |
+
|
357 |
+
if (theVerticator) {
|
358 |
+
var eventnames = ['ready', 'slidechanged'];
|
359 |
+
eventnames.forEach(function (eventname) {
|
360 |
+
return deck.on(eventname, function (event) {
|
361 |
+
slideAppear(event);
|
362 |
+
});
|
363 |
+
});
|
364 |
+
|
365 |
+
if (deck.getConfig().embedded) {
|
366 |
+
deck.on('click', function (event) {
|
367 |
+
clickBullet(event);
|
368 |
+
});
|
369 |
+
}
|
370 |
+
}
|
371 |
+
};
|
372 |
+
|
373 |
+
var init = function init(deck) {
|
374 |
+
var es5Filename = "verticator.js";
|
375 |
+
var defaultOptions = {
|
376 |
+
themetag: 'h1',
|
377 |
+
color: '',
|
378 |
+
inversecolor: '',
|
379 |
+
skipuncounted: false,
|
380 |
+
clickable: true,
|
381 |
+
position: 'auto',
|
382 |
+
offset: '3vmin',
|
383 |
+
autogenerate: true,
|
384 |
+
tooltip: false,
|
385 |
+
scale: 1,
|
386 |
+
csspath: '',
|
387 |
+
debug: false
|
388 |
+
};
|
389 |
+
|
390 |
+
var defaults = function defaults(options, defaultOptions) {
|
391 |
+
for (var i in defaultOptions) {
|
392 |
+
if (!options.hasOwnProperty(i)) {
|
393 |
+
options[i] = defaultOptions[i];
|
394 |
+
}
|
395 |
+
}
|
396 |
+
};
|
397 |
+
|
398 |
+
var options = deck.getConfig().verticator || {};
|
399 |
+
options.indexbase = deck.getConfig().hashOneBasedIndex ? 1 : 0;
|
400 |
+
defaults(options, defaultOptions);
|
401 |
+
|
402 |
+
function pluginPath() {
|
403 |
+
var path;
|
404 |
+
var pluginScript = document.querySelector("script[src$=\"".concat(es5Filename, "\"]"));
|
405 |
+
|
406 |
+
if (pluginScript) {
|
407 |
+
path = pluginScript.getAttribute("src").slice(0, -1 * es5Filename.length);
|
408 |
+
} else {
|
409 |
+
path = (typeof document === 'undefined' && typeof location === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : typeof document === 'undefined' ? location.href : (document.currentScript && document.currentScript.src || new URL('verticator.js', document.baseURI).href)).slice(0, (typeof document === 'undefined' && typeof location === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : typeof document === 'undefined' ? location.href : (document.currentScript && document.currentScript.src || new URL('verticator.js', document.baseURI).href)).lastIndexOf('/') + 1);
|
410 |
+
}
|
411 |
+
|
412 |
+
return path;
|
413 |
+
}
|
414 |
+
|
415 |
+
var VerticatorStylePath = options.csspath.verticator ? options.csspath.verticator : options.csspath ? options.csspath : "".concat(pluginPath(), "verticator.css") || 'plugin/verticator/verticator.css';
|
416 |
+
|
417 |
+
if (options.debug) {
|
418 |
+
console.log("Plugin path = ".concat(pluginPath()));
|
419 |
+
console.log("Verticator CSS path = ".concat(VerticatorStylePath));
|
420 |
+
}
|
421 |
+
|
422 |
+
var generator = document.querySelector('[name=generator]');
|
423 |
+
|
424 |
+
if (!(generator && generator.content.includes("quarto"))) {
|
425 |
+
loadStyle(VerticatorStylePath, 'verticatorstyle');
|
426 |
+
}
|
427 |
+
|
428 |
+
verticate(deck, options);
|
429 |
+
};
|
430 |
+
|
431 |
+
return {
|
432 |
+
id: 'verticator',
|
433 |
+
init: init
|
434 |
+
};
|
435 |
+
};
|
436 |
+
|
437 |
+
return Plugin;
|
438 |
+
|
439 |
+
}));
|
src/_extensions/quarto-ext/fontawesome/_extension.yml
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
title: Font Awesome support
|
2 |
+
author: Carlos Scheidegger
|
3 |
+
version: 1.1.0
|
4 |
+
quarto-required: ">=1.2.269"
|
5 |
+
contributes:
|
6 |
+
shortcodes:
|
7 |
+
- fontawesome.lua
|
src/_extensions/quarto-ext/fontawesome/assets/css/all.css
ADDED
The diff for this file is too large to render.
See raw diff
|
|
src/_extensions/quarto-ext/fontawesome/assets/css/latex-fontsize.css
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
.fa-tiny {
|
2 |
+
font-size: 0.5em;
|
3 |
+
}
|
4 |
+
.fa-scriptsize {
|
5 |
+
font-size: 0.7em;
|
6 |
+
}
|
7 |
+
.fa-footnotesize {
|
8 |
+
font-size: 0.8em;
|
9 |
+
}
|
10 |
+
.fa-small {
|
11 |
+
font-size: 0.9em;
|
12 |
+
}
|
13 |
+
.fa-normalsize {
|
14 |
+
font-size: 1em;
|
15 |
+
}
|
16 |
+
.fa-large {
|
17 |
+
font-size: 1.2em;
|
18 |
+
}
|
19 |
+
.fa-Large {
|
20 |
+
font-size: 1.5em;
|
21 |
+
}
|
22 |
+
.fa-LARGE {
|
23 |
+
font-size: 1.75em;
|
24 |
+
}
|
25 |
+
.fa-huge {
|
26 |
+
font-size: 2em;
|
27 |
+
}
|
28 |
+
.fa-Huge {
|
29 |
+
font-size: 2.5em;
|
30 |
+
}
|
src/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Brands-Regular-400.ttf
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:42e2c8c09da5345c0b626e16b11e0f8e4c58d122fc68301a797bdf4e5151edf9
|
3 |
+
size 180104
|
src/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Brands-Regular-400.woff2
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:49513c0b3ef601e39be4b67994342f30d276c1a7448eedfd8399ed7338966f8b
|
3 |
+
size 92140
|
src/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Regular-400.ttf
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:d47585213e6b6bd151531bcc9f673528a6c942c612b7f11f0c02410e6d99aef5
|
3 |
+
size 76072
|
src/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Regular-400.woff2
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:3573bbaebec5d5760d9fd551e797f7aa1a792e52ea118f615faa6278a92de308
|
3 |
+
size 25124
|
src/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Solid-900.ttf
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:1c2ee7d7d21f255743668be3d54abfbafdaf5d9d299c6955145c7f59de0cc49d
|
3 |
+
size 384736
|
src/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Solid-900.woff2
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:b1cd911c67f3c57ab398d622ba57edc1e1ee6390c3c6e04bc19ccf9d1436153a
|
3 |
+
size 133940
|
src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.ttf
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:e523f49c12b13a176014af1a46ae5a0545b136bf56d496426aa881026d0c318a
|
3 |
+
size 181852
|
src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.woff2
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:404c746c8f7e3f9b7611a8f23d908c1a32a5c972236b9d89bb68b05d9bf4b905
|
3 |
+
size 105536
|
src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.ttf
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:4e96a7e098e36fd493194c64e973ba5237da65760c7b746217e63c830326a9ac
|
3 |
+
size 60520
|
src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.woff2
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:6a274e7629c0d71dcf8cab1e7733687ebfe32e2c53b4ca9fad050b4f1d5471f3
|
3 |
+
size 23940
|
src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.ttf
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:03f2986c0824c68bdaf1e16947352f5fe417d03741806097fa9ea7131fe3a019
|
3 |
+
size 388460
|
src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.woff2
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:d76fb4e841748a3f6bc63efa23156e02631c283bf41f84efcbdaf339ea3e1b73
|
3 |
+
size 154228
|
src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.ttf
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:86a687cf5ade691e19aa03720ffa7c1ba99dd137f36cc61980eec447f2160627
|
3 |
+
size 10556
|
src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.woff2
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:0db31befb4837c56bf176e879a715b5cdf457553fc7e8877f974b4c6ef75b1b1
|
3 |
+
size 4960
|
src/_extensions/quarto-ext/fontawesome/fontawesome.lua
ADDED
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
local function ensureLatexDeps()
|
2 |
+
quarto.doc.use_latex_package("fontawesome5")
|
3 |
+
end
|
4 |
+
|
5 |
+
local function ensureHtmlDeps()
|
6 |
+
quarto.doc.add_html_dependency({
|
7 |
+
name = 'fontawesome6',
|
8 |
+
version = '0.1.0',
|
9 |
+
stylesheets = {'assets/css/all.css', 'assets/css/latex-fontsize.css'}
|
10 |
+
})
|
11 |
+
end
|
12 |
+
|
13 |
+
local function isEmpty(s)
|
14 |
+
return s == nil or s == ''
|
15 |
+
end
|
16 |
+
|
17 |
+
local function isValidSize(size)
|
18 |
+
local validSizes = {
|
19 |
+
"tiny",
|
20 |
+
"scriptsize",
|
21 |
+
"footnotesize",
|
22 |
+
"small",
|
23 |
+
"normalsize",
|
24 |
+
"large",
|
25 |
+
"Large",
|
26 |
+
"LARGE",
|
27 |
+
"huge",
|
28 |
+
"Huge"
|
29 |
+
}
|
30 |
+
for _, v in ipairs(validSizes) do
|
31 |
+
if v == size then
|
32 |
+
return size
|
33 |
+
end
|
34 |
+
end
|
35 |
+
return ""
|
36 |
+
end
|
37 |
+
|
38 |
+
return {
|
39 |
+
["fa"] = function(args, kwargs)
|
40 |
+
|
41 |
+
local group = "solid"
|
42 |
+
local icon = pandoc.utils.stringify(args[1])
|
43 |
+
if #args > 1 then
|
44 |
+
group = icon
|
45 |
+
icon = pandoc.utils.stringify(args[2])
|
46 |
+
end
|
47 |
+
|
48 |
+
local title = pandoc.utils.stringify(kwargs["title"])
|
49 |
+
if not isEmpty(title) then
|
50 |
+
title = " title=\"" .. title .. "\""
|
51 |
+
end
|
52 |
+
|
53 |
+
local label = pandoc.utils.stringify(kwargs["label"])
|
54 |
+
if isEmpty(label) then
|
55 |
+
label = " aria-label=\"" .. icon .. "\""
|
56 |
+
else
|
57 |
+
label = " aria-label=\"" .. label .. "\""
|
58 |
+
end
|
59 |
+
|
60 |
+
local size = pandoc.utils.stringify(kwargs["size"])
|
61 |
+
|
62 |
+
-- detect html (excluding epub which won't handle fa)
|
63 |
+
if quarto.doc.is_format("html:js") then
|
64 |
+
ensureHtmlDeps()
|
65 |
+
if not isEmpty(size) then
|
66 |
+
size = " fa-" .. size
|
67 |
+
end
|
68 |
+
return pandoc.RawInline(
|
69 |
+
'html',
|
70 |
+
"<i class=\"fa-" .. group .. " fa-" .. icon .. size .. "\"" .. title .. label .. "></i>"
|
71 |
+
)
|
72 |
+
-- detect pdf / beamer / latex / etc
|
73 |
+
elseif quarto.doc.is_format("pdf") then
|
74 |
+
ensureLatexDeps()
|
75 |
+
if isEmpty(isValidSize(size)) then
|
76 |
+
return pandoc.RawInline('tex', "\\faIcon{" .. icon .. "}")
|
77 |
+
else
|
78 |
+
return pandoc.RawInline('tex', "{\\" .. size .. "\\faIcon{" .. icon .. "}}")
|
79 |
+
end
|
80 |
+
else
|
81 |
+
return pandoc.Null()
|
82 |
+
end
|
83 |
+
end
|
84 |
+
}
|