Index: pkg/third_party/html5lib/lib/parser_console.dart |
diff --git a/pkg/third_party/html5lib/lib/parser_console.dart b/pkg/third_party/html5lib/lib/parser_console.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7858ab2e0b7b2824456cff03cdc5983782c9083a |
--- /dev/null |
+++ b/pkg/third_party/html5lib/lib/parser_console.dart |
@@ -0,0 +1,46 @@ |
+/** |
+ * This library adds `dart:io` support to the HTML5 parser. Call |
+ * [initDartIOSupport] before calling the [parse] methods and they will accept |
+ * a [RandomAccessFile] as input, in addition to the other input types. |
+ */ |
+library parser_console; |
+ |
+import 'dart:io'; |
+import 'parser.dart'; |
+import 'src/inputstream.dart' as inputstream; |
+ |
+/** |
+ * Adds support to the [HtmlParser] for running on a console VM. In particular |
+ * this means it will be able to handle `dart:io` and [RandomAccessFile]s as |
+ * input to the various [parse] methods. |
+ */ |
+void useConsole() { |
+ inputstream.consoleSupport = new _ConsoleSupport(); |
+} |
+ |
+class _ConsoleSupport extends inputstream.ConsoleSupport { |
+ List<int> bytesFromFile(source) { |
+ if (source is! RandomAccessFile) return null; |
+ return readAllBytesFromFile(source); |
+ } |
+} |
+ |
+// TODO(jmesserly): this should be `RandomAccessFile.readAllBytes`. |
+/** Synchronously reads all bytes from the [file]. */ |
+List<int> readAllBytesFromFile(RandomAccessFile file) { |
+ int length = file.lengthSync(); |
+ var bytes = new List<int>(length); |
+ |
+ int bytesRead = 0; |
+ while (bytesRead < length) { |
+ int read = file.readIntoSync(bytes, bytesRead, length - bytesRead); |
+ if (read <= 0) { |
+ // This could happen if, for example, the file was resized while |
+ // we're reading. Just shrink the bytes array and move on. |
+ bytes = bytes.sublist(0, bytesRead); |
+ break; |
+ } |
+ bytesRead += read; |
+ } |
+ return bytes; |
+} |