22import xml .etree .ElementTree as etree
33from dataclasses import dataclass
44
5- from neoteroi .mkdocs .markdown .images import build_icon_html
6- from neoteroi .mkdocs .markdown .images import build_image_html
5+ from neoteroi .mkdocs .markdown .images import build_icon_html , build_image_html
76
87from .domain import CardItem , Cards
98
@@ -16,6 +15,7 @@ class CardsViewOptions:
1615 class_name : str = ""
1716 cols : int = 3
1817 image_bg : bool = False
18+ blank_target : bool = False
1919
2020 def __post_init__ (self ):
2121 if isinstance (self .cols , str ):
@@ -45,6 +45,14 @@ def _get_root_class(self):
4545 return base_class + " " + self .options .class_name
4646 return base_class
4747
48+ def _get_link_properties (self , item : CardItem ):
49+ assert item .url is not None
50+ props = {"href" : item .url }
51+
52+ if self .options .blank_target :
53+ props .update (target = "_blank" , rel = "noopener" )
54+ return props
55+
4856 def build_html (self , parent , cards : Cards ):
4957 root_element = etree .SubElement (
5058 parent , "div" , {"class" : self ._get_root_class ()}
@@ -57,7 +65,9 @@ def build_item_html(self, parent, item: CardItem):
5765 item_element = etree .SubElement (parent , "div" , self .get_item_props (item ))
5866
5967 if item .url :
60- first_child = etree .SubElement (item_element , "a" , {"href" : item .url })
68+ first_child = etree .SubElement (
69+ item_element , "a" , self ._get_link_properties (item )
70+ )
6171 else :
6272 first_child = etree .SubElement (
6373 item_element , "div" , {"class" : "nt-card-wrap" }
@@ -68,9 +78,10 @@ def build_item_html(self, parent, item: CardItem):
6878 if item .image :
6979 self .build_image_html (wrapper_element , item )
7080 elif item .icon :
71- build_icon_html (etree .SubElement (
72- wrapper_element , "div" , {"class" : "nt-card-icon" }
73- ), item .icon )
81+ build_icon_html (
82+ etree .SubElement (wrapper_element , "div" , {"class" : "nt-card-icon" }),
83+ item .icon ,
84+ )
7485
7586 text_wrapper = etree .SubElement (
7687 wrapper_element , "div" , {"class" : "nt-card-content" }
0 commit comments