mirror of
https://github.com/typst/typst
synced 2025-06-28 08:12:53 +08:00
Allow shortening locations from 1:x-1:y to x-y 🩳
This commit is contained in:
parent
bcb2c46a10
commit
e3139ed3ee
@ -17,11 +17,11 @@
|
|||||||
,)}
|
,)}
|
||||||
|
|
||||||
// Missing closing paren.
|
// Missing closing paren.
|
||||||
// Error: 1:3-1:3 expected closing paren
|
// Error: 3-3 expected closing paren
|
||||||
{(}
|
{(}
|
||||||
|
|
||||||
// Not an array.
|
// Not an array.
|
||||||
// Error: 1:2-1:3 expected expression, found closing paren
|
// Error: 2-3 expected expression, found closing paren
|
||||||
{)}
|
{)}
|
||||||
|
|
||||||
// Missing comma and bad expression.
|
// Missing comma and bad expression.
|
||||||
@ -30,17 +30,17 @@
|
|||||||
{(1*/2)}
|
{(1*/2)}
|
||||||
|
|
||||||
// Bad expression.
|
// Bad expression.
|
||||||
// Error: 1:6-1:8 expected expression, found invalid token
|
// Error: 6-8 expected expression, found invalid token
|
||||||
{(1, 1u 2)}
|
{(1, 1u 2)}
|
||||||
|
|
||||||
// Leading comma is not an expression.
|
// Leading comma is not an expression.
|
||||||
// Error: 1:3-1:4 expected expression, found comma
|
// Error: 3-4 expected expression, found comma
|
||||||
{(,1)}
|
{(,1)}
|
||||||
|
|
||||||
// Missing expression makes named pair incomplete, making this an empty array.
|
// Missing expression makes named pair incomplete, making this an empty array.
|
||||||
// Error: 1:5-1:5 expected expression
|
// Error: 5-5 expected expression
|
||||||
{(a:)}
|
{(a:)}
|
||||||
|
|
||||||
// Named pair after this is already identified as an array.
|
// Named pair after this is already identified as an array.
|
||||||
// Error: 1:6-1:10 expected expression, found named pair
|
// Error: 6-10 expected expression, found named pair
|
||||||
{(1, b: 2)}
|
{(1, b: 2)}
|
||||||
|
@ -5,13 +5,13 @@
|
|||||||
{1}
|
{1}
|
||||||
|
|
||||||
// Bad expression.
|
// Bad expression.
|
||||||
// Error: 1:2-1:4 expected expression, found invalid token
|
// Error: 2-4 expected expression, found invalid token
|
||||||
{1u}
|
{1u}
|
||||||
|
|
||||||
// Missing closing brace in nested block.
|
// Missing closing brace in nested block.
|
||||||
// Error: 1:5-1:5 expected closing brace
|
// Error: 5-5 expected closing brace
|
||||||
{({1) + 1}
|
{({1) + 1}
|
||||||
|
|
||||||
// Missing closing bracket in template expression.
|
// Missing closing bracket in template expression.
|
||||||
// Error: 1:11-1:11 expected closing bracket
|
// Error: 11-11 expected closing bracket
|
||||||
{[_] + [3_}
|
{[_] + [3_}
|
||||||
|
@ -33,14 +33,14 @@
|
|||||||
#[f|f|f]
|
#[f|f|f]
|
||||||
|
|
||||||
// With body.
|
// With body.
|
||||||
// Error: 1:7-1:8 expected identifier, found integer
|
// Error: 7-8 expected identifier, found integer
|
||||||
#[f | 1 | box][💕]
|
#[f | 1 | box][💕]
|
||||||
|
|
||||||
// Error: 2:3-2:3 expected identifier
|
// Error: 2:3-2:3 expected identifier
|
||||||
// Error: 1:4-1:4 expected identifier
|
// Error: 1:4-1:4 expected identifier
|
||||||
#[||f true]
|
#[||f true]
|
||||||
|
|
||||||
// Error: 1:7-1:7 expected identifier
|
// Error: 7-7 expected identifier
|
||||||
#[f 1|]
|
#[f 1|]
|
||||||
|
|
||||||
// Error: 2:3-2:3 expected identifier
|
// Error: 2:3-2:3 expected identifier
|
||||||
@ -55,23 +55,23 @@
|
|||||||
#[box width: 1cm | image "res/rhino.png"]
|
#[box width: 1cm | image "res/rhino.png"]
|
||||||
|
|
||||||
---
|
---
|
||||||
// Error: 1:5-1:7 expected expression, found end of block comment
|
// Error: 5-7 expected expression, found end of block comment
|
||||||
#[f */]
|
#[f */]
|
||||||
|
|
||||||
// Error: 1:8-1:9 expected expression, found colon
|
// Error: 8-9 expected expression, found colon
|
||||||
#[f a:1:]
|
#[f a:1:]
|
||||||
|
|
||||||
// Error: 1:6-1:6 expected comma
|
// Error: 6-6 expected comma
|
||||||
#[f 1 2]
|
#[f 1 2]
|
||||||
|
|
||||||
// Error: 2:5-2:6 expected identifier
|
// Error: 2:5-2:6 expected identifier
|
||||||
// Error: 1:7-1:7 expected expression
|
// Error: 1:7-1:7 expected expression
|
||||||
#[f 1:]
|
#[f 1:]
|
||||||
|
|
||||||
// Error: 1:5-1:6 expected identifier
|
// Error: 5-6 expected identifier
|
||||||
#[f 1:2]
|
#[f 1:2]
|
||||||
|
|
||||||
// Error: 1:5-1:8 expected identifier
|
// Error: 5-8 expected identifier
|
||||||
#[f (x):1]
|
#[f (x):1]
|
||||||
|
|
||||||
---
|
---
|
||||||
@ -80,7 +80,7 @@
|
|||||||
#let x = "string"
|
#let x = "string"
|
||||||
#[x]
|
#[x]
|
||||||
|
|
||||||
// Error: 1:3-1:4 expected identifier, found invalid token
|
// Error: 3-4 expected identifier, found invalid token
|
||||||
#[# 1]
|
#[# 1]
|
||||||
|
|
||||||
// Error: 4:1-4:1 expected identifier
|
// Error: 4:1-4:1 expected identifier
|
||||||
|
@ -12,7 +12,7 @@ C/*
|
|||||||
, 1]
|
, 1]
|
||||||
|
|
||||||
// End should not appear without start.
|
// End should not appear without start.
|
||||||
// Error: 1:7-1:9 unexpected end of block comment
|
// Error: 7-9 unexpected end of block comment
|
||||||
/* */ */
|
/* */ */
|
||||||
|
|
||||||
// Unterminated is okay.
|
// Unterminated is okay.
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
{(one: 1, two: 2)}
|
{(one: 1, two: 2)}
|
||||||
|
|
||||||
// Simple expression after this is already identified as a dictionary.
|
// Simple expression after this is already identified as a dictionary.
|
||||||
// Error: 1:9-1:10 expected named pair, found expression
|
// Error: 9-10 expected named pair, found expression
|
||||||
{(a: 1, b)}
|
{(a: 1, b)}
|
||||||
|
|
||||||
// Identified as dictionary by initial colon.
|
// Identified as dictionary by initial colon.
|
||||||
|
@ -19,9 +19,9 @@
|
|||||||
\u{41} vs. \\u\{41\}
|
\u{41} vs. \\u\{41\}
|
||||||
|
|
||||||
// Unicode codepoint does not exist.
|
// Unicode codepoint does not exist.
|
||||||
// Error: 1:1-1:11 invalid unicode escape sequence
|
// Error: 1-11 invalid unicode escape sequence
|
||||||
\u{FFFFFF}
|
\u{FFFFFF}
|
||||||
|
|
||||||
// Unterminated.
|
// Unterminated.
|
||||||
// Error: 1:6-1:6 expected closing brace
|
// Error: 6-6 expected closing brace
|
||||||
\u{41*Bold*
|
\u{41*Bold*
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#let a = 2
|
#let a = 2
|
||||||
#let b = 4
|
#let b = 4
|
||||||
|
|
||||||
// Error: 1:14-1:17 cannot apply '+' to string
|
// Error: 14-17 cannot apply '+' to string
|
||||||
#let error = +""
|
#let error = +""
|
||||||
|
|
||||||
// Paren call.
|
// Paren call.
|
||||||
@ -77,16 +77,16 @@
|
|||||||
{ x = "some" } #[test x, "some"]
|
{ x = "some" } #[test x, "some"]
|
||||||
{ x += "thing" } #[test x, "something"]
|
{ x += "thing" } #[test x, "something"]
|
||||||
|
|
||||||
// Error: 1:3-1:4 unknown variable
|
// Error: 3-4 unknown variable
|
||||||
{ z = 1 }
|
{ z = 1 }
|
||||||
|
|
||||||
// Error: 1:3-1:6 cannot assign to this expression
|
// Error: 3-6 cannot assign to this expression
|
||||||
{ (x) = "" }
|
{ (x) = "" }
|
||||||
|
|
||||||
// Error: 1:3-1:8 cannot assign to this expression
|
// Error: 3-8 cannot assign to this expression
|
||||||
{ 1 + 2 = 3}
|
{ 1 + 2 = 3}
|
||||||
|
|
||||||
// Error: 1:3-1:6 cannot assign to a constant
|
// Error: 3-6 cannot assign to a constant
|
||||||
{ box = "hi" }
|
{ box = "hi" }
|
||||||
|
|
||||||
// Works if we define box before (since then it doesn't resolve to the standard
|
// Works if we define box before (since then it doesn't resolve to the standard
|
||||||
@ -98,23 +98,23 @@
|
|||||||
#[test (2), 2]
|
#[test (2), 2]
|
||||||
#[test (1+2)*3, 9]
|
#[test (1+2)*3, 9]
|
||||||
|
|
||||||
// Error: 1:3-1:3 expected expression
|
// Error: 3-3 expected expression
|
||||||
{-}
|
{-}
|
||||||
|
|
||||||
// Error: 1:11-1:11 expected expression
|
// Error: 11-11 expected expression
|
||||||
#[test {1+}, 1]
|
#[test {1+}, 1]
|
||||||
|
|
||||||
// Error: 1:11-1:11 expected expression
|
// Error: 11-11 expected expression
|
||||||
#[test {2*}, 2]
|
#[test {2*}, 2]
|
||||||
|
|
||||||
// Error: 1:8-1:17 cannot apply '-' to boolean
|
// Error: 8-17 cannot apply '-' to boolean
|
||||||
#[test -not true, error]
|
#[test -not true, error]
|
||||||
|
|
||||||
// Error: 1:2-1:8 cannot apply 'not' to array
|
// Error: 2-8 cannot apply 'not' to array
|
||||||
{not ()}
|
{not ()}
|
||||||
|
|
||||||
// Error: 1:3-1:10 cannot apply '+' to integer and string
|
// Error: 3-10 cannot apply '+' to integer and string
|
||||||
{(1 + "2")}
|
{(1 + "2")}
|
||||||
|
|
||||||
// Error: 1:2-1:12 cannot apply '<=' to relative and relative
|
// Error: 2-12 cannot apply '<=' to relative and relative
|
||||||
{30% <= 40%}
|
{30% <= 40%}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
====== Six
|
====== Six
|
||||||
|
|
||||||
// Too many hashtags.
|
// Too many hashtags.
|
||||||
// Warning: 1:1-1:8 should not exceed depth 6
|
// Warning: 1-8 should not exceed depth 6
|
||||||
======= Seven
|
======= Seven
|
||||||
|
|
||||||
---
|
---
|
||||||
|
@ -39,7 +39,7 @@ a#if true {"b"} #else {"?"} c \
|
|||||||
#let x = true
|
#let x = true
|
||||||
|
|
||||||
// Needs condition.
|
// Needs condition.
|
||||||
// Error: 1:6-1:7 expected expression, found closing brace
|
// Error: 6-7 expected expression, found closing brace
|
||||||
a#if }
|
a#if }
|
||||||
|
|
||||||
// Needs if-body.
|
// Needs if-body.
|
||||||
@ -48,17 +48,17 @@ a#if }
|
|||||||
a#if x b#if (x)c
|
a#if x b#if (x)c
|
||||||
|
|
||||||
// Needs else-body.
|
// Needs else-body.
|
||||||
// Error: 1:20-1:20 expected body
|
// Error: 20-20 expected body
|
||||||
a#if true [b] #else c
|
a#if true [b] #else c
|
||||||
|
|
||||||
// Lone else.
|
// Lone else.
|
||||||
// Error: 1:1-1:6 unexpected keyword `#else`
|
// Error: 1-6 unexpected keyword `#else`
|
||||||
#else []
|
#else []
|
||||||
|
|
||||||
// Condition must be boolean. If it isn't, neither branch is evaluated.
|
// Condition must be boolean. If it isn't, neither branch is evaluated.
|
||||||
// Error: 1:5-1:14 expected boolean, found string
|
// Error: 5-14 expected boolean, found string
|
||||||
#if "a" + "b" { "nope" } #else { "nope" }
|
#if "a" + "b" { "nope" } #else { "nope" }
|
||||||
|
|
||||||
// No coercing from empty array or or stuff like that.
|
// No coercing from empty array or or stuff like that.
|
||||||
// Error: 1:5-1:7 expected boolean, found array
|
// Error: 5-7 expected boolean, found array
|
||||||
#if () { "nope" } #else { "nope" }
|
#if () { "nope" } #else { "nope" }
|
||||||
|
@ -21,24 +21,24 @@
|
|||||||
#let x = "a"; #let y = "b"; #[test x + y, "ab"]
|
#let x = "a"; #let y = "b"; #[test x + y, "ab"]
|
||||||
|
|
||||||
// Invalid name.
|
// Invalid name.
|
||||||
// Error: 1:6-1:7 expected identifier, found integer
|
// Error: 6-7 expected identifier, found integer
|
||||||
#let 1
|
#let 1
|
||||||
|
|
||||||
// Invalid name.
|
// Invalid name.
|
||||||
// Error: 1:6-1:7 expected identifier, found integer
|
// Error: 6-7 expected identifier, found integer
|
||||||
#let 1 = 2
|
#let 1 = 2
|
||||||
|
|
||||||
// Missing binding name.
|
// Missing binding name.
|
||||||
// Error: 1:5-1:5 expected identifier
|
// Error: 5-5 expected identifier
|
||||||
#let
|
#let
|
||||||
x = 5
|
x = 5
|
||||||
|
|
||||||
// Missing right-hand side.
|
// Missing right-hand side.
|
||||||
// Error: 1:9-1:9 expected expression
|
// Error: 9-9 expected expression
|
||||||
#let a =
|
#let a =
|
||||||
|
|
||||||
// No name at all.
|
// No name at all.
|
||||||
// Error: 1:11-1:11 expected identifier
|
// Error: 11-11 expected identifier
|
||||||
The Fi#let;rst
|
The Fi#let;rst
|
||||||
|
|
||||||
// Terminated with just a line break.
|
// Terminated with just a line break.
|
||||||
@ -58,9 +58,9 @@ The#let v = "a"; Fourth #[test v, "a"]
|
|||||||
The#let array = (1, 2 + ;Fifth #[test array, (1, 2)]
|
The#let array = (1, 2 + ;Fifth #[test array, (1, 2)]
|
||||||
|
|
||||||
// Not terminated.
|
// Not terminated.
|
||||||
// Error: 1:16-1:16 expected semicolon or line break
|
// Error: 16-16 expected semicolon or line break
|
||||||
The#let v = "a"Sixth #[test v, "a"]
|
The#let v = "a"Sixth #[test v, "a"]
|
||||||
|
|
||||||
// Not terminated.
|
// Not terminated.
|
||||||
// Error: 1:16-1:16 expected semicolon or line break
|
// Error: 16-16 expected semicolon or line break
|
||||||
The#let v = "a" #[test v, "a"] Seventh
|
The#let v = "a" #[test v, "a"] Seventh
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
{ke-bab} \
|
{ke-bab} \
|
||||||
{α} \
|
{α} \
|
||||||
|
|
||||||
// Error: 1:2-1:3 unknown variable
|
// Error: 2-3 unknown variable
|
||||||
{_}
|
{_}
|
||||||
|
|
||||||
// Literal values.
|
// Literal values.
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
// Set stretch (not available, matching closest).
|
// Set stretch (not available, matching closest).
|
||||||
#[font stretch: ultra-condensed][Condensed]
|
#[font stretch: ultra-condensed][Condensed]
|
||||||
|
|
||||||
// Error: 1:8-1:13 unexpected argument
|
// Error: 8-13 unexpected argument
|
||||||
#[font false]
|
#[font false]
|
||||||
|
|
||||||
// Error: 3:15-3:19 expected font style, found font weight
|
// Error: 3:15-3:19 expected font style, found font weight
|
||||||
@ -27,10 +27,10 @@
|
|||||||
// Error: 1:44-1:45 expected font family or array of font families, found integer
|
// Error: 1:44-1:45 expected font family or array of font families, found integer
|
||||||
#[font style: bold, weight: "thin", serif: 0]
|
#[font style: bold, weight: "thin", serif: 0]
|
||||||
|
|
||||||
// Warning: 1:16-1:20 should be between 100 and 900
|
// Warning: 16-20 should be between 100 and 900
|
||||||
#[font weight: 2700]
|
#[font weight: 2700]
|
||||||
|
|
||||||
// Error: 1:8-1:28 unexpected argument
|
// Error: 8-28 unexpected argument
|
||||||
#[font something: "invalid"]
|
#[font something: "invalid"]
|
||||||
|
|
||||||
---
|
---
|
||||||
|
@ -11,7 +11,7 @@ Add #[h 10pt] #[h 10pt] up
|
|||||||
Relative #[h 100%] spacing
|
Relative #[h 100%] spacing
|
||||||
|
|
||||||
// Missing spacing.
|
// Missing spacing.
|
||||||
// Error: 1:12-1:12 missing argument: spacing
|
// Error: 12-12 missing argument: spacing
|
||||||
Totally #[h] ignored
|
Totally #[h] ignored
|
||||||
|
|
||||||
// Swapped axes.
|
// Swapped axes.
|
||||||
|
@ -7,10 +7,10 @@
|
|||||||
// Load an RGB JPEG image.
|
// Load an RGB JPEG image.
|
||||||
#[image "res/tiger.jpg"]
|
#[image "res/tiger.jpg"]
|
||||||
|
|
||||||
// Error: 1:9-1:30 failed to load image
|
// Error: 9-30 failed to load image
|
||||||
#[image "path/does/not/exist"]
|
#[image "path/does/not/exist"]
|
||||||
|
|
||||||
// Error: 1:9-1:30 failed to load image
|
// Error: 9-30 failed to load image
|
||||||
#[image "typ/image-error.typ"]
|
#[image "typ/image-error.typ"]
|
||||||
|
|
||||||
---
|
---
|
||||||
|
@ -21,10 +21,10 @@
|
|||||||
// Ensure that specific margins override general margins.
|
// Ensure that specific margins override general margins.
|
||||||
#[page margins: 0pt, left: 20pt][Overriden]
|
#[page margins: 0pt, left: 20pt][Overriden]
|
||||||
|
|
||||||
// Error: 1:8-1:19 unknown variable
|
// Error: 8-19 unknown variable
|
||||||
#[page nonexistant]
|
#[page nonexistant]
|
||||||
|
|
||||||
// Error: 1:18-1:21 aligned axis
|
// Error: 18-21 aligned axis
|
||||||
#[page main-dir: ltr]
|
#[page main-dir: ltr]
|
||||||
|
|
||||||
// Flipped predefined paper.
|
// Flipped predefined paper.
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
// Warning: 1:12-1:16 should be between 0.0 and 1.0
|
// Warning: 1:12-1:16 should be between 0.0 and 1.0
|
||||||
#[rgb -30, 15.5, 0.5]
|
#[rgb -30, 15.5, 0.5]
|
||||||
|
|
||||||
// Error: 1:7-1:11 missing argument: blue component
|
// Error: 7-11 missing argument: blue component
|
||||||
#[rgb 0, 1]
|
#[rgb 0, 1]
|
||||||
|
|
||||||
// Error: 3:6-3:6 missing argument: red component
|
// Error: 3:6-3:6 missing argument: red component
|
||||||
|
@ -262,7 +262,9 @@ fn parse_metadata(src: &str, map: &LineMap) -> (bool, SpanVec<Diag>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let pos = |s: &mut Scanner| -> Pos {
|
let pos = |s: &mut Scanner| -> Pos {
|
||||||
let (delta, _, column) = (num(s), s.eat_assert(':'), num(s));
|
let first = num(s);
|
||||||
|
let (delta, column) =
|
||||||
|
if s.eat_if(':') { (first, num(s)) } else { (1, first) };
|
||||||
let line = i as u32 + 1 + delta;
|
let line = i as u32 + 1 + delta;
|
||||||
map.pos(Location::new(line, column)).unwrap()
|
map.pos(Location::new(line, column)).unwrap()
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user