mirror of
https://github.com/typst/typst
synced 2025-05-22 13:05:29 +08:00
Let the lexer respect linebreaks within inline raw (#3756)
This commit is contained in:
parent
88b305c3f9
commit
6ca8717305
@ -32,7 +32,7 @@ pub enum SyntaxKind {
|
|||||||
RawLang,
|
RawLang,
|
||||||
/// A raw delimiter consisting of 1 or 3+ backticks: `` ` ``.
|
/// A raw delimiter consisting of 1 or 3+ backticks: `` ` ``.
|
||||||
RawDelim,
|
RawDelim,
|
||||||
/// A sequence of whitespace to ignore in a raw block: ` `.
|
/// A sequence of whitespace to ignore in a raw text: ` `.
|
||||||
RawTrimmed,
|
RawTrimmed,
|
||||||
/// A hyperlink: `https://typst.org`.
|
/// A hyperlink: `https://typst.org`.
|
||||||
Link,
|
Link,
|
||||||
|
@ -275,10 +275,7 @@ impl Lexer<'_> {
|
|||||||
if backticks >= 3 {
|
if backticks >= 3 {
|
||||||
self.blocky_raw(start, end, backticks);
|
self.blocky_raw(start, end, backticks);
|
||||||
} else {
|
} else {
|
||||||
// Single backtick needs no trimming or extra fancyness.
|
self.inline_raw(start, end, backticks);
|
||||||
self.s.jump(end - backticks);
|
|
||||||
self.push_raw(SyntaxKind::Text);
|
|
||||||
self.s.jump(end);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Closing delimiter.
|
// Closing delimiter.
|
||||||
@ -356,6 +353,25 @@ impl Lexer<'_> {
|
|||||||
self.s.jump(end);
|
self.s.jump(end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn inline_raw(&mut self, start: usize, end: usize, backticks: usize) {
|
||||||
|
self.s.jump(start + backticks);
|
||||||
|
|
||||||
|
while self.s.cursor() < end - backticks {
|
||||||
|
if self.s.at(is_newline) {
|
||||||
|
self.push_raw(SyntaxKind::Text);
|
||||||
|
self.s.eat_newline();
|
||||||
|
self.push_raw(SyntaxKind::RawTrimmed);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
self.s.eat();
|
||||||
|
}
|
||||||
|
self.push_raw(SyntaxKind::Text);
|
||||||
|
|
||||||
|
self.s.jump(end);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Push the current cursor that marks the end of a raw segment of
|
||||||
|
/// the given `kind`.
|
||||||
fn push_raw(&mut self, kind: SyntaxKind) {
|
fn push_raw(&mut self, kind: SyntaxKind) {
|
||||||
let end = self.s.cursor();
|
let end = self.s.cursor();
|
||||||
self.raw.push((kind, end));
|
self.raw.push((kind, end));
|
||||||
@ -821,7 +837,7 @@ pub fn link_prefix(text: &str) -> (&str, bool) {
|
|||||||
(s.before(), brackets.is_empty())
|
(s.before(), brackets.is_empty())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Split text at newlines.
|
/// Split text at newlines. These newline characters are not kept.
|
||||||
pub fn split_newlines(text: &str) -> Vec<&str> {
|
pub fn split_newlines(text: &str) -> Vec<&str> {
|
||||||
let mut s = Scanner::new(text);
|
let mut s = Scanner::new(text);
|
||||||
let mut lines = Vec::new();
|
let mut lines = Vec::new();
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 54 KiB |
@ -69,3 +69,18 @@ end
|
|||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
#set page(width: 180pt)
|
||||||
|
#set text(6pt)
|
||||||
|
#set raw(lang:"python")
|
||||||
|
|
||||||
|
Inline raws, multiline e.g. `for i in range(10):
|
||||||
|
# Only this line is a comment.
|
||||||
|
print(i)` or otherwise e.g. `print(j)`, are colored properly.
|
||||||
|
|
||||||
|
Inline raws, multiline e.g. `
|
||||||
|
# Appears blocky due to linebreaks at the boundary.
|
||||||
|
for i in range(10):
|
||||||
|
print(i)
|
||||||
|
` or otherwise e.g. `print(j)`, are colored properly.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user