Example #1
0
def generate(args):
    # print args.html_filepath, args.output_filepath
    htmlpath = args.html_filepath
    rktpath = args.output_filepath
    
    f = open(rktpath, 'w')
    
    # Racket headers.
    f.write("#lang rosette\n\n")
    f.write('(require (only-in racket/runtime-path define-runtime-path))\n')
    f.write('(require "{wf}/dom.rkt")\n'.format(wf=args.websynth_filepath))
    f.write('(require "{wf}/websynth.rkt")\n'.format(wf=args.websynth_filepath))
    f.write('(require "{wf}/websynthlib.rkt")\n\n'.format(wf=args.websynth_filepath))
    
    # Define dom
    f.write('(define-runtime-path html (build-path "{wf}" "{html}"))\n'.format(wf=args.websynth_filepath,html=htmlpath))
    f.write('(define dom (read-DOMNode html))\n')
    # Define tags
    f.write('(define-tags (tags dom))\n')
       
    # Example Data
    data = efp.ef_parse(args.examples, args.delimiter)
    rec_count = efp.count_records(data)
    field_count = efp.count_fields(data)
    
    # Solver calls.
    f.write('(define max_zpath_depth (depth dom))\n\n')
    for r_index in range(0, rec_count):
        f.write('; Record {} fields\n'.format(r_index))
        
        # Create all the zpath symbolic variables
        for f_index in range(0, field_count):
            zpath_name = field_zpath_name(r_index, f_index)
            f.write('(define-symbolic {zpath_name} tag? [max_zpath_depth])\n'.format(zpath_name=zpath_name))
        f.write('\n')
        
        # Records Masks
        fieldmask_name = field_mask_name(r_index)
        f.write("(define-symbolic {field_mask_name} boolean? [max_zpath_depth])\n".format(field_mask_name=fieldmask_name))
    
    f.write('\n')
    f.write('; Cross-record Mask\n')
    f.write('(define-symbolic recordmask boolean? [max_zpath_depth])\n')
    
    f.write('(current-bitwidth #f)\n\n')

    f.write('(define (demonstration)\n\n');
    # All zpath asserts
    for r_index in range(0, rec_count):
        f.write('\t; Record {i} zpath asserts\n'.format(i=r_index))
        for f_index in range(0, field_count):
            zpath_name = field_zpath_name(r_index, f_index)
            f.write('\t(assert (path? {zpath_name} dom "{example}"))\n'.format(zpath_name=zpath_name,
                                                                             example=data[r_index][f_index]))
        f.write('\n')
    
    # Generate Masks
    if field_count >= 2 and rec_count >= 2:
        for r_index in range(rec_count):
            f.write('\t; Record {r} Field Mask Generation\n'.format(r=r_index))
            for f_index in range(field_count):
                if f_index == 0:
                    continue
                prev_zpath = field_zpath_name(r_index, f_index - 1)
                cur_zpath = field_zpath_name(r_index, f_index)
                field_mask = field_mask_name(r_index)
                f.write("\t(generate-mask {zpath_prev} {zpath_cur} {field_mask} max_zpath_depth)\n".format(zpath_prev=prev_zpath,
                                                                                                         zpath_cur=cur_zpath,
                                                                                                         field_mask=field_mask))
            f.write('\n')
        f.write('\n')
    # Record mask and Solve
    f.write('\t; Record Mask\n')
    f.write('\t(generate-mask r0f0zpath r1f0zpath recordmask max_zpath_depth))\n\n')

    f.write('; Solve\n')
    f.write('(define (scrape)\n')
    f.write('\t(define sol (solve (demonstration)))\n\n')
    
    # display all the zpaths!
    for r_index in range(rec_count):
        f.write('\t; Record {r} zpaths\n'.format(r=r_index))
        for f_index in range(field_count):
            # Record X zpaths
            zpath_name = field_zpath_name(r_index, f_index)
        
        # field mask for record
        fieldmask_name = field_mask_name(r_index)
    f.write('\n')
    
    # Make the zpaths
    f.write('\t; Construct final zpaths\n')
    for r_index in [0]:
        for f_index in range(field_count):
            zpath_name = field_zpath_name(r_index, f_index)
            f.write('\t(define {zpath_name}_list (map label (evaluate {zpath_name} sol)))\n'.format(zpath_name=zpath_name))
            f.write('\t(define generalized_{zpath_name}_list \n'.format(zpath_name=zpath_name))
            f.write('\t\t(apply-mask {zpath_name}_list (evaluate recordmask sol)))\n'.format(zpath_name=zpath_name))
            f.write('\t(define field{i}_zpath (synthsis_solution->zpath generalized_{zpath_name}_list))\n'.format(i=f_index,
                                                                                                                    zpath_name=zpath_name))
            f.write('\n')

    #if (args.rackunit_test == False) :
    #    f.write('\t(printf "DOM stats:  size = ~a, depth = ~a\\n" (size dom) max_zpath_depth)\n')
        
    # Scrape!
    f.write('\t(zip \n')
    for f_index in range(field_count):
        f.write('\t\t(DOM-Flatten (DOM-XPath dom field{i}_zpath))\n'.format(i=f_index))
    f.write('\t))\n\n')

    if (args.rackunit_test == False) :
        f.write('(scrape)\n')
    else :
        out = os.path.splitext(os.path.basename(args.html_filepath))[0]
        t = os.path.splitext(os.path.basename(args.examples))[0]
        f.write('(require rackunit rackunit/text-ui rosette/lib/roseunit)\n')
        f.write('(define-runtime-path out (build-path "." "{name}.out"))\n\n'.format(name=out))
        f.write('(define a-test\n')
        f.write('\t(test-suite+ \n')
        f.write('\t\t"{name}"\n'.format(name=t))
        f.write('\t\t(test-case "{name}"\n'.format(name=t))
        f.write('\t\t\t(define expected (second (call-with-input-file out read)))\n')
        f.write('\t\t\t(define actual (scrape))\n')
        f.write('\t\t\t(check-equal? actual expected))))\n')
        f.write('(time (run-tests a-test))\n')
        
    f.close()
    print("{} converted and saved to {}.".format(htmlpath, rktpath))
Example #2
0
def generate(args):
    # print args.html_filepath, args.output_filepath
    htmlpath = args.html_filepath
    rktpath = args.output_filepath

    f = open(rktpath, 'w')

    # Racket headers.
    f.write("#lang rosette\n\n")
    f.write('(require (only-in racket/runtime-path define-runtime-path))\n')
    f.write('(require "{wf}/dom.rkt")\n'.format(wf=args.websynth_filepath))
    f.write(
        '(require "{wf}/websynth.rkt")\n'.format(wf=args.websynth_filepath))
    f.write('(require "{wf}/websynthlib.rkt")\n\n'.format(
        wf=args.websynth_filepath))

    # Define dom
    f.write('(define-runtime-path html (build-path "{wf}" "{html}"))\n'.format(
        wf=args.websynth_filepath, html=htmlpath))
    f.write('(define dom (read-DOMNode html))\n')
    # Define tags
    f.write('(define-tags (tags dom))\n')

    # Example Data
    data = efp.ef_parse(args.examples, args.delimiter)
    rec_count = efp.count_records(data)
    field_count = efp.count_fields(data)

    # Solver calls.
    f.write('(define max_zpath_depth (depth dom))\n\n')
    for r_index in range(0, rec_count):
        f.write('; Record {} fields\n'.format(r_index))

        # Create all the zpath symbolic variables
        for f_index in range(0, field_count):
            zpath_name = field_zpath_name(r_index, f_index)
            f.write(
                '(define-symbolic {zpath_name} tag? #:length max_zpath_depth)\n'
                .format(zpath_name=zpath_name))
        f.write('\n')

        # Records Masks
        fieldmask_name = field_mask_name(r_index)
        f.write(
            "(define-symbolic {field_mask_name} boolean? #:length max_zpath_depth)\n"
            .format(field_mask_name=fieldmask_name))

    f.write('\n')
    f.write('; Cross-record Mask\n')
    f.write('(define-symbolic recordmask boolean? #:length max_zpath_depth)\n')

    f.write('(current-bitwidth #f)\n\n')

    f.write('(define (demonstration)\n\n')
    # All zpath asserts
    for r_index in range(0, rec_count):
        f.write('\t; Record {i} zpath asserts\n'.format(i=r_index))
        for f_index in range(0, field_count):
            zpath_name = field_zpath_name(r_index, f_index)
            f.write('\t(assert (path? {zpath_name} dom "{example}"))\n'.format(
                zpath_name=zpath_name, example=data[r_index][f_index]))
        f.write('\n')

    # Generate Masks
    if field_count >= 2 and rec_count >= 2:
        for r_index in range(rec_count):
            f.write('\t; Record {r} Field Mask Generation\n'.format(r=r_index))
            for f_index in range(field_count):
                if f_index == 0:
                    continue
                prev_zpath = field_zpath_name(r_index, f_index - 1)
                cur_zpath = field_zpath_name(r_index, f_index)
                field_mask = field_mask_name(r_index)
                f.write(
                    "\t(generate-mask {zpath_prev} {zpath_cur} {field_mask} max_zpath_depth)\n"
                    .format(zpath_prev=prev_zpath,
                            zpath_cur=cur_zpath,
                            field_mask=field_mask))
            f.write('\n')
        f.write('\n')
    # Record mask and Solve
    f.write('\t; Record Mask\n')
    f.write(
        '\t(generate-mask r0f0zpath r1f0zpath recordmask max_zpath_depth))\n\n'
    )

    f.write('; Solve\n')
    f.write('(define (scrape)\n')
    f.write('\t(define sol (solve (demonstration)))\n\n')

    # display all the zpaths!
    for r_index in range(rec_count):
        f.write('\t; Record {r} zpaths\n'.format(r=r_index))
        for f_index in range(field_count):
            # Record X zpaths
            zpath_name = field_zpath_name(r_index, f_index)

        # field mask for record
        fieldmask_name = field_mask_name(r_index)
    f.write('\n')

    # Make the zpaths
    f.write('\t; Construct final zpaths\n')
    for r_index in [0]:
        for f_index in range(field_count):
            zpath_name = field_zpath_name(r_index, f_index)
            f.write(
                '\t(define {zpath_name}_list (map label (evaluate {zpath_name} sol)))\n'
                .format(zpath_name=zpath_name))
            f.write('\t(define generalized_{zpath_name}_list \n'.format(
                zpath_name=zpath_name))
            f.write(
                '\t\t(apply-mask {zpath_name}_list (evaluate recordmask sol)))\n'
                .format(zpath_name=zpath_name))
            f.write(
                '\t(define field{i}_zpath (synthsis_solution->zpath generalized_{zpath_name}_list))\n'
                .format(i=f_index, zpath_name=zpath_name))
            f.write('\n')

    #if (args.rackunit_test == False) :
    #    f.write('\t(printf "DOM stats:  size = ~a, depth = ~a\\n" (size dom) max_zpath_depth)\n')

    # Scrape!
    f.write('\t(zip \n')
    for f_index in range(field_count):
        f.write('\t\t(DOM-Flatten (DOM-XPath dom field{i}_zpath))\n'.format(
            i=f_index))
    f.write('\t))\n\n')

    if (args.rackunit_test == False):
        f.write('(scrape)\n')
    else:
        out = os.path.splitext(os.path.basename(args.html_filepath))[0]
        t = os.path.splitext(os.path.basename(args.examples))[0]
        f.write('(require rackunit rackunit/text-ui rosette/lib/roseunit)\n')
        f.write('(define-runtime-path out (build-path "." "{name}.out"))\n\n'.
                format(name=out))
        f.write('(define a-test\n')
        f.write('\t(test-suite+ \n')
        f.write('\t\t"{name}"\n'.format(name=t))
        f.write('\t\t(test-case "{name}"\n'.format(name=t))
        f.write(
            '\t\t\t(define expected (second (call-with-input-file out read)))\n'
        )
        f.write('\t\t\t(define actual (scrape))\n')
        f.write('\t\t\t(check-equal? actual expected))))\n')
        f.write('(time (run-tests a-test))\n')

    f.close()
    print("{} converted and saved to {}.".format(htmlpath, rktpath))
Example #3
0
def generate(args):
    # print args.html_filepath, args.output_filepath
    htmlpath = args.html_filepath
    rktpath = args.output_filepath
    
    f = open(rktpath, 'w')
    
    # Racket headers.
    f.write("#lang s-exp rosette\n\n")
    f.write('(require (only-in racket/runtime-path define-runtime-path))\n')
    f.write('(require "{wf}/dom.rkt")\n'.format(wf=args.websynth_filepath))
    f.write('(require "{wf}/websynth.rkt")\n'.format(wf=args.websynth_filepath))
    f.write('(require "{wf}/websynthlib.rkt")\n\n'.format(wf=args.websynth_filepath))
    
    # Define dom
    f.write('(define-runtime-path html (build-path "." "{html}"))\n'.format(html=htmlpath))
    f.write('(define dom (read-DOMNode html))\n')
    # Define tags
    f.write('(define-tags (tags dom))\n')
       
    # Example Data
    data = efp.ef_parse(args.examples, args.delimiter)
    rec_count = efp.count_records(data)
    field_count = efp.count_fields(data)
    
    # Solver calls.
    f.write('(define max_zpath_depth (depth dom))\n\n')
    for r_index in range(0, rec_count):
        f.write('; Record {} fields\n'.format(r_index))
        
        # Create all the zpath symbolic variables
        for f_index in range(0, field_count):
            zpath_name = field_zpath_name(r_index, f_index)
            f.write('(define-symbolic {zpath_name} tag? [max_zpath_depth])\n'.format(zpath_name=zpath_name))
        f.write('\n')
        
        # Records Masks
        fieldmask_name = field_mask_name(r_index)
        f.write("(define-symbolic {field_mask_name} boolean? [max_zpath_depth])\n".format(field_mask_name=fieldmask_name))
    
    f.write('\n')
    f.write('; Cross-record Mask\n')
    f.write('(define-symbolic recordmask boolean? [max_zpath_depth])\n')
    
    
    f.write('(current-log-handler (log-handler #:info any/c))\n')
    f.write('(configure [bitwidth 1])\n\n')
    
    # All zpath asserts
    for r_index in range(0, rec_count):
        f.write('; Record {i} zpath asserts\n'.format(i=r_index))
        for f_index in range(0, field_count):
            zpath_name = field_zpath_name(r_index, f_index)
            f.write('(assert (path? {zpath_name} dom "{example}"))\n'.format(zpath_name=zpath_name,
                                                                             example=data[r_index][f_index]))
        f.write('\n')
    
    # Generate Masks
    if field_count >= 2 and rec_count >= 2:
        for r_index in range(rec_count):
            f.write('; Record {r} Field Mask Generation\n'.format(r=r_index))
            for f_index in range(field_count):
                if f_index == 0:
                    continue
                prev_zpath = field_zpath_name(r_index, f_index - 1)
                cur_zpath = field_zpath_name(r_index, f_index)
                field_mask = field_mask_name(r_index)
                f.write("(generate-mask {zpath_prev} {zpath_cur} {field_mask} max_zpath_depth)\n".format(zpath_prev=prev_zpath,
                                                                                                         zpath_cur=cur_zpath,
                                                                                                         field_mask=field_mask))
            f.write('\n')
        f.write('\n')
    # Record mask and Solve
    f.write('; Record Mask and Solve\n')
    f.write('(generate-mask r0f0zpath r1f0zpath recordmask max_zpath_depth)\n')
    f.write('(define sol (solve #t))\n\n')
    
    # display all the zpaths!
    for r_index in range(rec_count):
        f.write('; Record {r} zpaths\n'.format(r=r_index))
        for f_index in range(field_count):
            # Record X zpaths
            zpath_name = field_zpath_name(r_index, f_index)
        
        # field mask for record
        fieldmask_name = field_mask_name(r_index)
    f.write('\n')
    
    # Make the zpaths
    f.write('; Construct final zpaths\n')
    for r_index in [0]:
        for f_index in range(field_count):
            zpath_name = field_zpath_name(r_index, f_index)
            f.write('(define {zpath_name}_list (map label (evaluate {zpath_name})))\n'.format(zpath_name=zpath_name))
            f.write('(define generalizelized_{zpath_name}_list \n'.format(zpath_name=zpath_name))
            f.write('   (apply-mask {zpath_name}_list (evaluate recordmask)))\n'.format(zpath_name=zpath_name))
            f.write('(define field{i}_zpath (synthsis_solution->zpath generalizelized_{zpath_name}_list))\n'.format(i=f_index,
                                                                                                                    zpath_name=zpath_name))
            f.write('\n')
    
    f.write('(printf "DOM stats:  size = ~a, depth = ~a, tags = ~a\\n" (size dom) max_zpath_depth (enum-size tag?))\n')
    # Scrape!
    f.write('(zip \n')
    for f_index in range(field_count):
        f.write('(DOM-Flatten (DOM-XPath dom field{i}_zpath))\n'.format(i=f_index))
    f.write(')\n')
    
    f.close()
    print("{} converted and saved to {}.".format(htmlpath, rktpath))