| // Copyright 2016 The Chromium 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 'dart:async'; |
| |
| 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') ?? |
| '// lib/gallery/example_code.dart not found\n'; |
| _exampleCode = <String, String>{}; |
| |
| final List<String> lines = code.split('\n'); |
| |
| List<String> codeBlock; |
| String codeTag; |
| |
| for (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()); |
| } |
| } |
| } |
| } |