Update builder.nim

changed find_closer() to find_closers()
This commit is contained in:
witer33 2020-11-03 16:32:27 +01:00 committed by GitHub
parent 33b928f7e3
commit 656bccd68a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 16 additions and 17 deletions

View File

@ -1,39 +1,38 @@
import cursor, parser, types import cursor, parser, types, tables
type Builder* = ref object of RootObj type Builder* = ref object of RootObj
parser*: Parser parser*: Parser
cursor: Cursor cursor: Cursor
tags: seq[Tag] tags: seq[Tag]
method find_closer(this: Builder, tag: Token): bool {.base.} = method find_closers(this: Builder) {.base.} =
var initial_index = this.cursor.get_index() var initial_index = this.cursor.get_index()
var name = tag.name var opened_tags = initTable[string, seq[Token]]()
var closer_expected = 1
for token in this.cursor.iter(): for token in this.cursor.iter():
if token.kind == TokenType.TagCloser and token.name == name: if token.kind == TokenType.TagOpener:
dec closer_expected if opened_tags.hasKey token.name:
elif token.kind == TokenType.TagOpener and token.name == name: opened_tags[token.name].add(token)
inc closer_expected else:
if closer_expected == 0: opened_tags[token.name] = @[token]
this.cursor.go_to(initial_index) elif token.kind == TokenType.TagCloser:
return true if opened_tags.hasKey(token.name) and len(opened_tags[token.name]) > 0:
opened_tags[token.name][len(opened_tags[token.name]) - 1].self_closing = false
opened_tags[token.name].delete(len(opened_tags[token.name]) - 1)
this.cursor.go_to(initial_index) this.cursor.go_to(initial_index)
return false
method build*(this: Builder) {.base.} = method build*(this: Builder) {.base.} =
this.cursor = Cursor(data: this.parser.tokens) this.cursor = Cursor(data: this.parser.tokens)
this.find_closers()
var opened_tags: seq[Tag] var opened_tags: seq[Tag]
var closer_tag = false
var tag: Tag var tag: Tag
for token in this.cursor.iter(): for token in this.cursor.iter():
if token.kind == TokenType.TagOpener: if token.kind == TokenType.TagOpener:
closer_tag = this.find_closer(token) tag = Tag(name: token.name, args: token.args, level: len(opened_tags), no_closer: token.self_closing, index: len(this.tags))
tag = Tag(name: token.name, args: token.args, level: len(opened_tags), no_closer: not closer_tag, index: len(this.tags)) if not tag.no_closer:
if closer_tag:
opened_tags.add(tag) opened_tags.add(tag)
this.tags.add(tag) this.tags.add(tag)
elif token.kind == TokenType.TagCloser: elif token.kind == TokenType.TagCloser:
if opened_tags[len(opened_tags)-1].name == token.name: if len(opened_tags) > 0 and opened_tags[len(opened_tags)-1].name == token.name:
opened_tags.delete(len(opened_tags)-1) opened_tags.delete(len(opened_tags)-1)
elif token.kind == TokenType.Text: elif token.kind == TokenType.Text:
if len(opened_tags) > 0: if len(opened_tags) > 0: