feat: Added standalone property and tweaked xmldecl parsing
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				test / test (push) Has been cancelled
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	test / test (push) Has been cancelled
				
			This commit is contained in:
		@@ -1,16 +1,16 @@
 | 
			
		||||
import gleam/option.{type Option, None}
 | 
			
		||||
import gleam/result
 | 
			
		||||
 | 
			
		||||
pub type Declaration {
 | 
			
		||||
  Declaration(versioninfo: String, encoding: String)
 | 
			
		||||
  Declaration(versioninfo: String, encoding: String, standalone: Bool)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub type DocType {
 | 
			
		||||
  None
 | 
			
		||||
  DocType(name: String)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub type Document {
 | 
			
		||||
  Document(decl: Declaration, doctype: DocType)
 | 
			
		||||
  Document(decl: Declaration, doctype: Option(DocType))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn main() {
 | 
			
		||||
@@ -23,8 +23,13 @@ fn parse_document(doc: String) -> Result(Document, Nil) {
 | 
			
		||||
  Ok(Document(decl, doctype))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn parse_prolog(doc: String) -> Result(#(Declaration, DocType, String), Nil) {
 | 
			
		||||
  use #(decl, doc) <- result.try(parse_decl(doc))
 | 
			
		||||
fn parse_prolog(
 | 
			
		||||
  doc: String,
 | 
			
		||||
) -> Result(#(Declaration, Option(DocType), String), Nil) {
 | 
			
		||||
  let #(decl, doc) = case parse_decl(doc) {
 | 
			
		||||
    Ok(#(decl, doc)) -> #(decl, doc)
 | 
			
		||||
    _ -> #(Declaration("1.0", "UTF-8", False), doc)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Ok(#(decl, None, doc))
 | 
			
		||||
}
 | 
			
		||||
@@ -37,9 +42,14 @@ fn parse_decl(doc: String) -> Result(#(Declaration, String), Nil) {
 | 
			
		||||
        Ok(e) -> e
 | 
			
		||||
        Error(_) -> #("", doc)
 | 
			
		||||
      }
 | 
			
		||||
      let #(standalone, doc) = case parse_standalone(doc) {
 | 
			
		||||
        Ok(e) -> e
 | 
			
		||||
        Error(_) -> #(False, doc)
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      case trim_space(doc) {
 | 
			
		||||
        "?>" <> tail -> Ok(#(Declaration(versioninfo:, encoding:), tail))
 | 
			
		||||
        "?>" <> tail ->
 | 
			
		||||
          Ok(#(Declaration(versioninfo:, encoding:, standalone:), tail))
 | 
			
		||||
        _ -> Error(Nil)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
@@ -142,6 +152,17 @@ fn parse_encoding(doc: String) -> Result(#(String, String), Nil) {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn parse_standalone(doc: String) -> Result(#(Bool, String), Nil) {
 | 
			
		||||
  use #(_, doc) <- result.try(parse_space(doc))
 | 
			
		||||
 | 
			
		||||
  case doc {
 | 
			
		||||
    "standalone=\"yes\"" <> tail | "standalone='yes'" <> tail ->
 | 
			
		||||
      Ok(#(True, tail))
 | 
			
		||||
    "standalone=\"no\"" <> tail | "standalone='no'" <> tail -> Ok(#(True, tail))
 | 
			
		||||
    _ -> Error(Nil)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn do_parse_digit(doc: String) -> Result(#(String, String), Nil) {
 | 
			
		||||
  case doc {
 | 
			
		||||
    "0" as digit <> tail
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user