| 95 | } |
| 96 | |
| 97 | func (s *scanner) Next() bool { |
| 98 | if s.rewind { |
| 99 | s.rewind = false |
| 100 | return true |
| 101 | } |
| 102 | |
| 103 | for { |
| 104 | if !s.scanToken() { |
| 105 | return false |
| 106 | } |
| 107 | switch s.t.ID { |
| 108 | case text: |
| 109 | if s.stripToNewLine { |
| 110 | s.t.Value = tailOfLine.ReplaceAll(s.t.Value, nil) |
| 111 | s.stripToNewLine = false |
| 112 | } |
| 113 | if len(s.t.Value) == 0 { |
| 114 | // skip empty text |
| 115 | continue |
| 116 | } |
| 117 | case tagName: |
| 118 | switch string(s.t.Value) { |
| 119 | case "comment": |
| 120 | if !s.skipComment() { |
| 121 | return false |
| 122 | } |
| 123 | continue |
| 124 | case "plain": |
| 125 | if !s.readPlain() { |
| 126 | return false |
| 127 | } |
| 128 | if len(s.t.Value) == 0 { |
| 129 | // skip empty text |
| 130 | continue |
| 131 | } |
| 132 | case "collapsespace": |
| 133 | if !s.readTagContents() { |
| 134 | return false |
| 135 | } |
| 136 | s.collapseSpaceDepth++ |
| 137 | continue |
| 138 | case "stripspace": |
| 139 | if !s.readTagContents() { |
| 140 | return false |
| 141 | } |
| 142 | s.stripSpaceDepth++ |
| 143 | continue |
| 144 | case "endcollapsespace": |
| 145 | if s.collapseSpaceDepth == 0 { |
| 146 | s.err = fmt.Errorf("endcollapsespace tag found without the corresponding collapsespace tag") |
| 147 | return false |
| 148 | } |
| 149 | if !s.readTagContents() { |
| 150 | return false |
| 151 | } |
| 152 | s.collapseSpaceDepth-- |
| 153 | continue |
| 154 | case "endstripspace": |