@@ -300,6 +300,20 @@ pub fn get_parent_node(child: &Handle) -> Handle {
300300 parent. and_then ( |node| node. upgrade ( ) ) . unwrap ( )
301301}
302302
303+ pub fn get_robots ( handle : & Handle ) -> Option < String > {
304+ for meta_node in find_nodes ( handle, vec ! [ "html" , "head" , "meta" ] ) . iter ( ) {
305+ // Only the first base tag matters (we ignore the rest, if there's any)
306+ if get_node_attr ( meta_node, "name" )
307+ . unwrap_or_default ( )
308+ . eq_ignore_ascii_case ( "robots" )
309+ {
310+ return get_node_attr ( meta_node, "content" ) ;
311+ }
312+ }
313+
314+ None
315+ }
316+
303317pub fn get_title ( node : & Handle ) -> Option < String > {
304318 for title_node in find_nodes ( node, vec ! [ "html" , "head" , "title" ] ) . iter ( ) {
305319 for child_node in title_node. children . borrow ( ) . iter ( ) {
@@ -436,7 +450,7 @@ pub fn parse_srcset(srcset: &str) -> Vec<SrcSetItem> {
436450 srcset_items
437451}
438452
439- pub fn set_base_url ( document : & Handle , desired_base_href : String ) -> RcDom {
453+ pub fn set_base_url ( document : & Handle , base_href_value : String ) -> RcDom {
440454 let mut buf: Vec < u8 > = Vec :: new ( ) ;
441455 serialize (
442456 & mut buf,
@@ -450,14 +464,14 @@ pub fn set_base_url(document: &Handle, desired_base_href: String) -> RcDom {
450464 if let Some ( head_node) = get_child_node_by_name ( & html_node, "head" ) {
451465 // Check if BASE node already exists in the DOM tree
452466 if let Some ( base_node) = get_child_node_by_name ( & head_node, "base" ) {
453- set_node_attr ( & base_node, "href" , Some ( desired_base_href ) ) ;
467+ set_node_attr ( & base_node, "href" , Some ( base_href_value ) ) ;
454468 } else {
455469 let base_node = create_element (
456470 & dom,
457471 QualName :: new ( None , ns ! ( ) , LocalName :: from ( "base" ) ) ,
458472 vec ! [ Attribute {
459473 name: QualName :: new( None , ns!( ) , LocalName :: from( "href" ) ) ,
460- value: format_tendril!( "{}" , desired_base_href ) ,
474+ value: format_tendril!( "{}" , base_href_value ) ,
461475 } ] ,
462476 ) ;
463477
@@ -470,10 +484,10 @@ pub fn set_base_url(document: &Handle, desired_base_href: String) -> RcDom {
470484 dom
471485}
472486
473- pub fn set_charset ( dom : RcDom , desired_charset : String ) -> RcDom {
487+ pub fn set_charset ( dom : RcDom , charset : String ) -> RcDom {
474488 for meta_node in find_nodes ( & dom. document , vec ! [ "html" , "head" , "meta" ] ) . iter ( ) {
475489 if get_node_attr ( meta_node, "charset" ) . is_some ( ) {
476- set_node_attr ( meta_node, "charset" , Some ( desired_charset ) ) ;
490+ set_node_attr ( meta_node, "charset" , Some ( charset ) ) ;
477491 return dom;
478492 }
479493
@@ -485,7 +499,7 @@ pub fn set_charset(dom: RcDom, desired_charset: String) -> RcDom {
485499 set_node_attr (
486500 meta_node,
487501 "content" ,
488- Some ( format ! ( "text/html;charset={}" , desired_charset ) ) ,
502+ Some ( format ! ( "text/html;charset={}" , charset ) ) ,
489503 ) ;
490504 return dom;
491505 }
@@ -498,7 +512,7 @@ pub fn set_charset(dom: RcDom, desired_charset: String) -> RcDom {
498512 QualName :: new ( None , ns ! ( ) , LocalName :: from ( "meta" ) ) ,
499513 vec ! [ Attribute {
500514 name: QualName :: new( None , ns!( ) , LocalName :: from( "charset" ) ) ,
501- value: format_tendril!( "{}" , desired_charset ) ,
515+ value: format_tendril!( "{}" , charset ) ,
502516 } ] ,
503517 ) ;
504518
@@ -508,6 +522,7 @@ pub fn set_charset(dom: RcDom, desired_charset: String) -> RcDom {
508522 . children
509523 . borrow_mut ( )
510524 . push ( meta_charset_node. clone ( ) ) ;
525+ break ;
511526 }
512527 }
513528
@@ -551,6 +566,47 @@ pub fn set_node_attr(node: &Handle, attr_name: &str, attr_value: Option<String>)
551566 } ;
552567}
553568
569+ pub fn set_robots ( dom : RcDom , content_value : & str ) -> RcDom {
570+ for meta_node in find_nodes ( & dom. document , vec ! [ "html" , "head" , "meta" ] ) . iter ( ) {
571+ if get_node_attr ( meta_node, "name" )
572+ . unwrap_or_default ( )
573+ . eq_ignore_ascii_case ( "robots" )
574+ {
575+ set_node_attr ( meta_node, "content" , Some ( content_value. to_string ( ) ) ) ;
576+ return dom;
577+ }
578+ }
579+
580+ // Manually append robots META node to HEAD
581+ {
582+ let meta_charset_node: Handle = create_element (
583+ & dom,
584+ QualName :: new ( None , ns ! ( ) , LocalName :: from ( "meta" ) ) ,
585+ vec ! [
586+ Attribute {
587+ name: QualName :: new( None , ns!( ) , LocalName :: from( "name" ) ) ,
588+ value: format_tendril!( "robots" ) ,
589+ } ,
590+ Attribute {
591+ name: QualName :: new( None , ns!( ) , LocalName :: from( "content" ) ) ,
592+ value: format_tendril!( "{}" , content_value) ,
593+ } ,
594+ ] ,
595+ ) ;
596+
597+ // Insert newly created META charset node into HEAD
598+ for head_node in find_nodes ( & dom. document , vec ! [ "html" , "head" ] ) . iter ( ) {
599+ head_node
600+ . children
601+ . borrow_mut ( )
602+ . push ( meta_charset_node. clone ( ) ) ;
603+ break ;
604+ }
605+ }
606+
607+ dom
608+ }
609+
554610pub fn serialize_document ( dom : RcDom , document_encoding : String , options : & Options ) -> Vec < u8 > {
555611 let mut buf: Vec < u8 > = Vec :: new ( ) ;
556612
0 commit comments