     link boa ;
 
 : link. ( vector -- )
-    [ attributes>> "href" swap at write nl ]
+    [ "href" attribute write nl ]
     [ clickable>> [ bl bl text>> print ] each nl ] bi ;
-
-: find-by-text ( seq quot -- tag )
-    [ dup name>> text = ] prepose find drop ; inline
-
-: find-opening-tags-by-name ( name seq -- seq )
-    [ [ name>> = ] [ closing?>> not ] bi and ] with find-all ;
-
-: href-contains? ( str tag -- ? )
-    attributes>> "href" swap at* [ subseq? ] [ 2drop f ] if ;
-
-: find-hrefs ( vector -- vector' )
-    find-links
-    [ [
-        [ name>> "a" = ]
-        [ attributes>> "href" swap key? ] bi and ] filter
-    ] map sift
-    [ [ attributes>> "href" swap at ] map ] map concat
-    [ >url ] map ;
-
-: find-frame-links ( vector -- vector' )
-    [ name>> "frame" = ] find-between-all
-    [ [ attributes>> "src" swap at ] map sift ] map concat sift
-    [ >url ] map ;
-
-: find-all-links ( vector -- vector' )
-    [ find-hrefs ] [ find-frame-links ] bi union ;
-
-: find-forms ( vector -- vector' )
-    "form" over find-opening-tags-by-name
-    swap [ [ first2 ] dip find-between* ] curry map
-    [ [ name>> { "form" "input" } member? ] filter ] map ;
-
-: find-html-objects ( vector string -- vector' )
-    dupd find-opening-tags-by-name
-    [ first2 find-between* ] curry map ;
-
-: form-action ( vector -- string )
-    [ name>> "form" = ] find nip 
-    attributes>> "action" swap at ;
-
-: hidden-form-values ( vector -- strings )
-    [ attributes>> "type" swap at "hidden" = ] filter ;
-
-: input. ( tag -- )
-    dup name>> print
-    attributes>>
-    [ bl bl bl bl [ write "=" write ] [ write bl ] bi* nl ] assoc-each ;
-
-: form. ( vector -- )
-    [ closing?>> not ] filter
-    [
-        {
-            { [ dup name>> "form" = ]
-                [ "form action: " write attributes>> "action" swap at print ] }
-            { [ dup name>> "input" = ] [ input. ] }
-            [ drop ]
-        } cond
-    ] each ;
-
-: query>assoc* ( str -- hash )
-    "?" split1 nip query>assoc ;
-    
-: html-class? ( tag string -- ? )
-    swap attributes>> "class" swap at = ;
-    
-: html-id? ( tag string -- ? )
-    swap attributes>> "id" swap at = ;
-
-: opening-tag? ( tag -- ? )
-    closing?>> not ;

    ] map ;

: find-by-id ( vector id -- vector' elt/f )
    '[ attributes>> "id" swap at _ = ] find ;
    
: find-by-class ( vector id -- vector' elt/f )
    '[ attributes>> "class" swap at _ = ] find ;

: find-by-name ( vector string -- vector elt/f )
    >lower '[ name>> _ = ] find ;

: find-by-id-between ( vector string -- vector' )
    dupd
    '[ attributes>> "id" swap at _ = ] find find-between* ;
    
: find-by-class-between ( vector string -- vector' )
    dupd
    '[ attributes>> "class" swap at _ = ] find find-between* ;
    
: find-by-class-id-between ( vector class id -- vector' )
    '[
        [ attributes>> "class" swap at _ = ]
        [ attributes>> "id" swap at _ = ] bi and
    ] dupd find find-between* ;

: find-by-attribute-key ( vector key -- vector' elt/? )
    >lower

: find-between* ( vector i/f tag/f -- vector )
    over integer? [
        [ tail-slice ] [ name>> ] bi*
        dupd find-matching-close drop [ 1 + ] [ 1 ] if*
        head
    ] [
        3drop V{ } clone
    ] if ; inline
