Skip to repository content

tenant.openagents/omega

No repository description is available.

OpenAgents Git authority 2026-07-28T04:14:12.559Z Public web read
NIP-34 coordinate30617:7649603503856e5148d571eac2766b288a8ff1e9e35d380337a1d2b0015b4f92:omega
MaintainersHidden in public view
References2 branches · 1 tag
Read-only clonegit clone https://openagents.com/git/tenant.openagents/omega.git
Browse files

markdown_renderer.rs

349 lines · 10.0 KB · rust
1use benchmarks::bench_utils::random_rust_file;
2use gpui::{
3    AppContext as _, BenchAppContext, Context, Entity, IntoElement, Render, SharedString, Window,
4};
5use language::LanguageRegistry;
6use markdown::{
7    CodeBlockRenderer, CopyButtonVisibility, Markdown, MarkdownElement, MarkdownFont,
8    MarkdownOptions, MarkdownStyle, WrapButtonVisibility,
9};
10use rand::{Rng as _, SeedableRng as _, rngs::StdRng};
11use settings::SettingsStore;
12use std::sync::Arc;
13use ui::prelude::*;
14
15const SEED: u64 = 1;
16
17#[gpui::bench(
18    inputs = markdown_sizes(),
19    group = "Markdown render",
20    input_name = "min_bytes",
21    sample_size = 10
22)]
23fn markdown_render(target_size: &usize, cx: &mut BenchAppContext) {
24    init_context(cx);
25
26    let source = SharedString::from(generate_markdown(SEED, *target_size));
27    let language_registry = markdown_language_registry(cx);
28
29    let mut window = cx.add_empty_window();
30    let view = window.update(|window, cx| {
31        let markdown = cx.new({
32            let source = source.clone();
33            let language_registry = language_registry.clone();
34            move |cx| build_markdown(source, language_registry, cx)
35        });
36        window.replace_root(cx, |_window, _cx| MarkdownBenchView { markdown })
37    });
38
39    cx.bench_renderer(view, |_, _, cx| cx.notify());
40}
41
42struct MarkdownBenchView {
43    markdown: Entity<Markdown>,
44}
45
46impl Render for MarkdownBenchView {
47    fn render(&mut self, window: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
48        let style = MarkdownStyle::themed(MarkdownFont::Preview, window, cx);
49
50        div().w_full().h_full().child(
51            MarkdownElement::new(self.markdown.clone(), style).code_block_renderer(
52                CodeBlockRenderer::Default {
53                    copy_button_visibility: CopyButtonVisibility::VisibleOnHover,
54                    wrap_button_visibility: WrapButtonVisibility::VisibleOnHover,
55                    border: false,
56                },
57            ),
58        )
59    }
60}
61
62fn build_markdown(
63    source: SharedString,
64    language_registry: Arc<LanguageRegistry>,
65    cx: &mut Context<Markdown>,
66) -> Markdown {
67    Markdown::new_with_options(
68        source,
69        Some(language_registry),
70        None,
71        MarkdownOptions {
72            // Mermaid and embedded resources need their own focused benchmarks.
73            render_metadata_blocks: true,
74            ..Default::default()
75        },
76        cx,
77    )
78}
79
80fn generate_markdown(seed: u64, target_size: usize) -> String {
81    let mut rng = StdRng::seed_from_u64(seed);
82    let mut markdown = String::with_capacity(target_size);
83
84    markdown.push_str("---\n");
85    markdown.push_str("title: Markdown renderer benchmark\n");
86    markdown.push_str("author: Zed benchmark\n");
87    markdown.push_str("---\n\n");
88
89    while markdown.len() < target_size {
90        push_mixed_block(&mut markdown, &mut rng);
91    }
92
93    markdown
94}
95
96fn push_mixed_block(markdown: &mut String, rng: &mut StdRng) {
97    match rng.random_range(0..10) {
98        0 => push_heading(markdown, rng),
99        1 | 2 => push_paragraph(markdown, rng),
100        3 => push_list(markdown, rng),
101        4 => push_task_list(markdown, rng),
102        5 => push_table(markdown, rng),
103        6 | 7 => push_code_block(markdown, rng),
104        8 => push_block_quote(markdown, rng),
105        _ => push_rule(markdown),
106    }
107}
108
109fn push_heading(markdown: &mut String, rng: &mut StdRng) {
110    let level = rng.random_range(1..=4);
111    markdown.push_str(&"#".repeat(level));
112    markdown.push(' ');
113    let word_count = rng.random_range(3..8);
114    push_words(markdown, rng, word_count);
115    markdown.push_str("\n\n");
116}
117
118fn push_paragraph(markdown: &mut String, rng: &mut StdRng) {
119    let sentence_count = rng.random_range(2..7);
120    for sentence_index in 0..sentence_count {
121        if sentence_index > 0 {
122            markdown.push(' ');
123        }
124        push_sentence(markdown, rng);
125    }
126    markdown.push_str("\n\n");
127}
128
129fn push_sentence(markdown: &mut String, rng: &mut StdRng) {
130    let word_count = rng.random_range(8..24);
131    for word_index in 0..word_count {
132        if word_index > 0 {
133            markdown.push(' ');
134        }
135
136        match rng.random_range(0..18) {
137            0 => {
138                markdown.push_str("**");
139                markdown.push_str(random_word(rng));
140                markdown.push_str("**");
141            }
142            1 => {
143                markdown.push('*');
144                markdown.push_str(random_word(rng));
145                markdown.push('*');
146            }
147            2 => {
148                markdown.push('`');
149                markdown.push_str(random_identifier(rng));
150                markdown.push('`');
151            }
152            3 => {
153                markdown.push('[');
154                markdown.push_str(random_word(rng));
155                markdown.push_str("](https://example.com/");
156                markdown.push_str(random_identifier(rng));
157                markdown.push(')');
158            }
159            4 => {
160                markdown.push_str("https://zed.dev/");
161                markdown.push_str(random_identifier(rng));
162            }
163            _ => markdown.push_str(random_word(rng)),
164        }
165    }
166    markdown.push('.');
167}
168
169fn push_list(markdown: &mut String, rng: &mut StdRng) {
170    let item_count = rng.random_range(3..9);
171    let ordered = rng.random();
172    for item_index in 0..item_count {
173        if ordered {
174            markdown.push_str(&(item_index + 1).to_string());
175            markdown.push_str(". ");
176        } else {
177            markdown.push_str("- ");
178        }
179        let word_count = rng.random_range(5..14);
180        push_words(markdown, rng, word_count);
181        markdown.push('\n');
182    }
183    markdown.push('\n');
184}
185
186fn push_task_list(markdown: &mut String, rng: &mut StdRng) {
187    let item_count = rng.random_range(3..8);
188    for _ in 0..item_count {
189        if rng.random() {
190            markdown.push_str("- [x] ");
191        } else {
192            markdown.push_str("- [ ] ");
193        }
194        let word_count = rng.random_range(4..12);
195        push_words(markdown, rng, word_count);
196        markdown.push('\n');
197    }
198    markdown.push('\n');
199}
200
201fn push_table(markdown: &mut String, rng: &mut StdRng) {
202    let column_count = rng.random_range(3..7);
203    let row_count = rng.random_range(3..9);
204
205    for column_index in 0..column_count {
206        if column_index == 0 {
207            markdown.push('|');
208        }
209        markdown.push(' ');
210        markdown.push_str(random_word(rng));
211        markdown.push(' ');
212        markdown.push('|');
213    }
214    markdown.push('\n');
215
216    for column_index in 0..column_count {
217        if column_index == 0 {
218            markdown.push('|');
219        }
220        markdown.push_str(" --- |");
221    }
222    markdown.push('\n');
223
224    for _ in 0..row_count {
225        for column_index in 0..column_count {
226            if column_index == 0 {
227                markdown.push('|');
228            }
229            markdown.push(' ');
230            let word_count = rng.random_range(2..6);
231            push_words(markdown, rng, word_count);
232            markdown.push(' ');
233            markdown.push('|');
234        }
235        markdown.push('\n');
236    }
237    markdown.push('\n');
238}
239
240fn push_code_block(markdown: &mut String, rng: &mut StdRng) {
241    let line_count = rng.random_range(24..80);
242    let rust = random_rust_file(rng, line_count);
243    markdown.push_str("```rust\n");
244    markdown.push_str(&rust.join("\n"));
245    markdown.push_str("\n```\n\n");
246}
247
248fn push_block_quote(markdown: &mut String, rng: &mut StdRng) {
249    let line_count = rng.random_range(2..6);
250    for _ in 0..line_count {
251        markdown.push_str("> ");
252        push_sentence(markdown, rng);
253        markdown.push('\n');
254    }
255    markdown.push('\n');
256}
257
258fn push_rule(markdown: &mut String) {
259    markdown.push_str("---\n\n");
260}
261
262fn push_words(markdown: &mut String, rng: &mut StdRng, word_count: usize) {
263    for word_index in 0..word_count {
264        if word_index > 0 {
265            markdown.push(' ');
266        }
267        markdown.push_str(random_word(rng));
268    }
269}
270
271fn random_word(rng: &mut StdRng) -> &'static str {
272    const WORDS: &[&str] = &[
273        "renderer",
274        "layout",
275        "markdown",
276        "paragraph",
277        "heading",
278        "table",
279        "selection",
280        "syntax",
281        "highlight",
282        "window",
283        "element",
284        "callback",
285        "benchmark",
286        "profile",
287        "latency",
288        "throughput",
289        "scroll",
290        "wrapping",
291        "theme",
292        "language",
293        "fenced",
294        "blockquote",
295        "inline",
296        "content",
297    ];
298    choose(rng, WORDS)
299}
300
301fn random_identifier(rng: &mut StdRng) -> &'static str {
302    const IDENTIFIERS: &[&str] = &[
303        "markdown_renderer",
304        "layout_cache",
305        "rendered_text",
306        "source_range",
307        "bench_input",
308        "window_state",
309        "code_block",
310        "table_row",
311        "link_target",
312        "scroll_handle",
313        "text_style",
314        "root_block",
315    ];
316    choose(rng, IDENTIFIERS)
317}
318
319fn choose(rng: &mut StdRng, items: &'static [&'static str]) -> &'static str {
320    let index = rng.random_range(0..items.len());
321    items.get(index).copied().unwrap_or("markdown")
322}
323
324fn markdown_language_registry(cx: &BenchAppContext) -> Arc<LanguageRegistry> {
325    let registry = Arc::new(LanguageRegistry::test(cx.background_executor().clone()));
326    registry.add(language::rust_lang());
327    registry
328}
329
330fn init_context(cx: &mut BenchAppContext) {
331    cx.update(|cx| {
332        let store = SettingsStore::test(cx);
333        cx.set_global(store);
334        assets::Assets.load_test_fonts(cx);
335        theme_settings::init(theme::LoadThemes::JustBase, cx);
336    });
337}
338
339fn markdown_sizes() -> Vec<usize> {
340    let mut sizes = vec![5_000, 10_000, 50_000, 250_000];
341    if std::env::var("ZED_BENCH_HUGE").is_ok() {
342        sizes.push(1_000_000);
343    }
344    sizes
345}
346
347gpui::bench_group!(benches, markdown_render);
348gpui::bench_main!(benches);
349
Served at tenant.openagents/omega Member data and write actions are omitted.