From f81a42045e29cc396af78b5d87ead874ba26fa18 Mon Sep 17 00:00:00 2001 From: Jieiku Date: Mon, 22 May 2023 23:12:14 -0700 Subject: All Variables Easy Override --- sass/_functions.scss | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 sass/_functions.scss (limited to 'sass/_functions.scss') diff --git a/sass/_functions.scss b/sass/_functions.scss new file mode 100644 index 0000000..13fd8be --- /dev/null +++ b/sass/_functions.scss @@ -0,0 +1,122 @@ +@use "sass:meta"; +@use "sass:list"; + +@function remove($list, $value, $recursive:false) { + $result: (); + @for $i from 1 through length($list) { + @if type-of(nth($list, $i)) == list and $recursive { + $result: append($result, remove(nth($list, $i), $value, $recursive), $separator: comma); + } @else if nth($list, $i) != $value { + $result: append($result, nth($list, $i), $separator: comma); + } + } + @return $result; +} + +@function font-append($base, $ext, $separator:comma) { + $base-pre: (); + $base-pos: (); + $iFontSep: index($base, $separator); + @if not $iFontSep {// didn't find the font separator, return + @debug "⚠ Failed to find '#{$separator}' in the list of '#{$base}'"; + @return $base; + } + @for $i from 1 through list.length($base) { + $iEl: list.nth($base, $i); + @if $i <= $iFontSep { + $base-pre: list.append($base-pre, $iEl, $separator:comma); + } @else { + $base-pos: list.append($base-pos, $iEl, $separator:comma); + } + } + @return list.join(list.join($base-pre, $ext), $base-pos); +} + +@function font-prepend($base, $ext) { + $ext-type: meta.type-of($ext); + @if not ($ext-type == 'string') and not ($ext-type == 'list') { + //@debug "⚠ Expected a string or a list, but got '#{$ext-type}' in '#{$ext}'"; + @return $base; + } @else { + @return list.join($ext, $base); + } +} + +@function font-var($base, $ext, $findFont:null) { + $typeFont: meta.type-of($base); + + @if ($typeFont == 'string') or ($typeFont == 'list') { + @if ($findFont == null) {// prepend + $font: font-prepend($base, $ext); + @return $font; + } @else { // append + $iFoundFont-Main: index($base, $findFont); + @if $iFoundFont-Main { + $font: font-append($base, $ext, $findFont); + @return $font; + } @else { + @debug "⚠ Failed to find font '#{$findFont}' in the list of '#{$base}'"; + } + } + } +} + +@function icon($icon-name,$stroke,$stroke-width:1,$fill:'none',$ic) { + $sc:"%23888";//stroke color + @if $ic { + $sc: $stroke + } + $p: ( + 's': $sc, + 'sw': $stroke-width, + 'f': $fill + ); + $icons: ( + //template-fill: "%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d=''/%3E%3C/svg%3E", + //template-stroke: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d=''/%3E%3C/svg%3E", + bitbucket: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M14.2 15.3H9.8L8.7 8.7h6.6ZM2.8 3.2A.7.7 0 0 0 2 4l3.4 16c.1.4.6.8 1 .8h11a.7.7 0 0 0 .6-.6l4-16.1a.7.7 0 0 0-.7-.9Z'/%3E%3C/svg%3E", + buymeacoffee: "%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='#{map-get($p, f)}' d='m7.9 11.7.8 8.3c.2 2 .8 2 3.6 2 2.3 0 2.8-.1 3-2l.8-9.3c-3.3-1-4 2-8.2 1z'/%3E%3Cpath fill='#{map-get($p, s)}' d='M18.8 4.3c-.6-.1-.6-1-.7-1.9-.2-1.6-1.2-2-4-2.2-3-.4-8.6-.2-8.5 1.6 0 1.7 4.8 2.2 9.7 1.6.8-.1.6-1.5-.2-1.4-3.6.5-7.4 0-7.4-.2 0-.3 3.3-.5 5-.4 4.5.3 3.7.3 4.2 2.2.2 1 0 .9-.7 1-3 .3-6 .2-9-.2C4.7 4 4.3 4.4 4 6c-.8 2.7 1 2.8 2.1 3 4.8.7 7.7.3 10.3.2.8-.1.6.5.6 1.2l-1.3 10.8c-.1 1.4-1.4 1.4-4 1.5-2.7.2-3.3-.5-3.5-1.6L7.1 10c-.1-1-1.5-.6-1.4.3l1.1 10.8C7.1 24 9.4 24 12.2 24c2.6 0 4.6-.3 5-3.2l1-11.3c.2-.9.3-.7 1-.9 1.8-.8 1-4.2-.4-4.3zm-.3 3a38 38 0 0 1-12.6.2c-1.4-.2-.9-2 0-1.9 4.5.7 8.7.7 12 0 1.4-.2 1.1 1.7.6 1.8z' /%3E%3C/svg%3E", + check: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E", + chevron: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E", + clock: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='M12 6v6l4 2'/%3E%3C/svg%3E", + codeberg: "%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='#{map-get($p, f)}' d='M12 1A11 11 0 0 0 1 12a11 11 0 0 0 1.7 6.4L12 6l9.3 12.4A11 11 0 0 0 23 12 11 11 0 0 0 12 1Z'/%3E%3Cpath fill='#{map-get($p, s)}' d='M21.3 18.4 12 6l4.4 16.8a11 11 0 0 0 4.9-4.4Z' /%3E%3C/svg%3E", + date: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'/%3E%3Cpath d='M16 2v4M8 2v4m-5 4h18'/%3E%3C/svg%3E", + discord: "%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M19.7 5.6a18.2 18.2 90 0 0-4.6-1.4 12.5 12.5 90 0 0-.6 1.2 17 17 90 0 0-5 0 12.5 12.5 90 0 0-.6-1.2 18.4 18.4 90 0 0-4.6 1.4A20 20 0 0 0 1 18a18.4 18.4 90 0 0 5.7 2.9 13.5 13.5 90 0 0 1.2-2A11.8 11.8 90 0 1 6 18l.5-.3a13.2 13.2 90 0 0 11 0l.5.3a12 12 90 0 1-1.9.9 13.3 13.3 90 0 0 1.2 2A18.2 18.2 90 0 0 23 18c.3-4.7-.9-8.8-3.3-12.4Zm-11.4 10c-1 0-1.9-1-1.9-2.2s.8-2.2 1.9-2.2 2 1 2 2.2-1 2.2-2 2.2Zm7.4 0c-1.1 0-2-1-2-2.2s.9-2.2 2-2.2 1.9 1 1.9 2.2-.9 2.2-1.9 2.2Z'/%3E%3C/svg%3E", + docker: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M4 19.8S7 20 8 18m-4-7h3v3H4Zm3 0h3v3H7Zm3 0h3v3h-3ZM7 8h3v3H7Zm3 0h3v3h-3Zm0-3h3v3h-3Zm10 8c-1 0-1 0-1.4-1.9C18.5 10 17 10 17 12c0 1 0 2-3 2H1a9 9 0 0 0 3 6c3 2 5 2 9 1a10.8 10.8 90 0 0 5-4c1-2 1-1 3-2s1-2 0-2Z'/%3E%3C/svg%3E%0A", + element: "%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M12 0C5 0 0 6 0 12s6 12 12 12 12-6 12-12A12 12 0 0 0 12 0Zm-1 4c4 0 6 3 6 6 0 2-2 2-2 0s-2-4-4-4-2-2 0-2Zm-7 9c0-4 3-6 6-6 2 0 2 2 0 2s-4 2-4 4-2 2-2 0Zm9 7c-4 0-6-3-6-6 0-2 2-2 2 0s2.4 4 4 4c2 0 2 2 0 2Zm1-3c-2 0-2-2 0-2s4-2 4-4 2-2 2 0c0 4-3 6-6 6Z'/%3E%3C/svg%3E", + facebook: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z'/%3E%3C/svg%3E", + folder: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z'/%3E%3C/svg%3E", + github: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M9 19c-5 1.5-5-2.5-7-3m14 6v-3.9a3.4 3.4 0 0 0-1-2.6c3.2-.3 6.5-1.5 6.5-7A5.4 5.4 0 0 0 20 4.8 5 5 0 0 0 20 1s-1.3-.3-4 1.5a13.4 13.4 0 0 0-7 0C6.3.6 5 1 5 1a5 5 0 0 0 0 3.8 5.4 5.4 0 0 0-1.5 3.7c0 5.5 3.3 6.7 6.4 7a3.4 3.4 0 0 0-.9 2.6V22'/%3E%3C/svg%3E", + github-sponsor: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M20 4c-5-3-8 2-8 4 0-2-3-7-8-4-4 2-6 10 8 18 14-8 12-16 8-18z'/%3E%3C/svg%3E", + gitlab: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M22.6 14.4 12 22 1.3 14.4a.8.8 0 0 1-.3-1l1.3-3.7 2.4-7.5a.4.4 0 0 1 .1-.2.4.4 0 0 1 .6 0 .4.4 0 0 1 .1.2L8 9.7h8l2.5-7.5a.4.4 0 0 1 .1-.2.4.4 0 0 1 .6 0 .4.4 0 0 1 0 .2l2.5 7.5 1.3 3.8a.8.8 0 0 1-.3.9z'/%3E%3C/svg%3E", + globe: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='M2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z'/%3E%3C/svg%3E", + home: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M9 22V12h6v10M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z'/%3E%3C/svg%3E", + instagram: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Crect x='2' y='2' width='20' height='20' rx='5' ry='5'/%3E%3Cpath d='M16 11.4A4 4 0 1 1 12.6 8a4 4 0 0 1 3.4 3.4zm1.5-4.9h.01'/%3E%3C/svg%3E", + linkedin: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6zM2 9h4v12H2z'/%3E%3Ccircle cx='4' cy='4' r='2'/%3E%3C/svg%3E", + mail: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='m22 6-10 7L2 6m2-2h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2Z'/%3E%3C/svg%3E", + mastodon: "%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M2 8c0 5.7-.2 12.6 5 14 2 .6 3.7.7 5 .6 2.4-.1 3.8-.9 3.8-.9l-.1-1.8s-1.7.6-3.7.5c-1.9 0-4-.2-4.2-2.6a5 5 90 0 1 0-.7c4 1 7.5.5 8.4.4 2.7-.4 5-2 5.3-3.6.5-2.4.4-5.8.4-5.8C22 3.4 19 2 19 2 15.9.6 8 .6 5.1 2c0 0-3 1.4-3 6zm4.5-2.3c1.2-1.4 3.8-1.5 5 .3l.5.9.6-1c1.1-1.7 3.7-1.6 4.9-.2 1.1 1.3.9 2.5.9 8.4H16V8.6c0-2.4-3-2.5-3 .3v3h-2V9c0-2.8-3-2.7-3-.3V14H5.6c0-5.9-.2-7.1 1-8.4z'/%3E%3C/svg%3E", + matrix: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M.6.6v22.8H3v.6H0V0h3v.6zm7 7.2V9h.1c3.2-2.3 4.3 0 4.8.3C14.9 6.7 18 8 18 11v5h-1.5v-5a1 1 0 0 0-3.5 0v5h-1.7v-5a1 1 0 0 0-3.7 0v5H6V7.8zm15.8 15.7V.4H21V0h3v24h-3v-.6z'/%3E%3C/svg%3E", + minus: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14'/%3E%3C/svg%3E", + moon: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z'/%3E%3C/svg%3E", + pinterest: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='m8 20 4-9m-1.3 3c.4 1.3 1.4 2 2.5 2 2.1 0 3.8-1.6 3.8-4a5 5 0 1 0-9.7 1.7'/%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3C/svg%3E", + python: "%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='#{map-get($p, f)}' d='M17 6c0 4-1 5-6 5-4 0-5 1-5 6-4 0-5-1-5-6 0-3 1-4.5 4-4.5h7c0-.5 0-.5-1-.5H6c0-3 0-5 6-5 5 0 5 2 5 5ZM9 3C7.5 3 7.5 5 9 5s1.5-2 0-2Z'/%3E%3Cpath fill='#{map-get($p, s)}' d='M23 12c0 3-1 4.6-4 4.5h-7v.5h6c0 4 0 6-6 6-5 0-5-2-5-6s1-5 6-5c4 0 5-1 5-6 4 0 5 1 5 6Zm-8 7c-1.5 0-1.5 2 0 2s1.5-2 0-2Z' /%3E%3C/svg%3E", + researchgate: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M16 5c0 3.5.7 5 3 5s3.7-1.3 3.3-5h-3v1.3H21c0 1.9-.7 2.7-2 2.5-1.3 0-1.8-.7-1.8-3.2 0-2.4.4-3.3 1.5-3.4 1-.2 1.7.2 2.2 1.1L22 3c-.4-1.3-1.4-2-2.9-2C17.2 1 16 2 16 5ZM8 6.2l-6 .2v.9c1 .3 2 0 2 2.2v11C4 22 3 22 2 22.2v.8h6.6v-.8C7 22 6 22 6 20.5v-5.2h2a46 46 0 0 0 4 5.7 5 5 0 0 0 5 2v-1c-3 0-5-5-7-7 6-1 6-10-2-8.8ZM6 14V7.6C14 6 13 14 8 14Z'/%3E%3C/svg%3E", + rss: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M4 11a9 9 0 0 1 9 9M4 4a16 16 0 0 1 16 16'/%3E%3Ccircle cx='5' cy='19' r='1'/%3E%3C/svg%3E", + stack: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M4 17v1a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-1M8 16h8m-7.7-3.4 8 .8M8.8 9.2l7.8 1.6m-6.5-5 7.6 2.4'/%3E%3C/svg%3E", + sun: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='5'/%3E%3Cpath d='M12 1v2m0 18v2M4.2 4.2l1.4 1.4m12.8 12.8 1.4 1.4M1 12h2m18 0h2M4.2 19.8l1.4-1.4M18.4 5.6l1.4-1.4'/%3E%3C/svg%3E", + tag: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='m20.6 13.4-7.2 7.2a2 2 0 0 1-2.8 0L2 12V2h10l8.6 8.6a2 2 0 0 1 0 2.8zM7 7h.01'/%3E%3C/svg%3E", + twitch: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M21 2H3v16h5v4l4-4h5l4-4V2zm-10 9V7m5 4V7'/%3E%3C/svg%3E", + twitter: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M23 3a10.9 10.9 0 0 1-3.1 1.5 4.5 4.5 0 0 0-7.9 3v1A10.7 10.7 0 0 1 3 4s-4 9 5 13a11.6 11.6 0 0 1-7 2c9 5 20 0 20-11.5a4.5 4.5 0 0 0 0-.8A7.7 7.7 0 0 0 23 3z'/%3E%3C/svg%3E", + x: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M21 3 3 21M3 3l18 18'/%3E%3C/svg%3E", + youtube: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='m9.8 15 5.7-3.3-5.8-3.2V15Zm12.7-8.6a2.8 2.8 0 0 0-1.9-2C18.9 4 12 4 12 4s-6.9 0-8.6.5a2.8 2.8 0 0 0-2 2 29 29 0 0 0-.4 5.3 29 29 0 0 0 .5 5.3A2.8 2.8 0 0 0 3.4 19c1.7.5 8.6.5 8.6.5s6.9 0 8.6-.5a2.8 2.8 0 0 0 2-2 29 29 0 0 0 .4-5.3 29 29 0 0 0-.5-5.3z'/%3E%3C/svg%3E", + adjust: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M12 0C6 0 0 6 0 12s5 12 12 12 12-5 12-12S19 0 12 0Zm0 4c5 0 8 3 8 8s-3 8-8 8V4Z'/%3E%3C/svg%3E", + angl: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='m16 4-8 8 8 8'/%3E%3C/svg%3E", + angll: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='m11 4-8 8 8 8m9-16-8 8 8 8'/%3E%3C/svg%3E", + angr: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='m8 4 8 8-8 8'/%3E%3C/svg%3E", + angrr: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='m4 4 8 8-8 8m9-16 8 8-8 8'/%3E%3C/svg%3E", + angu: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='m4 16 8-8 8 8'/%3E%3C/svg%3E", + search: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Ccircle cx='9.5' cy='9.5' r='8'/%3E%3Cpath d='m23 23-9-9'/%3E%3C/svg%3E" + ); + $icon: map-get($icons, $icon-name); + @return url("data:image/svg+xml,#{$icon}"); +} -- cgit v1.3.1 From 9b05dfd7276c3cf88f1446fe0892cbe743eab7c7 Mon Sep 17 00:00:00 2001 From: Jieiku Date: Mon, 17 Jul 2023 15:11:26 -0700 Subject: Code Blocks Improvements --- COPY-TO-ROOT-SASS/abridge.scss | 1 + sass/_functions.scss | 12 + sass/abridge.scss | 38 ++- static/js/abridge.min.js | 2 +- static/js/codecopy.js | 100 ++---- static/js/elasticlunr.js | 691 ----------------------------------------- 6 files changed, 67 insertions(+), 777 deletions(-) delete mode 100644 static/js/elasticlunr.js (limited to 'sass/_functions.scss') diff --git a/COPY-TO-ROOT-SASS/abridge.scss b/COPY-TO-ROOT-SASS/abridge.scss index b442102..0fd51e9 100644 --- a/COPY-TO-ROOT-SASS/abridge.scss +++ b/COPY-TO-ROOT-SASS/abridge.scss @@ -50,6 +50,7 @@ //$icon-angr: true,//pagination, goto next page //$icon-angrr: true,//pagination, goto last page //$icon-angu: true,//back to top button, appears after scrolling down. + //$icon-copy: true,//copy to clipboard, for code blocks. //$icon-ffolder: false, //$icon-folder: false,// categories folder diff --git a/sass/_functions.scss b/sass/_functions.scss index 13fd8be..2f4029a 100644 --- a/sass/_functions.scss +++ b/sass/_functions.scss @@ -61,6 +61,15 @@ } } +/** + * SVG Icons + * https://github.com/feathericons/feather + * https://github.com/tabler/tabler-icons/find/master + * + * https://yqnn.github.io/svg-path-editor/ + * https://jakearchibald.github.io/svgomg/ + * https://codepen.io/yoksel/pen/MWKeKK + */ @function icon($icon-name,$stroke,$stroke-width:1,$fill:'none',$ic) { $sc:"%23888";//stroke color @if $ic { @@ -115,6 +124,9 @@ angr: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='m8 4 8 8-8 8'/%3E%3C/svg%3E", angrr: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='m4 4 8 8-8 8m9-16 8 8-8 8'/%3E%3C/svg%3E", angu: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='m4 16 8-8 8 8'/%3E%3C/svg%3E", + copy: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M11 1a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1ZM7 9H3a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1v-4'/%3E%3C/svg%3E", + copy-yes: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E", + copy-err: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M1 12a1 1 0 0 0 22 0 1 1 0 0 0-22 0m11-7v9m0 5v-2'/%3E%3C/svg%3E", search: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Ccircle cx='9.5' cy='9.5' r='8'/%3E%3Cpath d='m23 23-9-9'/%3E%3C/svg%3E" ); $icon: map-get($icons, $icon-name); diff --git a/sass/abridge.scss b/sass/abridge.scss index f5e623e..b50d2b6 100644 --- a/sass/abridge.scss +++ b/sass/abridge.scss @@ -58,6 +58,7 @@ $icon-angl: true !default;//pagination, goto previous page $icon-angr: true !default;//pagination, goto next page $icon-angrr: true !default;//pagination, goto last page $icon-angu: true !default;//back to top button, appears after scrolling down. +$icon-copy: true !default;//copy to clipboard, for code blocks. $icon-ffolder: false !default; $icon-folder: false !default;// categories folder @@ -859,6 +860,8 @@ $syntax: true !default;//syntax highlighting for code blocks padding: .3rem .2rem; } pre { + position: relative; + padding: 2rem .5rem .3rem; display: block; overflow-x: auto; -ms-overflow-style: scrollbar; @@ -1158,27 +1161,29 @@ $syntax: true !default;//syntax highlighting for code blocks .rpad {padding-right: .2rem} .si {font-size: 1.5em} pre code[data-lang]::before { + content: attr(data-lang); + padding: .3rem; + display: block; + background-color: var(--c3); color: var(--h1); + width: 100%; + position: absolute; + top: 0; + left: 0; + padding-left: 1rem; text-transform: uppercase; - content: ' [' attr(data-lang) '] ' "\a\a"; - } - // code copy wrapper - .ccw { - position: relative; - } - .ccw:hover { - .cc { - opacity: 1; - } } // code copy button .cc { - opacity: 0; + cursor: pointer; z-index: 9; position: absolute; - right: 9px; - top: 9px; - font-size: .8rem; + top: .3rem; + right: .5rem; + } + .cc:hover { + background: var(--a3); + opacity: 1; } // Table Override, this is used for Zola's linenos and hl_lines code { @@ -1246,6 +1251,11 @@ $syntax: true !default;//syntax highlighting for code blocks @if $icon-angr {.angr { -webkit-mask: functions.icon(angr, "%23000", 3, "none", $ic) ; background: var(--f2) }}//angle right @if $icon-angrr {.angrr { -webkit-mask: functions.icon(angrr, "%23000", 3, "none", $ic) ; background: var(--f2) }}//angle right right @if $icon-angu {.angu { -webkit-mask: functions.icon(angu, "%23000", 3, "none", $ic) ; background: var(--f2) }}//angle up + @if $icon-copy {//copy icons for code blocks + .copy { -webkit-mask: functions.icon(copy, "%23000", 2, "none", $ic) ; background: var(--f2) } + .copy.yes { -webkit-mask: functions.icon(copy-yes, "%23000", 2, "none", $ic) ; background: var(--f2) } + .copy.err { -webkit-mask: functions.icon(copy-err, "%23000", 2, "none", $ic) ; background: var(--f2) } + } @if $icon-search {.search { -webkit-mask: functions.icon(search, "%23000", 3, "none", $ic) ; background: var(--f2) }}//search @if $icon-bitbucket {.bitbucket { background-image: functions.icon(bitbucket, "%2328f", 2, "none", $ic) }} @if $icon-buymeacoffee {.buymeacoffee { background-image: functions.icon(buymeacoffee, "%23777", 1, "%23fd0", $ic) }} diff --git a/static/js/abridge.min.js b/static/js/abridge.min.js index c438a71..4cfe749 100644 --- a/static/js/abridge.min.js +++ b/static/js/abridge.min.js @@ -1 +1 @@ -const items=document.querySelectorAll(".preStyle");items.forEach(e=>{e.rel="stylesheet"}),document.getElementById("mode")&&document.getElementById("mode").addEventListener("click",()=>{document.documentElement.classList.toggle("light"),localStorage.setItem("theme",document.documentElement.classList.contains("light")?"light":"dark")}),function(){function g(e){var t=new g.Index;return t.pipeline.add(g.trimmer,g.stopWordFilter,g.stemmer),e&&e.call(t,t),t}var a,c,e,t,d,h,f,p,m,v,y,S,x,w,b,E,I,C,D,F,k,L,N,_,n;g.version="0.9.5",((lunr=g).utils={}).warn=(n=this,function(e){n.console&&console.warn&&console.warn(e)}),g.utils.toString=function(e){return null==e?"":e.toString()},(g.EventEmitter=function(){this.events={}}).prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop();if("function"!=typeof t)throw new TypeError("last argument must be a function");e.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},g.EventEmitter.prototype.removeListener=function(e,t){this.hasHandler(e)&&-1!==(t=this.events[e].indexOf(t))&&(this.events[e].splice(t,1),0==this.events[e].length)&&delete this.events[e]},g.EventEmitter.prototype.emit=function(e){var t;this.hasHandler(e)&&(t=Array.prototype.slice.call(arguments,1),this.events[e].forEach(function(e){e.apply(void 0,t)},this))},g.EventEmitter.prototype.hasHandler=function(e){return e in this.events},(g.tokenizer=function(e){var t,n;return arguments.length&&null!=e?Array.isArray(e)?(t=(t=e.filter(function(e){return null!=e})).map(function(e){return g.utils.toString(e).toLowerCase()}),n=[],t.forEach(function(e){e=e.split(g.tokenizer.seperator),n=n.concat(e)},this),n):e.toString().trim().toLowerCase().split(g.tokenizer.seperator):[]}).defaultSeperator=/[\s\-]+/,g.tokenizer.seperator=g.tokenizer.defaultSeperator,g.tokenizer.setSeperator=function(e){null!=e&&"object"==typeof e&&(g.tokenizer.seperator=e)},g.tokenizer.resetSeperator=function(){g.tokenizer.seperator=g.tokenizer.defaultSeperator},g.tokenizer.getSeperator=function(){return g.tokenizer.seperator},(g.Pipeline=function(){this._queue=[]}).registeredFunctions={},g.Pipeline.registerFunction=function(e,t){t in g.Pipeline.registeredFunctions&&g.utils.warn("Overwriting existing registered function: "+t),e.label=t,g.Pipeline.registeredFunctions[t]=e},g.Pipeline.getRegisteredFunction=function(e){return e in g.Pipeline.registeredFunctions!=1?null:g.Pipeline.registeredFunctions[e]},g.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||g.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},g.Pipeline.load=function(e){var n=new g.Pipeline;return e.forEach(function(e){var t=g.Pipeline.getRegisteredFunction(e);if(!t)throw new Error("Cannot load un-registered function: "+e);n.add(t)}),n},g.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach(function(e){g.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},g.Pipeline.prototype.after=function(e,t){if(g.Pipeline.warnIfFunctionNotRegistered(t),-1===(e=this._queue.indexOf(e)))throw new Error("Cannot find existingFn");this._queue.splice(e+1,0,t)},g.Pipeline.prototype.before=function(e,t){if(g.Pipeline.warnIfFunctionNotRegistered(t),-1===(e=this._queue.indexOf(e)))throw new Error("Cannot find existingFn");this._queue.splice(e,0,t)},g.Pipeline.prototype.remove=function(e){-1!==(e=this._queue.indexOf(e))&&this._queue.splice(e,1)},g.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,o=this._queue.length,i=0;iu[o]&&o++:(t.add(s[n]),n++,o++);return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){for(var t,e=this.length>=e.length?(t=this,e):(t=e,this),n=t.clone(),o=0,i=e.toArray();o",a=n.querySelector("a"),t=n.querySelector("span:first-child"),d=n.querySelector("span:nth-child(2)"),a.href=e.ref,t.textContent=e.doc.title,d.innerHTML=function(e){var t=x.map(function(e){return elasticlunr.stemmer(e.toLowerCase())}),n=!1,o=0,i=[],r=e.toLowerCase().split(". ");for(f in r){var s,u=r[f].split(/[\s\n]/),l=8;for(s in u){if(0<(g=u[s]).length){for(var a in t)elasticlunr.stemmer(g).startsWith(t[a])&&(l=40,n=!0);i.push([g,l,o]),l=2}o=o+g.length+1}o+=1}if(0===i.length)return void 0!==e.length&&300"),S=g[2]+g[0].length,40!==g[1]&&12<=g[0].length&&!/^[\x00-\xff]+$/.test(g[0])?(v=function(e){for(var t="",n=!1,o=0,i=0,r=0,s=0;s");return y.push("…"),y.join("")}(e.doc.body),s.appendChild(n))});i.length>r;)s.removeChild(i[0])},!0),s.addEventListener("click",function(){for(;s.lastChild;)s.removeChild(s.lastChild);return!1},!0),document.goSearch.onsubmit=function(){var e=document.querySelector("main"),t=(window.main||(window.main=e.innerHTML),document.getElementById("suggestions")),n=t.cloneNode(!0),o=(n.id="results",document.createElement("div")),i='

Results For: '.concat(document.getElementById("searchinput").value,"

");return o.innerHTML=i,n.insertBefore(o,n.firstChild),e.innerHTML=n.outerHTML,t.innerHTML="",document.getElementById("searchinput").value="",document.body.contains(document.closeSearch)&&(document.closeSearch.onsubmit=function(){document.querySelector("main").innerHTML=window.main}),!1})},function(){for(var e=document.getElementsByClassName("m-protected"),t=0;tasync function(e,t){var n=t.querySelectorAll("table")["length"];let o="";0 tr > td:last-child").forEach(e=>{o+=e.innerText}):o=t.querySelector(":last-child > code").innerText;try{"granted"==(result=await navigator.permissions.query({name:"clipboard-write"})).state||"prompt"==result.state?await navigator.clipboard.writeText(o):i(o,t)}catch(e){i(o,t)}finally{e.innerHTML="Copied",setTimeout(function(){e.innerHTML="Copy"},2e3)}}(t,e));var n=document.createElement("div");n.className="ccw",n.appendChild(t),e.parentNode.insertBefore(n,e),n.appendChild(e)}function i(e,t){var n=document.createElement("textArea"),e=(n.contentEditable="true",n.readOnly="false",n.className="copyable-text-area",n.value=e,t.insertBefore(n,t.firstChild),document.createRange()),o=(e.selectNodeContents(n),window.getSelection());o.removeAllRanges(),o.addRange(e),n.setSelectionRange(0,999999),document.execCommand("copy"),t.removeChild(n)}document.querySelectorAll("pre").forEach(e=>t(e))}(); \ No newline at end of file +const items=document.querySelectorAll(".preStyle"),changeIcon=(items.forEach(e=>{e.rel="stylesheet"}),document.getElementById("mode")&&document.getElementById("mode").addEventListener("click",()=>{document.documentElement.classList.toggle("light"),localStorage.setItem("theme",document.documentElement.classList.contains("light")?"light":"dark")}),!function(){function g(e){var t=new g.Index;return t.pipeline.add(g.trimmer,g.stopWordFilter,g.stemmer),e&&e.call(t,t),t}var a,c,e,t,d,h,f,p,m,v,y,S,x,b,w,I,E,C,D,F,k,L,_,N,n;g.version="0.9.5",((lunr=g).utils={}).warn=(n=this,function(e){n.console&&console.warn&&console.warn(e)}),g.utils.toString=function(e){return null==e?"":e.toString()},(g.EventEmitter=function(){this.events={}}).prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop();if("function"!=typeof t)throw new TypeError("last argument must be a function");e.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},g.EventEmitter.prototype.removeListener=function(e,t){this.hasHandler(e)&&-1!==(t=this.events[e].indexOf(t))&&(this.events[e].splice(t,1),0==this.events[e].length)&&delete this.events[e]},g.EventEmitter.prototype.emit=function(e){var t;this.hasHandler(e)&&(t=Array.prototype.slice.call(arguments,1),this.events[e].forEach(function(e){e.apply(void 0,t)},this))},g.EventEmitter.prototype.hasHandler=function(e){return e in this.events},(g.tokenizer=function(e){var t,n;return arguments.length&&null!=e?Array.isArray(e)?(t=(t=e.filter(function(e){return null!=e})).map(function(e){return g.utils.toString(e).toLowerCase()}),n=[],t.forEach(function(e){e=e.split(g.tokenizer.seperator),n=n.concat(e)},this),n):e.toString().trim().toLowerCase().split(g.tokenizer.seperator):[]}).defaultSeperator=/[\s\-]+/,g.tokenizer.seperator=g.tokenizer.defaultSeperator,g.tokenizer.setSeperator=function(e){null!=e&&"object"==typeof e&&(g.tokenizer.seperator=e)},g.tokenizer.resetSeperator=function(){g.tokenizer.seperator=g.tokenizer.defaultSeperator},g.tokenizer.getSeperator=function(){return g.tokenizer.seperator},(g.Pipeline=function(){this._queue=[]}).registeredFunctions={},g.Pipeline.registerFunction=function(e,t){t in g.Pipeline.registeredFunctions&&g.utils.warn("Overwriting existing registered function: "+t),e.label=t,g.Pipeline.registeredFunctions[t]=e},g.Pipeline.getRegisteredFunction=function(e){return e in g.Pipeline.registeredFunctions!=1?null:g.Pipeline.registeredFunctions[e]},g.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||g.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},g.Pipeline.load=function(e){var n=new g.Pipeline;return e.forEach(function(e){var t=g.Pipeline.getRegisteredFunction(e);if(!t)throw new Error("Cannot load un-registered function: "+e);n.add(t)}),n},g.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach(function(e){g.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},g.Pipeline.prototype.after=function(e,t){if(g.Pipeline.warnIfFunctionNotRegistered(t),-1===(e=this._queue.indexOf(e)))throw new Error("Cannot find existingFn");this._queue.splice(e+1,0,t)},g.Pipeline.prototype.before=function(e,t){if(g.Pipeline.warnIfFunctionNotRegistered(t),-1===(e=this._queue.indexOf(e)))throw new Error("Cannot find existingFn");this._queue.splice(e,0,t)},g.Pipeline.prototype.remove=function(e){-1!==(e=this._queue.indexOf(e))&&this._queue.splice(e,1)},g.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,o=this._queue.length,i=0;iu[o]&&o++:(t.add(s[n]),n++,o++);return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){for(var t,e=this.length>=e.length?(t=this,e):(t=e,this),n=t.clone(),o=0,i=e.toArray();o",a=n.querySelector("a"),t=n.querySelector("span:first-child"),d=n.querySelector("span:nth-child(2)"),a.href=e.ref,t.textContent=e.doc.title,d.innerHTML=function(e){var t=x.map(function(e){return elasticlunr.stemmer(e.toLowerCase())}),n=!1,o=0,i=[],r=e.toLowerCase().split(". ");for(f in r){var s,u=r[f].split(/[\s\n]/),l=8;for(s in u){if(0<(g=u[s]).length){for(var a in t)elasticlunr.stemmer(g).startsWith(t[a])&&(l=40,n=!0);i.push([g,l,o]),l=2}o=o+g.length+1}o+=1}if(0===i.length)return void 0!==e.length&&300"),S=g[2]+g[0].length,40!==g[1]&&12<=g[0].length&&!/^[\x00-\xff]+$/.test(g[0])?(v=function(e){for(var t="",n=!1,o=0,i=0,r=0,s=0;s");return y.push("…"),y.join("")}(e.doc.body),s.appendChild(n))});i.length>r;)s.removeChild(i[0])},!0),s.addEventListener("click",function(){for(;s.lastChild;)s.removeChild(s.lastChild);return!1},!0),document.goSearch.onsubmit=function(){var e=document.querySelector("main"),t=(window.main||(window.main=e.innerHTML),document.getElementById("suggestions")),n=t.cloneNode(!0),o=(n.id="results",document.createElement("div")),i='

Results For: '.concat(document.getElementById("searchinput").value,"

");return o.innerHTML=i,n.insertBefore(o,n.firstChild),e.innerHTML=n.outerHTML,t.innerHTML="",document.getElementById("searchinput").value="",document.body.contains(document.closeSearch)&&(document.closeSearch.onsubmit=function(){document.querySelector("main").innerHTML=window.main}),!1})},!function(){for(var e=document.getElementsByClassName("m-protected"),t=0;t{e.classList.add(t),setTimeout(()=>e.classList.remove(t),2500)}),copyCodeAndChangeIcon=async(t,e)=>{e=(e.querySelector("table")?getTableCode:getNonTableCode)(e);try{await navigator.clipboard.writeText(e),changeIcon(t,"yes")}catch(e){changeIcon(t,"err")}},getNonTableCode=e=>[...e.querySelectorAll("code")].map(e=>e.textContent).join(""),getTableCode=e=>[...e.querySelectorAll("tr")].map(e=>e.querySelector("td:last-child")?.innerText??"").join("");document.querySelectorAll("pre").forEach(e=>{const t=document.createElement("div");t.className="cc svgs svgh copy",t.innerHTML=" ",e.prepend(t),t.addEventListener("click",()=>copyCodeAndChangeIcon(t,e))}); \ No newline at end of file diff --git a/static/js/codecopy.js b/static/js/codecopy.js index c1f3a75..9e00c79 100644 --- a/static/js/codecopy.js +++ b/static/js/codecopy.js @@ -1,76 +1,34 @@ -// https://aaronluna.dev/blog/add-copy-button-to-code-blocks-hugo-chroma/ -// Further modified for Zola by Jieiku: https://github.com/Jieiku -(function() { - // create copy button - function ccb(highlightDiv) { - const button = document.createElement("button"); - button.className = "cc "; - button.type = "button"; - button.innerHTML = "Copy"; - button.addEventListener("click", () => - ccc(button, highlightDiv) - ); +const changeIcon = (copyDiv, className) => { + copyDiv.classList.add(className); + setTimeout(() => copyDiv.classList.remove(className), 2500); +}; - // addCopyButtonToDom - const wrapper = document.createElement("div"); - wrapper.className = "ccw"; - wrapper.appendChild(button); - highlightDiv.parentNode.insertBefore(wrapper, highlightDiv); - wrapper.appendChild(highlightDiv); - } - - // copy code clipboard - async function ccc(button, highlightDiv) { - //look for table, if so do it different - const { length } = highlightDiv.querySelectorAll("table"); - let codeToCopy = ""; - if (length > 0) { - const items = highlightDiv.querySelectorAll(":last-child > tr > td:last-child"); - items.forEach(item => { - codeToCopy = codeToCopy + item.innerText; - //console.log(codeToCopy); - }); - } else { - codeToCopy = highlightDiv.querySelector(":last-child > code").innerText; - } +const copyCodeAndChangeIcon = async (copyDiv, block) => { + const code = block.querySelector('table') ? getTableCode(block) : getNonTableCode(block); try { - result = await navigator.permissions.query({ name: "clipboard-write" }); - if (result.state == "granted" || result.state == "prompt") { - await navigator.clipboard.writeText(codeToCopy); - } else { - cce(codeToCopy, highlightDiv);//copyCodeBlockExecCommand - } - } catch (_) { - cce(codeToCopy, highlightDiv);//copyCodeBlockExecCommand - } finally { - //codeWasCopied - //button.blur(); - button.innerHTML = "Copied"; - setTimeout(function () { - button.innerHTML = "Copy"; - }, 2000); + await navigator.clipboard.writeText(code); + changeIcon(copyDiv, "yes"); + } catch (error) { + changeIcon(copyDiv, "err"); } - } +}; + +const getNonTableCode = (block) => { + return [...block.querySelectorAll('code')] + .map(code => code.textContent) + .join(''); +}; - //copyCodeBlockExecCommand - function cce(codeToCopy, highlightDiv) { - const textArea = document.createElement("textArea"); - textArea.contentEditable = "true"; - textArea.readOnly = "false"; - textArea.className = "copyable-text-area"; - textArea.value = codeToCopy; - highlightDiv.insertBefore(textArea, highlightDiv.firstChild); - const range = document.createRange(); - range.selectNodeContents(textArea); - const sel = window.getSelection(); - sel.removeAllRanges(); - sel.addRange(range); - textArea.setSelectionRange(0, 999999); - document.execCommand("copy"); - highlightDiv.removeChild(textArea); - } +const getTableCode = (block) => { + return [...block.querySelectorAll('tr')] + .map(row => row.querySelector('td:last-child')?.innerText ?? '') + .join(''); +}; - document - .querySelectorAll("pre") - .forEach((highlightDiv) => ccb(highlightDiv)); -})(); \ No newline at end of file +document.querySelectorAll("pre").forEach((block) => { + const copyDiv = document.createElement("div"); + copyDiv.className = "cc svgs svgh copy"; + copyDiv.innerHTML = " "; + block.prepend(copyDiv); + copyDiv.addEventListener("click", () => copyCodeAndChangeIcon(copyDiv, block));; +}); diff --git a/static/js/elasticlunr.js b/static/js/elasticlunr.js deleted file mode 100644 index d96ce65..0000000 --- a/static/js/elasticlunr.js +++ /dev/null @@ -1,691 +0,0 @@ -/** - * elasticlunr - http://weixsong.github.io - * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.6 - * - * Copyright (C) 2017 Oliver Nightingale - * Copyright (C) 2017 Wei Song - * MIT Licensed - * @license - */ -! function() { - function e(e) { - if (null === e || "object" != typeof e) return e; - var t = e.constructor(); - for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]); - return t - } - var t = function(e) { - var n = new t.Index; - return n.pipeline.add(t.trimmer, t.stopWordFilter, t.stemmer), e && e.call(n, n), n - }; - t.version = "0.9.5", lunr = t, t.utils = {}, t.utils.warn = function(e) { - return function(t) { - e.console && console.warn && console.warn(t) - } - }(this), t.utils.toString = function(e) { - return void 0 === e || null === e ? "" : e.toString() - }, t.EventEmitter = function() { - this.events = {} - }, t.EventEmitter.prototype.addListener = function() { - var e = Array.prototype.slice.call(arguments), - t = e.pop(), - n = e; - if ("function" != typeof t) throw new TypeError("last argument must be a function"); - n.forEach(function(e) { - this.hasHandler(e) || (this.events[e] = []), this.events[e].push(t) - }, this) - }, t.EventEmitter.prototype.removeListener = function(e, t) { - if (this.hasHandler(e)) { - var n = this.events[e].indexOf(t); - 1 !== n && (this.events[e].splice(n, 1), 0 == this.events[e].length && delete this.events[e]) - } - }, t.EventEmitter.prototype.emit = function(e) { - if (this.hasHandler(e)) { - var t = Array.prototype.slice.call(arguments, 1); - this.events[e].forEach(function(e) { - e.apply(void 0, t) - }, this) - } - }, t.EventEmitter.prototype.hasHandler = function(e) { - return e in this.events - }, t.tokenizer = function(e) { - if (!arguments.length || null === e || void 0 === e) return []; - if (Array.isArray(e)) { - var n = e.filter(function(e) { - return null === e || void 0 === e ? !1 : !0 - }); - n = n.map(function(e) { - return t.utils.toString(e).toLowerCase() - }); - var i = []; - return n.forEach(function(e) { - var n = e.split(t.tokenizer.seperator); - i = i.concat(n) - }, this), i - } - return e.toString().trim().toLowerCase().split(t.tokenizer.seperator) - }, t.tokenizer.defaultSeperator = /[\s\-]+/, t.tokenizer.seperator = t.tokenizer.defaultSeperator, t.tokenizer.setSeperator = function(e) { - null !== e && void 0 !== e && "object" == typeof e && (t.tokenizer.seperator = e) - }, t.tokenizer.resetSeperator = function() { - t.tokenizer.seperator = t.tokenizer.defaultSeperator - }, t.tokenizer.getSeperator = function() { - return t.tokenizer.seperator - }, t.Pipeline = function() { - this._queue = [] - }, t.Pipeline.registeredFunctions = {}, t.Pipeline.registerFunction = function(e, n) { - n in t.Pipeline.registeredFunctions && t.utils.warn("Overwriting existing registered function: " + n), e.label = n, t.Pipeline.registeredFunctions[n] = e - }, t.Pipeline.getRegisteredFunction = function(e) { - return e in t.Pipeline.registeredFunctions != !0 ? null : t.Pipeline.registeredFunctions[e] - }, t.Pipeline.warnIfFunctionNotRegistered = function(e) { - var n = e.label && e.label in this.registeredFunctions; - n || t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n", e) - }, t.Pipeline.load = function(e) { - var n = new t.Pipeline; - return e.forEach(function(e) { - var i = t.Pipeline.getRegisteredFunction(e); - if (!i) throw new Error("Cannot load un-registered function: " + e); - n.add(i) - }), n - }, t.Pipeline.prototype.add = function() { - var e = Array.prototype.slice.call(arguments); - e.forEach(function(e) { - t.Pipeline.warnIfFunctionNotRegistered(e), this._queue.push(e) - }, this) - }, t.Pipeline.prototype.after = function(e, n) { - t.Pipeline.warnIfFunctionNotRegistered(n); - var i = this._queue.indexOf(e); - if (-1 === i) throw new Error("Cannot find existingFn"); - this._queue.splice(i + 1, 0, n) - }, t.Pipeline.prototype.before = function(e, n) { - t.Pipeline.warnIfFunctionNotRegistered(n); - var i = this._queue.indexOf(e); - if (-1 === i) throw new Error("Cannot find existingFn"); - this._queue.splice(i, 0, n) - }, t.Pipeline.prototype.remove = function(e) { - var t = this._queue.indexOf(e); - 1 !== t && this._queue.splice(t, 1) - }, t.Pipeline.prototype.run = function(e) { - for (var t = [], n = e.length, i = this._queue.length, o = 0; n > o; o++) { - for (var r = e[o], s = 0; i > s && (r = this._queue[s](r, o, e), void 0 !== r && null !== r); s++); - void 0 !== r && null !== r && t.push(r) - } - return t - }, t.Pipeline.prototype.reset = function() { - this._queue = [] - }, t.Pipeline.prototype.get = function() { - return this._queue - }, t.Pipeline.prototype.toJSON = function() { - return this._queue.map(function(e) { - return t.Pipeline.warnIfFunctionNotRegistered(e), e.label - }) - }, t.Index = function() { - this._fields = [], this._ref = "id", this.pipeline = new t.Pipeline, this.documentStore = new t.DocumentStore, this.index = {}, this.eventEmitter = new t.EventEmitter, this._idfCache = {}, this.on("add", "remove", "update", function() { - this._idfCache = {} - }.bind(this)) - }, t.Index.prototype.on = function() { - var e = Array.prototype.slice.call(arguments); - return this.eventEmitter.addListener.apply(this.eventEmitter, e) - }, t.Index.prototype.off = function(e, t) { - return this.eventEmitter.removeListener(e, t) - }, t.Index.load = function(e) { - e.version !== t.version && t.utils.warn("version mismatch: current " + t.version + " importing " + e.version); - var n = new this; - n._fields = e.fields, n._ref = e.ref, n.documentStore = t.DocumentStore.load(e.documentStore), n.pipeline = t.Pipeline.load(e.pipeline), n.index = {}; - for (var i in e.index) n.index[i] = t.InvertedIndex.load(e.index[i]); - return n - }, t.Index.prototype.addField = function(e) { - return this._fields.push(e), this.index[e] = new t.InvertedIndex, this - }, t.Index.prototype.setRef = function(e) { - return this._ref = e, this - }, t.Index.prototype.saveDocument = function(e) { - return this.documentStore = new t.DocumentStore(e), this - }, t.Index.prototype.addDoc = function(e, n) { - if (e) { - var n = void 0 === n ? !0 : n, - i = e[this._ref]; - this.documentStore.addDoc(i, e), this._fields.forEach(function(n) { - var o = this.pipeline.run(t.tokenizer(e[n])); - this.documentStore.addFieldLength(i, n, o.length); - var r = {}; - o.forEach(function(e) { - e in r ? r[e] += 1 : r[e] = 1 - }, this); - for (var s in r) { - var u = r[s]; - u = Math.sqrt(u), this.index[n].addToken(s, { - ref: i, - tf: u - }) - } - }, this), n && this.eventEmitter.emit("add", e, this) - } - }, t.Index.prototype.removeDocByRef = function(e) { - if (e && this.documentStore.isDocStored() !== !1 && this.documentStore.hasDoc(e)) { - var t = this.documentStore.getDoc(e); - this.removeDoc(t, !1) - } - }, t.Index.prototype.removeDoc = function(e, n) { - if (e) { - var n = void 0 === n ? !0 : n, - i = e[this._ref]; - this.documentStore.hasDoc(i) && (this.documentStore.removeDoc(i), this._fields.forEach(function(n) { - var o = this.pipeline.run(t.tokenizer(e[n])); - o.forEach(function(e) { - this.index[n].removeToken(e, i) - }, this) - }, this), n && this.eventEmitter.emit("remove", e, this)) - } - }, t.Index.prototype.updateDoc = function(e, t) { - var t = void 0 === t ? !0 : t; - this.removeDocByRef(e[this._ref], !1), this.addDoc(e, !1), t && this.eventEmitter.emit("update", e, this) - }, t.Index.prototype.idf = function(e, t) { - var n = "@" + t + "/" + e; - if (Object.prototype.hasOwnProperty.call(this._idfCache, n)) return this._idfCache[n]; - var i = this.index[t].getDocFreq(e), - o = 1 + Math.log(this.documentStore.length / (i + 1)); - return this._idfCache[n] = o, o - }, t.Index.prototype.getFields = function() { - return this._fields.slice() - }, t.Index.prototype.search = function(e, n) { - if (!e) return []; - e = "string" == typeof e ? { - any: e - } : JSON.parse(JSON.stringify(e)); - var i = null; - null != n && (i = JSON.stringify(n)); - for (var o = new t.Configuration(i, this.getFields()).get(), r = {}, s = Object.keys(e), u = 0; u < s.length; u++) { - var a = s[u]; - r[a] = this.pipeline.run(t.tokenizer(e[a])) - } - var l = {}; - for (var c in o) { - var d = r[c] || r.any; - if (d) { - var f = this.fieldSearch(d, c, o), - h = o[c].boost; - for (var p in f) f[p] = f[p] * h; - for (var p in f) p in l ? l[p] += f[p] : l[p] = f[p] - } - } - var v, g = []; - for (var p in l) v = { - ref: p, - score: l[p] - }, this.documentStore.hasDoc(p) && (v.doc = this.documentStore.getDoc(p)), g.push(v); - return g.sort(function(e, t) { - return t.score - e.score - }), g - }, t.Index.prototype.fieldSearch = function(e, t, n) { - var i = n[t].bool, - o = n[t].expand, - r = n[t].boost, - s = null, - u = {}; - return 0 !== r ? (e.forEach(function(e) { - var n = [e]; - 1 == o && (n = this.index[t].expandToken(e)); - var r = {}; - n.forEach(function(n) { - var o = this.index[t].getDocs(n), - a = this.idf(n, t); - if (s && "AND" == i) { - var l = {}; - for (var c in s) c in o && (l[c] = o[c]); - o = l - } - n == e && this.fieldSearchStats(u, n, o); - for (var c in o) { - var d = this.index[t].getTermFrequency(n, c), - f = this.documentStore.getFieldLength(c, t), - h = 1; - 0 != f && (h = 1 / Math.sqrt(f)); - var p = 1; - n != e && (p = .15 * (1 - (n.length - e.length) / n.length)); - var v = d * a * h * p; - c in r ? r[c] += v : r[c] = v - } - }, this), s = this.mergeScores(s, r, i) - }, this), s = this.coordNorm(s, u, e.length)) : void 0 - }, t.Index.prototype.mergeScores = function(e, t, n) { - if (!e) return t; - if ("AND" == n) { - var i = {}; - for (var o in t) o in e && (i[o] = e[o] + t[o]); - return i - } - for (var o in t) o in e ? e[o] += t[o] : e[o] = t[o]; - return e - }, t.Index.prototype.fieldSearchStats = function(e, t, n) { - for (var i in n) i in e ? e[i].push(t) : e[i] = [t] - }, t.Index.prototype.coordNorm = function(e, t, n) { - for (var i in e) - if (i in t) { - var o = t[i].length; - e[i] = e[i] * o / n - } - return e - }, t.Index.prototype.toJSON = function() { - var e = {}; - return this._fields.forEach(function(t) { - e[t] = this.index[t].toJSON() - }, this), { - version: t.version, - fields: this._fields, - ref: this._ref, - documentStore: this.documentStore.toJSON(), - index: e, - pipeline: this.pipeline.toJSON() - } - }, t.Index.prototype.use = function(e) { - var t = Array.prototype.slice.call(arguments, 1); - t.unshift(this), e.apply(this, t) - }, t.DocumentStore = function(e) { - this._save = null === e || void 0 === e ? !0 : e, this.docs = {}, this.docInfo = {}, this.length = 0 - }, t.DocumentStore.load = function(e) { - var t = new this; - return t.length = e.length, t.docs = e.docs, t.docInfo = e.docInfo, t._save = e.save, t - }, t.DocumentStore.prototype.isDocStored = function() { - return this._save - }, t.DocumentStore.prototype.addDoc = function(t, n) { - this.hasDoc(t) || this.length++, this.docs[t] = this._save === !0 ? e(n) : null - }, t.DocumentStore.prototype.getDoc = function(e) { - return this.hasDoc(e) === !1 ? null : this.docs[e] - }, t.DocumentStore.prototype.hasDoc = function(e) { - return e in this.docs - }, t.DocumentStore.prototype.removeDoc = function(e) { - this.hasDoc(e) && (delete this.docs[e], delete this.docInfo[e], this.length--) - }, t.DocumentStore.prototype.addFieldLength = function(e, t, n) { - null !== e && void 0 !== e && 0 != this.hasDoc(e) && (this.docInfo[e] || (this.docInfo[e] = {}), this.docInfo[e][t] = n) - }, t.DocumentStore.prototype.updateFieldLength = function(e, t, n) { - null !== e && void 0 !== e && 0 != this.hasDoc(e) && this.addFieldLength(e, t, n) - }, t.DocumentStore.prototype.getFieldLength = function(e, t) { - return null === e || void 0 === e ? 0 : e in this.docs && t in this.docInfo[e] ? this.docInfo[e][t] : 0 - }, t.DocumentStore.prototype.toJSON = function() { - return { - docs: this.docs, - docInfo: this.docInfo, - length: this.length, - save: this._save - } - }, t.stemmer = function() { - var e = { - ational: "ate", - tional: "tion", - enci: "ence", - anci: "ance", - izer: "ize", - bli: "ble", - alli: "al", - entli: "ent", - eli: "e", - ousli: "ous", - ization: "ize", - ation: "ate", - ator: "ate", - alism: "al", - iveness: "ive", - fulness: "ful", - ousness: "ous", - aliti: "al", - iviti: "ive", - biliti: "ble", - logi: "log" - }, - t = { - icate: "ic", - ative: "", - alize: "al", - iciti: "ic", - ical: "ic", - ful: "", - ness: "" - }, - n = "[^aeiou]", - i = "[aeiouy]", - o = n + "[^aeiouy]*", - r = i + "[aeiou]*", - s = "^(" + o + ")?" + r + o, - u = "^(" + o + ")?" + r + o + "(" + r + ")?$", - a = "^(" + o + ")?" + r + o + r + o, - l = "^(" + o + ")?" + i, - c = new RegExp(s), - d = new RegExp(a), - f = new RegExp(u), - h = new RegExp(l), - p = /^(.+?)(ss|i)es$/, - v = /^(.+?)([^s])s$/, - g = /^(.+?)eed$/, - m = /^(.+?)(ed|ing)$/, - y = /.$/, - S = /(at|bl|iz)$/, - x = new RegExp("([^aeiouylsz])\\1$"), - w = new RegExp("^" + o + i + "[^aeiouwxy]$"), - I = /^(.+?[^aeiou])y$/, - b = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/, - E = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/, - D = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/, - F = /^(.+?)(s|t)(ion)$/, - _ = /^(.+?)e$/, - P = /ll$/, - k = new RegExp("^" + o + i + "[^aeiouwxy]$"), - z = function(n) { - var i, o, r, s, u, a, l; - if (n.length < 3) return n; - if (r = n.substr(0, 1), "y" == r && (n = r.toUpperCase() + n.substr(1)), s = p, u = v, s.test(n) ? n = n.replace(s, "$1$2") : u.test(n) && (n = n.replace(u, "$1$2")), s = g, u = m, s.test(n)) { - var z = s.exec(n); - s = c, s.test(z[1]) && (s = y, n = n.replace(s, "")) - } else if (u.test(n)) { - var z = u.exec(n); - i = z[1], u = h, u.test(i) && (n = i, u = S, a = x, l = w, u.test(n) ? n += "e" : a.test(n) ? (s = y, n = n.replace(s, "")) : l.test(n) && (n += "e")) - } - if (s = I, s.test(n)) { - var z = s.exec(n); - i = z[1], n = i + "i" - } - if (s = b, s.test(n)) { - var z = s.exec(n); - i = z[1], o = z[2], s = c, s.test(i) && (n = i + e[o]) - } - if (s = E, s.test(n)) { - var z = s.exec(n); - i = z[1], o = z[2], s = c, s.test(i) && (n = i + t[o]) - } - if (s = D, u = F, s.test(n)) { - var z = s.exec(n); - i = z[1], s = d, s.test(i) && (n = i) - } else if (u.test(n)) { - var z = u.exec(n); - i = z[1] + z[2], u = d, u.test(i) && (n = i) - } - if (s = _, s.test(n)) { - var z = s.exec(n); - i = z[1], s = d, u = f, a = k, (s.test(i) || u.test(i) && !a.test(i)) && (n = i) - } - return s = P, u = d, s.test(n) && u.test(n) && (s = y, n = n.replace(s, "")), "y" == r && (n = r.toLowerCase() + n.substr(1)), n - }; - return z - }(), t.Pipeline.registerFunction(t.stemmer, "stemmer"), t.stopWordFilter = function(e) { - return e && t.stopWordFilter.stopWords[e] !== !0 ? e : void 0 - }, t.clearStopWords = function() { - t.stopWordFilter.stopWords = {} - }, t.addStopWords = function(e) { - null != e && Array.isArray(e) !== !1 && e.forEach(function(e) { - t.stopWordFilter.stopWords[e] = !0 - }, this) - }, t.resetStopWords = function() { - t.stopWordFilter.stopWords = t.defaultStopWords - }, t.defaultStopWords = { - "": !0, - a: !0, - able: !0, - about: !0, - across: !0, - after: !0, - all: !0, - almost: !0, - also: !0, - am: !0, - among: !0, - an: !0, - and: !0, - any: !0, - are: !0, - as: !0, - at: !0, - be: !0, - because: !0, - been: !0, - but: !0, - by: !0, - can: !0, - cannot: !0, - could: !0, - dear: !0, - did: !0, - "do": !0, - does: !0, - either: !0, - "else": !0, - ever: !0, - every: !0, - "for": !0, - from: !0, - get: !0, - got: !0, - had: !0, - has: !0, - have: !0, - he: !0, - her: !0, - hers: !0, - him: !0, - his: !0, - how: !0, - however: !0, - i: !0, - "if": !0, - "in": !0, - into: !0, - is: !0, - it: !0, - its: !0, - just: !0, - least: !0, - let: !0, - like: !0, - likely: !0, - may: !0, - me: !0, - might: !0, - most: !0, - must: !0, - my: !0, - neither: !0, - no: !0, - nor: !0, - not: !0, - of: !0, - off: !0, - often: !0, - on: !0, - only: !0, - or: !0, - other: !0, - our: !0, - own: !0, - rather: !0, - said: !0, - say: !0, - says: !0, - she: !0, - should: !0, - since: !0, - so: !0, - some: !0, - than: !0, - that: !0, - the: !0, - their: !0, - them: !0, - then: !0, - there: !0, - these: !0, - they: !0, - "this": !0, - tis: !0, - to: !0, - too: !0, - twas: !0, - us: !0, - wants: !0, - was: !0, - we: !0, - were: !0, - what: !0, - when: !0, - where: !0, - which: !0, - "while": !0, - who: !0, - whom: !0, - why: !0, - will: !0, - "with": !0, - would: !0, - yet: !0, - you: !0, - your: !0 - }, t.stopWordFilter.stopWords = t.defaultStopWords, t.Pipeline.registerFunction(t.stopWordFilter, "stopWordFilter"), t.trimmer = function(e) { - if (null === e || void 0 === e) throw new Error("token should not be undefined"); - return e.replace(/^\W+/, "").replace(/\W+$/, "") - }, t.Pipeline.registerFunction(t.trimmer, "trimmer"), t.InvertedIndex = function() { - this.root = { - docs: {}, - df: 0 - } - }, t.InvertedIndex.load = function(e) { - var t = new this; - return t.root = e.root, t - }, t.InvertedIndex.prototype.addToken = function(e, t, n) { - for (var n = n || this.root, i = 0; i <= e.length - 1;) { - var o = e[i]; - o in n || (n[o] = { - docs: {}, - df: 0 - }), i += 1, n = n[o] - } - var r = t.ref; - n.docs[r] ? n.docs[r] = { - tf: t.tf - } : (n.docs[r] = { - tf: t.tf - }, n.df += 1) - }, t.InvertedIndex.prototype.hasToken = function(e) { - if (!e) return !1; - for (var t = this.root, n = 0; n < e.length; n++) { - if (!t[e[n]]) return !1; - t = t[e[n]] - } - return !0 - }, t.InvertedIndex.prototype.getNode = function(e) { - if (!e) return null; - for (var t = this.root, n = 0; n < e.length; n++) { - if (!t[e[n]]) return null; - t = t[e[n]] - } - return t - }, t.InvertedIndex.prototype.getDocs = function(e) { - var t = this.getNode(e); - return null == t ? {} : t.docs - }, t.InvertedIndex.prototype.getTermFrequency = function(e, t) { - var n = this.getNode(e); - return null == n ? 0 : t in n.docs ? n.docs[t].tf : 0 - }, t.InvertedIndex.prototype.getDocFreq = function(e) { - var t = this.getNode(e); - return null == t ? 0 : t.df - }, t.InvertedIndex.prototype.removeToken = function(e, t) { - if (e) { - var n = this.getNode(e); - null != n && t in n.docs && (delete n.docs[t], n.df -= 1) - } - }, t.InvertedIndex.prototype.expandToken = function(e, t, n) { - if (null == e || "" == e) return []; - var t = t || []; - if (void 0 == n && (n = this.getNode(e), null == n)) return t; - n.df > 0 && t.push(e); - for (var i in n) "docs" !== i && "df" !== i && this.expandToken(e + i, t, n[i]); - return t - }, t.InvertedIndex.prototype.toJSON = function() { - return { - root: this.root - } - }, t.Configuration = function(e, n) { - var e = e || ""; - if (void 0 == n || null == n) throw new Error("fields should not be null"); - this.config = {}; - var i; - try { - i = JSON.parse(e), this.buildUserConfig(i, n) - } catch (o) { - t.utils.warn("user configuration parse failed, will use default configuration"), this.buildDefaultConfig(n) - } - }, t.Configuration.prototype.buildDefaultConfig = function(e) { - this.reset(), e.forEach(function(e) { - this.config[e] = { - boost: 1, - bool: "OR", - expand: !1 - } - }, this) - }, t.Configuration.prototype.buildUserConfig = function(e, n) { - var i = "OR", - o = !1; - if (this.reset(), "bool" in e && (i = e.bool || i), "expand" in e && (o = e.expand || o), "fields" in e) - for (var r in e.fields) - if (n.indexOf(r) > -1) { - var s = e.fields[r], - u = o; - void 0 != s.expand && (u = s.expand), this.config[r] = { - boost: s.boost || 0 === s.boost ? s.boost : 1, - bool: s.bool || i, - expand: u - } - } else t.utils.warn("field name in user configuration not found in index instance fields"); - else this.addAllFields2UserConfig(i, o, n) - }, t.Configuration.prototype.addAllFields2UserConfig = function(e, t, n) { - n.forEach(function(n) { - this.config[n] = { - boost: 1, - bool: e, - expand: t - } - }, this) - }, t.Configuration.prototype.get = function() { - return this.config - }, t.Configuration.prototype.reset = function() { - this.config = {} - }, lunr.SortedSet = function() { - this.length = 0, this.elements = [] - }, lunr.SortedSet.load = function(e) { - var t = new this; - return t.elements = e, t.length = e.length, t - }, lunr.SortedSet.prototype.add = function() { - var e, t; - for (e = 0; e < arguments.length; e++) t = arguments[e], ~this.indexOf(t) || this.elements.splice(this.locationFor(t), 0, t); - this.length = this.elements.length - }, lunr.SortedSet.prototype.toArray = function() { - return this.elements.slice() - }, lunr.SortedSet.prototype.map = function(e, t) { - return this.elements.map(e, t) - }, lunr.SortedSet.prototype.forEach = function(e, t) { - return this.elements.forEach(e, t) - }, lunr.SortedSet.prototype.indexOf = function(e) { - for (var t = 0, n = this.elements.length, i = n - t, o = t + Math.floor(i / 2), r = this.elements[o]; i > 1;) { - if (r === e) return o; - e > r && (t = o), r > e && (n = o), i = n - t, o = t + Math.floor(i / 2), r = this.elements[o] - } - return r === e ? o : -1 - }, lunr.SortedSet.prototype.locationFor = function(e) { - for (var t = 0, n = this.elements.length, i = n - t, o = t + Math.floor(i / 2), r = this.elements[o]; i > 1;) e > r && (t = o), r > e && (n = o), i = n - t, o = t + Math.floor(i / 2), r = this.elements[o]; - return r > e ? o : e > r ? o + 1 : void 0 - }, lunr.SortedSet.prototype.intersect = function(e) { - for (var t = new lunr.SortedSet, n = 0, i = 0, o = this.length, r = e.length, s = this.elements, u = e.elements;;) { - if (n > o - 1 || i > r - 1) break; - s[n] !== u[i] ? s[n] < u[i] ? n++ : s[n] > u[i] && i++ : (t.add(s[n]), n++, i++) - } - return t - }, lunr.SortedSet.prototype.clone = function() { - var e = new lunr.SortedSet; - return e.elements = this.toArray(), e.length = e.elements.length, e - }, lunr.SortedSet.prototype.union = function(e) { - var t, n, i; - this.length >= e.length ? (t = this, n = e) : (t = e, n = this), i = t.clone(); - for (var o = 0, r = n.toArray(); o < r.length; o++) i.add(r[o]); - return i - }, lunr.SortedSet.prototype.toJSON = function() { - return this.toArray() - }, - function(e, t) { - "function" == typeof define && define.amd ? define(t) : "object" == typeof exports ? module.exports = t() : e.elasticlunr = t() - }(this, function() { - return t - }) -}(); -- cgit v1.3.1 From 15ed680b4f7e1540fb09360dbd755f27403364f0 Mon Sep 17 00:00:00 2001 From: Jieiku Date: Sat, 22 Jul 2023 09:58:11 -0700 Subject: kofi icon --- COPY-TO-ROOT-SASS/abridge.scss | 1 + config.toml | 1 + sass/_functions.scss | 1 + sass/abridge.scss | 2 ++ templates/macros/social.html | 2 ++ 5 files changed, 7 insertions(+) (limited to 'sass/_functions.scss') diff --git a/COPY-TO-ROOT-SASS/abridge.scss b/COPY-TO-ROOT-SASS/abridge.scss index a680fdd..6ab3895 100644 --- a/COPY-TO-ROOT-SASS/abridge.scss +++ b/COPY-TO-ROOT-SASS/abridge.scss @@ -26,6 +26,7 @@ $icon-element: false, $icon-matrix: false, $icon-buymeacoffee: false, + $icon-kofi: false, $icon-twitter: false, $icon-facebook: false, $icon-linkedin: false, diff --git a/config.toml b/config.toml index ebeba67..eebc404 100644 --- a/config.toml +++ b/config.toml @@ -173,6 +173,7 @@ mail = "name@example.com" mastodon = "@your-user-name" element = "matrix.example.com" buymeacoffee = "your-user-name" +kofi = "your-user-name" discord = "your-discord" # Everything after https://discord.com/ eg: invite/my-server *or* servers/my-server-id twitter = "your-user-name" facebook = "your-user-name" diff --git a/sass/_functions.scss b/sass/_functions.scss index 2f4029a..dd6880a 100644 --- a/sass/_functions.scss +++ b/sass/_functions.scss @@ -102,6 +102,7 @@ home: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M9 22V12h6v10M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z'/%3E%3C/svg%3E", instagram: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Crect x='2' y='2' width='20' height='20' rx='5' ry='5'/%3E%3Cpath d='M16 11.4A4 4 0 1 1 12.6 8a4 4 0 0 1 3.4 3.4zm1.5-4.9h.01'/%3E%3C/svg%3E", linkedin: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6zM2 9h4v12H2z'/%3E%3Ccircle cx='4' cy='4' r='2'/%3E%3C/svg%3E", + kofi: "%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='%23fff' d='M2 5h15c8 0 8 10 0 10-1 0-1 0-1 1v2q0 1-1 1H2q-1 0-1-1V6q0-1 1-1m14 4v2c0 1 0 1 1 1 4 0 4-4 0-4-1 0-1 0-1 1'/%3E%3Cpath fill='#{map-get($p, f)}' d='M9 16C2 11 5 6 9 9c4-3 7 2 0 7' /%3E%3C/svg%3E", mail: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='m22 6-10 7L2 6m2-2h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6c0-1.1.9-2 2-2Z'/%3E%3C/svg%3E", mastodon: "%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M2 8c0 5.7-.2 12.6 5 14 2 .6 3.7.7 5 .6 2.4-.1 3.8-.9 3.8-.9l-.1-1.8s-1.7.6-3.7.5c-1.9 0-4-.2-4.2-2.6a5 5 90 0 1 0-.7c4 1 7.5.5 8.4.4 2.7-.4 5-2 5.3-3.6.5-2.4.4-5.8.4-5.8C22 3.4 19 2 19 2 15.9.6 8 .6 5.1 2c0 0-3 1.4-3 6zm4.5-2.3c1.2-1.4 3.8-1.5 5 .3l.5.9.6-1c1.1-1.7 3.7-1.6 4.9-.2 1.1 1.3.9 2.5.9 8.4H16V8.6c0-2.4-3-2.5-3 .3v3h-2V9c0-2.8-3-2.7-3-.3V14H5.6c0-5.9-.2-7.1 1-8.4z'/%3E%3C/svg%3E", matrix: "%3Csvg xmlns='http://www.w3.org/2000/svg' stroke='#{map-get($p, s)}' stroke-width='#{map-get($p, sw)}' fill='#{map-get($p, f)}' viewBox='0 0 24 24'%3E%3Cpath d='M.6.6v22.8H3v.6H0V0h3v.6zm7 7.2V9h.1c3.2-2.3 4.3 0 4.8.3C14.9 6.7 18 8 18 11v5h-1.5v-5a1 1 0 0 0-3.5 0v5h-1.7v-5a1 1 0 0 0-3.7 0v5H6V7.8zm15.8 15.7V.4H21V0h3v24h-3v-.6z'/%3E%3C/svg%3E", diff --git a/sass/abridge.scss b/sass/abridge.scss index ac01c1a..e457c5c 100644 --- a/sass/abridge.scss +++ b/sass/abridge.scss @@ -33,6 +33,7 @@ $icon-mastodon: true !default; $icon-element: true !default; $icon-matrix: false !default; $icon-buymeacoffee: true !default; +$icon-kofi: true !default; $icon-twitter: true !default; $icon-facebook: true !default; $icon-linkedin: true !default; @@ -1284,6 +1285,7 @@ $syntax: true !default;//syntax highlighting for code blocks @if $icon-globe {.globe { background-image: functions.icon(globe, "%23888", 2, "none", $ic) }} @if $icon-home {.home { background-image: functions.icon(home, "%23888", 2, "none", $ic) }} @if $icon-instagram {.instagram { background-image: functions.icon(instagram, "%23e07", 2, "none", $ic) }} + @if $icon-kofi {.kofi { background-image: functions.icon(kofi, "%23888", 1.5, "%23f55", $ic) }} @if $icon-linkedin {.linkedin { background-image: functions.icon(linkedin, "%2326a", 2, "none", $ic) }} @if $icon-mail {.mail { background-image: functions.icon(mail, "%23888", 2, "none", $ic) }} @if $icon-mastodon {.mastodon { background-image: functions.icon(mastodon, "none", 1, "%2328c", $ic) }} diff --git a/templates/macros/social.html b/templates/macros/social.html index 2b8f841..6ad83de 100644 --- a/templates/macros/social.html +++ b/templates/macros/social.html @@ -48,6 +48,8 @@ {% endif -%} {%- if config.extra.youtube -%} {% endif -%} + {%- if config.extra.kofi -%} + {% endif -%} {%- if config.extra.buymeacoffee -%} {% endif -%} {%- if config.extra.github_sponsor -%} -- cgit v1.3.1