summaryrefslogtreecommitdiff
path: root/node_modules/marked/src/Slugger.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/marked/src/Slugger.js')
-rw-r--r--node_modules/marked/src/Slugger.js55
1 files changed, 55 insertions, 0 deletions
diff --git a/node_modules/marked/src/Slugger.js b/node_modules/marked/src/Slugger.js
new file mode 100644
index 0000000..a0b68f5
--- /dev/null
+++ b/node_modules/marked/src/Slugger.js
@@ -0,0 +1,55 @@
+/**
+ * Slugger generates header id
+ */
+export class Slugger {
+ constructor() {
+ this.seen = {};
+ }
+
+ /**
+ * @param {string} value
+ */
+ serialize(value) {
+ return value
+ .toLowerCase()
+ .trim()
+ // remove html tags
+ .replace(/<[!\/a-z].*?>/ig, '')
+ // remove unwanted chars
+ .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '')
+ .replace(/\s/g, '-');
+ }
+
+ /**
+ * Finds the next safe (unique) slug to use
+ * @param {string} originalSlug
+ * @param {boolean} isDryRun
+ */
+ getNextSafeSlug(originalSlug, isDryRun) {
+ let slug = originalSlug;
+ let occurenceAccumulator = 0;
+ if (this.seen.hasOwnProperty(slug)) {
+ occurenceAccumulator = this.seen[originalSlug];
+ do {
+ occurenceAccumulator++;
+ slug = originalSlug + '-' + occurenceAccumulator;
+ } while (this.seen.hasOwnProperty(slug));
+ }
+ if (!isDryRun) {
+ this.seen[originalSlug] = occurenceAccumulator;
+ this.seen[slug] = 0;
+ }
+ return slug;
+ }
+
+ /**
+ * Convert string to unique id
+ * @param {object} [options]
+ * @param {boolean} [options.dryrun] Generates the next unique slug without
+ * updating the internal accumulator.
+ */
+ slug(value, options = {}) {
+ const slug = this.serialize(value);
+ return this.getNextSafeSlug(slug, options.dryrun);
+ }
+}