Skip to content

Commit 883206a

Browse files
shaileshmishrashaileshmishra
authored andcommitted
improved code
1 parent b1bb161 commit 883206a

File tree

7 files changed

+193
-178
lines changed

7 files changed

+193
-178
lines changed

README.md

Lines changed: 17 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -43,36 +43,16 @@ Let’s learn how you can use Utils SDK to render embedded items.
4343
To render embedded items on the front-end, use the renderContents function, and define the UI elements you want to show in the front-end of your website, as shown in the example code below:
4444

4545
```python
46-
47-
Utils.renderContents(rteArray, localJsonObj, (embedded_object, metadata) -> {
48-
49-
switch (metadata.get_style_type()) {
50-
51-
case BLOCK:
52-
title = embedded_object['title']
53-
multi_line = embedded_object['title']
54-
return '<p>'+title+'</p><span>'+multi_line+'</span>'
55-
56-
case INLINE:
57-
title_inline = embedded_object['title']
58-
ml_inline = embedded_object['multi_line']
59-
return ¸<p>'+title_inline+'</p><span>'+ml_inline+'</span>'
60-
61-
case LINKED:
62-
title_linked = embedded_object['title']
63-
ml_linked = embedded_object['multi_line']
64-
return '<p>'+title_linked+'</p><span>'+ml_linked+'</span>'
65-
66-
case DISPLAYABLE:
67-
title_diplayable = embedded_object['title']
68-
ml_diplayable = embedded_object['multi_line']
69-
return '<p>'+title_diplayable+'</p><span>'+ml_diplayable+ '</span>'
70-
71-
default:
72-
return null;
73-
}
74-
});
75-
46+
from contentstack_utils.utils import Utils
47+
from contentstack_utils.render.options import Options
48+
49+
json_array # should be type of dictionary or list
50+
rte_content = "html_string"
51+
52+
callback = Options()
53+
response = Utils.render_content(rte_content, json_array, callback)
54+
print(response)
55+
7656
```
7757

7858
## Basic Queries
@@ -84,6 +64,8 @@ Contentstack Utils SDK lets you interact with the Content Delivery APIs and retr
8464
To get an embedded item of a single entry, you need to provide the stack API key, environment name, content type’s UID, and entry’s UID. Then, use the `entry.fetch` function as shown below:
8565

8666
```python
67+
import contentstack
68+
8769
stack = contentstack.Stack('api_key','delivery_token','environment')
8870
content_type = stack.content_type("content_type_uid")
8971
entry = content_type.entry("entry_uid")
@@ -95,7 +77,9 @@ To get an embedded item of a single entry, you need to provide the stack API key
9577
To get embedded items from multiple entries, you need to provide the stack API key, delivery token, environment name, and content type’s UID.
9678

9779
```python
98-
stack = contentstack.Stack('api_key','delivery_token','environment')
99-
query = stack.content_type("content_type_uid").query()
100-
result = query.find()
80+
import contentstack
81+
82+
stack = contentstack.Stack('api_key','delivery_token','environment')
83+
query = stack.content_type("content_type_uid").query()
84+
result = query.find()
10185
```
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from contentstack_utils.embedded.styletype import StyleType
2+
3+
4+
def convert_style(style) -> StyleType:
5+
if style == 'block':
6+
return StyleType.BLOCK
7+
elif style == 'inline':
8+
return StyleType.INLINE
9+
elif style == 'link':
10+
return StyleType.LINK
11+
elif style == 'display':
12+
return StyleType.DISPLAY
13+
elif style == 'download':
14+
return StyleType.DOWNLOAD
15+

contentstack_utils/helper/metadata.py

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,17 @@ class Metadata:
1616
def __init__(self, text: str, item_type: str, item_uid: str,
1717
content_type_uid: str, style_type: StyleType,
1818
outer_html: str, attributes: str):
19-
"""Used to set the value to the variables
19+
"""
20+
Used to set the value to the variables
2021
2122
Args:
22-
text (str): [text for embedded objects]
23-
item_type (str): [item_type for embedded objects]
24-
item_uid (str): [item_uid for embedded objects]
25-
content_type_uid (str): [content_type_uid for embedded objects]
26-
style_type (StyleType): [style_type for embedded objects]
27-
outer_html (str): [outer_html for embedded objects]
28-
attributes (str): [attributes for embedded objects]
23+
text (str): text for embedded objects
24+
item_type (str): item_type for embedded objects
25+
item_uid (str): item_uid for embedded objects
26+
content_type_uid (str): content_type_uid for embedded objects
27+
style_type (StyleType): style_type for embedded objects
28+
outer_html (str): outer_html for embedded objects
29+
attributes (str): attributes for embedded objects
2930
"""
3031
self.text = text
3132
self.item_type = item_type
@@ -37,7 +38,7 @@ def __init__(self, text: str, item_type: str, item_uid: str,
3738

3839
@property
3940
def get_text(self):
40-
"""returns text for embedded objects
41+
"""text for embedded objects
4142
4243
Returns:
4344
str : text for embedded objects
@@ -46,7 +47,7 @@ def get_text(self):
4647

4748
@property
4849
def get_item_type(self):
49-
"""returns item_type for embedded objects
50+
"""item_type for embedded objects
5051
5152
Returns:
5253
str : item_type for embedded objects
@@ -55,7 +56,7 @@ def get_item_type(self):
5556

5657
@property
5758
def get_item_uid(self):
58-
"""returns item_uid for embedded objects
59+
"""item_uid for embedded objects
5960
6061
Returns:
6162
str : item_uid for embedded objects
@@ -64,7 +65,7 @@ def get_item_uid(self):
6465

6566
@property
6667
def get_content_type_uid(self):
67-
"""returns content_type_uid for embedded objects
68+
"""content_type_uid for embedded objects
6869
6970
Returns:
7071
str : content_type_uid for embedded objects
@@ -73,7 +74,7 @@ def get_content_type_uid(self):
7374

7475
@property
7576
def get_style_type(self) -> StyleType:
76-
"""returns style_type for embedded objects
77+
"""style_type for embedded objects
7778
7879
Returns:
7980
StyleType : style_type for embedded objects
@@ -82,7 +83,7 @@ def get_style_type(self) -> StyleType:
8283

8384
@property
8485
def get_outer_html(self):
85-
"""returns outer_html for embedded objects
86+
"""outer_html for embedded objects
8687
8788
Returns:
8889
str : outer_html for embedded objects
@@ -91,9 +92,9 @@ def get_outer_html(self):
9192

9293
@property
9394
def get_attributes(self):
94-
""" returns attributes for embedded objects
95+
"""attributes for embedded objects
9596
9697
Returns:
97-
str : attributes for embedded objects
98+
str : attributes for embedded objects
9899
"""
99100
return self.attributes

contentstack_utils/render/options.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def _asset_title_or_uid(embedded_obj: dict) -> str:
2929
class Options:
3030

3131
@staticmethod
32-
def render_options(embedded_obj: dict, metadata: Metadata) -> str:
32+
def render_options(embedded_obj: dict, metadata: Metadata):
3333
if metadata.style_type.value == 'block':
3434
return '<div><p>' + _title_or_uid(embedded_obj) \
3535
+ '</p><div><p>Content type: <span>' + embedded_obj['_content_type_uid'] \
@@ -43,4 +43,4 @@ def render_options(embedded_obj: dict, metadata: Metadata) -> str:
4343
+ _asset_title_or_uid(embedded_obj) + '/>'
4444
if metadata.style_type.value == 'download':
4545
return '<a href=' + embedded_obj['url'] + '>' + _asset_title_or_uid(embedded_obj) + '</a>'
46-
return ''
46+

contentstack_utils/utils.py

Lines changed: 70 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
import json
1111
from lxml import etree
1212

13-
from contentstack_utils.embedded.styletype import StyleType
1413
from contentstack_utils.helper.metadata import Metadata
1514
from contentstack_utils.render.options import Options
15+
from contentstack_utils.helper.converter import convert_style
1616

1717

1818
def _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+
3868
class 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

122138
def 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

Comments
 (0)