"use strict"; const assert = require("node:assert/strict"); const url_template_lib = require("url-template"); const {zrequire} = require("./lib/namespace.cjs"); const {run_test} = require("./lib/test.cjs"); const markdown = zrequire("markdown"); const linkifiers = zrequire("linkifiers"); const my_id = 101; const user_map = new Map(); user_map.set(my_id, "Me Myself"); user_map.set(105, "greg"); function get_actual_name_from_user_id(user_id) { return user_map.get(user_id); } function get_user_id_from_name(name) { for (const [user_id, _name] of user_map.entries()) { if (name === _name) { return user_id; } } /* istanbul ignore next */ throw new Error(`unexpected name ${name}`); } function is_valid_full_name_and_user_id(name, user_id) { return user_map.has(user_id) && user_map.get(user_id) === name; } function my_user_id() { return my_id; } function is_valid_user_id(user_id) { return user_map.has(user_id); } const staff_group = { id: 201, name: "Staff", }; const user_group_map = new Map(); user_group_map.set(staff_group.name, staff_group); function get_user_group_from_name(name) { return user_group_map.get(name); } function is_member_of_user_group(user_id, user_group_id) { assert.equal(user_group_id, staff_group.id); assert.equal(user_id, my_id); return true; } const social = { stream_id: 301, name: "social", }; const sub_map = new Map(); sub_map.set(social.name, social); function get_stream_by_name(name) { return sub_map.get(name); } function stream_hash(stream_id) { return `stream-${stream_id}`; } function stream_topic_hash(stream_id, topic) { return `stream-${stream_id}-topic-${topic}`; } function get_emoticon_translations() { return [ {regex: /(:\))/g, replacement_text: ":smile:"}, {regex: /(<3)/g, replacement_text: ":heart:"}, ]; } const emoji_map = new Map(); emoji_map.set("smile", "1f642"); emoji_map.set("alien", "1f47d"); function get_emoji_codepoint(emoji_name) { return emoji_map.get(emoji_name); } function get_emoji_name(codepoint) { for (const [emoji_name, _codepoint] of emoji_map.entries()) { if (codepoint === _codepoint) { return emoji_name; } } /* istanbul ignore next */ throw new Error(`unexpected codepoint ${codepoint}`); } const realm_emoji_map = new Map(); realm_emoji_map.set("heart", "/images/emoji/heart.bmp"); function get_realm_emoji_url(emoji_name) { return realm_emoji_map.get(emoji_name); } const regex = /#foo(\d+)(?!\w)/g; const linkifier_map = new Map(); linkifier_map.set(regex, { url_template: url_template_lib.parse("http://foo.com/{id}"), group_number_to_name: {1: "id"}, }); function get_linkifier_map() { return linkifier_map; } const helper_config = { // user stuff get_actual_name_from_user_id, get_user_id_from_name, is_valid_full_name_and_user_id, is_valid_user_id, my_user_id, // user groups get_user_group_from_name, is_member_of_user_group, // stream hashes get_stream_by_name, stream_hash, stream_topic_hash, // settings should_translate_emoticons: () => true, // emojis get_emoji_codepoint, get_emoji_name, get_emoticon_translations, get_realm_emoji_url, // linkifiers get_linkifier_map, }; function assert_parse(raw_content, expected_content) { const {content} = markdown.parse({raw_content, helper_config}); assert.equal(content, expected_content); } run_test("basics", () => { assert_parse("boring", "
boring
"); assert_parse("**bold**", "bold
"); }); run_test("user mentions", () => { assert_parse("@**greg**", '@greg
'); assert_parse("@**|105**", '@greg
'); assert_parse( "@**greg|105**", '@greg
', ); assert_parse( "@**Me Myself|101**", '@Me Myself
', ); }); run_test("user group mentions", () => { assert_parse( "@*Staff*", '@Staff
', ); }); run_test("stream links", () => { assert_parse( "#**social**", '', ); assert_parse( "#**social>lunch**", '', ); }); run_test("emojis", () => { assert_parse( "yup :)", 'yup :smile:
', ); assert_parse( "I <3 JavaScript", 'I JavaScript
', ); assert_parse( "Mars Attacks! \uD83D\uDC7D", 'Mars Attacks! :alien:
', ); }); run_test("linkifiers", () => { assert_parse( "see #foo12345 for details", 'see #foo12345 for details
', ); }); function assert_topic_links(topic, expected_links) { const topic_links = markdown.get_topic_links(topic); assert.deepEqual(topic_links, expected_links); } run_test("topic links", () => { linkifiers.initialize([{pattern: "#foo(?P