Skip to content

Instantly share code, notes, and snippets.

@kasimi
Created July 4, 2018 10:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kasimi/66013d7f972b97365323a57394d0e789 to your computer and use it in GitHub Desktop.
Save kasimi/66013d7f972b97365323a57394d0e789 to your computer and use it in GitHub Desktop.
Convert attributes to HTML tags
class Element():
closable = True
mergeable = True
class Italic(Element):
tag = 'i'
class Bold(Element):
tag = 'b'
class Underlined(Element):
tag = 'u'
class Anchor(Element):
tag = 'a'
mergeable = False
class Color(Element):
tag = 'color'
mergeable = False
class Br(Element):
tag = 'br'
closable = False
class Converter:
def __init__(self):
self.output = []
self.opened_elems = []
def _open(self, elem):
self.output.append('<' + elem.tag + '>')
self.opened_elems.append(elem)
if not elem.closable:
self._remove(elem)
def _close(self, elem):
for opened_elem in reversed(self.opened_elems):
if opened_elem.closable:
self.output.append('</' + opened_elem.tag + '>')
self._remove(opened_elem)
if opened_elem == elem:
break
def _remove(self, elem):
# Remove last (most recently added) occurence
self.opened_elems.reverse()
self.opened_elems.remove(elem)
self.opened_elems.reverse()
def convert(self, input):
self.output = []
self.opened_elems = []
for elems in input:
# Close elements from previous iteration
for opened_elem in reversed(self.opened_elems):
if not opened_elem.mergeable or opened_elem not in elems:
self._close(opened_elem)
# Open new elements
for elem in elems:
if not elem.mergeable or not elem in self.opened_elems:
self._open(elem)
# Close remaining elements
for opened_elem in reversed(self.opened_elems):
self._close(opened_elem)
return self.output
def main():
inputs = [
[[Bold, Anchor, Underlined], [Bold, Underlined]],
# ['<b>', '<a>', '<u>', '</u>', '</a>', '<u>', '</u>', '</b>']
[[Anchor, Bold, Color, Color], [Bold, Color]],
# ['<a>', '<b>', '<color>', '<color>', '</color>', '</color>', '</b>', '</a>', '<b>', '<color>', '</color>', '</b>']
]
for input in inputs:
output = Converter().convert(input)
print(output)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment