Bump to 1.14.1
[platform/upstream/augeas.git] / lenses / xml.aug
index 1bcdc6a..342b13b 100644 (file)
@@ -13,18 +13,18 @@ autoload xfm
  *************************************************************************)
 
 let dels (s:string)   = del s s
-let spc               = /[ \t\n]+/
-let osp               = /[ \t\n]*/
-let sep_spc           = del /[ \t\n]+/ " "
-let sep_osp           = del /[ \t\n]*/ ""
-let sep_eq            = del /[ \t\n]*=[ \t\n]*/ "="
+let spc               = /[ \t\r\n]+/
+let osp               = /[ \t\r\n]*/
+let sep_spc           = del /[ \t\r\n]+/ " "
+let sep_osp           = del /[ \t\r\n]*/ ""
+let sep_eq            = del /[ \t\r\n]*=[ \t\r\n]*/ "="
 
 let nmtoken             = /[a-zA-Z:_][a-zA-Z0-9:_.-]*/
 let word                = /[a-zA-Z][a-zA-Z0-9._-]*/
-let char                = /.|\n/
+let char                = /.|(\r?\n)/
 (* if we hide the quotes, then we can only accept single or double quotes *)
 (* otherwise a put ambiguity is raised *)
-let sto_dquote          = dels "\"" . store /[^"]*/ . dels "\""
+let sto_dquote          = dels "\"" . store /[^"]*/ . dels "\"" (* " *)
 let sto_squote          = dels "'" . store /[^']*/ . dels "'"
 
 let comment             = [ label "#comment" .
@@ -34,7 +34,7 @@ let comment             = [ label "#comment" .
 
 let pi_target           = nmtoken - /[Xx][Mm][Ll]/
 let empty               = Util.empty
-let del_end             = del />[\n]?/ ">\n"
+let del_end             = del />[\r?\n]?/ ">\n"
 let del_end_simple      = dels ">"
 
 (* This is siplified version of processing instruction
@@ -42,7 +42,7 @@ let del_end_simple      = dels ">"
  * must not contain "?>". We restrict too much by not allowing any
  * "?" nor ">" in PI
  *)
-let pi                  = /[^ \n\t]|[^ \n\t][^?>]*[^ \n\t]/
+let pi                  = /[^ \r\n\t]|[^ \r\n\t][^?>]*[^ \r\n\t]/
 
 (************************************************************************
  *                            Attributes
@@ -53,7 +53,7 @@ let decl          = [ label "#decl" . sep_spc .
                       store /[^> \t\n\r]|[^> \t\n\r][^>\t\n\r]*[^> \t\n\r]/ ]
 
 let decl_def (r:regexp) (b:lens) = [ dels "<" . key r .
-                                     sep_spc . store word .
+                                     sep_spc . store nmtoken .
                                      b . sep_osp . del_end_simple ]
 
 let elem_def      = decl_def /!ELEMENT/ decl
@@ -74,11 +74,17 @@ let att_def       = counter "att_id" .
                       [ label "#name" . store word . sep_spc ] .
                       [ label "#type" . store att_type . sep_spc ] .
                       ([ key   /#REQUIRED|#IMPLIED/ ] |
-                       [ label "#FIXED" . del /#FIXED[ \n\t]*|/ "" . sto_dquote ]) ]*
+                       [ label "#FIXED" . del /#FIXED[ \r\n\t]*|/ "" . sto_dquote ]) ]*
 
 let att_list_def = decl_def /!ATTLIST/ att_def
 
-let entity_def    = decl_def /!ENTITY/ ([sep_spc . label "#decl" . sto_dquote ])
+let entity_def   =
+  let literal (lbl:string) = [ sep_spc . label lbl . sto_dquote ] in
+  decl_def /!ENTITY/
+    ( literal "#decl"
+    | [ sep_spc . key /SYSTEM/ . literal "#systemliteral" ]
+    | [ sep_spc . key /PUBLIC/ . literal "#pubidliteral"
+                               . literal "#systemliteral" ] )
 
 let decl_def_item = elem_def | entity_def | att_list_def | notation_def
 
@@ -89,8 +95,24 @@ let decl_outer    = sep_osp . del /\[[ \n\t\r]*/ "[\n" .
 
 let doctype       = decl_def /!DOCTYPE/ (decl_outer|id_def)
 
-let attributes    = [ label "#attribute" .
-                      [ sep_spc . key nmtoken . sep_eq . sto_dquote ]+ ]
+(* General shape of an attribute
+ * q   is the regexp matching the quote character for the value
+ * qd  is the default quote character
+ * brx is what the actual attribute value must match *)
+let attval (q:regexp) (qd:string) (brx:regexp) =
+  let quote = del q qd in
+  let body = store brx in
+  [ sep_spc . key nmtoken . sep_eq . square quote body quote ]
+
+(* We treat attributes according to one of the following three patterns:
+   attval1 : values that must be quoted with single quotes
+   attval2 : values that must be quoted with double quotes
+   attval3 : values that can be quoted with either *)
+let attributes    =
+  let attval1 = attval "'" "'" /[^']*"[^']*/ in (* " *)
+  let attval2 = attval "\"" "\"" /[^"]*'[^"]*/ in
+  let attval3 = attval /['"]/ "\"" /(\\\\|[^'\"])*/ in (* " *)
+  [ label "#attribute" . (attval1|attval2|attval3)+ ]
 
 let prolog        = [ label "#declaration" .
                       dels "<?xml" .
@@ -109,12 +131,16 @@ let text      = [ label "#text" . store text_re ]
 let cdata     = [ label "#CDATA" . dels "<![CDATA[" .
                   store (char* - (char* . "]]>" . char*)) . dels "]]>" ]
 
+(* the value of nmtoken_del is always the nmtoken_key string *)
+let nmtoken_key = key nmtoken
+let nmtoken_del = del nmtoken "a"
+
 let element (body:lens) =
     let h = attributes? . sep_osp . dels ">" . body* . dels "</" in
-        [ dels "<" . square nmtoken h . sep_osp . del_end ]
+        [ dels "<" . square nmtoken_key h nmtoken_del . sep_osp . del_end ]
 
-let empty_element = [ dels "<" . key nmtoken . value "#empty" .
-                      attributes? . sep_osp . del /\/>[\n]?/ "/>\n" ]
+let empty_element = [ dels "<" . nmtoken_key . value "#empty" .
+                      attributes? . sep_osp . del /\/>[\r?\n]?/ "/>\n" ]
 
 let pi_instruction = [ dels "<?" . label "#pi" .
                        [ label "#target" . store pi_target ] .
@@ -127,17 +153,16 @@ let content1 = element text
 let rec content2 = element (content1|text|comment)
 *)
 
-let rec content = element (text|comment|content|empty_element|pi_instruction)
+let rec content = element (text|comment|content|empty_element|pi_instruction|cdata)
 
 (* Constraints are weaker here, but it's better than being too strict *)
 let doc = (sep_osp . (prolog  | comment | doctype | pi_instruction))* .
           ((sep_osp . content) | (sep_osp . empty_element)) .
           (sep_osp . (comment | pi_instruction ))* . sep_osp
 
-let lns = doc
+let lns = doc | Util.empty?
 
 let filter = (incl "/etc/xml/*.xml")
     . (incl "/etc/xml/catalog")
-    . Util.stdexcl
 
 let xfm = transform lns filter