mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	markdown: Eliminate setup() call.
It has always been pretty arbitrary what we did inside of setup() vs. parse(), and we want to avoid unpredictable results from other platforms neglecting to call setup(). On my machine you can parse a simple message in about 25 microseconds, based on a trial of a million messages with the content of "**bold**". Whatever portion of that time is related to setup-related things like compiling regexes should be negligible from the user's perspective, since we never run parse() in a loop.
This commit is contained in:
		@@ -152,17 +152,12 @@ function assert_parse(raw_content, expected_content) {
 | 
				
			|||||||
    assert.equal(content, expected_content);
 | 
					    assert.equal(content, expected_content);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function test(label, f) {
 | 
					run_test("basics", () => {
 | 
				
			||||||
    markdown.setup();
 | 
					 | 
				
			||||||
    run_test(label, f);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
test("basics", () => {
 | 
					 | 
				
			||||||
    assert_parse("boring", "<p>boring</p>");
 | 
					    assert_parse("boring", "<p>boring</p>");
 | 
				
			||||||
    assert_parse("**bold**", "<p><strong>bold</strong></p>");
 | 
					    assert_parse("**bold**", "<p><strong>bold</strong></p>");
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test("user mentions", () => {
 | 
					run_test("user mentions", () => {
 | 
				
			||||||
    assert_parse("@**greg**", '<p><span class="user-mention" data-user-id="105">@greg</span></p>');
 | 
					    assert_parse("@**greg**", '<p><span class="user-mention" data-user-id="105">@greg</span></p>');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert_parse("@**|105**", '<p><span class="user-mention" data-user-id="105">@greg</span></p>');
 | 
					    assert_parse("@**|105**", '<p><span class="user-mention" data-user-id="105">@greg</span></p>');
 | 
				
			||||||
@@ -178,14 +173,14 @@ test("user mentions", () => {
 | 
				
			|||||||
    );
 | 
					    );
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test("user group mentions", () => {
 | 
					run_test("user group mentions", () => {
 | 
				
			||||||
    assert_parse(
 | 
					    assert_parse(
 | 
				
			||||||
        "@*Staff*",
 | 
					        "@*Staff*",
 | 
				
			||||||
        '<p><span class="user-group-mention" data-user-group-id="201">@Staff</span></p>',
 | 
					        '<p><span class="user-group-mention" data-user-group-id="201">@Staff</span></p>',
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test("stream links", () => {
 | 
					run_test("stream links", () => {
 | 
				
			||||||
    assert_parse(
 | 
					    assert_parse(
 | 
				
			||||||
        "#**social**",
 | 
					        "#**social**",
 | 
				
			||||||
        '<p><a class="stream" data-stream-id="301" href="/stream-301">#social</a></p>',
 | 
					        '<p><a class="stream" data-stream-id="301" href="/stream-301">#social</a></p>',
 | 
				
			||||||
@@ -197,7 +192,7 @@ test("stream links", () => {
 | 
				
			|||||||
    );
 | 
					    );
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test("emojis", () => {
 | 
					run_test("emojis", () => {
 | 
				
			||||||
    assert_parse(
 | 
					    assert_parse(
 | 
				
			||||||
        "yup :)",
 | 
					        "yup :)",
 | 
				
			||||||
        '<p>yup <span aria-label="smile" class="emoji emoji-1f642" role="img" title="smile">:smile:</span></p>',
 | 
					        '<p>yup <span aria-label="smile" class="emoji emoji-1f642" role="img" title="smile">:smile:</span></p>',
 | 
				
			||||||
@@ -212,14 +207,14 @@ test("emojis", () => {
 | 
				
			|||||||
    );
 | 
					    );
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test("linkifiers", () => {
 | 
					run_test("linkifiers", () => {
 | 
				
			||||||
    assert_parse(
 | 
					    assert_parse(
 | 
				
			||||||
        "see #foo12345 for details",
 | 
					        "see #foo12345 for details",
 | 
				
			||||||
        '<p>see <a href="http://foo.com/12345" title="http://foo.com/12345">#foo12345</a> for details</p>',
 | 
					        '<p>see <a href="http://foo.com/12345" title="http://foo.com/12345">#foo12345</a> for details</p>',
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test("topic links", () => {
 | 
					run_test("topic links", () => {
 | 
				
			||||||
    const topic = "progress on #foo101 and #foo102";
 | 
					    const topic = "progress on #foo101 and #foo102";
 | 
				
			||||||
    const topic_links = markdown.get_topic_links({topic, get_linkifier_map});
 | 
					    const topic_links = markdown.get_topic_links({topic, get_linkifier_map});
 | 
				
			||||||
    assert.deepEqual(topic_links, [
 | 
					    assert.deepEqual(topic_links, [
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -453,10 +453,7 @@ export function get_linkifier_regexes() {
 | 
				
			|||||||
    return Array.from(helpers.get_linkifier_map().keys());
 | 
					    return Array.from(helpers.get_linkifier_map().keys());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function setup() {
 | 
					export function parse({raw_content, helper_config}) {
 | 
				
			||||||
    // Once we focus on supporting other platforms such as mobile,
 | 
					 | 
				
			||||||
    // we will export this function.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    function disable_markdown_regex(rules, name) {
 | 
					    function disable_markdown_regex(rules, name) {
 | 
				
			||||||
        rules[name] = {
 | 
					        rules[name] = {
 | 
				
			||||||
            exec() {
 | 
					            exec() {
 | 
				
			||||||
@@ -486,7 +483,7 @@ export function setup() {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function preprocess_translate_emoticons(src) {
 | 
					    function preprocess_translate_emoticons(src) {
 | 
				
			||||||
        if (!helpers.should_translate_emoticons()) {
 | 
					        if (!helper_config.should_translate_emoticons()) {
 | 
				
			||||||
            return src;
 | 
					            return src;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -517,21 +514,6 @@ export function setup() {
 | 
				
			|||||||
    // HTML into the output. This generated HTML is safe to not escape
 | 
					    // HTML into the output. This generated HTML is safe to not escape
 | 
				
			||||||
    fenced_code.set_stash_func((html) => marked.stashHtml(html, true));
 | 
					    fenced_code.set_stash_func((html) => marked.stashHtml(html, true));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    marked.setOptions({
 | 
					 | 
				
			||||||
        gfm: true,
 | 
					 | 
				
			||||||
        tables: true,
 | 
					 | 
				
			||||||
        breaks: true,
 | 
					 | 
				
			||||||
        pedantic: false,
 | 
					 | 
				
			||||||
        sanitize: true,
 | 
					 | 
				
			||||||
        smartLists: true,
 | 
					 | 
				
			||||||
        smartypants: false,
 | 
					 | 
				
			||||||
        zulip: true,
 | 
					 | 
				
			||||||
        renderer: r,
 | 
					 | 
				
			||||||
        preprocessors: [preprocess_code_blocks, preprocess_translate_emoticons],
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export function parse({raw_content, helper_config}) {
 | 
					 | 
				
			||||||
    function streamHandler(stream_name) {
 | 
					    function streamHandler(stream_name) {
 | 
				
			||||||
        return handleStream({
 | 
					        return handleStream({
 | 
				
			||||||
            stream_name,
 | 
					            stream_name,
 | 
				
			||||||
@@ -581,6 +563,16 @@ export function parse({raw_content, helper_config}) {
 | 
				
			|||||||
        streamTopicHandler,
 | 
					        streamTopicHandler,
 | 
				
			||||||
        texHandler: handleTex,
 | 
					        texHandler: handleTex,
 | 
				
			||||||
        timestampHandler: handleTimestamp,
 | 
					        timestampHandler: handleTimestamp,
 | 
				
			||||||
 | 
					        gfm: true,
 | 
				
			||||||
 | 
					        tables: true,
 | 
				
			||||||
 | 
					        breaks: true,
 | 
				
			||||||
 | 
					        pedantic: false,
 | 
				
			||||||
 | 
					        sanitize: true,
 | 
				
			||||||
 | 
					        smartLists: true,
 | 
				
			||||||
 | 
					        smartypants: false,
 | 
				
			||||||
 | 
					        zulip: true,
 | 
				
			||||||
 | 
					        renderer: r,
 | 
				
			||||||
 | 
					        preprocessors: [preprocess_code_blocks, preprocess_translate_emoticons],
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return parse_with_options({raw_content, helper_config, options});
 | 
					    return parse_with_options({raw_content, helper_config, options});
 | 
				
			||||||
@@ -598,7 +590,6 @@ export function initialize(helper_config) {
 | 
				
			|||||||
    // other platforms should call setup().
 | 
					    // other platforms should call setup().
 | 
				
			||||||
    webapp_helpers = helper_config;
 | 
					    webapp_helpers = helper_config;
 | 
				
			||||||
    helpers = helper_config;
 | 
					    helpers = helper_config;
 | 
				
			||||||
    setup();
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function apply_markdown(message) {
 | 
					export function apply_markdown(message) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user