Fix smart quotes in PDF outline (#3790)

This commit is contained in:
Ana Gelez 2024-03-25 14:32:02 +01:00 committed by GitHub
parent a33d8bf322
commit 2efa86cbdf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 26 additions and 2 deletions

View File

@ -2,7 +2,9 @@ use ecow::EcoString;
use unicode_segmentation::UnicodeSegmentation;
use crate::diag::{bail, StrResult};
use crate::foundations::{array, cast, dict, elem, Array, Dict, FromValue, Smart, Str};
use crate::foundations::{
array, cast, dict, elem, Array, Dict, FromValue, Packed, PlainText, Smart, Str,
};
use crate::layout::Dir;
use crate::syntax::is_newline;
use crate::text::{Lang, Region};
@ -26,7 +28,7 @@ use crate::text::{Lang, Region};
/// # Syntax
/// This function also has dedicated syntax: The normal quote characters
/// (`'` and `"`). Typst automatically makes your quotes smart.
#[elem(name = "smartquote")]
#[elem(name = "smartquote", PlainText)]
pub struct SmartQuoteElem {
/// Whether this should be a double quote.
#[default(true)]
@ -85,6 +87,16 @@ pub struct SmartQuoteElem {
pub quotes: Smart<SmartQuoteDict>,
}
impl PlainText for Packed<SmartQuoteElem> {
fn plain_text(&self, text: &mut EcoString) {
if self.double.unwrap_or(true) {
text.push_str("\"");
} else {
text.push_str("'");
}
}
}
/// State machine for smart quote substitution.
#[derive(Debug, Clone)]
pub struct SmartQuoter {

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,12 @@
// Smart quotes were not appearing in the PDF outline, because they didn't
// implement `PlainText`
// https://github.com/typst/typst/issues/3662
---
= It's "Unnormal Heading"
= Its “Normal Heading”
#set smartquote(enabled: false)
= It's "Unnormal Heading"
= It's 'single quotes'
= Its “Normal Heading”