mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-11-08 13:00:16 +00:00
.ai import: graphs open as their drawn art, with a note
A graph in a legacy .ai, or in a current file's editing data, is written as `%_Gs`, its data and settings on `%_` lines, its drawn art in a group with a `%_... Go` tag after each object, and `%_GS`. The reader stopped on the graph operators as ones it doesn't know, so such a file did not open through its layers. The reader now leaves the graph's records out with their operands and reads the drawn art as usual: the bars, lines and labels come in as the groups, paths and type they are written as. Paint operators on `%_` lines between `Gt` and `GT` set nothing. One note per file says the graphs came in as plain art without their data or settings. A graph that starts inside another, or doesn't end before its layer does, keeps the art read so far with a second note. Graph operators outside a graph stay unknown.
This commit is contained in:
@@ -5248,3 +5248,42 @@ proptest! {
|
||||
survive("mutated .ai blend", || Some(vectorcraft_eps::layered_ai(&private, Document::new(100.0, 100.0), vec![], false, true, 1.0).0))?;
|
||||
}
|
||||
}
|
||||
|
||||
/// A graph in `.ai` editing data, written by hand from the version 7 specification's chapter 17:
|
||||
/// its data and settings on `%_` lines (cells, strings, an array, a name), then its drawn art, a bar
|
||||
/// with its `Go` tag and an empty group, in a group.
|
||||
fn graph_text() -> String {
|
||||
"%_Gs\n%_10 10 110 90 Gb\n%_3 0 0 12 1 1 0 0 2 30 0 Gy\n%_6 1 1 0 80 70 0 50 60 80 70 Gd\n%_0 1 Gj\n\
|
||||
%_1 () Ga 0 12 0 0 0 0 0 () 0 0 GA\n%_40 Gw\n%_2 2 1 1 Gz\n%_() Gc (East) Gc (Q1) Gc 7 Gc GC\n\
|
||||
%_Gt\n%_(Bars) GD [1 2 3] 0 Ge\n%_/Name 1 Gi\n%_0.5 G\n%_0 g\n%_GT\n\
|
||||
u\n0 0 0 1 k\n10 10 m\n10 50 L\n30 50 L\n30 10 L\nf\n%_2 0 0 0 Go\nu\nU\nU\n%_GS\n"
|
||||
.to_string()
|
||||
}
|
||||
|
||||
proptest! {
|
||||
#![proptest_config(config())]
|
||||
|
||||
/// A `.ai` graph whose records are damaged, cut or hostile never panics. With only the numbers
|
||||
/// in its records changed, the records keep their shape, and the bar still comes in.
|
||||
#[test]
|
||||
fn ai_graph_never_panics(cut in 0usize..700, edits in prop::collection::vec((0usize..700, prop::sample::select(vec!['0', '9', '-', '.', ' ', '\n', '(', ')', '[', ']', '/', '%', '_', 'G', 's', 'S', 't', 'T', 'u', 'U'])), 0..12), digits in prop::collection::vec((0usize..600, 0u8..10), 0..12)) {
|
||||
let text = mutate_text(&graph_text(), cut, &edits);
|
||||
let private = ai_private(&text);
|
||||
survive("mutated .ai graph", || Some(vectorcraft_eps::layered_ai(&private, Document::new(100.0, 100.0), vec![], false, true, 1.0).0))?;
|
||||
let src = graph_text();
|
||||
let records = src.find("u\n0 0 0 1 k").unwrap_or(0).max(1);
|
||||
let mut kept: Vec<char> = src.chars().collect();
|
||||
for (at, d) in digits {
|
||||
if let Some(c) = kept.get_mut(at % records).filter(|c| c.is_ascii_digit()) {
|
||||
*c = char::from(b'0' + d);
|
||||
}
|
||||
}
|
||||
let (doc, notes, read) = vectorcraft_eps::layered_ai(&ai_private(&kept.into_iter().collect::<String>()), Document::new(4000.0, 200.0), vec![], false, true, 1.0);
|
||||
prop_assert!(read, "{:?}", notes);
|
||||
let mut paths = 0;
|
||||
doc.walk(|n| paths += usize::from(matches!(n.kind, vectorcraft_doc::NodeKind::Path { .. })));
|
||||
prop_assert_eq!(paths, 1, "{:?}", notes);
|
||||
prop_assert!(notes.iter().any(|n| n.contains("graphs come in as plain art")), "{:?}", notes);
|
||||
prop_assert!(!notes.iter().any(|n| n.contains("art this can't read")), "the records aren't art: {:?}", notes);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,6 +51,10 @@
|
||||
//! - Type in the legacy format (version 7 specification §15): `type To` … `TO`, read by
|
||||
//! [`legacy_text`].
|
||||
//!
|
||||
//! - Graphs (version 7 specification §17): `%_Gs`, the graph's data and settings on `%_` lines,
|
||||
//! its drawn art as ordinary groups, paths and type (each object followed by `%_… Go`), `%_GS`.
|
||||
//! The drawn art is read; the data and settings are left out, with a note.
|
||||
//!
|
||||
//! - Swatches: the palette (`%AI5_BeginPalette`), read by [`super::palette`], replaces the
|
||||
//! default swatches.
|
||||
//!
|
||||
@@ -92,9 +96,9 @@ use art::preview_png;
|
||||
pub use document::{PaletteSwatches, VariableLibrary, artboards, palette, variables};
|
||||
pub(crate) use document::{slot_frame, slot_of};
|
||||
pub use types::IMAGE_TOO_LARGE;
|
||||
use types::{BLEND_BUDGET, FLIP, Frame, GState, Kind, PatternHead, PendingEnvelope, Place, Raster};
|
||||
use types::{BLEND_BUDGET, FLIP, Frame, GState, Graph, Kind, PatternHead, PendingEnvelope, Place, Raster};
|
||||
#[cfg(test)]
|
||||
pub use types::{NON_NATIVE_ART, NON_NATIVE_ART_UNREAD, VERSIONED_UNENDED};
|
||||
pub use types::{GRAPH_PLAIN, GRAPH_UNENDED, NON_NATIVE_ART, NON_NATIVE_ART_UNREAD, VERSIONED_UNENDED};
|
||||
pub(super) use types::{blend_mode, blend_name};
|
||||
|
||||
#[path = "legacy_text.rs"]
|
||||
@@ -302,6 +306,8 @@ struct Reader<'a> {
|
||||
/// The legacy text object being read (`To` … `TO`), and the modal type attributes.
|
||||
text: Option<legacy_text::LegacyText>,
|
||||
type_state: legacy_text::TypeState,
|
||||
/// The graph being read (see [`Reader::graph_record`]).
|
||||
graph: Option<Graph>,
|
||||
}
|
||||
|
||||
/// A section comment's marker without its `AI<version>_` prefix and value (`AI14_BeginSymbol` →
|
||||
@@ -399,6 +405,7 @@ impl<'a> Reader<'a> {
|
||||
pattern_tiles: HashMap::new(),
|
||||
text: None,
|
||||
type_state: legacy_text::TypeState::default(),
|
||||
graph: None,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -529,6 +529,9 @@ impl<'a> Reader<'a> {
|
||||
}
|
||||
|
||||
pub(super) fn finish(mut self) -> Result<Structure, String> {
|
||||
if self.graph.take().is_some() {
|
||||
self.warn(super::types::GRAPH_UNENDED);
|
||||
}
|
||||
// Envelopes whose plugin never closed them keep their drawn art.
|
||||
if !self.envelopes.is_empty() {
|
||||
self.envelopes.clear();
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
use super::containers::close;
|
||||
use super::document::slot_of;
|
||||
use super::types::{BLENDS, FLIP, Frame, IGNORED, Kind, MAX_DEPTH};
|
||||
use super::types::{BLENDS, FLIP, Frame, GRAPH_OPS, GRAPH_PLAIN, GRAPH_UNENDED, IGNORED, Kind, MAX_DEPTH};
|
||||
use super::{
|
||||
Affine, Appearance, AppearanceItem, Arc, BlendMode, Dash, FillLayer, FillRule, Gradient, GradientDef, HashMap, HashSet, Instance, Knockout,
|
||||
LayerColor, LineCap, LineJoin, Node, NodeId, NodeKind, Paint, Reader, Rect, StrokeLayer, V, obj, paint,
|
||||
Affine, Appearance, AppearanceItem, Arc, BlendMode, Dash, FillLayer, FillRule, Gradient, GradientDef, Graph, HashMap, HashSet, Instance,
|
||||
Knockout, LayerColor, LineCap, LineJoin, Node, NodeId, NodeKind, Paint, Reader, Rect, StrokeLayer, V, obj, paint,
|
||||
};
|
||||
|
||||
impl<'a> Reader<'a> {
|
||||
@@ -77,6 +77,9 @@ impl<'a> Reader<'a> {
|
||||
let mesh_ended = std::mem::take(&mut self.mesh_ended);
|
||||
let vals = self.operands();
|
||||
let vals = self.take_head(vals);
|
||||
if self.graph_record(w, hidden) {
|
||||
return Ok(());
|
||||
}
|
||||
// Only `Bh` reads an undefined number. Anywhere else it would reach a point or a size, so
|
||||
// the operator is one the reader doesn't know, as before.
|
||||
if w != "Bh" && !self.frames.is_empty() && vals.iter().any(|v| matches!(v, V::Num(n) if n.is_nan())) {
|
||||
@@ -145,7 +148,14 @@ impl<'a> Reader<'a> {
|
||||
a.name = vals.iter().rev().find_map(V::text).unwrap_or_default();
|
||||
}
|
||||
}
|
||||
"LB" => self.end_layer()?,
|
||||
"LB" => {
|
||||
// A graph started in this layer that hasn't ended doesn't go on past it.
|
||||
if self.graph.as_ref().is_some_and(|g| g.frames >= self.frames.len()) {
|
||||
self.graph = None;
|
||||
self.warn(GRAPH_UNENDED);
|
||||
}
|
||||
self.end_layer()?
|
||||
}
|
||||
// Paths.
|
||||
"m" | "l" | "L" | "c" | "C" | "v" | "V" | "y" | "Y" => self.path_op(w, &vals)?,
|
||||
"h" => close(&mut self.path),
|
||||
@@ -324,6 +334,33 @@ impl<'a> Reader<'a> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// A graph's records (version 7 specification §17 and appendix A): `%_Gs` starts the graph on
|
||||
/// a layer, `GS` ends it, and its data and settings (the operators in [`GRAPH_OPS`], and any
|
||||
/// operator on a `%_` line between `Gt` and `GT`) are left out with their operands. Its drawn
|
||||
/// art, and anything else, is read as usual. `true` when `w` was one of them.
|
||||
fn graph_record(&mut self, w: &str, hidden: bool) -> bool {
|
||||
let Some(g) = self.graph.as_mut() else {
|
||||
// Outside a graph, its operators stay ones the reader doesn't know.
|
||||
if w == "Gs" && hidden && !self.frames.is_empty() {
|
||||
self.graph = Some(Graph { settings: false, frames: self.frames.len() });
|
||||
self.warn(GRAPH_PLAIN);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
match w {
|
||||
// A graph doesn't start inside another: the one being read goes on.
|
||||
"Gs" => self.warn(GRAPH_UNENDED),
|
||||
"GS" => self.graph = None,
|
||||
"Gt" => g.settings = true,
|
||||
"GT" => g.settings = false,
|
||||
_ if GRAPH_OPS.contains(&w) => {}
|
||||
_ if hidden && g.settings => {}
|
||||
_ => return false,
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
/// `… Lb`: a layer's options, `visible preview unlocked printing dimmed`, then the colour index
|
||||
/// and its RGB. The colour index is at 5 with fewer than ten operands, 6 with ten to twelve
|
||||
/// (`masks` before it) and 7 with thirteen or more (one more flag before it). Four places after
|
||||
|
||||
@@ -301,3 +301,28 @@ pub const NON_NATIVE_ART_UNREAD: &str = "non-native art (a placed PDF's content)
|
||||
|
||||
/// The name of the group a `/ForeignObject`'s art comes in as.
|
||||
pub const NON_NATIVE_ART: &str = "Non-native art";
|
||||
|
||||
/// The note for a file with a graph (`%_Gs` … `%_GS`): its drawn art comes in, its data and
|
||||
/// settings don't.
|
||||
pub const GRAPH_PLAIN: &str = "graphs come in as plain art, without their data or settings";
|
||||
|
||||
/// The note for a graph that starts inside another or doesn't end before its layer does: the art
|
||||
/// read so far is kept, and what follows the layer is read as usual.
|
||||
pub const GRAPH_UNENDED: &str = "a graph's records don't end where they should: its art was read as it is";
|
||||
|
||||
/// A graph's records (the version 7 specification's chapter 17 and appendix A): two-letter
|
||||
/// operators starting with `G`, read and left out with their operands.
|
||||
pub(super) const GRAPH_OPS: &[&str] = &[
|
||||
"G1", "G+", "Ga", "GA", "Gb", "Gc", "GC", "Gd", "GD", "Ge", "Gf", "Gg", "Gi", "Gj", "Gl", "Gm", "Go", "Gp", "Gr", "Gs", "GS", "Gt", "GT", "Gv",
|
||||
"Gw", "GX", "Gx", "Gy", "Gz",
|
||||
];
|
||||
|
||||
/// A graph being read (`%_Gs` … `%_GS`).
|
||||
#[derive(Debug)]
|
||||
pub(super) struct Graph {
|
||||
/// Between `Gt` and `GT`, where the graph's settings may use paint and type operators on `%_`
|
||||
/// lines too.
|
||||
pub(super) settings: bool,
|
||||
/// How many frames were open at its `Gs`: a layer that ends with fewer ends the graph.
|
||||
pub(super) frames: usize,
|
||||
}
|
||||
|
||||
@@ -3811,3 +3811,145 @@ fn an_objects_on_path_group_in_versioned_content_opens_once() {
|
||||
assert_eq!(kids[0].children().unwrap().len(), 5);
|
||||
assert!(kids[0].extras().objects_on_path.is_some());
|
||||
}
|
||||
|
||||
use read::{GRAPH_PLAIN, GRAPH_UNENDED};
|
||||
|
||||
/// Editing data in the legacy format (version 7 specification, chapter 2): `%AI5_FileFormat 2.0`,
|
||||
/// the art size and the template box in the header, then `body`.
|
||||
fn stream7(body: &str) -> String {
|
||||
format!(
|
||||
"%!PS-Adobe-3.0\n%%Creator: test\n%AI5_FileFormat 2.0\n%AI5_ArtSize: 612 792\n%AI3_TemplateBox: 306 396 306 396\n%%EndComments\n\
|
||||
%%BeginProlog\n%%EndProlog\n%%BeginSetup\n%%EndSetup\n{body}\n%%PageTrailer\ngsave annotatepage grestore showpage\n%%Trailer\n%%EOF\n"
|
||||
)
|
||||
}
|
||||
|
||||
/// One layer named `name` in the legacy format (ten operands before `Lb`) holding `art`.
|
||||
fn layer7(name: &str, art: &str) -> String {
|
||||
format!("%AI5_BeginLayer\n1 1 1 1 0 0 0 79 128 255 Lb\n({name}) Ln\n0 A\n{art}\nLB\n%AI5_EndLayer--\n")
|
||||
}
|
||||
|
||||
/// A graph's data on `%_` lines, in the order the version 7 specification's chapter 17 gives:
|
||||
/// bounds, style and dialog settings, a subscription, three axes, a column width and the table
|
||||
/// (two rows of two cells, one of them empty).
|
||||
const GRAPH_DATA: &str = "%_Gs\n%_10 10 110 90 Gb\n%_3 0 0 12 1 1 0 0 2 30 0 Gy\n%_6 1 1 0 80 70 0\n%_ 50 60 80 70 Gd\n%_0 1 Gj\n\
|
||||
%_1 () Ga 0 12 0 0 0 0 0 () 0 0 GA\n%_2 () Ga 0 12 0 1 0.5 0 1 () 0 0 GA\n%_3 () Ga 0 12 0 4 1 0 0 () 0 0 GA\n%_40 Gw\n\
|
||||
%_2 2 1 1 Gz\n%_() Gc (East) Gc\n%_(Q1) Gc 7 Gc GC\n";
|
||||
|
||||
/// A graph's settings (`Gt` … `GT`): a design's name and paint operators on `%_` lines.
|
||||
const GRAPH_SETTINGS: &str = "%_Gt\n%_(Bars) GD\n%_0.5 G\n%_0 g\n%_1 0 Gv\n%_GT\n";
|
||||
|
||||
/// A graph whose drawn art is `art` (in its group, then `%_GS`).
|
||||
fn graph(settings: &str, art: &str) -> String {
|
||||
format!("{GRAPH_DATA}{settings}u\n{art}U\n%_GS\n")
|
||||
}
|
||||
|
||||
/// A filled bar of a graph, with its `Go` tag.
|
||||
fn bar(x: f64) -> String {
|
||||
format!("0 0 0 1 k\n{}f\n%_2 0 0 0 Go\n", rect_path(x, 10.0, x + 20.0, 50.0))
|
||||
}
|
||||
|
||||
/// The gray (`k`) of `n`'s stroke.
|
||||
fn stroke_k(n: &Node) -> Option<f32> {
|
||||
match n.appearance.stroke().and_then(|s| s.paint.color()) {
|
||||
Some(Color::Gray { k }) => Some(k),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// A graph opens as its drawn art: the bar comes in, in its group, with one note.
|
||||
#[test]
|
||||
fn a_graph_opens_as_its_drawn_art() {
|
||||
let r = read(stream7(&layer7("Graph", &graph(GRAPH_SETTINGS, &bar(10.0)))).as_bytes()).unwrap();
|
||||
let a = art(&r.doc);
|
||||
assert_eq!(a.len(), 1);
|
||||
let NodeKind::Group { children, clip: false } = &a[0].kind else { panic!("{:?}", a[0].kind) };
|
||||
assert_eq!(children.len(), 1);
|
||||
assert!(matches!(children[0].kind, NodeKind::Path { .. }));
|
||||
assert_eq!(fill(&children[0]).color(), Some(Color::cmyk(0.0, 0.0, 0.0, 1.0)));
|
||||
assert_eq!(r.warnings, [GRAPH_PLAIN]);
|
||||
assert!(r.hidden_unread.is_empty(), "the records aren't unread art: {:?}", r.hidden_unread);
|
||||
// Two graphs, the second without settings: one note still.
|
||||
let two = format!("{}{}", graph(GRAPH_SETTINGS, &bar(10.0)), graph("", &bar(40.0)));
|
||||
let r = read(stream7(&layer7("Graph", &two)).as_bytes()).unwrap();
|
||||
assert_eq!(art(&r.doc).len(), 2);
|
||||
assert_eq!(r.warnings, [GRAPH_PLAIN]);
|
||||
// A graph with only the records a minimal one needs (bounds and table), and the newer header.
|
||||
let minimal = "%_Gs\n%_0 0 50 50 Gb\n%_1 1 1 1 Gz\n%_3 Gc GC\n";
|
||||
let r = read_ok(&layer(&format!("{minimal}u\n{}U\n%_GS\n", bar(0.0))));
|
||||
assert_eq!(art(&r.doc).len(), 1);
|
||||
assert_eq!(r.warnings, [GRAPH_PLAIN]);
|
||||
}
|
||||
|
||||
/// Paint operators on `%_` lines in a graph's settings set nothing; the same operators in its drawn
|
||||
/// art, and after it, paint as usual.
|
||||
#[test]
|
||||
fn a_graphs_settings_paint_nothing_and_its_drawn_art_paints_as_usual() {
|
||||
let stroked = |x: f64| format!("{}S\n", rect_path(x, 60.0, x + 5.0, 70.0));
|
||||
let drawn = format!("{}0.25 G\n{}", stroked(0.0), stroked(10.0));
|
||||
let body = format!("0.75 G\n{}0.5 G\n{}", graph(GRAPH_SETTINGS, &drawn), stroked(20.0));
|
||||
let r = read(stream7(&layer7("Graph", &body)).as_bytes()).unwrap();
|
||||
let a = art(&r.doc);
|
||||
assert_eq!(a.len(), 2);
|
||||
let kids = a[0].children().unwrap();
|
||||
assert_eq!(stroke_k(&kids[0]), Some(0.25), "the gray set before the graph, not its settings' `%_0.5 G`");
|
||||
assert_eq!(stroke_k(&kids[1]), Some(0.75), "a gray set in the drawn art");
|
||||
assert_eq!(stroke_k(&a[1]), Some(0.5), "a gray set after the graph");
|
||||
}
|
||||
|
||||
/// Graph operators outside a graph stay operators the reader doesn't know: an error on a layer that
|
||||
/// shows, noted as unread on `%_` lines (as any operator there), and no graph note.
|
||||
#[test]
|
||||
fn graph_operators_outside_a_graph_are_unknown() {
|
||||
for stray in ["Gs\n", "Go\n", "1 2 Gc\n"] {
|
||||
let err = read(stream7(&layer7("L", &format!("{}{stray}", rect_path(0.0, 0.0, 5.0, 5.0)))).as_bytes()).unwrap_err();
|
||||
assert!(err.contains("operators VectorCraft doesn't know"), "{stray}: {err}");
|
||||
}
|
||||
for (stray, op) in [("%_2 0 0 0 Go\n", "`Go`"), ("%_GS\n", "`GS`"), ("%_1 2 Gc\n", "`Gc`")] {
|
||||
let r = read(stream7(&layer7("L", &format!("{}f\n{stray}", rect_path(0.0, 0.0, 5.0, 5.0)))).as_bytes()).unwrap();
|
||||
assert!(r.hidden_unread.contains(op), "{stray}: {:?}", r.hidden_unread);
|
||||
assert!(r.warnings.is_empty(), "{stray}: {:?}", r.warnings);
|
||||
}
|
||||
}
|
||||
|
||||
/// A graph that starts inside another is noted and the first goes on; one that doesn't end stops at
|
||||
/// its layer's end, with the art read so far, and the next layer reads as usual.
|
||||
#[test]
|
||||
fn malformed_graphs_keep_their_art() {
|
||||
let nested = format!("{GRAPH_DATA}u\n{}%_Gs\n{}U\n%_GS\n", bar(0.0), bar(30.0));
|
||||
let r = read(stream7(&layer7("Graph", &nested)).as_bytes()).unwrap();
|
||||
assert_eq!(art(&r.doc)[0].children().unwrap().len(), 2);
|
||||
assert_eq!(r.warnings, [GRAPH_PLAIN, GRAPH_UNENDED]);
|
||||
|
||||
let unended = format!("{GRAPH_DATA}%_Gt\nu\n{}U\n", bar(0.0));
|
||||
let next = format!("%_0.5 G\n{}S\n", rect_path(0.0, 60.0, 5.0, 70.0));
|
||||
let r = read(stream7(&format!("{}{}", layer7("Graph", &unended), layer7("Next", &next))).as_bytes()).unwrap();
|
||||
assert_eq!(art(&r.doc).len(), 1, "the drawn art read before the layer ended");
|
||||
let after = r.doc.layers[1].children().unwrap();
|
||||
assert_eq!(stroke_k(&after[0]), Some(0.5), "the next layer isn't in the graph's settings");
|
||||
assert_eq!(r.warnings, [GRAPH_PLAIN, GRAPH_UNENDED]);
|
||||
|
||||
// One that doesn't end before the file does.
|
||||
let cut = stream7(&layer7("Graph", &format!("{GRAPH_DATA}u\n{}U\n", bar(0.0)))).replace("LB\n%AI5_EndLayer--\n", "");
|
||||
assert!(read(cut.as_bytes()).is_err(), "a layer that doesn't end is still an error");
|
||||
}
|
||||
|
||||
/// A graph's records in the shapes the specification's appendix A gives: several cells on one line,
|
||||
/// strings, arrays and names as operands, and empty groups among its drawn art.
|
||||
#[test]
|
||||
fn a_graphs_records_take_their_operands() {
|
||||
let settings = "%_Gt\n%_(Bars) GD [1 2 3] 0 Ge\n%_/Name 1 Gi (a) (b) Gl\n%_1 2 3 4 Gm 0 Gp 1 Gr 0 G+ 2 G1 0 Gf 0 Gg 0 Gx 1 GX\n%_GT\n";
|
||||
let drawn = format!("u\nU\nu\nu\nU\nU\n{}", bar(10.0));
|
||||
let r = read(stream7(&layer7("Graph", &graph(settings, &drawn))).as_bytes()).unwrap();
|
||||
let a = art(&r.doc);
|
||||
assert_eq!(a.len(), 1);
|
||||
let kids = a[0].children().unwrap();
|
||||
fn paths(n: &Node) -> usize {
|
||||
match n.children() {
|
||||
Some(c) => c.iter().map(|c| paths(c)).sum(),
|
||||
None => usize::from(matches!(n.kind, NodeKind::Path { .. })),
|
||||
}
|
||||
}
|
||||
assert!(matches!(kids.last().map(|k| &k.kind), Some(NodeKind::Path { .. })), "the bar is kept after the empty groups: {kids:?}");
|
||||
assert_eq!(paths(&a[0]), 1, "the empty groups hold no art");
|
||||
assert_eq!(r.warnings, [GRAPH_PLAIN]);
|
||||
}
|
||||
|
||||
@@ -123,6 +123,37 @@ fn a_postscript_ai_that_names_its_prolog_without_including_it_opens_with_its_lay
|
||||
assert_eq!(tree(d.layers[1].children().unwrap()), "p");
|
||||
}
|
||||
|
||||
/// A `.ai` in PostScript form with a graph on each of two layers (version 7 specification §17): its
|
||||
/// data on `%_` lines, then its drawn art in a group, each object followed by `%_… Go`.
|
||||
fn graphs_on_layers() -> String {
|
||||
let graph = |x: u32| {
|
||||
format!(
|
||||
"%_Gs\n%_{x} 10 {} 90 Gb\n%_2 0 0 12 1 1 0 0 2 30 0 Gy\n%_1 1 1 1 Gz\n%_() Gc 5 Gc GC\n%_Gt\n%_0.5 g\n%_GT\n\
|
||||
u\n0 0 0 1 k\n{x} 10 m\n{} 10 L\n{} 50 L\n{x} 50 L\n{x} 10 L\nf\n%_1 0 0 0 Go\nu\nU\nU\n%_GS\n",
|
||||
x + 60,
|
||||
x + 20,
|
||||
x + 20
|
||||
)
|
||||
};
|
||||
NAMED_PROLOG
|
||||
.replace("10 10 L\nS\nLB", &format!("10 10 L\nS\n{}LB", graph(100)))
|
||||
.replace("190 90 L\nS\nLB", &format!("190 90 L\nS\n{}LB", graph(10)))
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn graphs_open_as_their_drawn_art_on_their_layers() {
|
||||
let r = import(graphs_on_layers().as_bytes()).unwrap();
|
||||
assert!(!r.preview, "read through the layers, not a fallback preview");
|
||||
let d = &r.document;
|
||||
let names: Vec<_> = d.layers.iter().map(|l| l.name.clone().unwrap_or_default()).collect();
|
||||
assert_eq!(names, ["SECTION::Cut", "SECTION::Hatch"]);
|
||||
assert_eq!(tree(d.layers[0].children().unwrap()), "p g[p g[]]");
|
||||
assert_eq!(tree(d.layers[1].children().unwrap()), "p g[p g[]]");
|
||||
let notes: Vec<_> = r.warnings.iter().filter(|w| w.contains("graphs come in as plain art")).collect();
|
||||
assert_eq!(notes.len(), 1, "{:?}", r.warnings);
|
||||
assert!(!r.warnings.iter().any(|w| w.contains("doesn't know") || w.contains("couldn't be read")), "{:?}", r.warnings);
|
||||
}
|
||||
|
||||
/// A `.ai` in PostScript form whose layers can't be read either says why, after what stopped its
|
||||
/// program.
|
||||
#[test]
|
||||
|
||||
@@ -4871,6 +4871,7 @@ digits Malayalam Malaiàlam
|
||||
@msg an image of {w} × {h} pixels is shown at reduced size una imatge de {w} × {h} píxels es mostra a mida reduïda
|
||||
@msg an image of {w} × {h} pixels is too large to draw una imatge de {w} × {h} píxels és massa gran per dibuixar-la
|
||||
@msg an image VectorCraft can't read was left out s’ha omès una imatge que VectorCraft no pot llegir
|
||||
@msg graphs come in as plain art, without their data or settings els gràfics s’importen com a il·lustració normal, sense les seves dades ni la seva configuració
|
||||
@msg an image whose data is cut short was left out s’ha omès una imatge les dades de la qual estan tallades
|
||||
@msg an object can't be read no es pot llegir un objecte
|
||||
@msg an object in perspective would leave the edited grid un objecte en perspectiva sortiria de la quadrícula editada
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4886,6 +4886,7 @@ imageTrace Outline Obrys
|
||||
@msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet objekty s více výplněmi nebo tahy, efekty či štětci byly načteny jako vykreslený vzhled ({_1}): jejich vzhled zatím nelze upravovat
|
||||
@msg gradient “{name}” isn't defined in the file: a plain colour stands in for it přechod „{name}“ není v souboru definován: zastupuje ho plná barva
|
||||
@msg an image VectorCraft can't read was left out obrázek, který VectorCraft neumí přečíst, byl vynechán
|
||||
@msg graphs come in as plain art, without their data or settings grafy se načtou jako obyčejná grafika, bez svých dat a nastavení
|
||||
@msg an image whose data is cut short was left out obrázek s useknutými daty byl vynechán
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel propojené obrázky se zobrazují jako náhled v nízkém rozlišení uložený v souboru, dokud se nenajdou jejich soubory: znovu je propojte v panelu Propojení
|
||||
@msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise text v oblasti v rámcích příliš nízkých pro řádek písma, ve kterém se zde zobrazuje, dostal vyšší rámce ({_1}): jinak by nebyl vidět
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4495,6 +4495,7 @@ theme Appearance Erscheinungsbild
|
||||
@msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet Objekte mit mehreren Flächen oder Konturen, Effekten oder Pinseln wurden so übernommen, wie sie gezeichnet aussehen ({_1}): Ihr Aussehen ist noch nicht bearbeitbar
|
||||
@msg gradient “{name}” isn't defined in the file: a plain colour stands in for it der Verlauf „{name}“ ist in der Datei nicht definiert: Eine einfache Farbe steht an seiner Stelle
|
||||
@msg an image VectorCraft can't read was left out ein Bild, das VectorCraft nicht lesen kann, wurde ausgelassen
|
||||
@msg graphs come in as plain art, without their data or settings Diagramme werden als einfache Grafik übernommen, ohne ihre Daten und Einstellungen
|
||||
@msg an image whose data is cut short was left out ein Bild mit abgeschnittenen Daten wurde ausgelassen
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel verknüpfte Bilder zeigen die in der Datei gespeicherte Vorschau in niedriger Auflösung, bis ihre Dateien gefunden werden: Verknüpfen Sie sie im Bedienfeld „Verknüpfungen“ neu
|
||||
@msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise Flächentext in Rahmen, die für eine Zeile der Schrift, in der er hier erscheint, zu niedrig sind, hat höhere Rahmen bekommen ({_1}): Sonst wäre der Text nicht zu sehen
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4528,6 +4528,7 @@ digits Malayalam Μαλαγιάλαμ
|
||||
@msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet τα αντικείμενα με πολλαπλά γεμίσματα, περιγράμματα, εφέ ή πινέλα εισήχθησαν ως απεικονίσεις ({_1}): η εμφάνισή τους δεν είναι ακόμη επεξεργάσιμη
|
||||
@msg gradient “{name}” isn't defined in the file: a plain colour stands in for it το ντεγκραντέ «{name}» δεν ορίζεται στο αρχείο: χρησιμοποιείται στη θέση του ένα συμπαγές χρώμα
|
||||
@msg an image VectorCraft can't read was left out παραλείφθηκε εικόνα που δεν μπορεί να διαβάσει το VectorCraft
|
||||
@msg graphs come in as plain art, without their data or settings τα γραφήματα εισάγονται ως απλή γραφική, χωρίς τα δεδομένα και τις ρυθμίσεις τους
|
||||
@msg an image whose data is cut short was left out παραλείφθηκε εικόνα με περικομμένα δεδομένα
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel οι συνδεδεμένες εικόνες εμφανίζουν την προεπισκόπηση χαμηλής ανάλυσης που έχει αποθηκευτεί, μέχρι να βρεθούν τα αρχεία τους: επανασυνδέστε τις στον πίνακα Σύνδεσμοι
|
||||
@msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise οι περιοχές κειμένου με πλαίσια πολύ μικρά για μία γραμμή της γραμματοσειράς τους απέκτησαν μεγαλύτερο ύψος ({_1}), διαφορετικά το κείμενο δεν θα εμφανιζόταν
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 164 and column 5.
|
@@ -4580,6 +4580,7 @@ axis Both Ambos
|
||||
@msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet los objetos con varios rellenos o trazos, efectos o pinceles se importaron con su aspecto dibujado ({_1}): su aspecto aún no se puede editar
|
||||
@msg gradient “{name}” isn't defined in the file: a plain colour stands in for it el degradado “{name}” no está definido en el archivo: lo sustituye un color sólido
|
||||
@msg an image VectorCraft can't read was left out se omitió una imagen que VectorCraft no puede leer
|
||||
@msg graphs come in as plain art, without their data or settings los gráficos se importan como ilustración normal, sin sus datos ni sus ajustes
|
||||
@msg an image whose data is cut short was left out se omitió una imagen con datos incompletos
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel las imágenes vinculadas muestran la vista previa de baja resolución guardada en el archivo hasta que se encuentren sus archivos: vuelva a vincularlas en el panel Vínculos
|
||||
@msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise el texto de área en marcos demasiado bajos para una línea de la fuente en que se muestra recibió marcos más altos ({_1}): de otro modo no se vería
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4788,6 +4788,7 @@ imageTrace Outline Ääriviiva
|
||||
@msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet objektit, joilla on useita täyttöjä tai viivoja, tehosteita tai siveltimiä, tuotiin piirretyn näköisinä ({_1}): niiden ulkoasua ei voi vielä muokata
|
||||
@msg gradient “{name}” isn't defined in the file: a plain colour stands in for it liukuväriä “{name}” ei ole määritetty tiedostossa: sen tilalla on tasaväri
|
||||
@msg an image VectorCraft can't read was left out kuva, jota VectorCraft ei voi lukea, jätettiin pois
|
||||
@msg graphs come in as plain art, without their data or settings kaaviot tuodaan tavallisena grafiikkana ilman niiden tietoja ja asetuksia
|
||||
@msg an image whose data is cut short was left out kuva, jonka data on katkennut, jätettiin pois
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel linkitetyt kuvat näyttävät tiedostoon tallennetun matalan tarkkuuden esikatselun, kunnes niiden tiedostot löytyvät: linkitä ne uudelleen Linkit-paneelissa
|
||||
@msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise aluetekstin kehykset, jotka olivat liian matalia yhdelle riville niiden fontilla, korotettiin ({_1}): muuten niiden teksti ei näkyisi
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4570,6 +4570,7 @@ axis Both Les deux
|
||||
@msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet les objets à plusieurs fonds ou contours, effets ou formes ont été importés tels qu’ils sont dessinés ({_1}) : leur aspect n’est pas encore modifiable
|
||||
@msg gradient “{name}” isn't defined in the file: a plain colour stands in for it le dégradé « {name} » n’est pas défini dans le fichier : une couleur unie le remplace
|
||||
@msg an image VectorCraft can't read was left out une image que VectorCraft ne peut pas lire a été ignorée
|
||||
@msg graphs come in as plain art, without their data or settings les graphes sont importés comme illustration ordinaire, sans leurs données ni leurs réglages
|
||||
@msg an image whose data is cut short was left out une image aux données tronquées a été ignorée
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel les images liées affichent l’aperçu basse résolution enregistré dans le fichier tant que leurs fichiers ne sont pas trouvés : liez-les à nouveau dans le panneau Liens
|
||||
@msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise le texte captif dans des cadres trop bas pour une ligne de la police dans laquelle il s’affiche a reçu des cadres plus hauts ({_1}) : il ne s’afficherait pas autrement
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4616,6 +4616,7 @@ imageTrace Outline Körvonal
|
||||
@msg add a format to export adj meg egy exportálási formátumot
|
||||
@msg already editing a pattern már folyik egy mintázat szerkesztése
|
||||
@msg an image VectorCraft can't read was left out kimaradt egy kép, amelyet a VectorCraft nem tud olvasni
|
||||
@msg graphs come in as plain art, without their data or settings a diagramok egyszerű grafikaként kerülnek be, adataik és beállításaik nélkül
|
||||
@msg an image whose data is cut short was left out kimaradt egy csonka adatú kép
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel a csatolt képek a fájlban mentett kis felbontású előnézetet mutatják, amíg a fájljaik elő nem kerülnek: csatold őket újra a Csatolások panelen
|
||||
@msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise a túl alacsony keretben lévő területszöveg, amelybe a megjelenítő betűtípus egy sora sem fér el, magasabb keretet kapott ({_1}): különben nem látszana
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4621,6 +4621,7 @@ axis Both Entrambi
|
||||
@msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet gli oggetti con più riempimenti o tratti, effetti o pennelli sono stati importati come appaiono disegnati ({_1}): il loro aspetto non è ancora modificabile
|
||||
@msg gradient “{name}” isn't defined in the file: a plain colour stands in for it la sfumatura “{name}” non è definita nel file: la sostituisce un colore pieno
|
||||
@msg an image VectorCraft can't read was left out un'immagine che VectorCraft non può leggere è stata omessa
|
||||
@msg graphs come in as plain art, without their data or settings i grafici vengono importati come grafica semplice, senza i loro dati e le loro impostazioni
|
||||
@msg an image whose data is cut short was left out un'immagine con dati incompleti è stata omessa
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel le immagini collegate mostrano l'anteprima a bassa risoluzione salvata nel file finché i loro file non vengono trovati: ricollegale nel pannello Collegamenti
|
||||
@msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise il testo in area in cornici troppo basse per una riga del font in cui viene mostrato ha ricevuto cornici più alte ({_1}): altrimenti non sarebbe visibile
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4323,6 +4323,7 @@ swatch Bright Violet ビビッドバイオレット
|
||||
@msg its objects are nested too deeply オブジェクトの入れ子が深すぎます
|
||||
@msg its section ending with `%{end}` doesn't end `%{end}` で終わるはずのセクションが終わっていません
|
||||
@msg an image VectorCraft can't read was left out VectorCraft で読み込めない画像は除外されました
|
||||
@msg graphs come in as plain art, without their data or settings グラフは通常のアートとして読み込まれ、データと設定は保持されません
|
||||
@msg an image whose data is cut short was left out データが途中で切れている画像は除外されました
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel リンク画像は、元のファイルが見つかるまで、ファイルに保存された低解像度のプレビューで表示されます:リンクパネルで再リンクしてください
|
||||
@msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise 表示に使われるフォントの 1 行に対して低すぎるフレーム内のエリア内文字は、フレームを高くしました ({_1}): そうしないと文字が表示されません
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4319,6 +4319,7 @@ font-technology Variable ცვლადი
|
||||
@msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet რამდენიმე შევსების ან კონტურის, ეფექტის ან ფუნჯის მქონე ობიექტები შემოვიდა დახატული სახით ({_1}): მათი იერსახე ჯერ არ რედაქტირდება
|
||||
@msg gradient “{name}” isn't defined in the file: a plain colour stands in for it გრადიენტი „{name}“ ფაილში განსაზღვრული არ არის: მის ნაცვლად ერთგვაროვანი ფერია
|
||||
@msg an image VectorCraft can't read was left out გამოსახულება, რომელსაც VectorCraft ვერ კითხულობს, გამოტოვებულია
|
||||
@msg graphs come in as plain art, without their data or settings დიაგრამები შემოდის როგორც ჩვეულებრივი გრაფიკა, მათი მონაცემებისა და პარამეტრების გარეშე
|
||||
@msg an image whose data is cut short was left out გამოსახულება, რომლის მონაცემებიც შეკვეცილია, გამოტოვებულია
|
||||
@msg its editing data doesn't say where its art is მისი რედაქტირების მონაცემები არ მიუთითებს, სად არის მისი ნახატი
|
||||
@msg this file was saved without PDF compatibility, and its editing data can't be read ({why}) ეს ფაილი PDF-თავსებადობის გარეშეა შენახული და მისი რედაქტირების მონაცემების წაკითხვა ვერ ხერხდება ({why})
|
||||
|
||||
|
Can't render this file because it is too large.
|
@@ -4250,6 +4250,7 @@ theme Appearance 외관
|
||||
@msg its objects are nested too deeply 개체가 너무 깊게 중첩되어 있습니다
|
||||
@msg its section ending with `%{end}` doesn't end `%{end}`로 끝나는 구역이 끝나지 않습니다
|
||||
@msg an image VectorCraft can't read was left out VectorCraft가 읽을 수 없는 이미지는 제외했습니다
|
||||
@msg graphs come in as plain art, without their data or settings 그래프는 데이터와 설정 없이 일반 아트로 가져왔습니다
|
||||
@msg an image whose data is cut short was left out 데이터가 잘린 이미지는 제외했습니다
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel 연결된 그림은 해당 파일을 찾을 때까지 파일에 저장된 저해상도 미리 보기로 표시됩니다: 링크 패널에서 다시 연결하세요
|
||||
@msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise 표시되는 글꼴의 한 줄보다 낮은 프레임의 영역 문자는 프레임을 더 높였습니다({_1}). 그렇지 않으면 문자가 표시되지 않습니다
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4712,6 +4712,7 @@ imageTrace Outline Kontur
|
||||
@msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet obiekty z kilkoma wypełnieniami lub obrysami, efektami albo pędzlami wczytano jako ich narysowany wygląd ({_1}): ich wyglądu nie można jeszcze edytować
|
||||
@msg gradient “{name}” isn't defined in the file: a plain colour stands in for it gradient „{name}” nie jest zdefiniowany w pliku: zastąpiono go jednolitym kolorem
|
||||
@msg an image VectorCraft can't read was left out pominięto obraz, którego VectorCraft nie potrafi odczytać
|
||||
@msg graphs come in as plain art, without their data or settings wykresy są wczytywane jako zwykła grafika, bez ich danych i ustawień
|
||||
@msg an image whose data is cut short was left out pominięto obraz z uciętymi danymi
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel połączone obrazy pokazują zapisany w pliku podgląd niskiej rozdzielczości, dopóki ich pliki nie zostaną znalezione: połącz je ponownie w panelu Łącza
|
||||
@msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise tekst akapitowy w ramkach niższych niż wiersz wyświetlanej czcionki otrzymał wyższe ramki ({_1}): inaczej tekst nie byłby widoczny
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4162,6 +4162,7 @@ axis Both Ambos
|
||||
@msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet objetos com vários preenchimentos ou traços, efeitos ou pincéis entraram com a aparência desenhada ({_1}): sua aparência ainda não é editável
|
||||
@msg gradient “{name}” isn't defined in the file: a plain colour stands in for it o gradiente “{name}” não está definido no arquivo: uma cor sólida o substitui
|
||||
@msg an image VectorCraft can't read was left out uma imagem que o VectorCraft não consegue ler foi omitida
|
||||
@msg graphs come in as plain art, without their data or settings os gráficos são importados como arte comum, sem seus dados nem configurações
|
||||
@msg an image whose data is cut short was left out uma imagem com dados incompletos foi omitida
|
||||
@msg its editing data doesn't say where its art is seus dados de edição não indicam onde está a arte
|
||||
@msg this file was saved without PDF compatibility, and its editing data can't be read ({why}) este arquivo foi salvo sem compatibilidade com PDF e seus dados de edição não podem ser lidos ({why})
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -4616,6 +4616,7 @@ axis Both Оба
|
||||
@msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet объекты с несколькими заливками или обводками, эффектами или кистями импортированы в нарисованном виде ({_1}): их оформление пока нельзя редактировать
|
||||
@msg gradient “{name}” isn't defined in the file: a plain colour stands in for it градиент «{name}» не определён в файле: вместо него используется сплошной цвет
|
||||
@msg an image VectorCraft can't read was left out изображение, которое VectorCraft не может прочитать, пропущено
|
||||
@msg graphs come in as plain art, without their data or settings диаграммы импортируются как обычная графика, без их данных и настроек
|
||||
@msg an image whose data is cut short was left out изображение с обрезанными данными пропущено
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel связанные изображения показываются как сохранённый в файле просмотр низкого разрешения, пока их файлы не найдены: восстановите связи на панели «Связи»
|
||||
@msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise текст в области в рамках, слишком низких для строки шрифта, которым он отображается, получил более высокие рамки ({_1}): иначе он не был бы виден
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -4479,6 +4479,7 @@ axis Both Båda
|
||||
@msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet objekt med flera fyllningar eller konturer, effekter eller penslar importerades som sitt ritade utseende ({_1}): deras utseende går inte att redigera än
|
||||
@msg gradient “{name}” isn't defined in the file: a plain colour stands in for it gradienten ”{name}” är inte definierad i filen: en enfärgad fyllning används i stället
|
||||
@msg an image VectorCraft can't read was left out en bild som VectorCraft inte kan läsa utelämnades
|
||||
@msg graphs come in as plain art, without their data or settings diagram läses in som vanlig grafik, utan sina data och inställningar
|
||||
@msg an image whose data is cut short was left out en bild med avkortade data utelämnades
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel länkade bilder visar förhandsgranskningen med låg upplösning som sparats i filen tills deras filer hittas: länka om dem i panelen Länkar
|
||||
@msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise områdestext i ramar som var för låga för en rad i det typsnitt den visas med fick högre ramar ({_1}): annars skulle texten inte synas
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 5 and column 25.
|
@@ -4317,6 +4317,7 @@ axis Both Her İkisi
|
||||
@msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet çeşitli dolgulara veya konturlara, efektlere veya fırçalara sahip nesneler çizilmiş görünümleri olarak geldi ({_1}): görünümleri henüz düzenlenemez
|
||||
@msg gradient “{name}” isn't defined in the file: a plain colour stands in for it “{name}” degradesi dosyada tanımlı değil: onun yerine düz bir renk geliyor
|
||||
@msg an image VectorCraft can't read was left out VectorCraft'ın okuyamadığı bir resim dışarıda bırakıldı
|
||||
@msg graphs come in as plain art, without their data or settings grafikler, verileri ve ayarları olmadan düz çizim olarak içe aktarılır
|
||||
@msg an image whose data is cut short was left out verileri kısa kesilen bir resim dışarıda bırakıldı
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel bağlantılı resimler, dosyaları bulunana kadar dosyaya kaydedilen düşük çözünürlüklü önizlemeyi gösterir: bunları Bağlantılar panelinde yeniden bağlayın
|
||||
@msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise çerçevelerdeki alan türü, daha uzun çerçevelerde gösterdiği yazı tipinin bir satırı için çok kısa ({_1}): bunların türü aksi halde gösterilmez
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 5 and column 25.
|
@@ -4605,6 +4605,7 @@ axis Both Обидві
|
||||
@msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet об’єкти з кількома заливками або обведеннями, ефектами або пензлями імпортовані в намальованому вигляді ({_1}): їх оформлення поки що не можна редагувати
|
||||
@msg gradient “{name}” isn't defined in the file: a plain colour stands in for it градієнт «{name}» не визначено у файлі: замість нього використовується суцільний колір
|
||||
@msg an image VectorCraft can't read was left out зображення, яке VectorCraft не може прочитати, пропущено
|
||||
@msg graphs come in as plain art, without their data or settings діаграми імпортуються як звичайна графіка, без їхніх даних і налаштувань
|
||||
@msg an image whose data is cut short was left out зображення з обрізаними даними пропущено
|
||||
@msg linked pictures show the low-resolution preview saved in the file until their files are found: relink them in the Links panel пов’язані зображення показуються як збережений у файлі перегляд низької роздільності, доки їхні файли не знайдено: відновіть зв’язки на панелі «Зв’язки»
|
||||
@msg area type in frames too short for a line of the font it shows in got taller frames ({_1}): their type wouldn't show otherwise текст в області в рамках, занизьких для рядка шрифту, яким він показується, отримав вищі рамки ({_1}): інакше його не було б видно
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 178 and column 5.
|
@@ -4268,6 +4268,7 @@ theme Appearance Giao diện
|
||||
@msg add a format to export thêm định dạng để xuất
|
||||
@msg already editing a pattern đang chỉnh sửa họa tiết
|
||||
@msg an image VectorCraft can't read was left out một ảnh VectorCraft không đọc được đã bị bỏ qua
|
||||
@msg graphs come in as plain art, without their data or settings biểu đồ được nhập dưới dạng hình vẽ thường, không kèm dữ liệu và thiết lập của chúng
|
||||
@msg an image whose data is cut short was left out một ảnh bị cắt ngắn dữ liệu đã bị bỏ qua
|
||||
@msg an object can't be read không thể đọc một đối tượng
|
||||
@msg an object in perspective would leave the edited grid đối tượng trong phối cảnh sẽ rời khỏi lưới đang chỉnh sửa
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 200 and column 5.
|
@@ -4048,6 +4048,7 @@ imageTrace Outline 轮廓
|
||||
@msg its objects are nested too deeply 其对象嵌套过深
|
||||
@msg its section ending with `%{end}` doesn't end 其以 `%{end}` 结束的部分没有结束
|
||||
@msg an image VectorCraft can't read was left out 已略去 VectorCraft 无法读取的图像
|
||||
@msg graphs come in as plain art, without their data or settings 图表作为普通图稿导入,不保留其数据和设置
|
||||
@msg an image whose data is cut short was left out 已略去数据不完整的图像
|
||||
@msg gradient “{name}” isn't defined in the file: a plain colour stands in for it 文件中未定义渐变“{name}”:已改用纯色代替
|
||||
@msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet 带有多个填色或描边、效果或画笔的对象已按其绘制外观导入 ({_1}):其外观尚不可编辑
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -1970,6 +1970,7 @@ file-filter Templates 範本
|
||||
@msg its objects are nested too deeply 其物件巢狀層級過深
|
||||
@msg its section ending with `%{end}` doesn't end 其以 `%{end}` 結尾的區段沒有結束
|
||||
@msg an image VectorCraft can't read was left out 已略過 VectorCraft 無法讀取的影像
|
||||
@msg graphs come in as plain art, without their data or settings 圖表以一般圖稿匯入,不保留其資料與設定
|
||||
@msg an image whose data is cut short was left out 已略過資料不完整的影像
|
||||
@msg gradient “{name}” isn't defined in the file: a plain colour stands in for it 檔案中未定義漸層「{name}」:已改用單色替代
|
||||
@msg objects with several fills or strokes, effects or brushes came in as their drawn look ({_1}): their appearance isn't editable yet 具有多個填色或筆畫、效果或筆刷的物件已依其繪製外觀匯入 ({_1}):其外觀目前尚無法編輯
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -91,6 +91,8 @@ private editing data. VectorCraft:
|
||||
without the prolog opens since #1027, its legacy type (`To` … `TO`) since #868.
|
||||
lines lost (#779), some files 4× slower to open since the editing data is read whole (#758), live effects,
|
||||
brushes and symbols come in as their drawn look (#637; pattern fills are read since #1025); legacy `.ai`
|
||||
without the prolog opens since #1027, its legacy type (`To` … `TO`) since #868. Graphs (`%_Gs` … `%_GS`)
|
||||
come in as their drawn art, as plain groups, paths and type, without their data or settings, with a note.
|
||||
without the prolog opens since #1027, its legacy type (`To` … `TO`) since #868, with its paragraphs' letter
|
||||
and word spacing (`TC`, `TW`), hanging punctuation (`Tq`) and hyphenation (`Th`).
|
||||
- Estimate: **~65%** for real exchange with Illustrator users (open: ~75%; save: PDF-compatible, or legacy
|
||||
|
||||
Reference in New Issue
Block a user