mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 15:48:51 +00:00
[xml] Allow multi-line bodies w/o CDATA. Strip trailing whitespace.
This commit is contained in:
@@ -27,11 +27,14 @@ print :: proc(writer: io.Writer, doc: ^Document) -> (written: int, err: io.Error
|
|||||||
}
|
}
|
||||||
|
|
||||||
written += wprintf(writer, "[Encoding] %v\n", doc.encoding)
|
written += wprintf(writer, "[Encoding] %v\n", doc.encoding)
|
||||||
|
|
||||||
|
if len(doc.doctype.ident) > 0 {
|
||||||
written += wprintf(writer, "[DOCTYPE] %v\n", doc.doctype.ident)
|
written += wprintf(writer, "[DOCTYPE] %v\n", doc.doctype.ident)
|
||||||
|
|
||||||
if len(doc.doctype.rest) > 0 {
|
if len(doc.doctype.rest) > 0 {
|
||||||
wprintf(writer, "\t%v\n", doc.doctype.rest)
|
wprintf(writer, "\t%v\n", doc.doctype.rest)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if doc.root != nil {
|
if doc.root != nil {
|
||||||
wprintln(writer, " --- ")
|
wprintln(writer, " --- ")
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ scan_identifier :: proc(t: ^Tokenizer) -> string {
|
|||||||
return string(t.src[offset : t.offset])
|
return string(t.src[offset : t.offset])
|
||||||
}
|
}
|
||||||
|
|
||||||
scan_string :: proc(t: ^Tokenizer, offset: int, close: rune = '<', consume_close := false) -> (value: string, err: Error) {
|
scan_string :: proc(t: ^Tokenizer, offset: int, close: rune = '<', consume_close := false, multiline := true) -> (value: string, err: Error) {
|
||||||
err = .None
|
err = .None
|
||||||
in_cdata := false
|
in_cdata := false
|
||||||
|
|
||||||
@@ -238,7 +238,7 @@ scan_string :: proc(t: ^Tokenizer, offset: int, close: rune = '<', consume_close
|
|||||||
}
|
}
|
||||||
|
|
||||||
case '\n':
|
case '\n':
|
||||||
if !in_cdata {
|
if !(multiline || in_cdata) {
|
||||||
error(t, offset, string(t.src[offset : t.offset]))
|
error(t, offset, string(t.src[offset : t.offset]))
|
||||||
error(t, offset, "[scan_string] Not terminated\n")
|
error(t, offset, "[scan_string] Not terminated\n")
|
||||||
err = .Invalid_Tag_Value
|
err = .Invalid_Tag_Value
|
||||||
@@ -256,7 +256,22 @@ scan_string :: proc(t: ^Tokenizer, offset: int, close: rune = '<', consume_close
|
|||||||
advance_rune(t)
|
advance_rune(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Strip trailing whitespace.
|
||||||
|
*/
|
||||||
lit := string(t.src[offset : t.offset])
|
lit := string(t.src[offset : t.offset])
|
||||||
|
|
||||||
|
end := len(lit)
|
||||||
|
eat: for ; end > 0; end -= 1 {
|
||||||
|
ch := lit[end - 1]
|
||||||
|
switch ch {
|
||||||
|
case ' ', '\t', '\r', '\n':
|
||||||
|
case:
|
||||||
|
break eat
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lit = lit[:end]
|
||||||
|
|
||||||
if consume_close {
|
if consume_close {
|
||||||
advance_rune(t)
|
advance_rune(t)
|
||||||
}
|
}
|
||||||
@@ -307,7 +322,7 @@ scan :: proc(t: ^Tokenizer) -> Token {
|
|||||||
case ':': kind = .Colon
|
case ':': kind = .Colon
|
||||||
|
|
||||||
case '"', '\'':
|
case '"', '\'':
|
||||||
lit, err = scan_string(t, t.offset, ch, true)
|
lit, err = scan_string(t, t.offset, ch, true, false)
|
||||||
if err == .None {
|
if err == .None {
|
||||||
kind = .String
|
kind = .String
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user