Skip to content

Commit 7ec1e65

Browse files
author
benni-tec
committed
rebased and some fine tuning
1 parent 45a99af commit 7ec1e65

File tree

5 files changed

+66
-74
lines changed

5 files changed

+66
-74
lines changed

README.md

+52-17
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,19 @@ Load a TMX file into a string by any means, and then pass the string to TileMapP
2626

2727
```dart
2828
final String tmxBody = /* ... */;
29-
final TiledMap mapTmx = TileMapParser.parseTmx(tmxBody);
29+
final TiledMap mapTmx = TiledMap.parseTmx(tmxBody);
3030
```
3131

32-
If your tmx file includes a external tsx reference, you have to add a CustomParser. This can either be done by using extending the TsxProviderBase, which can match multiple files, or by extending TsxProvider, which only matches on file by its name.
32+
If your tmx file includes external reference, e.g. for .tsx files, you have to add providers.
33+
These providers are then used to find these files and load their contents as a string,
34+
as well as maybe caching them.
35+
36+
To construct a provider for tsx files for example you can just extend the Provider<Parser>
37+
or ParserProvider class, which is just a type alias.
3338
```dart
34-
class MultipleTsxProvider extends TsxProviderBase {
39+
class MultipleTsxProvider extends ParserProvider {
3540
@override
36-
bool checkProvidable(String filename) => ["external1.tsx", "external2.tsx"].contains(filename);
41+
bool canProvide(String filename) => ["external1.tsx", "external2.tsx"].contains(filename);
3742
3843
@override
3944
Parser? getCachedSource(String filename) => null;
@@ -47,34 +52,64 @@ class MultipleTsxProvider extends TsxProviderBase {
4752
}
4853
```
4954

55+
If, for example, all your tsx files are in one directory,
56+
adding only one RelativeTsxProvider can allow the Parser to find all of them.
57+
5058
```dart
51-
class SingleTsxProvider extends TsxProvider {
59+
class RelativeTsxProvider extends TsxProviderBase {
60+
final String root;
61+
62+
RelativeTsxProvider(this.root);
63+
5264
@override
53-
String get filename => "external.tsx";
54-
65+
bool canProvide(String filename) {
66+
if (cache.containsKey(filename)) return true;
67+
68+
final exists = File(paths.join(root, filename)).existsSync();
69+
if (exists) cache[filename] = null;
70+
71+
return exists;
72+
}
73+
74+
Map<String, Parser?> cache = {};
75+
5576
@override
56-
Parser? getCachedSource() => null;
57-
77+
Parser? getCachedSource(String filename) => cache[filename];
78+
5879
@override
59-
Parser getSource(String _) {
60-
final xml = File(filename).readAsStringSync();
61-
final node = XmlDocument.parse(xml).rootElement;
62-
return XmlParser(node);
80+
Parser getSource(String filename) {
81+
final xml = XmlDocument.parse(File(paths.join(root, filename)).readAsStringSync());
82+
final element = xml.getElement("tileset");
83+
if (element == null) {
84+
throw ParsingException(
85+
"tileset",
86+
null,
87+
"This tsx file does not seem to contain a top-level tileset tag",
88+
);
89+
}
90+
91+
cache[filename] = XmlParser(element);
92+
return cache[filename]!;
6393
}
6494
}
6595
```
66-
And use it in the parseTmx method. Keep in mind that the first TsxProvider that can provide a source is used!
96+
97+
These providers are passed to the parseTmx or parseJson method.
98+
Keep in mind that the first Provider that can provide a source is used!
99+
67100
```dart
68101
final String tmxBody = /* ... */;
69-
final TiledMap mapTmx = TileMapParser.parseTmx(tmxBody, tsxProviders: [SingleTsxProvider(), MultipleTsxProvider()]);
70-
102+
final TiledMap mapTmx = TiledMap.parseTmx(
103+
tmxBody,
104+
tsxProviders: [SingleTsxProvider(), MultipleTsxProvider()],
105+
);
71106
```
72107

73108
### Load Json Files
74109
Alternatively load a json file.
75110
```dart
76111
final String jsonBody = /* ... */;
77-
final TiledMap mapTmx = TileMapParser.parseJson(jsonBody);
112+
final TiledMap mapTmx = TiledMap.parseJson(jsonBody);
78113
```
79114

80115
### Implementation

packages/tiled/lib/src/common/property.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class Property<T> {
3737
case PropertyType.color:
3838
return ColorProperty(
3939
name: name,
40-
value: parser.getColor('value', defaults: ColorData.hex(0x00000000)),
40+
value: parser.getColor('value', defaults: const ColorData.hex(0x00000000)),
4141
hexValue: parser.getString('value', defaults: '#00000000'),
4242
);
4343

packages/tiled/lib/src/parser.dart

+8-21
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,10 @@ class XmlParser extends Parser {
1313

1414
XmlParser(this.element, {super.tsxProviders, super.templateProviders});
1515

16-
factory XmlParser.fromString(
17-
String string, {
18-
List<ParserProvider>? tsxProviders,
19-
List<ParserProvider>? templateProviders,
20-
}) =>
21-
XmlParser(
22-
XmlDocument.parse(string).rootElement,
23-
tsxProviders: tsxProviders,
24-
templateProviders: templateProviders,
25-
);
16+
XmlParser.fromString(String string, {
17+
super.tsxProviders,
18+
super.templateProviders,
19+
}) : element = XmlDocument.parse(string).rootElement;
2620

2721
@override
2822
String? getInnerTextOrNull() =>
@@ -61,7 +55,7 @@ class XmlParser extends Parser {
6155
@override
6256
T formatSpecificParsing<T>(
6357
T Function(JsonParser) json,
64-
T Function(XmlParser) xml,
58+
T Function(XmlParser) xml
6559
) {
6660
return xml(this);
6761
}
@@ -72,16 +66,9 @@ class JsonParser extends Parser {
7266

7367
JsonParser(this.json, {super.tsxProviders, super.templateProviders});
7468

75-
factory JsonParser.fromString(
76-
String string, {
77-
List<ParserProvider>? tsxProviders,
78-
List<ParserProvider>? templateProviders,
79-
}) =>
80-
JsonParser(
81-
jsonDecode(string) as Map<String, dynamic>,
82-
tsxProviders: tsxProviders,
83-
templateProviders: templateProviders,
84-
);
69+
JsonParser.fromString(String string, {
70+
super.tsxProviders, super.templateProviders,
71+
}) : json = jsonDecode(string) as Map<String, dynamic>;
8572

8673
@override
8774
String? getInnerTextOrNull() => null;

packages/tiled/lib/src/template.dart

-4
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,3 @@ class Template {
3434
object: parser.getSingleChildOrNullAs('object', TiledObject.parse),
3535
);
3636
}
37-
38-
class TemplateReference {
39-
40-
}

packages/tiled/lib/src/tiled_map.dart

+5-31
Original file line numberDiff line numberDiff line change
@@ -124,36 +124,6 @@ class TiledMap {
124124
this.properties = CustomProperties.empty,
125125
});
126126

127-
/// Takes a string [contents] and converts it to a [TiledMap] with the help of
128-
/// the [TsxProvider]s returned from the [tsxProviderFunction].
129-
/// The [tsxProviderFunction] is most commonly your static [TsxProvider.parse]
130-
/// implementation.
131-
// TODO: why is this here? same as parseTmx???
132-
// static Future<TiledMap> fromString(
133-
// String contents, {
134-
// List<ParserProvider>? tsxProviders,
135-
// List<ParserProvider>? templateProviders,
136-
// List<ImagePathProvider>? imageProviders,
137-
// }) async {
138-
// final tsxSourcePaths = XmlDocument.parse(contents)
139-
// .rootElement
140-
// .children
141-
// .whereType<XmlElement>()
142-
// .where((element) => element.name.local == 'tileset')
143-
// .map((e) => e.getAttribute('source'));
144-
//
145-
// final tsxProviders = await Future.wait(
146-
// tsxSourcePaths
147-
// .where((key) => key != null)
148-
// .map((key) async => tsxProviderFunction(key!)),
149-
// );
150-
//
151-
// return TileMapParser.parseTmx(
152-
// contents,
153-
// tsxList: tsxProviders.isEmpty ? null : tsxProviders,
154-
// );
155-
// }
156-
157127
// Convenience Methods
158128
Tile? tileByGid(int tileGid) {
159129
if (tileGid == 0) {
@@ -314,7 +284,11 @@ class TiledMap {
314284
);
315285
}
316286

317-
static TiledMap parseJson(
287+
/// Parses the provided json.
288+
///
289+
/// Accepts an optional list of external TsxProviders for external tilesets
290+
/// referenced in the map file.
291+
factory TiledMap.parseJson(
318292
String json, {
319293
List<ParserProvider>? tsxProviders,
320294
List<ParserProvider>? templateProviders,

0 commit comments

Comments
 (0)