Description
At the moment, style_map
components do not receive any data beyond the text to style (as props['children]
).
draftjs_exporter/draftjs_exporter/style_state.py
Lines 26 to 32 in 209631a
This is ok for common use cases (BOLD
, ITALIC
, etc), but it makes the style_map fallback rather useless – there is no way to know what style needs the fallback, or have any other information about the context to adjust the fallback behavior.
Here's what the block_map
fallback has access to for comparison:
props['block'] = {
'type': type_,
'depth': depth,
'data': data,
}
In retrospect I think this could've been all of the block's attributes, not just a cherry-picked shortlist, so for inline styles we could pass the following exhaustive props
:
{
# The style range to render.
"range":
"offset": 10,
"length": 17,
"style": "BOLD"
},
# The full block data, eg.
"block": {
"key": "t7k7",
"text": "Unstyled test test test test test",
"type": "unstyled",
"depth": 0,
"inlineStyleRanges": [
{
"offset": 10,
"length": 17,
"style": "BOLD"
}
],
"entityRanges": [
{
"offset": 0,
"length": 4,
"key": 6
}
],
"data": {}
},
}
Here's the approximative change:
- def render_styles(self, text_node):
+ def render_styles(self, text_node, block):
node = text_node
if not self.is_empty():
# Nest the tags.
for s in sorted(self.styles, reverse=True):
opt = Options.for_style(self.style_map, s)
+ props['block'] = block
+ props['range'] = s
node = DOM.create_element(opt.element, opt.props, node)
return node
Ideally I'd like entities and blocks to also be given more data (enough data to recreate the whole ContentState, thus making the exporter usable to create content migrations), but that's a separate issue.