Generic functions to build lenses
Author: Raphael Pinson rap@gmai l.com hink
Build | Generic functions to build lenses |
License | This file is licensed under the LGPL v2+, like the rest of Augeas. |
Reference | This file provides generic functions to build Augeas lenses |
GENERIC CONSTRUCTIONS | |
brackets | Put a lens inside brackets |
LIST CONSTRUCTIONS | |
list | Build a list of identical lenses separated with a given separator (at least 2 elements) |
opt_list | Same as list, but there might be only one element in the list |
LABEL OPERATIONS | |
xchg | Replace a pattern with a different label in the tree, thus emulating a key but allowing to replace the keyword with a different value than matched |
xchgs | Same as xchg, but the pattern is the default string |
SUBNODE CONSTRUCTIONS | |
key_value_line | A subnode with a keyword, a separator and a storing lens, and an end of line |
key_value_line_comment | Same as key_value_line, but allows to have a comment in the end of a line and an end of line |
key_value | Same as key_value_line, but does not end with an end of line |
key_ws_value | Store a key/value pair where key and value are separated by whitespace and the value goes to the end of the line. |
flag | A simple flag subnode, consisting of a single key |
flag_line | A simple flag line, consisting of a single key |
BLOCK CONSTRUCTIONS | |
block_generic | A block enclosed in brackets |
block_setdefault | A block enclosed in brackets |
block_ldelim_re | |
block_rdelim_re | |
block_ldelim_default | |
block_rdelim_default | |
block | A block enclosed in brackets |
block_ldelim_newlines_re | |
block_rdelim_newlines_re | |
block_ldelim_newlines_default | |
block_rdelim_newlines_default | |
block_newline | A block enclosed in brackets, with newlines forced and indentation defaulting to a tab. |
block_newlines_spc | A block enclosed in brackets, with newlines forced and indentation defaulting to a tab. |
named_block | A named block enclosed in brackets |
COMBINATORICS | |
combine_two_ord | Combine two lenses, ensuring first lens is first |
combine_two | Combine two lenses |
combine_two_opt_ord | Combine two lenses optionally, ensuring first lens is first (a, and optionally b) |
combine_two_opt | Combine two lenses optionally (either a, b, or both, in any order) |
combine_three_ord | Combine three lenses, ensuring first lens is first (a followed by either b, c, in any order) |
combine_three | Combine three lenses |
combine_three_opt_ord | Combine three lenses optionally, ensuring first lens is first (a followed by either b, c, or any of them, in any order) |
combine_three_opt | Combine three lenses optionally (either a, b, c, or any of them, in any order) |
let list (lns:lens) (sep:lens) = lns . ( sep . lns )+
Build a list of identical lenses separated with a given separator (at least 2 elements)
lns:lens | the lens to repeat in the list |
sep:lens | the separator lens, which can be taken from the Sep module |
let xchg (m:regexp) (d:string) (l:string) = del m d . label l
Replace a pattern with a different label in the tree, thus emulating a key but allowing to replace the keyword with a different value than matched
m:regexp | the pattern to match |
d:string | the default value when a node in created |
l:string | the label to apply for such nodes |
let xchgs (m:string) (l:string) = xchg m m l
Same as xchg, but the pattern is the default string
m:string | the string to replace, also used as default |
l:string | the label to apply for such nodes |
let key_value_line (kw:regexp) (sep:lens) (sto:lens) = [ key kw . sep . sto . eol ]
A subnode with a keyword, a separator and a storing lens, and an end of line
kw:regexp | the pattern to match as key |
sep:lens | the separator lens, which can be taken from the Sep module |
sto:lens | the storing lens |
let key_value_line_comment (kw:regexp) (sep:lens) (sto:lens) (comment:lens) = [ key kw . sep . sto . (eol|comment) ]
Same as key_value_line, but allows to have a comment in the end of a line and an end of line
kw:regexp | the pattern to match as key |
sep:lens | the separator lens, which can be taken from the Sep module |
sto:lens | the storing lens |
comment:lens | the comment lens, which can be taken from Util |
let key_value (kw: regexp) (sep:lens) (sto:lens) = [ key kw . sep . sto ]
Same as key_value_line, but does not end with an end of line
kw:regexp | the pattern to match as key |
sep:lens | the separator lens, which can be taken from the Sep module |
sto:lens | the storing lens |
let key_ws_value (kw:regexp) = key_value_line kw Util.del_ws_spc (store Rx.space_in)
Store a key/value pair where key and value are separated by whitespace and the value goes to the end of the line. Leading and trailing whitespace is stripped from the value. The end of line is consumed by this lens
kw:regexp | the pattern to match as key |
let block_generic (entry:lens) (entry_noindent:lens) (entry_noeol:lens) (entry_noindent_noeol:lens) (comment:lens) (comment_noindent:lens) (ldelim_re:regexp) (rdelim_re:regexp) (ldelim_default:string) (rdelim_default:string) = let block_single = entry_noindent_noeol | comment_noindent in let block_start = entry_noindent | comment_noindent in let block_middle = (entry | comment)* in let block_end = entry_noeol | comment in del ldelim_re ldelim_default . ( ( block_start . block_middle . block_end ) | block_single ) . del rdelim_re rdelim_default
A block enclosed in brackets
entry:lens | the entry to be stored inside the block. This entry should include Util.empty or its equivalent if necessary. |
entry_noindent:lens | the entry to be stored inside the block, without indentation. This entry should not include Util.empty |
entry_noeol:lens | the entry to be stored inside the block, without eol. This entry should not include Util.empty |
entry_noindent_noeol:lens | the entry to be stored inside the block, without indentation or eol. This entry should not include Util.empty |
comment:lens | the comment lens used in the block |
comment_noindent:lens | the comment lens used in the block, without indentation. |
ldelim_re:regexp | regexp for the left delimiter |
rdelim_re:regexp | regexp for the right delimiter |
ldelim_default:string | default value for the left delimiter |
rdelim_default:string | default value for the right delimiter |
A block enclosed in brackets
entry:lens | the entry to be stored inside the block. This entry should not include Util.empty, Util.comment or Util.comment_noindent, should not be indented or finish with an eol. |
ldelim_re:regexp | regexp for the left delimiter |
rdelim_re:regexp | regexp for the left delimiter |
ldelim_default:string | default value for the left delimiter |
rdelim_default:string | default value for the right delimiter |
let block (entry:lens) = block_setdelim entry block_ldelim_re block_rdelim_re block_ldelim_default block_rdelim_default
A block enclosed in brackets
entry:lens | the entry to be stored inside the block. This entry should not include Util.empty, Util.comment or Util.comment_noindent, should not be indented or finish with an eol. |
let block_newlines (entry:lens) (comment:lens) = del block_ldelim_newlines_re block_ldelim_newlines_default . ((entry | comment) . (Util.empty | entry | comment)*)? . del block_rdelim_newlines_re block_rdelim_newlines_default
A block enclosed in brackets, with newlines forced and indentation defaulting to a tab.
entry:lens | the entry to be stored inside the block. This entry should not include Util.empty, Util.comment or Util.comment_noindent, should be indented and finish with an eol. |
let block_newlines_spc (entry:lens) (comment:lens) = del (/[ \t\n]/ . block_ldelim_newlines_re) block_ldelim_newlines_default . ((entry | comment) . (Util.empty | entry | comment)*)? . del block_rdelim_newlines_re block_rdelim_newlines_default
A block enclosed in brackets, with newlines forced and indentation defaulting to a tab. The opening brace must be preceded by whitespace
entry:lens | the entry to be stored inside the block. This entry should not include Util.empty, Util.comment or Util.comment_noindent, should be indented and finish with an eol. |
let named_block (kw:regexp) (entry:lens) = [ key kw . block entry . eol ]
A named block enclosed in brackets
kw:regexp | the regexp for the block name |
entry:lens | the entry to be stored inside the block this entry should not include Util.empty |
let combine_three_opt_ord (a:lens) (b:lens) (c:lens) = combine_two_opt_ord a (combine_two_opt b c)
Combine three lenses optionally, ensuring first lens is first (a followed by either b, c, or any of them, in any order)
a:lens | the first lens |
b:lens | the second lens |
c:lens | the third lens |
let combine_three_opt (a:lens) (b:lens) (c:lens) = combine_three_opt_ord a b c | combine_three_opt_ord b a c | combine_three_opt_ord c b a
Combine three lenses optionally (either a, b, c, or any of them, in any order)
a:lens | the first lens |
b:lens | the second lens |
c:lens | the third lens |
Put a lens inside brackets
let brackets (l:lens) (r:lens) (lns:lens) = l . lns . r
Build a list of identical lenses separated with a given separator (at least 2 elements)
let list (lns:lens) (sep:lens) = lns . ( sep . lns )+
Same as list, but there might be only one element in the list
let opt_list (lns:lens) (sep:lens) = lns . ( sep . lns )*
Replace a pattern with a different label in the tree, thus emulating a key but allowing to replace the keyword with a different value than matched
let xchg (m:regexp) (d:string) (l:string) = del m d . label l
Same as xchg, but the pattern is the default string
let xchgs (m:string) (l:string) = xchg m m l
A subnode with a keyword, a separator and a storing lens, and an end of line
let key_value_line (kw:regexp) (sep:lens) (sto:lens) = [ key kw . sep . sto . eol ]
Same as key_value_line, but allows to have a comment in the end of a line and an end of line
let key_value_line_comment (kw:regexp) (sep:lens) (sto:lens) (comment:lens) = [ key kw . sep . sto . (eol|comment) ]
Same as key_value_line, but does not end with an end of line
let key_value (kw: regexp) (sep:lens) (sto:lens) = [ key kw . sep . sto ]
Store a key/value pair where key and value are separated by whitespace and the value goes to the end of the line.
let key_ws_value (kw:regexp) = key_value_line kw Util.del_ws_spc (store Rx.space_in)
A simple flag subnode, consisting of a single key
let flag (kw:regexp) = [ key kw ]
A simple flag line, consisting of a single key
let flag_line (kw:regexp) = [ key kw . eol ]
A block enclosed in brackets
let block_generic (entry:lens) (entry_noindent:lens) (entry_noeol:lens) (entry_noindent_noeol:lens) (comment:lens) (comment_noindent:lens) (ldelim_re:regexp) (rdelim_re:regexp) (ldelim_default:string) (rdelim_default:string) = let block_single = entry_noindent_noeol | comment_noindent in let block_start = entry_noindent | comment_noindent in let block_middle = (entry | comment)* in let block_end = entry_noeol | comment in del ldelim_re ldelim_default . ( ( block_start . block_middle . block_end ) | block_single ) . del rdelim_re rdelim_default
let block_rdelim_re = /[ \t\n]*\}/
let block_rdelim_default = "}"
A block enclosed in brackets
let block (entry:lens) = block_setdelim entry block_ldelim_re block_rdelim_re block_ldelim_default block_rdelim_default
let block_rdelim_newlines_re = /[ \t]*\}/
let block_rdelim_newlines_default = "}"
A block enclosed in brackets, with newlines forced and indentation defaulting to a tab.
let block_newlines (entry:lens) (comment:lens) = del block_ldelim_newlines_re block_ldelim_newlines_default . ((entry | comment) . (Util.empty | entry | comment)*)? . del block_rdelim_newlines_re block_rdelim_newlines_default
A block enclosed in brackets, with newlines forced and indentation defaulting to a tab.
let block_newlines_spc (entry:lens) (comment:lens) = del (/[ \t\n]/ . block_ldelim_newlines_re) block_ldelim_newlines_default . ((entry | comment) . (Util.empty | entry | comment)*)? . del block_rdelim_newlines_re block_rdelim_newlines_default
A named block enclosed in brackets
let named_block (kw:regexp) (entry:lens) = [ key kw . block entry . eol ]
Combine two lenses, ensuring first lens is first
let combine_two_ord (a:lens) (b:lens) = a . b
Combine two lenses
let combine_two (a:lens) (b:lens) = combine_two_ord a b | combine_two_ord b a
Combine two lenses optionally, ensuring first lens is first (a, and optionally b)
let combine_two_opt_ord (a:lens) (b:lens) = a . b?
Combine two lenses optionally (either a, b, or both, in any order)
let combine_two_opt (a:lens) (b:lens) = combine_two_opt_ord a b | combine_two_opt_ord b a
Combine three lenses, ensuring first lens is first (a followed by either b, c, in any order)
let combine_three_ord (a:lens) (b:lens) (c:lens) = combine_two_ord a (combine_two b c)
Combine three lenses
let combine_three (a:lens) (b:lens) (c:lens) = combine_three_ord a b c | combine_three_ord b a c | combine_three_ord c b a
Combine three lenses optionally, ensuring first lens is first (a followed by either b, c, or any of them, in any order)
let combine_three_opt_ord (a:lens) (b:lens) (c:lens) = combine_two_opt_ord a (combine_two_opt b c)
Combine three lenses optionally (either a, b, c, or any of them, in any order)
let combine_three_opt (a:lens) (b:lens) (c:lens) = combine_three_opt_ord a b c | combine_three_opt_ord b a c | combine_three_opt_ord c b a
Map empty lines, including empty comments
let empty = empty_generic empty_generic_re
Map comments into “#comment” nodes
let comment = comment_generic /[ \t]*#[ \t]*/ "# "
Map comments into “#comment” nodes, without indentation
let comment_noindent = comment_generic /#[ \t]*/ "# "