Skip to content
Snippets Groups Projects
Unverified Commit 7585b490 authored by aleok's avatar aleok Committed by GitHub
Browse files

Merge pull request #110 from PieKing1215/multiline-string

Add support for multiline string properties
parents 0ca8ff1a b9a27679
No related branches found
No related tags found
No related merge requests found
This diff is collapsed.
This diff is collapsed.
...@@ -15,6 +15,11 @@ ...@@ -15,6 +15,11 @@
<properties> <properties>
<property name="prop1" value="12"/> <property name="prop1" value="12"/>
<property name="prop2" value="some text"/> <property name="prop2" value="some text"/>
<property name="prop3">Line 1
Line 2
Line 3,
etc
</property>
</properties> </properties>
<data encoding="base64" compression="gzip"> <data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3XMQrDMAwFUF0hJwglc9L7364NjUG4dulQu8t7IMiQSR8heYuIrapbpxhvuWq/6njWvVNymaNkUs/JqZURc5wZLOm7rpKLGRlvjVfP107t8T47jJH7vTcqZ3KETEYrfa/7XO/6vEtkMk7u87kbcq9LJjV5jFPfUOWube30CFnM0Lpr6/dGyaE3M/zep1zy210e47Tu2FYuW3gTzvDtLrAz5ujt7d5/zPUpG3n837fzw3zyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgewAvf+EvQJwAAA== H4sIAAAAAAAACu3XMQrDMAwFUF0hJwglc9L7364NjUG4dulQu8t7IMiQSR8heYuIrapbpxhvuWq/6njWvVNymaNkUs/JqZURc5wZLOm7rpKLGRlvjVfP107t8T47jJH7vTcqZ3KETEYrfa/7XO/6vEtkMk7u87kbcq9LJjV5jFPfUOWube30CFnM0Lpr6/dGyaE3M/zep1zy210e47Tu2FYuW3gTzvDtLrAz5ujt7d5/zPUpG3n837fzw3zyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgewAvf+EvQJwAAA==
......
...@@ -15,6 +15,11 @@ ...@@ -15,6 +15,11 @@
<properties> <properties>
<property name="prop1" value="12"/> <property name="prop1" value="12"/>
<property name="prop2" value="some text"/> <property name="prop2" value="some text"/>
<property name="prop3">Line 1
Line 2
Line 3,
etc
</property>
</properties> </properties>
<data encoding="base64" compression="zlib"> <data encoding="base64" compression="zlib">
eJzt1zEKwzAMBVBdIScIJXPS+9+uDY1BuHbpULvLeyDIkEkfIXmLiK2qW6cYb7lqv+p41r1TcpmjZFLPyamVEXOcGSzpu66SixkZb41Xz9dO7fE+O4yR+703KmdyhExGK32v+1zv+rxLZDJO7vO5G3KvSyY1eYxT31Dlrm3t9AhZzNC6a+v3RsmhNzP83qdc8ttdHuO07thWLlt4E87w7S6wM+bo7e3ef8z1KRt5/N+388N88gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIHsArPIXTA== eJzt1zEKwzAMBVBdIScIJXPS+9+uDY1BuHbpULvLeyDIkEkfIXmLiK2qW6cYb7lqv+p41r1TcpmjZFLPyamVEXOcGSzpu66SixkZb41Xz9dO7fE+O4yR+703KmdyhExGK32v+1zv+rxLZDJO7vO5G3KvSyY1eYxT31Dlrm3t9AhZzNC6a+v3RsmhNzP83qdc8ttdHuO07thWLlt4E87w7S6wM+bo7e3ef8z1KRt5/N+388N88gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIHsArPIXTA==
......
...@@ -15,6 +15,11 @@ ...@@ -15,6 +15,11 @@
<properties> <properties>
<property name="prop1" value="12"/> <property name="prop1" value="12"/>
<property name="prop2" value="some text"/> <property name="prop2" value="some text"/>
<property name="prop3">Line 1
Line 2
Line 3,
etc
</property>
</properties> </properties>
<data encoding="base64" compression="zstd"> <data encoding="base64" compression="zstd">
KLUv/WBAm6UFAPgjAAAAIREtLgAAAC8RACMfHy0tLi0tLSMjIyMjIyMjSaBguwAAg0JmtQEFA2qvb+Al6lHUO91VvxpMveegXVabfkkjaEj1wZVZeNWPbSrdISdZk1b145uYEEFAvQmwiF5zTMi2QsOb9Vhv7ZxsK27ZJBXC9lYf2mVdhuqWjb8/hITgZAMw1ctxfXIOXBaofKbranfWDTtJ/Xyz7E2ZNWzVKauthC4r26Ry1TnnDqtmvUfyDw== KLUv/WBAm6UFAPgjAAAAIREtLgAAAC8RACMfHy0tLi0tLSMjIyMjIyMjSaBguwAAg0JmtQEFA2qvb+Al6lHUO91VvxpMveegXVabfkkjaEj1wZVZeNWPbSrdISdZk1b145uYEEFAvQmwiF5zTMi2QsOb9Vhv7ZxsK27ZJBXC9lYf2mVdhuqWjb8/hITgZAMw1ctxfXIOXBaofKbranfWDTtJ/Xyz7E2ZNWzVKauthC4r26Ry1TnnDqtmvUfyDw==
......
...@@ -15,6 +15,11 @@ ...@@ -15,6 +15,11 @@
<properties> <properties>
<property name="prop1" value="12"/> <property name="prop1" value="12"/>
<property name="prop2" value="some text"/> <property name="prop2" value="some text"/>
<property name="prop3">Line 1
Line 2
Line 3,
etc
</property>
</properties> </properties>
<data encoding="csv"> <data encoding="csv">
35,35,35,35,35,33,33,33,33,33,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 35,35,35,35,35,33,33,33,33,33,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
......
use std::{collections::HashMap, io::Read, str::FromStr}; use std::{collections::HashMap, io::Read, str::FromStr};
use xml::{attribute::OwnedAttribute, EventReader}; use xml::{EventReader, attribute::OwnedAttribute, reader::XmlEvent};
use crate::{ use crate::{
error::{ParseTileError, TiledError}, error::{ParseTileError, TiledError},
...@@ -87,18 +87,29 @@ pub(crate) fn parse_properties<R: Read>( ...@@ -87,18 +87,29 @@ pub(crate) fn parse_properties<R: Read>(
let mut p = HashMap::new(); let mut p = HashMap::new();
parse_tag!(parser, "properties", { parse_tag!(parser, "properties", {
"property" => |attrs:Vec<OwnedAttribute>| { "property" => |attrs:Vec<OwnedAttribute>| {
let (t, (k, v)) = get_attrs!( let ((t, v_attr), k) = get_attrs!(
attrs, attrs,
optionals: [ optionals: [
("type", property_type, |v| Some(v)), ("type", property_type, |v| Some(v)),
("value", value, |v| Some(v)),
], ],
required: [ required: [
("name", key, |v| Some(v)), ("name", key, |v| Some(v)),
("value", value, |v| Some(v)),
], ],
TiledError::MalformedAttributes("property must have a name and a value".to_string()) TiledError::MalformedAttributes("property must have a name and a value".to_string())
); );
let t = t.unwrap_or("string".into()); let t = t.unwrap_or("string".into());
let v = match v_attr {
Some(val) => val,
None => {
// if the "value" attribute was missing, might be a multiline string
match parser.next().map_err(TiledError::XmlDecodingError)? {
XmlEvent::Characters(s) => Ok(s),
_ => Err(TiledError::MalformedAttributes(format!("property '{}' is missing a value", k))),
}?
}
};
p.insert(k, PropertyValue::new(t, v)?); p.insert(k, PropertyValue::new(t, v)?);
Ok(()) Ok(())
......
...@@ -110,6 +110,19 @@ fn test_tile_property() { ...@@ -110,6 +110,19 @@ fn test_tile_property() {
assert_eq!("123", prop_value); assert_eq!("123", prop_value);
} }
#[test]
fn test_layer_property() {
let r = read_from_file(&Path::new("assets/tiled_base64.tmx")).unwrap();
let prop_value: String = if let Some(&PropertyValue::StringValue(ref v)) =
r.layers[0].properties.get("prop3")
{
v.clone()
} else {
String::new()
};
assert_eq!("Line 1\r\nLine 2\r\nLine 3,\r\n etc\r\n ", prop_value);
}
#[test] #[test]
fn test_object_group_property() { fn test_object_group_property() {
let r = read_from_file(&Path::new("assets/tiled_object_groups.tmx")).unwrap(); let r = read_from_file(&Path::new("assets/tiled_object_groups.tmx")).unwrap();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment