import sharingMedia from '@config/sharing'; import { t } from '@lingui/macro'; import { useRouter } from 'next/router'; import { useEffect, useState } from 'react'; import styles from './Sharing.module.scss'; type Parameters = { content: string; image: string; title: string; url: string; }; type Website = { id: string; name: string; parameters: Parameters; url: string; }; const Sharing = ({ excerpt, title }: { excerpt: string; title: string }) => { const [pageExcerpt, setPageExcerpt] = useState(''); const [pageUrl, setPageUrl] = useState(''); const [domainName, setDomainName] = useState(''); const router = useRouter(); useEffect(() => { const divEl = document.createElement('div'); divEl.innerHTML = excerpt; const cleanExcerpt = divEl.textContent!; setPageExcerpt(cleanExcerpt); }, [excerpt]); useEffect(() => { const { protocol, hostname, port } = window.location; const currentPort = port ? `:${port}` : ''; const fullUrl = `${protocol}//${hostname}${currentPort}${router.asPath}`; setDomainName(hostname); setPageUrl(fullUrl); }, [router.asPath]); const getSharingUrl = (website: Website): string => { const { id, parameters, url } = website; let sharingUrl = `${url}?`; let count = 0; for (const [key, value] of Object.entries(parameters)) { if (!value) continue; sharingUrl += count > 0 ? `&${value}=` : `${value}=`; switch (key) { case 'content': if (id === 'email') { const intro = t`Introduction:`; const readMore = t`Read more here:`; const body = `${intro}\n\n"${pageExcerpt}"\n\n${readMore} ${pageUrl}`; sharingUrl += encodeURI(body); } else { sharingUrl += encodeURI(pageExcerpt); } break; case 'title': const prefix = id === 'email' ? t`Seen on ${domainName}:` : ''; sharingUrl += encodeURI(`${prefix} ${title}`); break; case 'url': sharingUrl += encodeURI(pageUrl); break; default: break; } count++; } return sharingUrl; }; const getItems = () => { const websites: Website[] = sharingMedia; return websites.map((website) => { const { id, name } = website; const sharingUrl = getSharingUrl(website); const linkModifier = `link--${id}`; return (
  • {name}
  • ); }); }; return (

    {t`Share`}

    ); }; export default Sharing; ippot.com/tree/public/prism?h=v1.1.0&id=796bac09eab8259783343ca0db2610345d50496a'>prism/prism-monkey.js
    blob: 9172cf2914ca6791372a1c71aa79384498944c53 (plain)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    Prism.languages.monkey = {
      comment: {
        pattern: /^#Rem\s[\s\S]*?^#End|'.+/im,
        greedy: true,
      },
      string: {
        pattern: /"[^"\r\n]*"/,
        greedy: true,
      },
      preprocessor: {
        pattern: /(^[ \t]*)#.+/m,
        lookbehind: true,
        greedy: true,
        alias: 'property',
      },
    
      function: /\b\w+(?=\()/,
      'type-char': {
        pattern: /\b[?%#$]/,
        alias: 'class-name',
      },
      number: {
        pattern:
          /((?:\.\.)?)(?:(?:\b|\B-\.?|\B\.)\d+(?:(?!\.\.)\.\d*)?|\$[\da-f]+)/i,
        lookbehind: true,
      },
      keyword:
        /\b(?:Abstract|Array|Bool|Case|Catch|Class|Const|Continue|Default|Eachin|Else|ElseIf|End|EndIf|Exit|Extends|Extern|False|Field|Final|Float|For|Forever|Function|Global|If|Implements|Import|Inline|Int|Interface|Local|Method|Module|New|Next|Null|Object|Private|Property|Public|Repeat|Return|Select|Self|Step|Strict|String|Super|Then|Throw|To|True|Try|Until|Void|Wend|While)\b/i,
      operator:
        /\.\.|<[=>]?|>=?|:?=|(?:[+\-*\/&~|]|\b(?:Mod|Shl|Shr)\b)=?|\b(?:And|Not|Or)\b/i,
      punctuation: /[.,:;()\[\]]/,
    };