Skip to content

Commit 9d129c9

Browse files
author
benni-tec
committed
generalized provider (ready for templates)
1 parent 2e27ba1 commit 9d129c9

19 files changed

+163
-165
lines changed

packages/tiled/lib/src/parser.dart

+7
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@ class ParsingException implements Exception {
44
final String name;
55
final String? valueFound;
66
final String reason;
7+
78
ParsingException(this.name, this.valueFound, this.reason);
89
}
910

1011
class XmlParser extends Parser {
1112
final XmlElement element;
13+
1214
XmlParser(this.element);
1315

16+
factory XmlParser.fromString(String string) =>
17+
XmlParser(XmlDocument.parse(string).rootElement);
18+
1419
@override
1520
String? getInnerTextOrNull() =>
1621
element.innerText.isEmpty ? null : element.innerText;
@@ -48,7 +53,9 @@ class XmlParser extends Parser {
4853

4954
class JsonParser extends Parser {
5055
final Map<String, dynamic> json;
56+
5157
JsonParser(this.json);
58+
factory JsonParser.fromString(String string) => JsonParser(jsonDecode(string) as Map<String, dynamic>);
5259

5360
@override
5461
String? getInnerTextOrNull() => null;

packages/tiled/lib/src/provider.dart

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
part of tiled;
2+
3+
abstract class Provider<T> {
4+
bool canProvide(String filename);
5+
6+
T getSource(String filename);
7+
T? getCachedSource(String filename);
8+
}
9+
10+
typedef ParserProvider = Provider<Parser>;
11+
typedef ImagePathProvider = Provider<String>;

packages/tiled/lib/src/tile_map_parser.dart

-21
This file was deleted.

packages/tiled/lib/src/tiled_map.dart

+62-26
Original file line numberDiff line numberDiff line change
@@ -128,28 +128,31 @@ class TiledMap {
128128
/// the [TsxProvider]s returned from the [tsxProviderFunction].
129129
/// The [tsxProviderFunction] is most commonly your static [TsxProvider.parse]
130130
/// implementation.
131-
static Future<TiledMap> fromString(
132-
String contents,
133-
Future<TsxProvider> Function(String key) tsxProviderFunction,
134-
) async {
135-
final tsxSourcePaths = XmlDocument.parse(contents)
136-
.rootElement
137-
.children
138-
.whereType<XmlElement>()
139-
.where((element) => element.name.local == 'tileset')
140-
.map((e) => e.getAttribute('source'));
141-
142-
final tsxProviders = await Future.wait(
143-
tsxSourcePaths
144-
.where((key) => key != null)
145-
.map((key) async => tsxProviderFunction(key!)),
146-
);
147-
148-
return TileMapParser.parseTmx(
149-
contents,
150-
tsxList: tsxProviders.isEmpty ? null : tsxProviders,
151-
);
152-
}
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+
// }
153156

154157
// Convenience Methods
155158
Tile? tileByGid(int tileGid) {
@@ -311,7 +314,40 @@ class TiledMap {
311314
);
312315
}
313316

314-
factory TiledMap.parse(Parser parser, {List<TsxProviderBase>? tsxList}) {
317+
static TiledMap parseJson(String json) {
318+
final parser = JsonParser(jsonDecode(json) as Map<String, dynamic>);
319+
return TiledMap.parse(parser);
320+
}
321+
322+
/// Parses the provided map xml.
323+
///
324+
/// Accepts an optional list of external TsxProviders for external tilesets
325+
/// referenced in the map file.
326+
static TiledMap parseTmx(
327+
String xml, {
328+
List<ParserProvider>? tsxProviders,
329+
List<ParserProvider>? templateProviders,
330+
List<ImagePathProvider>? imageProviders,
331+
}) {
332+
final xmlElement = XmlDocument.parse(xml).rootElement;
333+
if (xmlElement.name.local != 'map') {
334+
throw 'XML is not in TMX format';
335+
}
336+
final parser = XmlParser(xmlElement);
337+
return TiledMap.parse(
338+
parser,
339+
tsxProviders: tsxProviders,
340+
templateProviders: templateProviders,
341+
imageProviders: imageProviders,
342+
);
343+
}
344+
345+
factory TiledMap.parse(
346+
Parser parser, {
347+
List<ParserProvider>? tsxProviders,
348+
List<ParserProvider>? templateProviders,
349+
List<ImagePathProvider>? imageProviders,
350+
}) {
315351
final backgroundColorHex = parser.getStringOrNull('backgroundcolor');
316352
final backgroundColor = parser.getColorOrNull('backgroundcolor');
317353
final compressionLevel = parser.getInt('compressionlevel', defaults: -1);
@@ -338,11 +374,11 @@ class TiledMap {
338374
'tileset',
339375
(tilesetData) {
340376
final tilesetSource = tilesetData.getStringOrNull('source');
341-
if (tilesetSource == null || tsxList == null) {
377+
if (tilesetSource == null || tsxProviders == null) {
342378
return Tileset.parse(tilesetData);
343379
}
344-
final matchingTsx = tsxList.where(
345-
(tsx) => tsx.checkProvidable(tilesetSource),
380+
final matchingTsx = tsxProviders.where(
381+
(tsx) => tsx.canProvide(tilesetSource),
346382
);
347383

348384
return Tileset.parse(

packages/tiled/lib/src/tileset/tileset.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class Tileset {
103103
tileCount = this.tiles.length;
104104
}
105105

106-
factory Tileset.parse(Parser parser, {TsxProviderBase? tsx}) {
106+
factory Tileset.parse(Parser parser, {ParserProvider? tsx}) {
107107
final backgroundColor = parser.getStringOrNull('backgroundcolor');
108108
final columns = parser.getIntOrNull('columns');
109109
final firstGid = parser.getIntOrNull('firstgid');
@@ -169,10 +169,10 @@ class Tileset {
169169
return result;
170170
}
171171

172-
void _checkIfExternalTsx(String? source, TsxProviderBase? tsx) {
172+
void _checkIfExternalTsx(String? source, ParserProvider? tsx) {
173173
if (tsx != null && source != null) {
174174
final tileset = Tileset.parse(
175-
tsx.getCachedSourceBase(source) ?? tsx.getSourceBase(source),
175+
tsx.getCachedSource(source) ?? tsx.getSource(source),
176176
);
177177
// Copy attributes if not null
178178
backgroundColor = tileset.backgroundColor ?? backgroundColor;

packages/tiled/lib/src/tsx_provider.dart

-46
This file was deleted.

packages/tiled/lib/tiled.dart

+2-3
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ part 'src/layer.dart';
2626
part 'src/objects/text.dart';
2727
part 'src/objects/tiled_object.dart';
2828
part 'src/parser.dart';
29+
part 'src/provider.dart';
2930
part 'src/template.dart';
30-
part 'src/tile_map_parser.dart';
3131
part 'src/tiled_map.dart';
3232
part 'src/tileset/grid.dart';
3333
part 'src/tileset/terrain.dart';
@@ -36,5 +36,4 @@ part 'src/tileset/tile_offset.dart';
3636
part 'src/tileset/tileset.dart';
3737
part 'src/tileset/wang/wang_color.dart';
3838
part 'src/tileset/wang/wang_set.dart';
39-
part 'src/tileset/wang/wang_tile.dart';
40-
part 'src/tsx_provider.dart';
39+
part 'src/tileset/wang/wang_tile.dart';

packages/tiled/pubspec.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@ dev_dependencies:
1616
dartdoc: ^8.3.1
1717
flame_lint: ^1.1.2
1818
test: ^1.24.8
19+
path: ^1.8.3

packages/tiled/test/complexmap_infinite_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ void main() {
1010
return File('./test/fixtures/complexmap_infinite.tmx')
1111
.readAsString()
1212
.then((xml) {
13-
complexMapInfinite = TileMapParser.parseTmx(xml);
13+
complexMapInfinite = TiledMap.parseTmx(xml);
1414
});
1515
});
1616

packages/tiled/test/image_layer_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ void main() {
77
late TiledMap map;
88
setUp(() {
99
return File('./test/fixtures/imagelayer.tmx').readAsString().then((xml) {
10-
map = TileMapParser.parseTmx(xml);
10+
map = TiledMap.parseTmx(xml);
1111
});
1212
});
1313

packages/tiled/test/isometric_staggered_test.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ void main() {
1111
return File('./test/fixtures/isometric_staggered_grass_and_water.json')
1212
.readAsString()
1313
.then((xml) {
14-
mapIsoStaggeredJson = TileMapParser.parseJson(xml);
14+
mapIsoStaggeredJson = TiledMap.parseJson(xml);
1515
});
1616
});
1717
setUp(() {
1818
return File('./test/fixtures/isometric_staggered_grass_and_water.tmx')
1919
.readAsString()
2020
.then((xml) {
21-
mapIsoStaggeredTmx = TileMapParser.parseTmx(xml);
21+
mapIsoStaggeredTmx = TiledMap.parseTmx(xml);
2222
});
2323
});
2424

packages/tiled/test/isometric_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ void main() {
1010
return File('./test/fixtures/isometric_grass_and_water.tmx')
1111
.readAsString()
1212
.then((xml) {
13-
mapIso = TileMapParser.parseTmx(xml);
13+
mapIso = TiledMap.parseTmx(xml);
1414
});
1515
});
1616

packages/tiled/test/layer_test.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ void main() {
99

1010
setUp(() {
1111
final f1 = File('./test/fixtures/test.tmx').readAsString().then((xml) {
12-
mapTmx = TileMapParser.parseTmx(xml);
12+
mapTmx = TiledMap.parseTmx(xml);
1313
});
1414
final f2 =
1515
File('./test/fixtures/test_base64_gzip.tmx').readAsString().then((xml) {
16-
mapTmxBase64Gzip = TileMapParser.parseTmx(xml);
16+
mapTmxBase64Gzip = TiledMap.parseTmx(xml);
1717
});
1818

1919
return Future.wait([f1, f2]);

packages/tiled/test/object_group_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ void main() {
77
late TiledMap map;
88
setUp(() {
99
return File('./test/fixtures/objectgroup.tmx').readAsString().then((xml) {
10-
map = TileMapParser.parseTmx(xml);
10+
map = TiledMap.parseTmx(xml);
1111
});
1212
});
1313

packages/tiled/test/overflow_bug_test.dart

+1-5
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,7 @@ void main() {
1111
setUp(() {
1212
return File('./test/fixtures/testoverflow_csv.tmx').readAsString().then(
1313
(mapString) {
14-
return TiledMap.fromString(mapString, TsxProvider.parse).then(
15-
(parsedMap) {
16-
map = parsedMap;
17-
},
18-
);
14+
map = TiledMap.parseTmx(mapString);
1915
},
2016
);
2117
});

0 commit comments

Comments
 (0)