Generic module to create INI files lenses
Author: Raphael Pinson rap@gmai l.com hink
IniFile | Generic module to create INI files lenses |
License | This file is licensed under the GPL. |
TODO | Things to add in the future |
Lens usage | This lens is made to provide generic primitives to construct INI File lenses. |
USEFUL PRIMITIVES | |
Internal primitives | |
eol | End of line, inherited from Util.eol |
empty | Empty line, an eol subnode |
Separators | |
sep | Generic separator |
sep_re | The default regexp for a separator |
sep_default | The default separator value |
Stores | |
sto_to_eol | Store until end of line |
sto_to_comment | Store until comment |
Define comment and defaults | |
comment | Map comments into “#comment” nodes |
comment_re | Default regexp for comment pattern |
comment_default | Default value for comment pattern |
ENTRY | |
entry includes comments | |
entry | Generic INI File entry |
indented_entry | Generic INI File entry that might be indented with an arbitrary amount of whitespace |
entry_re | Default regexp for entry keyword |
RECORD | |
Title definition | |
title | Title for record. |
indented_title | Title for record. |
title_label | Title for record. |
record_re | Default regexp for title keyword pattern |
record_label_re | Default regexp for title_label keyword pattern |
Record definition | |
record_noempty | INI File Record with no empty lines allowed. |
record | Generic INI File record |
LENS | |
Lens definition | |
lns_noempty | Generic INI File lens with no empty lines |
lns | Generic INI File lens |
let eol = Util.eol
End of line, inherited from Util.eol
let empty = [ eol ]
Empty line, an eol subnode
let comment ( pat:regexp ) (default:string) = [ label "#comment" . sep pat default . sto_to_eol? . eol ]
Map comments into “#comment” nodes
pat:regexp | pattern to delete before commented data |
default:string | default pattern before commented data |
let comment = IniFile.comment "#" "#" let comment = IniFile.comment IniFile.comment_re IniFile.comment_default
let comment_re = /[;#]/
Default regexp for comment pattern
let comment_default = ";"
Default value for comment pattern
let entry ( kw:regexp ) (sep:lens) (comment:lens) = [ key kw . sep . sto_to_comment? . (comment|eol) ] | comment
Generic INI File entry
kw:regexp | keyword regexp for the label |
sep:lens | lens to use as key/value separator |
comment:lens | lens to use as comment |
let entry = IniFile.entry setting sep comment
let indented_entry ( kw:regexp ) (sep:lens) (comment:lens) = [ Util.del_opt_ws "" . key kw . sep . sto_to_comment? . (comment|eol) ] | comment
Generic INI File entry that might be indented with an arbitrary amount of whitespace
kw:regexp | keyword regexp for the label |
sep:lens | lens to use as key/value separator |
comment:lens | lens to use as comment |
let entry = IniFile.indented_entry setting sep comment
let entry_re = ( /[A-Za-z][A-Za-z0-9\._-]+/ )
Default regexp for entry keyword
let title ( kw:regexp ) = Util.del_str "[" . key kw . Util.del_str "]". eol
Title for record. This maps the title of a record as a node in the abstract tree.
kw:regexp | keyword regexp for the label |
let title = IniFile.title IniFile.record_re
let indented_title ( kw:regexp ) = Util.del_opt_ws "" . Util.del_str "[" . key kw . Util.del_str "]". eol
Title for record. This maps the title of a record as a node in the abstract tree. The title may be indented with arbitrary amounts of whitespace
kw:regexp | keyword regexp for the label |
let title = IniFile.title IniFile.record_re
let title_label ( name:string ) (kw:regexp) = label name . Util.del_str "[" . store kw . Util.del_str "]". eol
Title for record. This maps the title of a record as a value in the abstract tree.
name:string | name for the title label |
kw:regexp | keyword regexp for the label |
let title = IniFile.title_label "target" IniFile.record_label_re
let record_re = ( /[^]\n\/]+/ - /#comment/ )
Default regexp for title keyword pattern
let record_label_re = /[^]\n]+/
Default regexp for title_label keyword pattern
let record_noempty ( title:lens ) (entry:lens) = [ title . entry* ]
INI File Record with no empty lines allowed.
title:lens | lens to use for title. Use either title or title_label. |
entry:lens | lens to use for entries in the record. See entry. |
let record ( title:lens ) (entry:lens) = record_noempty title ( entry | empty )
Generic INI File record
title:lens | lens to use for title. Use either title or title_label. |
entry:lens | lens to use for entries in the record. See entry. |
let record = IniFile.record title entry
let lns_noempty ( record:lens ) (comment:lens) = comment* . record*
Generic INI File lens with no empty lines
record:lens | record lens to use. See record_noempty. |
comment:lens | comment lens to use. See comment. |
let lns = IniFile.lns_noempty record comment
End of line, inherited from Util.eol
let eol = Util.eol
Delete end of line, including optional trailing whitespace
let eol = del /[ \t]*\n/ "\n"
Empty line, an eol subnode
let empty = [ eol ]
Generic separator
let sep ( pat:regexp ) (default:string) = Util.del_opt_ws "" . del pat default
The default regexp for a separator
let sep_re = /[=:]/
The default separator value
let sep_default = "="
Store until end of line
let sto_to_eol = Util.del_opt_ws "" . store /( [^ \t\n].*[^ \t\n]|[^ \t\n] )/
Store until comment
let sto_to_comment = Util.del_opt_ws "" . store /[^;# \t\n][^;#\n]*[^;# \t\n]|[^;# \t\n]/
Map comments into “#comment” nodes
let comment ( pat:regexp ) (default:string) = [ label "#comment" . sep pat default . sto_to_eol? . eol ]
Default regexp for comment pattern
let comment_re = /[;#]/
Default value for comment pattern
let comment_default = ";"
Generic INI File entry
let entry ( kw:regexp ) (sep:lens) (comment:lens) = [ key kw . sep . sto_to_comment? . (comment|eol) ] | comment
Generic INI File entry that might be indented with an arbitrary amount of whitespace
let indented_entry ( kw:regexp ) (sep:lens) (comment:lens) = [ Util.del_opt_ws "" . key kw . sep . sto_to_comment? . (comment|eol) ] | comment
Default regexp for entry keyword
let entry_re = ( /[A-Za-z][A-Za-z0-9\._-]+/ )
Title for record.
let title ( kw:regexp ) = Util.del_str "[" . key kw . Util.del_str "]". eol
Generic INI File record
let record ( title:lens ) (entry:lens) = record_noempty title ( entry | empty )
Title for record.
let indented_title ( kw:regexp ) = Util.del_opt_ws "" . Util.del_str "[" . key kw . Util.del_str "]". eol
Title for record.
let title_label ( name:string ) (kw:regexp) = label name . Util.del_str "[" . store kw . Util.del_str "]". eol
Default regexp for title keyword pattern
let record_re = ( /[^]\n\/]+/ - /#comment/ )
Default regexp for title_label keyword pattern
let record_label_re = /[^]\n]+/
INI File Record with no empty lines allowed.
let record_noempty ( title:lens ) (entry:lens) = [ title . entry* ]
Generic INI File lens with no empty lines
let lns_noempty ( record:lens ) (comment:lens) = comment* . record*
Generic INI File lens
let lns ( record:lens ) (comment:lens) = lns_noempty record (comment|empty)