OLD | NEW |
1 Parsing | 1 Parsing |
2 ======= | 2 ======= |
3 | 3 |
4 Parsing in Sky is a strict pipeline consisting of five stages: | 4 Parsing in Sky is a strict pipeline consisting of five stages: |
5 | 5 |
6 - decoding, which converts incoming bytes into Unicode characters | 6 - decoding, which converts incoming bytes into Unicode characters |
7 using UTF-8. | 7 using UTF-8. |
8 | 8 |
9 - normalising, which manipulates the sequence of characters. | 9 - normalising, which manipulates the sequence of characters. |
10 | 10 |
(...skipping 765 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
776 | 776 |
777 If the token is a start tag token, notify the JavaScript token stream | 777 If the token is a start tag token, notify the JavaScript token stream |
778 callback of the token. | 778 callback of the token. |
779 | 779 |
780 Then, pass the tokens to the tree construction stage. | 780 Then, pass the tokens to the tree construction stage. |
781 | 781 |
782 | 782 |
783 Tree construction stage | 783 Tree construction stage |
784 ----------------------- | 784 ----------------------- |
785 | 785 |
786 To construct a node tree from a _sequence of tokens_ and a document | 786 To construct a node tree from a _sequence of tokens_ and an element |
787 _document_ (this is implemented in JS): | 787 tree rooted at a `Root` node _root_ (this is implemented in JS): |
788 | 788 |
789 1. Initialize the _stack of open nodes_ to be _document_. | 789 1. Initialize the _stack of open nodes_ to be _root_. |
790 2. Initialize _imported modules_ to an empty list. | 790 2. Initialize _imported modules_ to an empty list. |
791 3. Consider each token _token_ in the _sequence of tokens_ in turn, as | 791 3. Consider each token _token_ in the _sequence of tokens_ in turn, as |
792 follows. If a token is to be skipped, then jump straight to the | 792 follows. If a token is to be skipped, then jump straight to the |
793 next token, without doing any more work with the skipped token. | 793 next token, without doing any more work with the skipped token. |
794 - If _token_ is a string token, | 794 - If _token_ is a string token, |
795 1. If the value of the token contains only U+0020 and U+000A | 795 1. If the value of the token contains only U+0020 and U+000A |
796 characters, and there is no ``t`` element on the _stack of | 796 characters, and there is no ``t`` element on the _stack of |
797 open nodes_, then skip the token. | 797 open nodes_, then skip the token. |
798 2. Create a text node _node_ whose character data is the value of | 798 2. Create a text node _node_ whose character data is the value of |
799 the token. | 799 the token. |
800 3. Append _node_ to the top node in the _stack of open nodes_. | 800 3. Append _node_ to the top node in the _stack of open nodes_. |
801 - If _token_ is a start tag token, | 801 - If _token_ is a start tag token, |
802 1. If the tag name isn't a registered tag name, then yield until | 802 1. If the tag name isn't a registered tag name, then yield until |
803 _imported modules_ contains no entries with unresolved | 803 _imported modules_ contains no entries with unresolved |
804 promises. | 804 promises. |
805 2. If the tag name is not registered, then let the ErrorElement | 805 2. If the tag name is not registered, then let the ErrorElement |
806 constructor from dart:sky be the element constructor. | 806 constructor from dart:sky be the element constructor. |
807 Otherwise, let the element constructor be the registered | 807 Otherwise, let the element constructor be the registered |
808 element's constructor for that tag name in this module. | 808 element's constructor for that tag name in this module. |
809 3. Create an element _node_ with the attributes given by the | 809 3. Create an element _node_ with the attributes given by the |
810 token by calling the constructor. | 810 token by calling the constructor. |
811 4. If _node_ is not an Element object, then let the constructor | 811 4. If _node_ is not an Element object, then let the constructor |
812 be the ErrorElement constructor and return to the previous | 812 be the ErrorElement constructor and return to the previous |
813 step. | 813 step. |
814 5. Append _node_ to the top node in the _stack of open nodes_. | 814 5. Append _node_ to the top node in the _stack of open nodes_. |
815 6. Push _node_ onto the top of the _stack of open nodes_. | 815 6. Push _node_ onto the top of the _stack of open nodes_. |
816 7. If _node_ is a ``template`` element, then: | 816 7. If _node_ is a ``template`` element, then: |
817 1. Let _fragment_ be the ``DocumentFragment`` object that the | 817 1. Let _fragment_ be the ``Fragment`` object that the |
818 ``template`` element uses as its template contents container. | 818 ``template`` element uses as its template contents |
| 819 container. |
819 2. Push _fragment_ onto the top of the _stack of open nodes_. | 820 2. Push _fragment_ onto the top of the _stack of open nodes_. |
820 If _node_ is an ``import`` element, then: | 821 If _node_ is an ``import`` element, then: |
821 1. Let ``url`` be the value of _node_'s ``src`` attribute. | 822 1. Let ``url`` be the value of _node_'s ``src`` attribute. |
822 2. Call ``parsing context``'s ``importModule()`` method, | 823 2. Call ``parsing context``'s ``importModule()`` method, |
823 passing it ``url``. | 824 passing it ``url``. |
824 3. Add the returned promise to _imported modules_; if _node_ | 825 3. Add the returned promise to _imported modules_; if _node_ |
825 has an ``as`` attribute, associate the entry with that | 826 has an ``as`` attribute, associate the entry with that |
826 name. | 827 name. |
827 - If _token_ is an end tag token: | 828 - If _token_ is an end tag token: |
828 1. If the tag name is registered, let _tag name_ be that tag | 829 1. If the tag name is registered, let _tag name_ be that tag |
829 name. Otherwise, let _tag name_ be "error". | 830 name. Otherwise, let _tag name_ be "error". |
830 2. Let _node_ be the topmost node in the _stack of open nodes_ | 831 2. Let _node_ be the topmost node in the _stack of open nodes_ |
831 whose tag name is _tag name_, if any. If there isn't one, skip | 832 whose tag name is _tag name_, if any. If there isn't one, skip |
832 this token. | 833 this token. |
833 3. If there's a ``template`` element in the _stack of open | 834 3. If there's a ``template`` element in the _stack of open |
834 nodes_ above _node_, then skip this token. | 835 nodes_ above _node_, then skip this token. |
835 4. Pop nodes from the _stack of open nodes_ until _node_ has been | 836 4. Pop nodes from the _stack of open nodes_ until _node_ has been |
836 popped. | 837 popped. |
837 5. If _node_'s tag name is ``script``, then yield until _imported | 838 5. If _node_'s tag name is ``script``, then yield until _imported |
838 modules_ contains no entries with unresolved promises, then | 839 modules_ contains no entries with unresolved promises, then |
839 execute the script given by the element's contents, using the | 840 execute the script given by the element's contents, using the |
840 associated names as appropriate. | 841 associated names as appropriate. |
841 - If _token_ is an automatic end tag token: | 842 - If _token_ is an automatic end tag token: |
842 1. Pop the top node from the _stack of open nodes_, unless it is | 843 1. Pop the top node from the _stack of open nodes_, unless it is |
843 the document. | 844 the _root_ node. |
844 4. Yield until _imported modules_ has no promises. | 845 4. Yield until _imported modules_ has no promises. |
845 5. Fire a ``load`` event at the _parsing context_ object. | 846 5. Fire a ``load`` event at the _parsing context_ object. |
OLD | NEW |