UNPKG

osm-community-index

Version:

An index of community resources for OpenStreetMap

8 lines (7 loc) 8.99 kB
{ "version": 3, "sources": ["../../index.mjs", "../../lib/simplify.js", "../../lib/resolve_strings.js"], "sourcesContent": ["export { resolveStrings } from './lib/resolve_strings.js';\nexport { simplify } from './lib/simplify.js';\n", "// External\nimport diacritics from 'diacritics';\n\n// remove spaces, punctuation, diacritics\n// for punction see https://stackoverflow.com/a/21224179\nexport function simplify(str) {\n if (typeof str !== 'string') return '';\n\n return diacritics.remove(\n str\n .replace(/&/g, 'and')\n .replace(/(\u0130|i\u0307)/ig, 'i') // see name-suggestion-index#5017, #8261\n .replace(/[\\s\\-=_!\"#%'*{},.\\/:;?\\(\\)\\[\\]@\\\\$\\^*+<>\u00AB\u00BB~`\u2019\\u00a1\\u00a7\\u00b6\\u00b7\\u00bf\\u037e\\u0387\\u055a-\\u055f\\u0589\\u05c0\\u05c3\\u05c6\\u05f3\\u05f4\\u0609\\u060a\\u060c\\u060d\\u061b\\u061e\\u061f\\u066a-\\u066d\\u06d4\\u0700-\\u070d\\u07f7-\\u07f9\\u0830-\\u083e\\u085e\\u0964\\u0965\\u0970\\u0af0\\u0df4\\u0e4f\\u0e5a\\u0e5b\\u0f04-\\u0f12\\u0f14\\u0f85\\u0fd0-\\u0fd4\\u0fd9\\u0fda\\u104a-\\u104f\\u10fb\\u1360-\\u1368\\u166d\\u166e\\u16eb-\\u16ed\\u1735\\u1736\\u17d4-\\u17d6\\u17d8-\\u17da\\u1800-\\u1805\\u1807-\\u180a\\u1944\\u1945\\u1a1e\\u1a1f\\u1aa0-\\u1aa6\\u1aa8-\\u1aad\\u1b5a-\\u1b60\\u1bfc-\\u1bff\\u1c3b-\\u1c3f\\u1c7e\\u1c7f\\u1cc0-\\u1cc7\\u1cd3\\u2000-\\u206f\\u2cf9-\\u2cfc\\u2cfe\\u2cff\\u2d70\\u2e00-\\u2e7f\\u3001-\\u3003\\u303d\\u30fb\\ua4fe\\ua4ff\\ua60d-\\ua60f\\ua673\\ua67e\\ua6f2-\\ua6f7\\ua874-\\ua877\\ua8ce\\ua8cf\\ua8f8-\\ua8fa\\ua92e\\ua92f\\ua95f\\ua9c1-\\ua9cd\\ua9de\\ua9df\\uaa5c-\\uaa5f\\uaade\\uaadf\\uaaf0\\uaaf1\\uabeb\\ufe10-\\ufe16\\ufe19\\ufe30\\ufe45\\ufe46\\ufe49-\\ufe4c\\ufe50-\\ufe52\\ufe54-\\ufe57\\ufe5f-\\ufe61\\ufe68\\ufe6a\\ufe6b\\ufeff\\uff01-\\uff03\\uff05-\\uff07\\uff0a\\uff0c\\uff0e\\uff0f\\uff1a\\uff1b\\uff1f\\uff20\\uff3c\\uff61\\uff64\\uff65]+/g,'')\n .toLowerCase()\n );\n}\n", "import { simplify } from './simplify.js';\n\n//\n// `resolveStrings`\n// Resolves the text strings for a given community index item\n//\n// Arguments\n// `item`: Object containing the community index item\n// `defaults`: Object containing the community index default strings\n// `localizerFn?`: optional function we will call to do the localization.\n// This function should be like the iD `t()` function that\n// accepts a `stringID` and returns a localized string\n//\n// Returns\n// An Object containing all the resolved strings:\n// {\n// name: 'talk-ru Mailing List',\n// url: 'https://lists.openstreetmap.org/listinfo/talk-ru',\n// signupUrl: 'https://example.url/signup',\n// description: 'A one line description',\n// extendedDescription: 'Extended description',\n// nameHTML: '<a href=\"the url\">the name</a>',\n// urlHTML: '<a href=\"the url\">the url</a>',\n// signupUrlHTML: '<a href=\"the signupUrl\">the signupUrl</a>',\n// descriptionHTML: the description, with urls and signupUrls linkified,\n// extendedDescriptionHTML: the extendedDescription with urls and signupUrls linkified\n// }\n//\nexport function resolveStrings(item, defaults, localizerFn) {\n let itemStrings = Object.assign({}, item.strings); // shallow clone\n let defaultStrings = Object.assign({}, defaults[item.type]); // shallow clone\n const anyToken = new RegExp(/(\\{\\w+\\})/, 'gi');\n\n // Pre-localize the item and default strings\n if (localizerFn) {\n if (itemStrings.community) {\n const communityID = simplify(itemStrings.community);\n itemStrings.community = localizerFn(`_communities.${communityID}`);\n }\n ['name', 'description', 'extendedDescription'].forEach(prop => {\n if (defaultStrings[prop]) defaultStrings[prop] = localizerFn(`_defaults.${item.type}.${prop}`);\n if (itemStrings[prop]) itemStrings[prop] = localizerFn(`${item.id}.${prop}`);\n });\n }\n\n let replacements = {\n account: item.account,\n community: itemStrings.community,\n signupUrl: itemStrings.signupUrl,\n url: itemStrings.url\n };\n\n // Resolve URLs first (which may refer to {account})\n if (!replacements.signupUrl) { replacements.signupUrl = resolve(itemStrings.signupUrl || defaultStrings.signupUrl); }\n if (!replacements.url) { replacements.url = resolve(itemStrings.url || defaultStrings.url); }\n\n let resolved = {\n name: resolve(itemStrings.name || defaultStrings.name),\n url: resolve(itemStrings.url || defaultStrings.url),\n signupUrl: resolve(itemStrings.signupUrl || defaultStrings.signupUrl),\n description: resolve(itemStrings.description || defaultStrings.description),\n extendedDescription: resolve(itemStrings.extendedDescription || defaultStrings.extendedDescription)\n };\n\n // Generate linkified strings\n resolved.nameHTML = linkify(resolved.url, resolved.name);\n resolved.urlHTML = linkify(resolved.url);\n resolved.signupUrlHTML = linkify(resolved.signupUrl);\n resolved.descriptionHTML = resolve((itemStrings.description || defaultStrings.description), true);\n resolved.extendedDescriptionHTML = resolve((itemStrings.extendedDescription || defaultStrings.extendedDescription), true);\n\n return resolved;\n\n\n function resolve(s, addLinks) {\n if (!s) return undefined;\n let result = s;\n\n for (let key in replacements) {\n const token = `{${key}}`;\n const regex = new RegExp(token, 'g');\n if (regex.test(result)) {\n let replacement = replacements[key];\n if (!replacement) {\n throw new Error(`Cannot resolve token: ${token}`);\n } else {\n if (addLinks && (key === 'signupUrl' || key === 'url')) {\n replacement = linkify(replacement);\n }\n result = result.replace(regex, replacement);\n }\n }\n }\n\n // There shouldn't be any leftover tokens in a resolved string\n const leftovers = result.match(anyToken);\n if (leftovers) {\n throw new Error(`Cannot resolve tokens: ${leftovers}`);\n }\n\n // Linkify subreddits like `/r/openstreetmap`\n // https://github.com/osmlab/osm-community-index/issues/82\n // https://github.com/openstreetmap/iD/issues/4997\n if (addLinks && item.type === 'reddit') {\n result = result.replace(/(\\/r\\/\\w+\\/*)/i, match => linkify(resolved.url, match));\n }\n\n return result;\n }\n\n function linkify(url, text) {\n if (!url) return undefined;\n text = text || url;\n return `<a target=\"_blank\" href=\"${url}\">${text}</a>`;\n }\n}\n"], "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,wBAAuB;AAIhB,SAAS,SAAS,KAAK;AAC5B,MAAI,OAAO,QAAQ,SAAU,QAAO;AAEpC,SAAO,kBAAAA,QAAW;AAAA,IAChB,IACG,QAAQ,MAAM,KAAK,EACnB,QAAQ,YAAY,GAAG,EACvB,QAAQ,+hCAA8hC,EAAE,EACxiC,YAAY;AAAA,EACjB;AACF;;;ACaO,SAAS,eAAe,MAAM,UAAU,aAAa;AAC1D,MAAI,cAAc,OAAO,OAAO,CAAC,GAAG,KAAK,OAAO;AAChD,MAAI,iBAAiB,OAAO,OAAO,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC;AAC1D,QAAM,WAAW,IAAI,OAAO,aAAa,IAAI;AAG7C,MAAI,aAAa;AACf,QAAI,YAAY,WAAW;AACzB,YAAM,cAAc,SAAS,YAAY,SAAS;AAClD,kBAAY,YAAY,YAAY,gBAAgB,WAAW,EAAE;AAAA,IACnE;AACA,KAAC,QAAQ,eAAe,qBAAqB,EAAE,QAAQ,UAAQ;AAC7D,UAAI,eAAe,IAAI,EAAI,gBAAe,IAAI,IAAI,YAAY,aAAa,KAAK,IAAI,IAAI,IAAI,EAAE;AAC9F,UAAI,YAAY,IAAI,EAAO,aAAY,IAAI,IAAO,YAAY,GAAG,KAAK,EAAE,IAAI,IAAI,EAAE;AAAA,IACpF,CAAC;AAAA,EACH;AAEA,MAAI,eAAe;AAAA,IACjB,SAAS,KAAK;AAAA,IACd,WAAW,YAAY;AAAA,IACvB,WAAW,YAAY;AAAA,IACvB,KAAK,YAAY;AAAA,EACnB;AAGA,MAAI,CAAC,aAAa,WAAY;AAAE,iBAAa,YAAY,QAAQ,YAAY,aAAa,eAAe,SAAS;AAAA,EAAG;AACrH,MAAI,CAAC,aAAa,KAAY;AAAE,iBAAa,MAAM,QAAQ,YAAY,OAAO,eAAe,GAAG;AAAA,EAAG;AAEnG,MAAI,WAAW;AAAA,IACb,MAAqB,QAAQ,YAAY,QAAQ,eAAe,IAAI;AAAA,IACpE,KAAqB,QAAQ,YAAY,OAAO,eAAe,GAAG;AAAA,IAClE,WAAqB,QAAQ,YAAY,aAAa,eAAe,SAAS;AAAA,IAC9E,aAAqB,QAAQ,YAAY,eAAe,eAAe,WAAW;AAAA,IAClF,qBAAqB,QAAQ,YAAY,uBAAuB,eAAe,mBAAmB;AAAA,EACpG;AAGA,WAAS,WAAW,QAAQ,SAAS,KAAK,SAAS,IAAI;AACvD,WAAS,UAAU,QAAQ,SAAS,GAAG;AACvC,WAAS,gBAAgB,QAAQ,SAAS,SAAS;AACnD,WAAS,kBAAkB,QAAS,YAAY,eAAe,eAAe,aAAc,IAAI;AAChG,WAAS,0BAA0B,QAAS,YAAY,uBAAuB,eAAe,qBAAsB,IAAI;AAExH,SAAO;AAGP,WAAS,QAAQ,GAAG,UAAU;AAC5B,QAAI,CAAC,EAAG,QAAO;AACf,QAAI,SAAS;AAEb,aAAS,OAAO,cAAc;AAC5B,YAAM,QAAQ,IAAI,GAAG;AACrB,YAAM,QAAQ,IAAI,OAAO,OAAO,GAAG;AACnC,UAAI,MAAM,KAAK,MAAM,GAAG;AACtB,YAAI,cAAc,aAAa,GAAG;AAClC,YAAI,CAAC,aAAa;AAChB,gBAAM,IAAI,MAAM,yBAAyB,KAAK,EAAE;AAAA,QAClD,OAAO;AACL,cAAI,aAAa,QAAQ,eAAe,QAAQ,QAAQ;AACtD,0BAAc,QAAQ,WAAW;AAAA,UACnC;AACA,mBAAS,OAAO,QAAQ,OAAO,WAAW;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAGA,UAAM,YAAY,OAAO,MAAM,QAAQ;AACvC,QAAI,WAAW;AACb,YAAM,IAAI,MAAM,0BAA0B,SAAS,EAAE;AAAA,IACvD;AAKA,QAAI,YAAY,KAAK,SAAS,UAAU;AACtC,eAAS,OAAO,QAAQ,kBAAkB,WAAS,QAAQ,SAAS,KAAK,KAAK,CAAC;AAAA,IACjF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ,KAAK,MAAM;AAC1B,QAAI,CAAC,IAAK,QAAO;AACjB,WAAO,QAAQ;AACf,WAAO,4BAA4B,GAAG,KAAK,IAAI;AAAA,EACjD;AACF;", "names": ["diacritics"] }