text_view: Fix markdown table alignment. (#666)
This commit is contained in:
parent
6a125b391e
commit
ffa848fb26
3 changed files with 51 additions and 5 deletions
|
|
@ -79,11 +79,11 @@ Here is a link to [Google](https://www.google.com), and another to [Rust](https:
|
||||||
|
|
||||||
### Table
|
### Table
|
||||||
|
|
||||||
| Header 1 | Header 2 | Header 3 | Header 4 |
|
| Header 1 | Centered | Header 3 | Align Right |
|
||||||
| -------- | -------- | ------------------------------------ | -------- |
|
| -------- | :------: | ------------------------------------ | ----------: |
|
||||||
| Cell 0 | Cell 1 | This is a long cell with line break. | Cell 3 |
|
| Cell 0 | Cell 1 | This is a long cell with line break. | Cell 3 |
|
||||||
| Row 2 | Row 2 | Row 2<br>[Link](https://github.com) | Row 2 |
|
| Row 2 | Row 2 | Row 2<br>[Link](https://github.com) | Row 2 |
|
||||||
| Row 3 | **Bold** | Row 3 | Row 3 |
|
| Row 3 | **Bold** | Row 3 | Row 3 |
|
||||||
|
|
||||||
#### Lists
|
#### Lists
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ use gpui::{
|
||||||
IntoElement, Length, ObjectFit, ParentElement, RenderOnce, SharedString, SharedUri, Styled,
|
IntoElement, Length, ObjectFit, ParentElement, RenderOnce, SharedString, SharedUri, Styled,
|
||||||
StyledImage as _, StyledText, Window,
|
StyledImage as _, StyledText, Window,
|
||||||
};
|
};
|
||||||
|
use markdown::mdast;
|
||||||
|
|
||||||
use crate::{h_flex, v_flex, ActiveTheme as _, Icon, IconName};
|
use crate::{h_flex, v_flex, ActiveTheme as _, Icon, IconName};
|
||||||
|
|
||||||
|
|
@ -99,6 +100,32 @@ impl From<String> for Paragraph {
|
||||||
#[derive(Debug, Default, Clone, PartialEq)]
|
#[derive(Debug, Default, Clone, PartialEq)]
|
||||||
pub struct Table {
|
pub struct Table {
|
||||||
pub children: Vec<TableRow>,
|
pub children: Vec<TableRow>,
|
||||||
|
pub column_aligns: Vec<TableColumnAlign>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Table {
|
||||||
|
pub(crate) fn column_align(&self, index: usize) -> TableColumnAlign {
|
||||||
|
self.column_aligns.get(index).copied().unwrap_or_default()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Default, Copy, Clone, PartialEq)]
|
||||||
|
pub enum TableColumnAlign {
|
||||||
|
#[default]
|
||||||
|
Left,
|
||||||
|
Center,
|
||||||
|
Right,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<mdast::AlignKind> for TableColumnAlign {
|
||||||
|
fn from(value: mdast::AlignKind) -> Self {
|
||||||
|
match value {
|
||||||
|
mdast::AlignKind::None => TableColumnAlign::Left,
|
||||||
|
mdast::AlignKind::Left => TableColumnAlign::Left,
|
||||||
|
mdast::AlignKind::Center => TableColumnAlign::Center,
|
||||||
|
mdast::AlignKind::Right => TableColumnAlign::Right,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, PartialEq)]
|
#[derive(Debug, Default, Clone, PartialEq)]
|
||||||
|
|
@ -461,6 +488,8 @@ impl Node {
|
||||||
.children({
|
.children({
|
||||||
let mut cells = Vec::with_capacity(row.children.len());
|
let mut cells = Vec::with_capacity(row.children.len());
|
||||||
for (ix, cell) in row.children.iter().enumerate() {
|
for (ix, cell) in row.children.iter().enumerate() {
|
||||||
|
let align = table.column_align(ix);
|
||||||
|
let is_last_col = ix == row.children.len() - 1;
|
||||||
let len = col_lens
|
let len = col_lens
|
||||||
.get(ix)
|
.get(ix)
|
||||||
.copied()
|
.copied()
|
||||||
|
|
@ -470,9 +499,20 @@ impl Node {
|
||||||
cells.push(
|
cells.push(
|
||||||
div()
|
div()
|
||||||
.id("cell")
|
.id("cell")
|
||||||
|
.flex()
|
||||||
|
.when(align == TableColumnAlign::Center, |this| {
|
||||||
|
this.justify_center()
|
||||||
|
})
|
||||||
|
.when(align == TableColumnAlign::Right, |this| {
|
||||||
|
this.justify_end()
|
||||||
|
})
|
||||||
.w(Length::Definite(relative(len as f32)))
|
.w(Length::Definite(relative(len as f32)))
|
||||||
.px_2()
|
.px_2()
|
||||||
.py_1()
|
.py_1()
|
||||||
|
.when(!is_last_col, |this| {
|
||||||
|
this.border_r_1()
|
||||||
|
.border_color(cx.theme().border)
|
||||||
|
})
|
||||||
.truncate()
|
.truncate()
|
||||||
.child(cell.children.clone()),
|
.child(cell.children.clone()),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -437,6 +437,12 @@ impl From<mdast::Node> for element::Node {
|
||||||
Node::ThematicBreak(_) => element::Node::Divider,
|
Node::ThematicBreak(_) => element::Node::Divider,
|
||||||
Node::Table(val) => {
|
Node::Table(val) => {
|
||||||
let mut table = Table::default();
|
let mut table = Table::default();
|
||||||
|
table.column_aligns = val
|
||||||
|
.align
|
||||||
|
.clone()
|
||||||
|
.into_iter()
|
||||||
|
.map(|align| align.into())
|
||||||
|
.collect();
|
||||||
val.children.iter().for_each(|c| {
|
val.children.iter().for_each(|c| {
|
||||||
if let Node::TableRow(row) = c {
|
if let Node::TableRow(row) = c {
|
||||||
parse_table_row(&mut table, row);
|
parse_table_row(&mut table, row);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue