Improve alignment of text inside raw blocks (#1034)

This commit is contained in:
Pg Biel 2023-05-11 11:32:46 -03:00 committed by GitHub
parent d19a4124de
commit b5ad2468ad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 111 additions and 1 deletions

View File

@ -102,6 +102,27 @@ pub struct RawElem {
/// ```
/// ````
pub lang: Option<EcoString>,
/// The horizontal alignment that each line in a raw block should have.
/// This option is ignored if this is not a raw block (if specified
/// `block: false` or single backticks were used in markup mode).
///
/// By default, this is set to `{start}`, meaning that raw text is
/// aligned towards the start of the text direction inside the block
/// by default, regardless of the current context's alignment (allowing
/// you to center the raw block itself without centering the text inside
/// it, for example).
///
/// ````example
/// #set raw(align: center)
///
/// ```typc
/// let f(x) = x
/// code = "centered"
/// ```
/// ````
#[default(HorizontalAlign(GenAlign::Start))]
pub align: HorizontalAlign,
}
impl RawElem {
@ -180,6 +201,8 @@ impl Show for RawElem {
};
if self.block(styles) {
// Align the text before inserting it into the block.
realized = realized.aligned(Axes::with_x(Some(self.align(styles).into())));
realized = BlockElem::new().with_body(Some(realized)).pack();
}

View File

@ -106,6 +106,18 @@ impl From<Align> for GenAlign {
}
}
impl From<HorizontalAlign> for GenAlign {
fn from(align: HorizontalAlign) -> Self {
align.0
}
}
impl From<VerticalAlign> for GenAlign {
fn from(align: VerticalAlign) -> Self {
align.0
}
}
impl Debug for GenAlign {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
match self {
@ -184,7 +196,45 @@ impl Fold for GenAlign {
}
}
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
/// Utility struct to restrict a passed alignment value to the horizontal axis
/// on cast.
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
pub struct HorizontalAlign(pub GenAlign);
cast_from_value! {
HorizontalAlign,
align: GenAlign => {
if align.axis() != Axis::X {
Err("alignment must be horizontal")?;
}
Self(align)
},
}
cast_to_value! {
v: HorizontalAlign => v.0.into()
}
/// Utility struct to restrict a passed alignment value to the vertical axis on
/// cast.
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
pub struct VerticalAlign(pub GenAlign);
cast_from_value! {
VerticalAlign,
align: GenAlign => {
if align.axis() != Axis::Y {
Err("alignment must be vertical")?;
}
Self(align)
},
}
cast_to_value! {
v: VerticalAlign => v.0.into()
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum LeftRightAlternator {
Left,
Right,

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -0,0 +1,37 @@
// Test the alignment of text inside of raw blocks.
---
// Text inside raw block should be unaffected by outer alignment by default.
#set align(center)
#set page(width: 180pt)
#set text(6pt)
#lorem(20)
```py
def something(x):
return x
a = 342395823859823958329
b = 324923
```
#lorem(20)
---
// Text inside raw block should follow the specified alignment.
#set page(width: 180pt)
#set text(6pt)
#lorem(20)
#align(center, raw(
lang: "typ",
block: true,
align: right,
"#let f(x) = x\n#align(center, line(length: 1em))",
))
#lorem(20)
---
// Error: 17-20 alignment must be horizontal
#set raw(align: top)