@@ -6,7 +6,7 @@ use tui::{
7use std::sync::Arc;
7use std::sync::Arc;
9−use pulldown_cmark::{CodeBlockKind, CowStr, Event, HeadingLevel, Options, Parser, Tag};
9+use pulldown_cmark::{CodeBlockKind, Event, HeadingLevel, Options, Parser, Tag};
11use helix_core::{
11use helix_core::{
12 syntax::{self, HighlightEvent, Syntax},
12 syntax::{self, HighlightEvent, Syntax},
@@ -59,15 +59,6 @@ impl Markdown {
59 let mut spans = Vec::new();
59 let mut spans = Vec::new();
60 let mut lines = Vec::new();
60 let mut lines = Vec::new();
62− fn to_span(text: pulldown_cmark::CowStr) -> Span {
64− Span::raw::<std::borrow::Cow<_>>(match text {
65− CowStr::Borrowed(s) => s.into(),
66− CowStr::Boxed(s) => s.to_string().into(),
67− CowStr::Inlined(s) => s.deref().to_owned().into(),
71 let get_theme = |keys: &[&str]| match theme {
62 let get_theme = |keys: &[&str]| match theme {
72 Some(theme) => keys
63 Some(theme) => keys
@@ -82,15 +73,28 @@ impl Markdown {
82 .map(|key| get_theme(key))
73 .map(|key| get_theme(key))
83 .collect();
74 .collect();
76+ let mut list_stack = Vec::new();
85 for event in parser {
78 for event in parser {
86 match event {
79 match event {
87− Event::Start(tag) => tags.push(tag),
80+ Event::Start(Tag::List(list)) => list_stack.push(list),
81+ Event::End(Tag::List(_)) => {
84+ Event::Start(Tag::Item) => {
85+ tags.push(Tag::Item);
86+ spans.push(Span::from("- "));
88+ Event::Start(tag) => {
88 Event::End(tag) => {
91 Event::End(tag) => {
89 tags.pop();
92 tags.pop();
90 match tag {
93 match tag {
91 Tag::Heading(_, _, _)
94 Tag::Heading(_, _, _)
92 | Tag::Paragraph
95 | Tag::Paragraph
93− | Tag::CodeBlock(CodeBlockKind::Fenced(_)) => {
96+ | Tag::CodeBlock(CodeBlockKind::Fenced(_))
94 // whenever code block or paragraph closes, new line
98 // whenever code block or paragraph closes, new line
95 let spans = std::mem::take(&mut spans);
99 let spans = std::mem::take(&mut spans);
96 if !spans.is_empty() {
100 if !spans.is_empty() {
@@ -132,8 +136,6 @@ impl Markdown {
132 None => text_style,
136 None => text_style,
135− // TODO: replace tabs with indentation
137 let mut slice = &text[start..end];
139 let mut slice = &text[start..end];
138 // TODO: do we need to handle all unicode line endings
140 // TODO: do we need to handle all unicode line endings
139 // here, or is just '\n' okay?
141 // here, or is just '\n' okay?
@@ -175,27 +177,24 @@ impl Markdown {
175 lines.push(Spans::from(span));
177 lines.push(Spans::from(span));
178− } else if let Some(Tag::Heading(level, _, _)) = tags.last() {
179− let mut span = to_span(text);
180− span.style = match level {
181− HeadingLevel::H1 => heading_styles[0],
182− HeadingLevel::H2 => heading_styles[1],
183− HeadingLevel::H3 => heading_styles[2],
184− HeadingLevel::H4 => heading_styles[3],
185− HeadingLevel::H5 => heading_styles[4],
186− HeadingLevel::H6 => heading_styles[5],
190− let mut span = to_span(text);
181+ let style = if let Some(Tag::Heading(level, ..)) = tags.last() {
183+ HeadingLevel::H1 => heading_styles[0],
184+ HeadingLevel::H2 => heading_styles[1],
185+ HeadingLevel::H3 => heading_styles[2],
186+ HeadingLevel::H4 => heading_styles[3],
187+ HeadingLevel::H5 => heading_styles[4],
188+ HeadingLevel::H6 => heading_styles[5],
191− span.style = text_style;
191+ text_style
192− spans.push(span);
193+ spans.push(Span::styled(text, style));
195 Event::Code(text) | Event::Html(text) => {
196 Event::Code(text) | Event::Html(text) => {
196− let mut span = to_span(text);
197+ spans.push(Span::styled(text, code_style));
197− span.style = code_style;
200 Event::SoftBreak | Event::HardBreak => {
199 Event::SoftBreak | Event::HardBreak => {
201 // let spans = std::mem::replace(&mut spans, Vec::new());
200 // let spans = std::mem::replace(&mut spans, Vec::new());
@@ -203,9 +202,7 @@ impl Markdown {
203 spans.push(Span::raw(" "));
202 spans.push(Span::raw(" "));
205 Event::Rule => {
204 Event::Rule => {
206− let mut span = Span::raw("---");
207− span.style = code_style;
208− lines.push(Spans::from(span));
205+ lines.push(Spans::from(Span::styled("---", code_style)));
209 lines.push(Spans::default());
206 lines.push(Spans::default());
211 // TaskListMarker(bool) true if checked
208 // TaskListMarker(bool) true if checked