facat commited on
Commit
0cb2777
1 Parent(s): a3771da

add extension

Browse files
Files changed (29) hide show
  1. .gitattributes +2 -0
  2. .gitignore +0 -1
  3. src/_extensions/codewindow/_extension.yml +12 -0
  4. src/_extensions/codewindow/codewindow.css +48 -0
  5. src/_extensions/codewindow/codewindow.js +112 -0
  6. src/_extensions/jmbuhr/qrcode/_extension.yml +6 -0
  7. src/_extensions/jmbuhr/qrcode/assets/qrcode.js +614 -0
  8. src/_extensions/jmbuhr/qrcode/qrcode.lua +104 -0
  9. src/_extensions/martinomagnifico/verticator/_extension.yml +22 -0
  10. src/_extensions/martinomagnifico/verticator/verticator.css +186 -0
  11. src/_extensions/martinomagnifico/verticator/verticator.js +439 -0
  12. src/_extensions/quarto-ext/fontawesome/_extension.yml +7 -0
  13. src/_extensions/quarto-ext/fontawesome/assets/css/all.css +0 -0
  14. src/_extensions/quarto-ext/fontawesome/assets/css/latex-fontsize.css +30 -0
  15. src/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Brands-Regular-400.ttf +3 -0
  16. src/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Brands-Regular-400.woff2 +3 -0
  17. src/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Regular-400.ttf +3 -0
  18. src/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Regular-400.woff2 +3 -0
  19. src/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Solid-900.ttf +3 -0
  20. src/_extensions/quarto-ext/fontawesome/assets/webfonts/FontAwesome6Free-Solid-900.woff2 +3 -0
  21. src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.ttf +3 -0
  22. src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.woff2 +3 -0
  23. src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.ttf +3 -0
  24. src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.woff2 +3 -0
  25. src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.ttf +3 -0
  26. src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.woff2 +3 -0
  27. src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.ttf +3 -0
  28. src/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.woff2 +3 -0
  29. 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), martijn.de.jongh@gmail.com
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
+ }