364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
| src = src.replace("\r", "")
if not literal:
src = rx.header.sub("", src)
src = rx.comment.search(src)
if not src:
log.warning("Couldn't read source meta information: %s", filename)
return meta
src = src.group(0)
src = rx.hash.sub("", src).strip()
# Split comment block
if src.find("\n\n") > 0:
src, meta["doc"] = src.split("\n\n", 1)
# Turn key:value lines into dictionary
for field in rx.keyval.findall(src):
|
|
|
| 364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
| src = src.replace("\r", "")
if not literal:
src = rx.header.sub("", src)
src = rx.comment.search(src)
if not src:
log.warning("Couldn't read source meta information: %s", filename)
return meta
src = src[1] or src[2] or src[3] or src[4]
src = rx.hash(src).sub("", src).strip()
# Split comment block
if src.find("\n\n") > 0:
src, meta["doc"] = src.split("\n\n", 1)
# Turn key:value lines into dictionary
for field in rx.keyval.findall(src):
|
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
| Pretty crude comment splitting approach. But works
well enough already. Technically a YAML parser would
do better; but is likely overkill.
"""
header = re.compile(r"""
(\A (
\#! \s+ /.+ | # shebang
<\?php .*
) $)+
""", re.M | re.X)
comment = re.compile(r"""
(^ [ ]{0,4} \# .*\n)+ | # general
(^ [ ]{0,4} // .*\n)+ | # C++-style
/\* [\s\S]+? \*/ | # C-multiline
<\# [\s\S]+? \#> | \{\# [\s\S]+? \#\} # PS/Perl
""", re.M | re.X)
hash = re.compile(r"""
(^ [ ]{0,4} [#*/]{1,2} [ ]{0,3})
""", re.M | re.X)
keyval = re.compile(r"""
^([\w-]+):(.*$(?:\n(?![\w-]+:).+$)*) # plain key:value lines
""", re.M | re.X)
config = re.compile(r"""
\{ ((?: [^\{\}]+ | \{[^\}]*\} )+) \} # JSOL/YAML scheme {...} dicts
| \< (.+?) \> # old <input> HTML style
""", re.X)
options = re.compile(r"""
["':$]? (\w*) ["']? # key or ":key" or '$key'
\s* [:=] \s* # "=" or ":"
(?: " ([^"]*) "
| ' ([^']*) ' # "quoted" or 'singl' values
| ([^,]*) # or unquoted literals
)
""", re.X)
select_dict = re.compile(r"(\w+)\s*[=:>]+\s*([^=,|:]+)")
select_list = re.compile(r"\s*([^,|;]+)\s*")
# ArgumentParser options conversion
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
def argparse_map(opt):
"""
As variation of in-application config: options, this method converts
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
| 469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
| Pretty crude comment splitting approach. But works
well enough already. Technically a YAML parser would
do better; but is likely overkill.
"""
header = re.compile(r"""
(\A (
\#! \s+ /.+ | # shebang
<\?php .*
) $)+
""", re.M | re.X)
comment = re.compile(r"""
((?:^ [ ]{0,4} (\#|//) .*\n)+) | # general
/\*+ ([\s\S]+?) \*/ | # C-multiline
<\# ([\s\S]+?) \#> | # PS
\{- ([\s\S]+?) -\} # Haskell
""", re.M | re.X)
hash_det = re.compile(r"""
^ ([ \t]*) ([#*/]*) ([ ]*) [\w-]*: # determine indent, craft strip regex
""", re.M | re.X)
keyval = re.compile(r"""
^ ([\w-]+) : ( .*$ # plain key:value lines
(?: \n(?![\w-]+:) .+$ )* # continuation lines sans ^xyz:
)
""", re.M | re.X)
config = re.compile(r"""
\{ ((?: [^\{\}]+ | \{[^\}]*\} )+) \} # JSOL/YAML scheme {...} dicts
| \< (.+?) \> # old <input> HTML style
""", re.X)
options = re.compile(r"""
["':$]? (\w*) ["']? # key or ":key" or '$key'
\s* [:=] \s* # "=" or ":"
(?: " ([^"]*) "
| ' ([^']*) ' # "quoted" or 'singl' values
| ([^,]*) # or unquoted literals
)
""", re.X)
select_dict = re.compile(r"""
(\w+) \s* [=:>]+ \s* ([^=,|:]+) # key=title | k2=t2
""", re.X)
select_list = re.compile(r"""
\s*([^,|;]+)\s* # alt | lists
""", re.X)
@staticmethod
def hash(src):
""" find first comment to generate consistent strip regex for following lines """
m = rx.hash_det.search(src)
if not m:# or not m[2]:
return re.compile("^ ? ?[#*/]{0,2} ?}", re.M) # fallback
hash_rx = "^"
if m[1]: # indent
hash_rx += m[1] + "{0,2}" # +- 1 in length?
if m[2]: # hash
hash_rx += "[" + m[2] + "]{1,%s}" % (len(m[2]) + 1)
if m[3]: # space
hash_rx += m[3] + "{0,2}"
return re.compile(hash_rx, re.M)
# ArgumentParser options conversion
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
def argparse_map(opt):
"""
As variation of in-application config: options, this method converts
|