@wordpress/block-library
Version:
Block library for the WordPress editor.
8 lines (7 loc) • 2.74 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../src/heading/autogenerate-anchors.js"],
"sourcesContent": ["/**\n * External dependencies\n */\nimport removeAccents from 'remove-accents';\n\n/**\n * Object map tracking anchors.\n *\n * @type {Record<string, string | null>}\n */\nconst anchors = {};\n\n/**\n * Returns the text without markup.\n *\n * @param {string} text The text.\n *\n * @return {string} The text without markup.\n */\nconst getTextWithoutMarkup = ( text ) => {\n\tconst dummyElement = document.createElement( 'div' );\n\tdummyElement.innerHTML = text;\n\treturn dummyElement.innerText;\n};\n\n/**\n * Get the slug from the content.\n *\n * @param {string} content The block content.\n *\n * @return {string} Returns the slug.\n */\nconst getSlug = ( content ) => {\n\t// Get the slug.\n\treturn (\n\t\tremoveAccents( getTextWithoutMarkup( content ) )\n\t\t\t// Convert anything that's not a letter or number to a hyphen.\n\t\t\t.replace( /[^\\p{L}\\p{N}]+/gu, '-' )\n\t\t\t// Convert to lowercase\n\t\t\t.toLowerCase()\n\t\t\t// Remove any remaining leading or trailing hyphens.\n\t\t\t.replace( /(^-+)|(-+$)/g, '' )\n\t);\n};\n\n/**\n * Generate the anchor for a heading.\n *\n * @param {string} clientId The block ID.\n * @param {string} content The block content.\n *\n * @return {string|null} Return the heading anchor.\n */\nexport const generateAnchor = ( clientId, content ) => {\n\tconst slug = getSlug( content );\n\t// If slug is empty, then return null.\n\t// Returning null instead of an empty string allows us to check again when the content changes.\n\tif ( '' === slug ) {\n\t\treturn null;\n\t}\n\n\tdelete anchors[ clientId ];\n\n\tlet anchor = slug;\n\tlet i = 0;\n\n\t// If the anchor already exists in another heading, append -i.\n\twhile ( Object.values( anchors ).includes( anchor ) ) {\n\t\ti += 1;\n\t\tanchor = slug + '-' + i;\n\t}\n\n\treturn anchor;\n};\n\n/**\n * Set the anchor for a heading.\n *\n * @param {string} clientId The block ID.\n * @param {string|null} anchor The block anchor.\n */\nexport const setAnchor = ( clientId, anchor ) => {\n\tanchors[ clientId ] = anchor;\n};\n"],
"mappings": ";AAGA,OAAO,mBAAmB;AAO1B,IAAM,UAAU,CAAC;AASjB,IAAM,uBAAuB,CAAE,SAAU;AACxC,QAAM,eAAe,SAAS,cAAe,KAAM;AACnD,eAAa,YAAY;AACzB,SAAO,aAAa;AACrB;AASA,IAAM,UAAU,CAAE,YAAa;AAE9B,SACC,cAAe,qBAAsB,OAAQ,CAAE,EAE7C,QAAS,oBAAoB,GAAI,EAEjC,YAAY,EAEZ,QAAS,gBAAgB,EAAG;AAEhC;AAUO,IAAM,iBAAiB,CAAE,UAAU,YAAa;AACtD,QAAM,OAAO,QAAS,OAAQ;AAG9B,MAAK,OAAO,MAAO;AAClB,WAAO;AAAA,EACR;AAEA,SAAO,QAAS,QAAS;AAEzB,MAAI,SAAS;AACb,MAAI,IAAI;AAGR,SAAQ,OAAO,OAAQ,OAAQ,EAAE,SAAU,MAAO,GAAI;AACrD,SAAK;AACL,aAAS,OAAO,MAAM;AAAA,EACvB;AAEA,SAAO;AACR;AAQO,IAAM,YAAY,CAAE,UAAU,WAAY;AAChD,UAAS,QAAS,IAAI;AACvB;",
"names": []
}