import sublime_plugin

from html.entities import codepoint2name as cp2n


class EncodeHtmlEntities(sublime_plugin.TextCommand):
    def run(self, edit, **args):
        view = self.view

        for sel in view.sel():
            buf = []

            for pt in range(sel.begin(), sel.end()):
                ch = view.substr(pt)
                ch_ord = ord(ch)

                if not view.match_selector(pt, 'meta.tag - string, constant.character.entity') and \
                        ch_ord in cp2n and \
                        not (ch in ('"', "'") and
                             view.match_selector(pt, 'string')):
                    ch = '&%s;' % cp2n[ch_ord]

                buf.append(ch)

            view.replace(edit, sel, ''.join(buf))
