OLD | NEW |
| (Empty) |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 library trydart.htmlToText; | |
6 | |
7 import 'dart:math' show | |
8 max; | |
9 | |
10 import 'dart:html' show | |
11 CharacterData, | |
12 Element, | |
13 Node, | |
14 NodeFilter, | |
15 ShadowRoot, | |
16 TreeWalker; | |
17 | |
18 import 'selection.dart' show | |
19 TrySelection; | |
20 | |
21 import 'shadow_root.dart' show | |
22 WALKER_NEXT, | |
23 WALKER_SKIP_NODE, | |
24 walkNodes; | |
25 | |
26 /// Returns true if [node] is a block element, that is, not inline. | |
27 bool isBlockElement(Node node) { | |
28 if (node is! Element) return false; | |
29 Element element = node; | |
30 | |
31 // TODO(ahe): Remove this line by changing code completion to avoid using a | |
32 // div element. | |
33 if (element.classes.contains('dart-code-completion')) return false; | |
34 | |
35 var display = element.getComputedStyle().display; | |
36 return display != 'inline' && display != 'none'; | |
37 } | |
38 | |
39 /// Writes the text of [root] to [buffer]. Keeps track of [selection] and | |
40 /// returns the new anchorOffset from beginning of [buffer] or -1 if the | |
41 /// selection isn't in [root]. | |
42 int htmlToText(Node root, | |
43 StringBuffer buffer, | |
44 TrySelection selection, | |
45 {bool treatRootAsInline: false}) { | |
46 int selectionOffset = -1; | |
47 walkNodes(root, (Node node) { | |
48 if (selection.anchorNode == node) { | |
49 selectionOffset = selection.anchorOffset + buffer.length; | |
50 } | |
51 switch (node.nodeType) { | |
52 case Node.CDATA_SECTION_NODE: | |
53 case Node.TEXT_NODE: | |
54 CharacterData text = node; | |
55 buffer.write(text.data.replaceAll('\xA0', ' ')); | |
56 break; | |
57 | |
58 default: | |
59 if (node.nodeName == 'BR') { | |
60 buffer.write('\n'); | |
61 } else if (node != root && isBlockElement(node)) { | |
62 selectionOffset = | |
63 max(selectionOffset, htmlToText(node, buffer, selection)); | |
64 return WALKER_SKIP_NODE; | |
65 } | |
66 break; | |
67 } | |
68 | |
69 return WALKER_NEXT; | |
70 }); | |
71 | |
72 if (!treatRootAsInline && isBlockElement(root)) { | |
73 buffer.write('\n'); | |
74 } | |
75 | |
76 return selectionOffset; | |
77 } | |
OLD | NEW |