@bartificer/linkify 2.3.5 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dist/index.js +1 -1
  2. package/docs/LinkData.class.mjs.html +93 -5
  3. package/docs/LinkTemplate.class.mjs.html +93 -5
  4. package/docs/Linkifier.class.mjs.html +99 -11
  5. package/docs/PageData.class.mjs.html +93 -5
  6. package/docs/defaults.mjs.html +116 -12
  7. package/docs/docdash-overrides.css +5 -0
  8. package/docs/externals.jsdoc.html +91 -4
  9. package/docs/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  10. package/docs/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  11. package/docs/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  12. package/docs/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  13. package/docs/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  14. package/docs/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  15. package/docs/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  16. package/docs/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  17. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  18. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
  19. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  20. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  21. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  22. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  23. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
  24. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  25. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  26. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  27. package/docs/index.html +930 -7
  28. package/docs/index.js.html +139 -17
  29. package/docs/module-cheerio.html +189 -3
  30. package/docs/module-defaults.html +585 -3
  31. package/docs/module-link-data.LinkData.html +944 -0
  32. package/docs/module-link-data.html +222 -0
  33. package/docs/module-link-template.LinkTemplate.html +817 -0
  34. package/docs/module-link-template.html +222 -0
  35. package/docs/module-linkifier.Linkifier.html +2323 -0
  36. package/docs/module-linkifier.html +232 -0
  37. package/docs/module-linkify.html +806 -3
  38. package/docs/module-mustache.html +189 -3
  39. package/docs/module-node-fetch.html +189 -3
  40. package/docs/module-page-data.PageData.html +1788 -0
  41. package/docs/module-page-data.html +222 -0
  42. package/docs/module-title-case.html +189 -3
  43. package/docs/module-urijs.html +189 -3
  44. package/docs/module-url-slug.html +189 -3
  45. package/docs/module-utilities.html +1468 -3
  46. package/docs/scripts/collapse.js +39 -0
  47. package/docs/scripts/commonNav.js +28 -0
  48. package/docs/scripts/linenumber.js +25 -0
  49. package/docs/scripts/nav.js +12 -0
  50. package/docs/scripts/polyfill.js +4 -0
  51. package/docs/scripts/{third-party → prettify}/Apache-License-2.0.txt +202 -202
  52. package/docs/scripts/prettify/lang-css.js +2 -0
  53. package/docs/scripts/prettify/prettify.js +28 -0
  54. package/docs/scripts/search.js +99 -265
  55. package/docs/styles/jsdoc.css +776 -0
  56. package/docs/styles/prettify.css +80 -0
  57. package/docs/utilities.mjs.html +124 -5
  58. package/examples/clipboardURLToMarkdown.mjs +80 -1
  59. package/package.json +3 -2
  60. package/src/LinkData.class.mjs +2 -1
  61. package/src/LinkTemplate.class.mjs +2 -1
  62. package/src/Linkifier.class.mjs +8 -7
  63. package/src/PageData.class.mjs +2 -1
  64. package/src/defaults.mjs +26 -8
  65. package/src/index.js +48 -13
  66. package/src/utilities.mjs +33 -1
  67. package/docs/data/search.json +0 -1
  68. package/docs/fonts/Inconsolata-Regular.ttf +0 -0
  69. package/docs/fonts/OpenSans-Regular.ttf +0 -0
  70. package/docs/fonts/WorkSans-Bold.ttf +0 -0
  71. package/docs/module-LinkData.LinkData.html +0 -13
  72. package/docs/module-LinkData.html +0 -3
  73. package/docs/module-LinkTemplate.LinkTemplate.html +0 -3
  74. package/docs/module-LinkTemplate.html +0 -3
  75. package/docs/module-Linkifier.Linkifier.html +0 -3
  76. package/docs/module-Linkifier.html +0 -3
  77. package/docs/module-PageData.PageData.html +0 -15
  78. package/docs/module-PageData.html +0 -3
  79. package/docs/scripts/core.js +0 -726
  80. package/docs/scripts/core.min.js +0 -23
  81. package/docs/scripts/resize.js +0 -90
  82. package/docs/scripts/search.min.js +0 -6
  83. package/docs/scripts/third-party/fuse.js +0 -9
  84. package/docs/scripts/third-party/hljs-line-num-original.js +0 -369
  85. package/docs/scripts/third-party/hljs-line-num.js +0 -1
  86. package/docs/scripts/third-party/hljs-original.js +0 -5171
  87. package/docs/scripts/third-party/hljs.js +0 -1
  88. package/docs/scripts/third-party/popper.js +0 -5
  89. package/docs/scripts/third-party/tippy.js +0 -1
  90. package/docs/scripts/third-party/tocbot.js +0 -672
  91. package/docs/scripts/third-party/tocbot.min.js +0 -1
  92. package/docs/styles/clean-jsdoc-theme-base.css +0 -1159
  93. package/docs/styles/clean-jsdoc-theme-dark.css +0 -412
  94. package/docs/styles/clean-jsdoc-theme-light.css +0 -482
  95. package/docs/styles/clean-jsdoc-theme-scrollbar.css +0 -30
  96. package/docs/styles/clean-jsdoc-theme-without-scrollbar.min.css +0 -1
  97. package/docs/styles/clean-jsdoc-theme.min.css +0 -1
@@ -0,0 +1,80 @@
1
+ .pln {
2
+ color: #ddd;
3
+ }
4
+
5
+ /* string content */
6
+ .str {
7
+ color: #61ce3c;
8
+ }
9
+
10
+ /* a keyword */
11
+ .kwd {
12
+ color: #fbde2d;
13
+ }
14
+
15
+ /* a comment */
16
+ .com {
17
+ color: #aeaeae;
18
+ }
19
+
20
+ /* a type name */
21
+ .typ {
22
+ color: #8da6ce;
23
+ }
24
+
25
+ /* a literal value */
26
+ .lit {
27
+ color: #fbde2d;
28
+ }
29
+
30
+ /* punctuation */
31
+ .pun {
32
+ color: #ddd;
33
+ }
34
+
35
+ /* lisp open bracket */
36
+ .opn {
37
+ color: #000000;
38
+ }
39
+
40
+ /* lisp close bracket */
41
+ .clo {
42
+ color: #000000;
43
+ }
44
+
45
+ /* a markup tag name */
46
+ .tag {
47
+ color: #8da6ce;
48
+ }
49
+
50
+ /* a markup attribute name */
51
+ .atn {
52
+ color: #fbde2d;
53
+ }
54
+
55
+ /* a markup attribute value */
56
+ .atv {
57
+ color: #ddd;
58
+ }
59
+
60
+ /* a declaration */
61
+ .dec {
62
+ color: #EF5050;
63
+ }
64
+
65
+ /* a variable name */
66
+ .var {
67
+ color: #c82829;
68
+ }
69
+
70
+ /* a function name */
71
+ .fun {
72
+ color: #4271ae;
73
+ }
74
+
75
+ /* Specify class=linenums on a pre to get line numbering */
76
+ ol.linenums {
77
+ margin-top: 0;
78
+ margin-bottom: 0;
79
+ padding-bottom: 2px;
80
+ }
@@ -1,8 +1,68 @@
1
- <!DOCTYPE html><html lang="en" style="font-size:16px"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Source: utilities.mjs</title><!--[if lt IE 9]>
2
- <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
3
- <![endif]--><script src="scripts/third-party/hljs.js" defer="defer"></script><script src="scripts/third-party/hljs-line-num.js" defer="defer"></script><script src="scripts/third-party/popper.js" defer="defer"></script><script src="scripts/third-party/tippy.js" defer="defer"></script><script src="scripts/third-party/tocbot.min.js"></script><script>var baseURL="/",locationPathname="";baseURL=(locationPathname=document.location.pathname).substr(0,locationPathname.lastIndexOf("/")+1)</script><link rel="stylesheet" href="styles/clean-jsdoc-theme.min.css"><svg aria-hidden="true" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="display:none"><defs><symbol id="copy-icon" viewbox="0 0 488.3 488.3"><g><path d="M314.25,85.4h-227c-21.3,0-38.6,17.3-38.6,38.6v325.7c0,21.3,17.3,38.6,38.6,38.6h227c21.3,0,38.6-17.3,38.6-38.6V124 C352.75,102.7,335.45,85.4,314.25,85.4z M325.75,449.6c0,6.4-5.2,11.6-11.6,11.6h-227c-6.4,0-11.6-5.2-11.6-11.6V124 c0-6.4,5.2-11.6,11.6-11.6h227c6.4,0,11.6,5.2,11.6,11.6V449.6z"/><path d="M401.05,0h-227c-21.3,0-38.6,17.3-38.6,38.6c0,7.5,6,13.5,13.5,13.5s13.5-6,13.5-13.5c0-6.4,5.2-11.6,11.6-11.6h227 c6.4,0,11.6,5.2,11.6,11.6v325.7c0,6.4-5.2,11.6-11.6,11.6c-7.5,0-13.5,6-13.5,13.5s6,13.5,13.5,13.5c21.3,0,38.6-17.3,38.6-38.6 V38.6C439.65,17.3,422.35,0,401.05,0z"/></g></symbol><symbol id="search-icon" viewBox="0 0 512 512"><g><g><path d="M225.474,0C101.151,0,0,101.151,0,225.474c0,124.33,101.151,225.474,225.474,225.474 c124.33,0,225.474-101.144,225.474-225.474C450.948,101.151,349.804,0,225.474,0z M225.474,409.323 c-101.373,0-183.848-82.475-183.848-183.848S124.101,41.626,225.474,41.626s183.848,82.475,183.848,183.848 S326.847,409.323,225.474,409.323z"/></g></g><g><g><path d="M505.902,476.472L386.574,357.144c-8.131-8.131-21.299-8.131-29.43,0c-8.131,8.124-8.131,21.306,0,29.43l119.328,119.328 c4.065,4.065,9.387,6.098,14.715,6.098c5.321,0,10.649-2.033,14.715-6.098C514.033,497.778,514.033,484.596,505.902,476.472z"/></g></g></symbol><symbol id="font-size-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11.246 15H4.754l-2 5H.6L7 4h2l6.4 16h-2.154l-2-5zm-.8-2L8 6.885 5.554 13h4.892zM21 12.535V12h2v8h-2v-.535a4 4 0 1 1 0-6.93zM19 18a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"/></symbol><symbol id="add-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"/></symbol><symbol id="minus-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M5 11h14v2H5z"/></symbol><symbol id="dark-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M10 7a7 7 0 0 0 12 4.9v.1c0 5.523-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2h.1A6.979 6.979 0 0 0 10 7zm-6 5a8 8 0 0 0 15.062 3.762A9 9 0 0 1 8.238 4.938 7.999 7.999 0 0 0 4 12z"/></symbol><symbol id="light-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 18a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm0-2a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM11 1h2v3h-2V1zm0 19h2v3h-2v-3zM3.515 4.929l1.414-1.414L7.05 5.636 5.636 7.05 3.515 4.93zM16.95 18.364l1.414-1.414 2.121 2.121-1.414 1.414-2.121-2.121zm2.121-14.85l1.414 1.415-2.121 2.121-1.414-1.414 2.121-2.121zM5.636 16.95l1.414 1.414-2.121 2.121-1.414-1.414 2.121-2.121zM23 11v2h-3v-2h3zM4 11v2H1v-2h3z"/></symbol><symbol id="reset-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M18.537 19.567A9.961 9.961 0 0 1 12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10c0 2.136-.67 4.116-1.81 5.74L17 12h3a8 8 0 1 0-2.46 5.772l.997 1.795z"/></symbol><symbol id="down-icon" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.7803 6.21967C13.0732 6.51256 13.0732 6.98744 12.7803 7.28033L8.53033 11.5303C8.23744 11.8232 7.76256 11.8232 7.46967 11.5303L3.21967 7.28033C2.92678 6.98744 2.92678 6.51256 3.21967 6.21967C3.51256 5.92678 3.98744 5.92678 4.28033 6.21967L8 9.93934L11.7197 6.21967C12.0126 5.92678 12.4874 5.92678 12.7803 6.21967Z"></path></symbol><symbol id="codepen-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M16.5 13.202L13 15.535v3.596L19.197 15 16.5 13.202zM14.697 12L12 10.202 9.303 12 12 13.798 14.697 12zM20 10.869L18.303 12 20 13.131V10.87zM19.197 9L13 4.869v3.596l3.5 2.333L19.197 9zM7.5 10.798L11 8.465V4.869L4.803 9 7.5 10.798zM4.803 15L11 19.131v-3.596l-3.5-2.333L4.803 15zM4 13.131L5.697 12 4 10.869v2.262zM2 9a1 1 0 0 1 .445-.832l9-6a1 1 0 0 1 1.11 0l9 6A1 1 0 0 1 22 9v6a1 1 0 0 1-.445.832l-9 6a1 1 0 0 1-1.11 0l-9-6A1 1 0 0 1 2 15V9z"/></symbol><symbol id="close-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 10.586l4.95-4.95 1.414 1.414-4.95 4.95 4.95 4.95-1.414 1.414-4.95-4.95-4.95 4.95-1.414-1.414 4.95-4.95-4.95-4.95L7.05 5.636z"/></symbol><symbol id="menu-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M3 4h18v2H3V4zm0 7h18v2H3v-2zm0 7h18v2H3v-2z"/></symbol></defs></svg></head><body data-theme="fallback-light"><div class="sidebar-container"><div class="sidebar" id="sidebar"><a href="/" class="sidebar-title sidebar-title-anchor">Bartificer Linkifier</a><div class="sidebar-items-container"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-modules"><div>Modules</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-LinkData.html">LinkData</a></div><div class="sidebar-section-children"><a href="module-LinkTemplate.html">LinkTemplate</a></div><div class="sidebar-section-children"><a href="module-Linkifier.html">Linkifier</a></div><div class="sidebar-section-children"><a href="module-PageData.html">PageData</a></div><div class="sidebar-section-children"><a href="module-defaults.html">defaults</a></div><div class="sidebar-section-children"><a href="module-linkify.html">linkify</a></div><div class="sidebar-section-children"><a href="module-utilities.html">utilities</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-classes"><div>Classes</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-LinkData.LinkData.html">LinkData</a></div><div class="sidebar-section-children"><a href="module-LinkTemplate.LinkTemplate.html">LinkTemplate</a></div><div class="sidebar-section-children"><a href="module-Linkifier.Linkifier.html">Linkifier</a></div><div class="sidebar-section-children"><a href="module-PageData.PageData.html">PageData</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-externals"><div>Externals</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-cheerio.html">cheerio</a></div><div class="sidebar-section-children"><a href="module-mustache.html">mustache</a></div><div class="sidebar-section-children"><a href="module-node-fetch.html">node-fetch</a></div><div class="sidebar-section-children"><a href="module-title-case.html">title-case</a></div><div class="sidebar-section-children"><a href="module-urijs.html">urijs</a></div><div class="sidebar-section-children"><a href="module-url-slug.html">url-slug</a></div></div></div></div></div><div class="navbar-container" id="VuAckcnZhf"><nav class="navbar"><div class="navbar-left-items"></div><div class="navbar-right-items"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#dark-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div><nav></nav></nav></div><div class="toc-container"><div class="toc-content"><span class="bold">On this page</span><div id="eed4d2a0bfd64539bb9df78095dec881"></div></div></div><div class="body-wrapper"><div class="main-content"><div class="main-wrapper"><section id="source-page" class="source-page"><header><h1 id="title" class="has-anchor">utilities.mjs</h1></header><article><pre class="prettyprint source lang-js"><code>/**
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+
5
+ <meta charset="utf-8">
6
+ <title>utilities.mjs - @bartificer/linkify Documentation</title>
7
+
8
+ <meta name="description" content="Documentation for the @bartificer/linkify package" />
9
+
10
+ <meta name="keywords" content="documentation, linkify, link, template, javascript, generator, npm, module, package" />
11
+ <meta name="keyword" content="documentation, linkify, link, template, javascript, generator, npm, module, package" />
12
+
13
+
14
+
15
+ <meta property="og:title" content="@bartificer/linkify"/>
16
+ <meta property="og:type" content="website"/>
17
+ <meta property="og:image" content=""/>
18
+ <meta property="og:site_name" content="@bartificer/linkify Documentation"/>
19
+ <meta property="og:url" content="https://bartificer.github.io/linkify/"/>
20
+
21
+ <script src="scripts/prettify/prettify.js"></script>
22
+ <script src="scripts/prettify/lang-css.js"></script>
23
+ <!--[if lt IE 9]>
24
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
25
+ <![endif]-->
26
+ <link type="text/css" rel="stylesheet" href="styles/prettify.css">
27
+ <link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
28
+ <script src="scripts/nav.js" defer></script>
29
+
30
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
31
+ </head>
32
+ <body>
33
+
34
+ <input type="checkbox" id="nav-trigger" class="nav-trigger" />
35
+ <label for="nav-trigger" class="navicon-button x">
36
+ <div class="navicon"></div>
37
+ </label>
38
+
39
+ <label for="nav-trigger" class="overlay"></label>
40
+
41
+ <nav class="wrap">
42
+
43
+ <input type="text" id="nav-search" placeholder="Search" />
44
+
45
+
46
+ <h2><a href="index.html">Home</a></h2><h2><a href="https://github.com/bartificer/linkify" target="_blank" >On GitHub</a></h2><h2><a href="https://bartificer.net/" target="_blank" >Bartificer Creations</a></h2><h3>Modules</h3><ul><li><a href="module-defaults.html">defaults</a><ul class='members'><li data-type='member'><a href="module-defaults.html#.linkTemplates">linkTemplates</a></li><li data-type='member'><a href="module-defaults.html#.smallWords">smallWords</a></li><li data-type='member'><a href="module-defaults.html#.speciallyCapitalisedWords">speciallyCapitalisedWords</a></li></ul></li><li><a href="module-link-data.html">link-data</a></li><li><a href="module-link-template.html">link-template</a></li><li><a href="module-linkifier.html">linkifier</a></li><li><a href="module-linkify.html">linkify</a><ul class='members'><li data-type='member'><a href="module-linkify.html#.LinkData">LinkData</a></li><li data-type='member'><a href="module-linkify.html#.LinkTemplate">LinkTemplate</a></li><li data-type='member'><a href="module-linkify.html#.Linkifier">Linkifier</a></li><li data-type='member'><a href="module-linkify.html#.PageData">PageData</a></li><li data-type='member'><a href="module-linkify.html#.VERSION">VERSION</a></li><li data-type='member'><a href="module-linkify.html#.default">default</a></li><li data-type='member'><a href="module-linkify.html#.linkify">linkify</a></li></ul></li><li><a href="module-page-data.html">page-data</a></li><li><a href="module-utilities.html">utilities</a><ul class='methods'><li data-type='method'><a href="module-utilities.html#.batchFixCustomWordCases">batchFixCustomWordCases</a></li><li data-type='method'><a href="module-utilities.html#.escapeRegex">escapeRegex</a></li><li data-type='method'><a href="module-utilities.html#.extractSlug">extractSlug</a></li><li data-type='method'><a href="module-utilities.html#.regulariseWhitespace">regulariseWhitespace</a></li><li data-type='method'><a href="module-utilities.html#.stripQueryString">stripQueryString</a></li><li data-type='method'><a href="module-utilities.html#.stripUTMParameters">stripUTMParameters</a></li><li data-type='method'><a href="module-utilities.html#.toTitleCase">toTitleCase</a></li></ul></li></ul><h3>Classes</h3><ul><li><a href="module-link-data.LinkData.html">LinkData</a><ul class='methods'><li data-type='method'><a href="module-link-data.LinkData.html#asPlainObject">asPlainObject</a></li></ul></li><li><a href="module-link-template.LinkTemplate.html">LinkTemplate</a><ul class='methods'><li data-type='method'><a href="module-link-template.LinkTemplate.html#addFilter">addFilter</a></li><li data-type='method'><a href="module-link-template.LinkTemplate.html#filtersFor">filtersFor</a></li></ul></li><li><a href="module-linkifier.Linkifier.html">Linkifier</a><ul class='methods'><li data-type='method'><a href="module-linkifier.Linkifier.html#fetchPageData">fetchPageData</a></li><li data-type='method'><a href="module-linkifier.Linkifier.html#generateLink">generateLink</a></li><li data-type='method'><a href="module-linkifier.Linkifier.html#getTemplate">getTemplate</a></li><li data-type='method'><a href="module-linkifier.Linkifier.html#getTemplateNameForDomain">getTemplateNameForDomain</a></li><li data-type='method'><a href="module-linkifier.Linkifier.html#getTransformerForDomain">getTransformerForDomain</a></li><li data-type='method'><a href="module-linkifier.Linkifier.html#registerDefaultTemplateMapping">registerDefaultTemplateMapping</a></li><li data-type='method'><a href="module-linkifier.Linkifier.html#registerTemplate">registerTemplate</a></li><li data-type='method'><a href="module-linkifier.Linkifier.html#registerTransformer">registerTransformer</a></li></ul></li><li><a href="module-page-data.PageData.html">PageData</a><ul class='methods'><li data-type='method'><a href="module-page-data.PageData.html#addSecondaryHeading">addSecondaryHeading</a></li><li data-type='method'><a href="module-page-data.PageData.html#addTopLevelHeading">addTopLevelHeading</a></li><li data-type='method'><a href="module-page-data.PageData.html#asPlainObject">asPlainObject</a></li><li data-type='method'><a href="module-page-data.PageData.html#h1">h1</a></li><li data-type='method'><a href="module-page-data.PageData.html#h2">h2</a></li></ul></li></ul><h3>Externals</h3><ul><li><a href="module-cheerio.html">cheerio</a></li><li><a href="module-mustache.html">mustache</a></li><li><a href="module-node-fetch.html">node-fetch</a></li><li><a href="module-title-case.html">title-case</a></li><li><a href="module-urijs.html">urijs</a></li><li><a href="module-url-slug.html">url-slug</a></li></ul>
47
+
48
+ </nav>
49
+
50
+ <div id="main">
51
+
52
+ <h1 class="page-title">utilities.mjs</h1>
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+ <section>
61
+ <article>
62
+ <pre class="prettyprint source linenums"><code>/**
4
63
  * @file A collection of useful utility functions.
5
64
  * @author Bart Busschots &lt;opensource@bartificer.ie>
65
+ * @license MIT
6
66
  */
7
67
 
8
68
  /**
@@ -68,6 +128,7 @@ export function escapeRegex(str) {
68
128
  * @param {string} str - the string to apply the replacemnts to.
69
129
  * @param {string[]} [words] - an array of words in their desired capitalisations. Defaults to the default list of custom capitalisations.
70
130
  * @returns {string}
131
+ * @see {@link module:defaults.speciallyCapitalisedWords} for the default list of custom capitalisations.
71
132
  */
72
133
  export function batchFixCustomWordCases(str, words){
73
134
  // coerce the first argument to a string
@@ -98,6 +159,36 @@ export function batchFixCustomWordCases(str, words){
98
159
  return ans;
99
160
  }
100
161
 
162
+ /**
163
+ * Convert a string to title case, with some custom capitalisations.
164
+ *
165
+ * @param {string} str - the string to convert to title case.
166
+ * @param {string[]} [words] - a list of words with custom capitalisations to correct after title-casing. Defaults to the default list of custom capitalisations.
167
+ * @return {string}
168
+ * @see {@link module:defaults.speciallyCapitalisedWords} for the default list of custom capitalisations.
169
+ * @see {@link module:title-case} for the Title Case module who's titleCase function is used to convert to title case, and which has its own default list of small words that are preserved in lower case.
170
+ * @see {@link module:defaults.smallWords} for the additional list of small words that are preserved in lower case by the title-casing function.
171
+ */
172
+ export function toTitleCase(str, words){
173
+ // coerce the first argument to a string
174
+ let ans = String(str);
175
+
176
+ // add the additional small words
177
+ for (const smallWord of defaults.smallWords){
178
+ console.log(`adding smallWord: ${smallWord}`);
179
+ titleCase.SMALL_WORDS.add(smallWord);
180
+ }
181
+
182
+ // convert to title case
183
+ ans = titleCase.titleCase(ans);
184
+
185
+ // fix any words with unusual customisations
186
+ ans = batchFixCustomWordCases(ans, words);
187
+
188
+ // return the result
189
+ return ans;
190
+ }
191
+
101
192
  /**
102
193
  * Extract the slug from a URL and convert it to a title-case string.
103
194
  *
@@ -145,7 +236,35 @@ export function extractSlug(url, words){
145
236
  title = titleCase.titleCase(title);
146
237
 
147
238
  // fix any words with unusual customisations
148
- title = batchFixCustomWordCases(title, words);
239
+ title = toTitleCase(title, words);
149
240
 
150
241
  return title;
151
- };</code></pre></article></section></div></div></div><div class="search-container" id="PkfLWpAbet" style="display:none"><div class="wrapper" id="iCxFxjkHbP"><button class="icon-button search-close-button" id="VjLlGakifb" aria-label="close search"><svg><use xlink:href="#close-icon"></use></svg></button><div class="search-box-c"><svg><use xlink:href="#search-icon"></use></svg> <input type="text" id="vpcKVYIppa" class="search-input" placeholder="Search..." autofocus></div><div class="search-result-c" id="fWwVHRuDuN"><span class="search-result-c-text">Type anything to view search result</span></div></div></div><div class="mobile-menu-icon-container"><button class="icon-button" id="mobile-menu" data-isopen="false" aria-label="menu"><svg><use xlink:href="#menu-icon"></use></svg></button></div><div id="mobile-sidebar" class="mobile-sidebar-container"><div class="mobile-sidebar-wrapper"><a href="/" class="sidebar-title sidebar-title-anchor">Bartificer Linkifier</a><div class="mobile-nav-links"></div><div class="mobile-sidebar-items-c"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-modules"><div>Modules</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-LinkData.html">LinkData</a></div><div class="sidebar-section-children"><a href="module-LinkTemplate.html">LinkTemplate</a></div><div class="sidebar-section-children"><a href="module-Linkifier.html">Linkifier</a></div><div class="sidebar-section-children"><a href="module-PageData.html">PageData</a></div><div class="sidebar-section-children"><a href="module-defaults.html">defaults</a></div><div class="sidebar-section-children"><a href="module-linkify.html">linkify</a></div><div class="sidebar-section-children"><a href="module-utilities.html">utilities</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-classes"><div>Classes</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-LinkData.LinkData.html">LinkData</a></div><div class="sidebar-section-children"><a href="module-LinkTemplate.LinkTemplate.html">LinkTemplate</a></div><div class="sidebar-section-children"><a href="module-Linkifier.Linkifier.html">Linkifier</a></div><div class="sidebar-section-children"><a href="module-PageData.PageData.html">PageData</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-externals"><div>Externals</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-cheerio.html">cheerio</a></div><div class="sidebar-section-children"><a href="module-mustache.html">mustache</a></div><div class="sidebar-section-children"><a href="module-node-fetch.html">node-fetch</a></div><div class="sidebar-section-children"><a href="module-title-case.html">title-case</a></div><div class="sidebar-section-children"><a href="module-urijs.html">urijs</a></div><div class="sidebar-section-children"><a href="module-url-slug.html">url-slug</a></div></div></div><div class="mobile-navbar-actions"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#dark-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div></div></div><script type="text/javascript" src="scripts/core.min.js"></script><script src="scripts/search.min.js" defer="defer"></script><script src="scripts/third-party/fuse.js" defer="defer"></script><script type="text/javascript">var tocbotInstance=tocbot.init({tocSelector:"#eed4d2a0bfd64539bb9df78095dec881",contentSelector:".main-content",headingSelector:"h1, h2, h3",hasInnerContainers:!0,scrollContainer:".main-content",headingsOffset:130,onClick:bringLinkToView})</script></body></html>
242
+ };</code></pre>
243
+ </article>
244
+ </section>
245
+
246
+
247
+
248
+
249
+
250
+
251
+ </div>
252
+
253
+ <br class="clear">
254
+
255
+ <footer>
256
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Apr 13 2026 16:45:07 GMT+0100 (Irish Standard Time) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
257
+ </footer>
258
+
259
+ <script>prettyPrint();</script>
260
+ <script src="scripts/polyfill.js"></script>
261
+ <script src="scripts/linenumber.js"></script>
262
+
263
+ <script src="scripts/search.js" defer></script>
264
+
265
+
266
+
267
+ <link type="text/css" rel="stylesheet" href="./docdash-overrides.css">
268
+
269
+ </body>
270
+ </html>
@@ -1,9 +1,18 @@
1
1
  // import Linkify Lib
2
+ import URI from 'urijs';
2
3
  import { linkify, LinkTemplate, LinkData } from '../dist/index.js';
3
4
 
4
5
  // import 3rd-party library for interacting with the clipboard
5
6
  import clipboardy from 'clipboardy';
6
7
 
8
+ // NOTE: this example supports one optional argument, a special-case name, if passed:
9
+ // 1. if there is a custom transformer defined with that name, it will be used as a one-off transformer
10
+ // 2. if there is a template defined with that name, it will be used as a one-off template
11
+
12
+ //
13
+ // === Register custom templates, transformers, etc... ===
14
+ //
15
+
7
16
  // register a custom Markdown link template and make it the default
8
17
  linkify.registerTemplate('md-bartificer', new LinkTemplate(
9
18
  '[{{{text}}} — {{{uri.hostname}}}{{#uri.hasPath}}/…{{/uri.hasPath}}]({{{url}}})',
@@ -32,7 +41,22 @@ linkify.registerTemplate('md-xkcd', new LinkTemplate(
32
41
  ));
33
42
  linkify.registerDefaultTemplateMapping('xkcd.com', 'md-xkcd');
34
43
 
44
+ // register a special Markdown template that just contains the link title, and nothing more
45
+ linkify.registerTemplate('md-title-only', new LinkTemplate(
46
+ '[{{{text}}}]({{{url}}})',
47
+ [
48
+ ['url', linkify.util.stripUTMParameters],
49
+ ['text', linkify.util.regulariseWhitespace]
50
+ ]
51
+ ));
52
+
53
+ // capture any templates that should be made available for special cases
54
+ const templates = {
55
+ mastodonServer: 'md-title-only'
56
+ }
57
+
35
58
  // Cache commonly needed transforer functions to reduce code repetition
59
+ // NOTE: these are the transformers that are available as special cases
36
60
  const transformers = {
37
61
  mainHeading: function(pData){
38
62
  return new LinkData(pData.url, pData.mainHeading);
@@ -44,6 +68,34 @@ const transformers = {
44
68
  titleMinusPostscript: function(pData, postscript){
45
69
  const regex = new RegExp(`${linkify.util.escapeRegex(postscript)}$`);
46
70
  return new LinkData(pData.url, pData.title.replace(regex, '').trim());
71
+ },
72
+ mastodonServer: function(pData){
73
+ const mastodonServer = pData.uri.hostname();
74
+
75
+ // see if the link points to a user-related page on the server
76
+ const mastodonPathMatch = pData.uri.path().match(/^\/@(?<handle>[^\/]+)(?:\/(?<postId>\d+))?/);
77
+ if (mastodonPathMatch && mastodonPathMatch.groups){
78
+ // if so, return the handle as the link text and the post ID as the description (if there is one)
79
+ const handle = mastodonPathMatch.groups.handle;
80
+ const postId = mastodonPathMatch.groups.postId;
81
+
82
+ // see if we're a post or some kind of profile page
83
+ if(postId){
84
+ // this is a post, so use the handle and the post snippet as the text
85
+
86
+ // extract the post snippet from the title
87
+ let snippet = pData.title.replace(/^[^"]+"/, '').replace(/"[^"]+$/, '').trim();
88
+
89
+ return new LinkData(pData.url, `@${handle}@${mastodonServer} on Mastodon: "${snippet}"`);
90
+ }else{
91
+ // some kind of profile page, so just return the handle with some text to indicate this is a Mastodon server
92
+ return new LinkData(pData.url, `@${handle}@${mastodonServer} on Mastodon`);
93
+ }
94
+ return new LinkData(pData.url, pData.title, mastodonServer);
95
+ } else {
96
+ // we're on a generic page, so return the title with with a note that this is a Mastodon server
97
+ return new LinkData(pData.url, `${pData.title} (Mastodon)`);
98
+ }
47
99
  }
48
100
  };
49
101
 
@@ -62,6 +114,7 @@ linkify.registerTransformer('apod.nasa.gov', (pData) => {
62
114
  return new LinkData(pData.url, pData.title);
63
115
  }
64
116
  });
117
+ linkify.registerTransformer('social.bartificer.ie', transformers.mastodonServer);
65
118
  linkify.registerTransformer('cultofmac.com', transformers.mainHeading);
66
119
  linkify.registerTransformer('daringfireball.net', (pData) => transformers.titleMinusPrefix(pData, 'Daring Fireball: '));
67
120
  linkify.registerTransformer('intego.com', (pData) => transformers.titleMinusPostscript(pData, ' | Intego'));
@@ -87,10 +140,36 @@ linkify.registerTransformer('xkcd.com', (pData) => {
87
140
  return new LinkData(pData.url, comicTitle, comicNumber);
88
141
  });
89
142
 
143
+ //
144
+ // === Genereate the Link ===
145
+ //
146
+
90
147
  // read the URL from the clipboard
91
148
  let testURL = clipboardy.readSync();
92
149
 
150
+ // check if a specicla-case was passed
151
+ let specialCaseName = '';
152
+ let templateName = null;
153
+ if(process.argv.length > 2){
154
+ specialCaseName = String(process.argv[2]);
155
+ }
156
+ if(specialCaseName){
157
+ // check for a special-case transformer
158
+ if (transformers[specialCaseName]){
159
+ linkify.registerTransformer(URI(testURL).hostname(), transformers[specialCaseName]);
160
+ } else {
161
+ console.warn(`No transformer found with the name "${specialCaseName}". Proceeding without a one-off transformer.`);
162
+ }
163
+
164
+ // check for a special-case template
165
+ if(templates[specialCaseName]){
166
+ templateName = templates[specialCaseName];
167
+ } else {
168
+ console.warn(`No template found for special case "${specialCaseName}". Proceeding without a one-off template.`);
169
+ }
170
+ }
171
+
93
172
  // try generate the formatted link from the URL
94
- linkify.generateLink(testURL).then(function(d){
173
+ linkify.generateLink(testURL, templateName).then(function(d){
95
174
  console.log(d);
96
175
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bartificer/linkify",
3
- "version": "2.3.5",
3
+ "version": "2.4.0",
4
4
  "description": "An module for converting URLs into pretty links in any format.",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -17,7 +17,7 @@
17
17
  ],
18
18
  "scripts": {
19
19
  "build": "webpack",
20
- "docs": "rm -rf ./docs/* && npx jsdoc -c ./jsdoc.conf.json --destination ./docs",
20
+ "docs": "rm -rf ./docs/* && npx jsdoc -c ./jsdoc.conf.json",
21
21
  "release": "npm run build && npm run docs && npm login && npm publish"
22
22
  },
23
23
  "repository": {
@@ -41,6 +41,7 @@
41
41
  },
42
42
  "devDependencies": {
43
43
  "clean-jsdoc-theme": "^4.3.0",
44
+ "docdash": "^2.0.2",
44
45
  "jsdoc": "^4.0.5",
45
46
  "webpack": "^5.105.4",
46
47
  "webpack-cli": "^7.0.2"
@@ -1,11 +1,12 @@
1
1
  /**
2
2
  * @file The definition of the class representing a link.
3
3
  * @author Bart Busschots <opensource@bartificer.ie>
4
+ * @license MIT
4
5
  */
5
6
 
6
7
  /**
7
8
  * This module provides as class for representing the information that can be used when rendering a link.
8
- * @module LinkData
9
+ * @module link-data
9
10
  * @requires module:urijs
10
11
  */
11
12
  import {default as URI} from 'urijs';
@@ -1,11 +1,12 @@
1
1
  /**
2
2
  * @file The definition of the class representing a link generation template.
3
3
  * @author Bart Busschots <opensource@bartificer.ie>
4
+ * @license MIT
4
5
  */
5
6
 
6
7
  /**
7
8
  * This module provides as class for representing a template used for generating links.
8
- * @module LinkTemplate
9
+ * @module link-template
9
10
  * @requires module:urijs
10
11
  */
11
12
 
@@ -1,14 +1,15 @@
1
1
  /**
2
2
  * @file The definition of the main Linkifier class which provides the link rendering functionality with the help of the other classes and modules.
3
3
  * @author Bart Busschots <opensource@bartificer.ie>
4
+ * @license MIT
4
5
  */
5
6
 
6
7
  /**
7
8
  * Linkifier's core link rendering functionality.
8
- * @module Linkifier
9
- * @requires LinkData
10
- * @requires LinkTemplate
11
- * @requires PageData
9
+ * @module linkifier
10
+ * @requires link-data
11
+ * @requires link-template
12
+ * @requires page-data
12
13
  * @requires module:node-fetch
13
14
  * @requires module:cheerio
14
15
  * @requires module:mustache
@@ -203,7 +204,7 @@ export class Linkifier {
203
204
 
204
205
  /**
205
206
  * The default link template.
206
- * @type {LinkTemplate}
207
+ * @type {module:LinkTemplate.class.LinkTemplate}
207
208
  */
208
209
  get defaultTemplate(){
209
210
  return this._linkTemplates[this._pageDataToLinkTemplateName['.']];
@@ -212,8 +213,8 @@ export class Linkifier {
212
213
  /**
213
214
  * Register a link template.
214
215
  *
215
- * @param {templateName} name
216
- * @param {module:@bartificer/linkify.LinkTemplate} template
216
+ * @param {string} name
217
+ * @param {LinkTemplate} template
217
218
  * @throws {ValidationError} A validation error is thrown unless both a valid
218
219
  * name and template object are passed.
219
220
  */
@@ -1,11 +1,12 @@
1
1
  /**
2
2
  * @file The definition of the class representing a web page.
3
3
  * @author Bart Busschots <opensource@bartificer.ie>
4
+ * @license MIT
4
5
  */
5
6
 
6
7
  /**
7
8
  * This module provides as class for representing the information extracted from web pages which can be used to generate the link data avaiable for rendering links.
8
- * @module PageData
9
+ * @module page-data
9
10
  * @requires module:urijs
10
11
  */
11
12
  import {default as URI} from 'urijs';
package/src/defaults.mjs CHANGED
@@ -1,20 +1,28 @@
1
1
  /**
2
- * @file The default values used throughout the linkifier classes.
2
+ * @file Central location for the default values used throughout the codebase.
3
3
  * @author Bart Busschots <opensource@bartificer.ie>
4
+ * @license MIT
4
5
  */
5
6
 
6
7
  /**
7
- * This module provides default values for use by the various linkifier functions and classes. These separated out for clarity, helping users decide which values to override or augment.
8
+ * Default values used by the various functions and classes.
9
+ *
10
+ * The defaults are collected here for clarity, helping module users both understand the defaults, and, make informed decisions about which defaults to augment or override completely.
8
11
  * @module defaults
9
- * @requires module:LinkTemplate
10
- * @requires module:utilities
12
+ * @requires link-template
13
+ * @requires utilities
11
14
  */
12
15
  import { LinkTemplate } from './LinkTemplate.class.mjs';
13
16
  import * as utilities from "./utilities.mjs";
14
17
 
15
18
  /**
16
- * The collection of named link templates loaded by the Linkifier constructor.
17
- * @type {Object.<string, LinkTemplate>}
19
+ * The collection of named link templates loaded by the Linkifier constructor. All templates strip UTM parameters from the URL, and regularise white space in the text and descriptions.
20
+ * @type {Object.<string, module:link-template.LinkTemplate>}
21
+ * @property {module:link-template.LinkTemplate} html - The default HTML link template. Uses the link title as a the text and description as the hover-text.
22
+ * @property {module:link-template.LinkTemplate} htmlNewTab - The same as the `html` template, but with a `target="_blank"` attribute added.
23
+ * @property {module:link-template.LinkTemplate} markdown - The default Markdown link template. Uses the link title as the text, and ignores the description.
24
+ * @see {@link module:utilities.stripUTMParameters} for the function used to strip UTM parameters from the URL.
25
+ * @see {@link module:utilities.regulariseWhitespace} for the function used to regularise white space in the text and description.
18
26
  */
19
27
  export const linkTemplates = {
20
28
  html: new LinkTemplate(
@@ -43,8 +51,18 @@ export const linkTemplates = {
43
51
  };
44
52
 
45
53
  /**
46
- * The default list of words with special capitalisations.
54
+ * When conbverting strings to title case, some joiner words should be preserved in all lower case. The Title Case module handles most appropriately, but not all.
55
+ * These are the additional words that also treated as so-called *small words* by the functions in the utility module.
47
56
  * @type {string[]}
57
+ * @see {@link module:utilities.toTitleCase} for the function that uses this list to treat these words as small words by default.
58
+ * @see {@link module:title-case} for the Title Case module who's default small word list is augmented by this list.
59
+ */
60
+ export const smallWords = [ 'is', 'its' ];
61
+
62
+ /**
63
+ * When converting strings to title case, some words need to have their capitalisations corrected. These are the custom capitalisations that will be used by default.
64
+ * @type {string[]}
65
+ * @see {@link module:utilities.toTitleCase} for the function that uses this list to correct capitalisations by default.
48
66
  */
49
67
  export const speciallyCapitalisedWords = [
50
68
  // generic acronyms
@@ -100,4 +118,4 @@ export const speciallyCapitalisedWords = [
100
118
  'DisplayPort',
101
119
  'LinkedIn',
102
120
  'ChatGPT'
103
- ];
121
+ ];