| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:flutter/services.dart'; |
| |
| const String _kStartTag = '// START '; |
| const String _kEndTag = '// END'; |
| |
| Map<String?, String>? _exampleCode; |
| |
| Future<String?> getExampleCode(String? tag, AssetBundle bundle) async { |
| if (_exampleCode == null) { |
| await _parseExampleCode(bundle); |
| } |
| return _exampleCode![tag]; |
| } |
| |
| Future<void> _parseExampleCode(AssetBundle bundle) async { |
| final String code = await bundle.loadString('lib/gallery/example_code.dart'); |
| _exampleCode = <String?, String>{}; |
| |
| final List<String> lines = code.split('\n'); |
| |
| List<String>? codeBlock; |
| String? codeTag; |
| |
| for (final String line in lines) { |
| if (codeBlock == null) { |
| // Outside a block. |
| if (line.startsWith(_kStartTag)) { |
| // Starting a new code block. |
| codeBlock = <String>[]; |
| codeTag = line.substring(_kStartTag.length).trim(); |
| } else { |
| // Just skipping the line. |
| } |
| } else { |
| // Inside a block. |
| if (line.startsWith(_kEndTag)) { |
| // Add the block. |
| _exampleCode![codeTag] = codeBlock.join('\n'); |
| codeBlock = null; |
| codeTag = null; |
| } else { |
| // Add to the current block |
| // trimRight() to remove any \r on Windows |
| // without removing any useful indentation |
| codeBlock.add(line.trimRight()); |
| } |
| } |
| } |
| } |