1010import json
1111from lxml import etree
1212
13- from contentstack_utils .embedded .styletype import StyleType
1413from contentstack_utils .helper .metadata import Metadata
1514from contentstack_utils .render .options import Options
15+ from contentstack_utils .helper .converter import convert_style
1616
1717
1818def _is_json (file ):
@@ -35,65 +35,93 @@ def find_embedded_entry(json_array: list, metadata: Metadata):
3535 return None
3636
3737
38+ def get_metadata (elements ):
39+ for element in elements :
40+ content_type = None
41+ typeof = element .attrib ['type' ]
42+ if typeof == 'asset' :
43+ uid = element .attrib ['data-sys-asset-uid' ]
44+ else :
45+ uid = element .attrib ['data-sys-entry-uid' ]
46+ content_type = element .attrib ['data-sys-content-type-uid' ]
47+ style = element .attrib ['sys-style-type' ]
48+ outer_html = etree .tostring (element ).decode ('utf-8' )
49+ attributes = element .attrib
50+ style = convert_style (style )
51+ metadata = Metadata (element .text , typeof , uid , content_type , style , outer_html , attributes )
52+ return metadata
53+
54+
55+ def get_html_doc (embedded_obj , metadata , callback , html_doc ):
56+ if '_embedded_items' in embedded_obj :
57+ keys = extract_keys (embedded_obj ['_embedded_items' ])
58+ for key in keys :
59+ items_array = embedded_obj ['_embedded_items' ][key ]
60+ item = find_embedded_entry (items_array , metadata )
61+ if item is not None :
62+ replaceable_str = callback .render_options (item , metadata )
63+ html_doc = html_doc .replace (metadata .outer_html , replaceable_str )
64+ break
65+ return html_doc
66+
67+
3868class Utils :
3969 """
4070 render staticmethod, that accepts entry/entries, key path and render_object
4171 entry_obj: [list] or [dict] that contains list or dic object
4272 key_path: list of key_path
4373 Raises:
4474 FileNotFoundError: if file not found or invalid resource received
45- NameError: [description]
4675 """
4776
4877 @staticmethod
49- def render (entry_obj , key_path : list , option_callback : Options ):
78+ def render (entry_obj , key_path : list , option : Options ):
5079 valid = _is_json (entry_obj )
5180
5281 if not valid :
5382 raise FileNotFoundError ('Invalid file found' )
5483
5584 if isinstance (entry_obj , list ):
5685 for entry in entry_obj :
57- Utils .render (entry , key_path , option_callback )
86+ Utils .render (entry , key_path , option )
5887
5988 if isinstance (entry_obj , dict ):
60- Utils ._get_embedded_keys (entry_obj , key_path , option_callback )
89+ Utils ._get_embedded_keys (entry_obj , key_path , option )
6190
6291 @staticmethod
63- def _get_embedded_keys (entry , key_path , option_callback : Options ):
92+ def _get_embedded_keys (entry , key_path , option : Options ):
6493
6594 if '_embedded_items' in entry :
6695 if key_path is not None :
6796 for path in key_path :
68- Utils ._find_embed_keys (entry , path , option_callback )
97+ Utils ._find_embed_keys (entry , path , option )
6998 else :
7099 _embedded_items = entry ['_embedded_items' ]
71100 available_keys : list = _embedded_items .keys ()
72101 for path in available_keys :
73- Utils ._find_embed_keys (entry , path , option_callback )
102+ Utils ._find_embed_keys (entry , path , option )
74103
75104 @staticmethod
76- def _find_embed_keys (entry , path , option_callback : Options ):
105+ def _find_embed_keys (entry , path , option : Options ):
77106 keys = path .split ('.' )
78- Utils ._get_content (keys , entry , option_callback )
107+ Utils ._get_content (keys , entry , option )
79108
80109 @staticmethod
81- def _get_content (keys_array : list , entry , option_callback : Options ):
110+ def _get_content (keys_array : list , entry , option : Options ):
82111 if keys_array is not None and len (keys_array ) > 0 :
83112 key = keys_array [0 ]
84113 if len (keys_array ) == 1 and keys_array [0 ] in entry :
85114 var_content = entry [key ]
86115 if isinstance (var_content , (list , str )):
87- entry [key ] = Utils .render_content (var_content , entry , option_callback )
88- # call function
116+ entry [key ] = Utils .render_content (var_content , entry , option )
89117 else :
90118 keys_array .remove (key )
91119 if key in entry and isinstance (entry [key ], dict ):
92- Utils ._get_content (keys_array , entry [key ], option_callback )
120+ Utils ._get_content (keys_array , entry [key ], option )
93121 elif key in entry and isinstance (entry [key ], list ):
94122 list_json = entry [key ]
95123 for node in list_json :
96- Utils ._get_content (keys_array , node , option_callback )
124+ Utils ._get_content (keys_array , node , option )
97125
98126 @staticmethod
99127 def render_content (rte_content , embed_obj : dict , callback : Options ) -> object :
@@ -106,49 +134,38 @@ def render_content(rte_content, embed_obj: dict, callback: Options) -> object:
106134 return temp
107135 return rte_content
108136
109- def convert_style (style ) -> StyleType :
110- if style == 'block' :
111- return StyleType .BLOCK
112- elif style == 'inline' :
113- return StyleType .INLINE
114- elif style == 'link' :
115- return StyleType .LINK
116- elif style == 'display' :
117- return StyleType .DISPLAY
118- elif style == 'download' :
119- return StyleType .DOWNLOAD
120-
121137
122138def get_embedded_objects (html_doc , embedded_obj , callback ):
123139 import re
124-
125140 document = f"<items>{ html_doc } </items>"
126141 tag = etree .fromstring (document )
127142 html_doc = etree .tostring (tag ).decode ('utf-8' )
128143 html_doc = re .sub ('(?ms)<%s[^>]*>(.*)</%s>' % (tag .tag , tag .tag ), '\\ 1' , html_doc )
129144 elements = tag .xpath ("//*[contains(@class, 'embedded-asset') or contains(@class, 'embedded-entry')]" )
130- for element in elements :
131- uid = ''
132- content_type = None
133- typeof = element .attrib ['type' ]
134- if typeof == 'asset' :
135- uid = element .attrib ['data-sys-asset-uid' ]
136- else :
137- uid = element .attrib ['data-sys-entry-uid' ]
138- content_type = element .attrib ['data-sys-content-type-uid' ]
139- style = element .attrib ['sys-style-type' ]
140- outer_html = etree .tostring (element ).decode ('utf-8' )
141- attributes = element .attrib
142- style = Utils .convert_style (style )
143- metadata = Metadata (element .text , typeof , uid , content_type , style , outer_html , attributes )
144-
145- if '_embedded_items' in embedded_obj :
146- keys = extract_keys (embedded_obj ['_embedded_items' ])
147- for key in keys :
148- items_array = embedded_obj ['_embedded_items' ][key ]
149- item = find_embedded_entry (items_array , metadata )
150- if item is not None :
151- replaceable_str = callback .render_options (item , metadata )
152- html_doc = html_doc .replace (metadata .outer_html , replaceable_str )
153- break
154- return html_doc
145+ metadata = get_metadata (elements )
146+ return get_html_doc (embedded_obj , metadata , callback , html_doc )
147+
148+ # if '_embedded_items' in embedded_obj:
149+ # keys = extract_keys(embedded_obj['_embedded_items'])
150+ # for key in keys:
151+ # items_array = embedded_obj['_embedded_items'][key]
152+ # item = find_embedded_entry(items_array, metadata)
153+ # if item is not None:
154+ # replaceable_str = callback.render_options(item, metadata)
155+ # html_doc = html_doc.replace(metadata.outer_html, replaceable_str)
156+ # break
157+ # return html_doc
158+
159+ # for element in elements:
160+ # content_type = None
161+ # typeof = element.attrib['type']
162+ # if typeof == 'asset':
163+ # uid = element.attrib['data-sys-asset-uid']
164+ # else:
165+ # uid = element.attrib['data-sys-entry-uid']
166+ # content_type = element.attrib['data-sys-content-type-uid']
167+ # style = element.attrib['sys-style-type']
168+ # outer_html = etree.tostring(element).decode('utf-8')
169+ # attributes = element.attrib
170+ # style = Utils.convert_style(style)
171+ # metadata = Metadata(element.text, typeof, uid, content_type, style, outer_html, attributes)
0 commit comments