gpii-universal
Version:
Cross platform, core components of the GPII personalization infrastructure.
609 lines (485 loc) • 12.1 kB
Plain Text
# A test .ini file.
#
# Lines starting with "#@" are joined to produce a JSON object describing the expected data object that the parser
# will produce. The #@ lines are stripped before parsing.
#
# This is a comment.
; And this
# Also indented
; like this
# comment ; with another
; other # way
# # #
###
#
; ; ;
;;;
;
; # ; # ; ; ; # # # ;
; # ; # ; ; ; # # # ;
# ; # ; # ; ; ; # # # ;
# normal key=value
key=value1
# two together
key2=value2
key3=value3
# surrounding lines
key4=value4
key5=value5
key6=value6
#@ key: "value1"
#@ key2: "value2"
#@ key3: "value3"
#@ key4: "value4"
#@ key5: "value5"
#@ key6: "value6"
=
keyonly=
=valueonly
# The "=" line will set the zero length key to "", but that will be over written by the "=valueonly" line.
#@ keyonly: ""
#@ "": "valueonly"
# Ignored
not_a_key_or_value
100=numbered-key-value
#@ "100": "numbered-key-value"
number = 123
boolon = true
booloff = false
null=null
not_number = "123"
not_boolon = "true"
not_booloff = "false"
not_null="null"
#@ number: 123
#@ boolon: true
#@ booloff: false
#@ null: null
#@ not_number: "123"
#@ not_boolon: "true"
#@ not_booloff: "false"
#@ not_null: "null"
# Spaces (surrounding space is ignored)
spaced = value
spacedL =value
spacedR= value
spaced key name = value
spaced key nameL =value
spaced key nameR= value
indented and spaced = value
indented and spaced again = value
unindented and spaced = value
#@ spaced: "value"
#@ spacedL: "value"
#@ spacedR: "value"
#@ "spaced key name": "value"
#@ "spaced key nameL": "value"
#@ "spaced key nameR": "value"
#@ "indented and spaced": "value"
#@ "indented and spaced again": "value"
#@ "unindented and spaced": "value"
# Spaces in keys and values
notspaced = value with spaces
spaced key name2 = value with spaces
spaced key name left =value with spaces
spaced key name right= value with spaces
spaced key name none=value with spaces
double space = value
double space and value = valueA valueB
#@ "notspaced": "value with spaces"
#@ "spaced key name2": "value with spaces"
#@ "spaced key name left": "value with spaces"
#@ "spaced key name right": "value with spaces"
#@ "spaced key name none": "value with spaces"
#@ "double space": "value"
#@ "double space and value": "valueA valueB"
equals=valueA=valueB
doubleequals==value
#@ equals: "valueA=valueB"
#@ doubleequals: "=value"
# Comments should be on their own line
value_commentH=valueA # valueB
value_commentS=valueA ; valueB
value_commentHS=valueA # valueB ; valueC
value_commentSH=valueA ; valueB # valueC
value_commentHH=valueA # valueB # valueC
value_commentSS=valueA ; valueB ; valueC
#@ value_commentH: "valueA # valueB"
#@ value_commentS: "valueA ; valueB"
#@ value_commentHS: "valueA # valueB ; valueC"
#@ value_commentSH: "valueA ; valueB # valueC"
#@ value_commentHH: "valueA # valueB # valueC"
#@ value_commentSS: "valueA ; valueB ; valueC"
# Colons as delimiters
colon1:value
colon2 : value
colon3 : value
double_colon::value
#@ colon1: "value"
#@ colon2: "value"
#@ colon3: "value"
#@ double_colon: ":value"
# Mixing : and =
colon_value_equals:valueA=valueB
equals_value_colon=valueA:valueB
colon_equals_value:=value
equals_colon_value=:value
colon_equals:=
equals_colon=:
#@ colon_value_equals: "valueA=valueB"
#@ equals_value_colon: "valueA:valueB"
#@ colon_equals_value: "=value"
#@ equals_colon_value: ":value"
#@ colon_equals: "="
#@ equals_colon: ":"
cee:valueA=valueB=valueC
cec:valueA=valueB:valueC
cce:valueA:valueB=valueC
ccc:valueA:valueB:valueC
eee=valueA=valueB=valueC
eec=valueA=valueB:valueC
ece=valueA:valueB=valueC
ecc=valueA:valueB:valueC
#@ cee: "valueA=valueB=valueC"
#@ cec: "valueA=valueB:valueC"
#@ cce: "valueA:valueB=valueC"
#@ ccc: "valueA:valueB:valueC"
#@ eee: "valueA=valueB=valueC"
#@ eec: "valueA=valueB:valueC"
#@ ece: "valueA:valueB=valueC"
#@ ecc: "valueA:valueB:valueC"
# Quoted values
quoted_ns="value"
quoted_spc = "value"
quoted_spcL ="value"
quoted_spcR= "value"
quoted_spc_value = "valueA valueB valueC"
quoted_spc_valueL = " valueA valueB valueC"
quoted_spc_valueR = "valueA valueB valueC "
quoted_spc_valueB = " valueA valueB valueC "
quotes_only=""
#@ quoted_ns: "value"
#@ quoted_spc: "value"
#@ quoted_spcL: "value"
#@ quoted_spcR: "value"
#@ quoted_spc_value: "valueA valueB valueC"
#@ quoted_spc_valueL: " valueA valueB valueC"
#@ quoted_spc_valueR: "valueA valueB valueC "
#@ quoted_spc_valueB: " valueA valueB valueC "
#@ quotes_only: ""
# Values are quoted if it starts and ends with a quote, the content is not parsed.
quoted_inner = "valueA"valueB"
quoted_inner_escape = "valueA\"valueB"
quote_twice=""value""
quote_twiceL=""value"
quote_twiceR="value""
quoted_brokeL = "value
quoted_brokeR = value"
quoted_broke_innerL = "valueA"valueB
quoted_broke_innerR = value"valueB"
notquoted_inner = valueA"valueB
notquoted_inner2 = valueA"valueB"valueC
#@ quoted_inner: 'valueA"valueB'
#@ quoted_inner_escape: 'valueA"valueB'
#@ quote_twice: '"value"'
#@ quote_twiceL: '"value'
#@ quote_twiceR: 'value"'
#@ quoted_brokeL: '"value'
#@ quoted_brokeR: 'value"'
#@ quoted_broke_innerL: 'valueA'
#@ quoted_broke_innerR: 'value"valueB"'
#@ notquoted_inner: 'valueA"valueB'
#@ notquoted_inner2: 'valueA"valueB"valueC'
# Single quotes
single_quote='value'
single_quote_spc = 'value'
single_quote_only=''
#@ single_quote: "value"
#@ single_quote_spc: "value"
#@ single_quote_only: ""
single_double='valueA"valueB'
single_doubleL='"value'
single_doubleR='value"'
single_doubleB='"value"'
single_double_only='"'
single_double_odd='"
single_double_value='value"
#@ single_double: 'valueA"valueB'
#@ single_doubleL: '"value'
#@ single_doubleR: 'value"'
#@ single_doubleB: '"value"'
#@ single_double_only: '"'
#@ single_double_odd: '\'"'
#@ single_double_value: '\'value"'
double_single="valueA'valueB"
double_singleL="'value"
double_singleR="value'"
double_singleB="'value'"
double_single_only="'"
double_single_odd="'
double_single_value="value'
#@ double_single: "valueA'valueB"
#@ double_singleL: "'value"
#@ double_singleR: "value'"
#@ double_singleB: "'value'"
#@ double_single_only: "'"
#@ double_single_odd: "\"'"
#@ double_single_value: "\"value'"
# Quotes in keys are not special
"quoted_key"=value
"quoted=key"=value
#@ '"quoted_key"': "value"
#@ '"quoted': 'key"=value'
# Multi-line values, with tripple quote
1line="""value"""
2line="""valueA
valueB"""
3line="""valueA
valueB
valueC"""
# indentation is stripped.
3indent="""valueA
valueB
valueC"""
#@ "1line": "value"
#@ "2line": "valueA\nvalueB"
#@ "3line": "valueA\nvalueB\nvalueC"
#@ "3indent": "valueA\nvalueB\nvalueC"
ml_quote_empty=""""""
#@ ml_quote_empty: ""
# new-lines before and after should remain.
ml_newlineL="""
value"""
ml_newlineR="""value
"""
ml_newlineB="""
value
"""
ml_newline="""
"""
#@ ml_newlineL: "\nvalue"
#@ ml_newlineR: "value\n"
#@ ml_newlineB: "\nvalue\n"
#@ ml_newline: "\n"
# content should not be parsed.
ml_with_quote="""
"value"
"""
ml_with_values="""
inside1=value
inside2:value
inside3="value"
[inside4]
inside5='value'
#
;
"""
#@ ml_with_quote: '\n"value"\n'
#@ ml_with_values: "\ninside1=value\ninside2:value\ninside3=\"value\"\n[inside4]\ninside5='value'\n#\n;\n"
# Tripple single-quote
ml_single_quote='''valueA
valueB'''
ml_single_quote2='''
valueA
valueB'''
ml_single_quote3='''valueA
valueB
'''
ml_single_quote4='''valueA
valueB
'''
#@ ml_single_quote: "valueA\nvalueB"
#@ ml_single_quote2: "\nvalueA\nvalueB"
#@ ml_single_quote3: "valueA\nvalueB\n"
#@ ml_single_quote4: "valueA\nvalueB\n"
# Different quote inside another shouldn't matter
ml_quote_mix1="""valueA'''valueB"""
ml_quote_mix2="""
valueA'''valueB"""
ml_quote_mix3="""valueA
'''valueB"""
ml_quote_mix4="""valueA'''valueB
"""
ml_quote_mix5="""
valueA'''valueB
"""
ml_quote_mix6="""
valueA
'''valueB
"""
ml_quote_mix7="""
valueA
'''
valueB
"""
#@ ml_quote_mix1: "valueA'''valueB"
#@ ml_quote_mix2: "\nvalueA'''valueB"
#@ ml_quote_mix3: "valueA\n'''valueB"
#@ ml_quote_mix4: "valueA'''valueB\n"
#@ ml_quote_mix5: "\nvalueA'''valueB\n"
#@ ml_quote_mix6: "\nvalueA\n'''valueB\n"
#@ ml_quote_mix7: "\nvalueA\n'''\nvalueB\n"
# New-lines via indentation
ml_indent=line1
line2
line3
ml_indent_comment=line1
line2
line3
# comment not part of the value.
ml_indent_kv=line1
line2
line3
part:of=value
ml_indent_kv_after=value
ml_indent_deep=line1
line2
line3
ml_indent_deep_after=value
#@ ml_indent: "line1\nline2\nline3"
#@ ml_indent_comment: "line1\nline2\nline3"
#@ ml_indent_kv: "line1\nline2\nline3\npart:of=value"
#@ ml_indent_kv_after: "value"
#@ ml_indent_deep: "line1\nline2\nline3"
#@ ml_indent_deep_after: "value"
# Sections and sub-sections.
# Different values with the same key can exist in different sections
sectionX=outer
#@ sectionX: "outer"
[section1]
section1_key1=value
section1_key2=value
sectionX=section1
#@ section1:
#@ { section1_key1: "value",
#@ section1_key2: "value",
#@ sectionX: "section1" }
[section2]
section2_key1=value
sectionX=section2
[[subsection2A]]
subsection2A=value2A
sectionX=subsection2A
[[subsection2B]]
subsection2B=value2B
sectionX=subsection2B
#@ section2:
#@ { section2_key1: "value",
#@ sectionX: "section2",
#@ subsection2A: { subsection2A: "value2A", sectionX: "subsection2A" },
#@ subsection2B: { subsection2B: "value2B", sectionX: "subsection2B" } }
[section3]
section3_key=valueA
sectionX=section3
[[subsection3]]
subsection3_key=valueB
sectionX=subsection3
[[[subsubsection3]]]
subsubsection3_key=valueC
sectionX=subsubsection3
[[[[subsubsubsection3]]]]
subsubsubsection3_key=valueD
sectionX=subsubsubsection3
[[[subsubsection3B]]]
subsubsubsection3B_key=valueE
sectionX=subsubsection3B
#@ section3:
#@ { section3_key: "valueA",
#@ sectionX: "section3",
#@ subsection3:
#@ { subsection3_key: "valueB",
#@ sectionX: "subsection3",
#@ subsubsection3:
#@ { subsubsection3_key: "valueC", sectionX: "subsubsection3",
#@ subsubsubsection3: { subsubsubsection3_key: "valueD", sectionX: "subsubsubsection3" } },
#@ subsubsection3B:
#@ { subsubsubsection3B_key: "valueE", sectionX: "subsubsection3B" }
#@ }
#@ }
[section4]
section4=value
sectionX=section4
[[indented]]
key=indented
[[notindented]]
key=notindented
#@ section4:
#@ { section4: "value",
#@ sectionX: "section4",
#@ indented: { key: "indented" },
#@ notindented: { key: "notindented" } }
[empty_section]
[empty_section_no_space_below]
[empty_section_no_space_between]
[empty_section_no_space_above]
[empty_with_sub]
[[empty_sub]]
[section_no_space]
key=value
[section_no_space2]
key=value
[section_space]
key=value
#@ section_no_space: { key: "value" }
#@ section_no_space2: { key: "value" }
#@ section_space: { key: "value" }
[section.with.dot]
key=1st
keyA=value
[section]
[[with.dot]]
key=2nd
keyB=value
#@ "section.with.dot": { key: "1st", keyA: "value" }
#@ section: { "with.dot": { key: "2nd", keyB: "value" } }
# Sections with the same name are merged.
[duplicate]
dupkey=first
keyA=valueA
[duplicate]
dupkey=second
keyB=valueB
#@ duplicate: { dupkey: "second", keyA: "valueA", keyB: "valueB" }
[duplicate2]
key=value
[[duplicate_sub]]
dupkey=first
keyA=valueA
[[duplicate_sub]]
dupkey=second
keyB=valueB
#@ duplicate2:
#@ { key: "value",
#@ duplicate_sub: { dupkey: "second", keyA: "valueA", keyB: "valueB" } }
# Sub-section can have the same name as the container.
[sub_section_same]
key1=parent
keyA=valueA
[[sub_section_same]]
key1=child
keyB=valueB
#@ sub_section_same:
#@ { key1: "parent"
#@ keyA: "valueA"
#@ sub_section_same: { key1: "child", keyB: "valueB" } }
# A value will be over-written by a sub-section of the same name
[duplicate_section+key]
dup=value
key=1st
keyA=valueA
[[dup]]
keyB=valueB
key=2nd
#@ "duplicate_section+key":
#@ { key: "1st"
#@ keyA: "valueA",
#@ dup: { keyB: "valueB", key: "2nd" } }
[one space]
a=1
[two two space]
b=1
#@ "one space": { "a": 1 }
#@ "two two space": { "b": 1 }
[final_section]
complete=yes
#@ final_section: { complete: "yes" }