Imported Upstream version 1.7.0
[platform/upstream/augeas.git] / lenses / properties.aug
1 (* Augeas module for editing Java properties files
2  Author: Craig Dunn <craig@craigdunn.org>
3
4   Limitations:
5    - doesn't support \ alone on a line
6    - values are not unescaped
7    - multi-line properties are broken down by line, and can't be replaced with a single line
8
9   See format info: http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html#load(java.io.Reader)
10 *)
11
12
13 module Properties =
14   (* Define some basic primitives *)
15   let empty            = Util.empty
16   let eol              = Util.eol
17   let hard_eol         = del "\n" "\n"
18   let sepch            = del /([ \t]*(=|:)|[ \t])/ "="
19   let sepspc           = del /[ \t]/ " "
20   let sepch_ns         = del /[ \t]*(=|:)/ "="
21   let sepch_opt        = del /[ \t]*(=|:)?[ \t]*/ "="
22   let value_to_eol_ws  = store /(:|=)[^\n]*[^ \t\n\\]/
23   let value_to_bs_ws   = store /(:|=)[^\n]*[^\\\n]/
24   let value_to_eol     = store /([^ \t\n:=][^\n]*[^ \t\n\\]|[^ \t\n\\:=])/
25   let value_to_bs      = store /([^ \t\n:=][^\n]*[^\\\n]|[^ \t\n\\:=])/
26   let indent           = Util.indent
27   let backslash        = del /[\\][ \t]*\n/ "\\\n"
28   let opt_backslash    = del /([\\][ \t]*\n)?/ ""
29   let entry            = /([^ \t\n:=\/!#\\]|[\\]:|[\\]=|[\\][\t ]|[\\][^\/\n])+/
30
31   let multi_line_entry =
32       [ indent . value_to_bs? . backslash ] .
33       [ indent . value_to_bs . backslash ] * .
34       [ indent . value_to_eol . eol ] . value " < multi > "
35
36   let multi_line_entry_ws =
37       opt_backslash .
38       [ indent . value_to_bs_ws . backslash ] + .
39       [ indent . value_to_eol . eol ] . value " < multi_ws > "
40
41   (* define comments and properties*)
42   let bang_comment     = [ label "!comment" . del /[ \t]*![ \t]*/ "! " . store /([^ \t\n].*[^ \t\n]|[^ \t\n])/ . eol ]
43   let comment          = ( Util.comment | bang_comment )
44   let property         = [ indent . key entry . sepch . ( multi_line_entry | indent . value_to_eol . eol ) ]
45   let property_ws         = [ indent . key entry . sepch_ns . ( multi_line_entry_ws | indent . value_to_eol_ws . eol ) ]
46   let empty_property   = [ indent . key entry . sepch_opt . hard_eol ]
47   let empty_key        = [ sepch_ns . ( multi_line_entry | indent . value_to_eol . eol ) ]
48
49   (* setup our lens and filter*)
50   let lns              = ( empty | comment | property_ws | property | empty_property | empty_key ) *