UNPKG

gpii-universal

Version:

Cross platform, core components of the GPII personalization infrastructure.

609 lines (485 loc) 12.1 kB
# 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" }