Я не знаю алгоритма, позволяющего безопасно вставлять метки направления в строку HTML без ее анализа. Разбор HTML в DOM и манипулирование текстовыми узлами - самый безопасный способ избежать случайного добавления меток направления в текст внутри тегов <script>
и <style>
.
Вот короткий скрипт на Python, который может помочь вам автоматически преобразовать ваши файлы. Логика должна быть легко переведена на другие языки, если это необходимо. Я недостаточно знаком с правилами RTL, которые вы пытаетесь кодировать, но вы можете настроить регулярное выражение '(\W([^\W]+)(\W)'
и шаблон подстановки ur"\u200e\1\2\3\u200e"
, чтобы получить ожидаемый результат:
import re
import lxml.html
_RE_REPLACE = re.compile('(\W)([^\W]+)(\W)', re.M)
def _replace(text):
if not text:
return text
return _RE_REPLACE.sub(ur'\u200e\1\2\3\u200e', text)
text = u'''
<html><body>
<div>sample (\u05de\u05d3\u05d2\u05dd :example)</div>
<script type="text/javascript">var foo = "ignore this";</script>
<style type="text/css">div { font-size: 18px; }</style>
</body></html>
'''
# convert the text into an html dom
tree = lxml.html.fromstring(text)
body = tree.find('body')
# iterate over all children of <body> tag
for node in body.iterdescendants():
# transform text with trails after the current html tag
node.tail = _replace(node.tail)
# ignore text inside script and style tags
if node.tag in ('script','style'):
continue
# transform text inside the current html tag
node.text = _replace(node.text)
# render the modified tree back to html
print lxml.html.tostring(tree)
Выход:
python convert.py
<html><body>
<div>sample (מדגם ‎:example)‎</div>
<script type="text/javascript">var foo = "ignore this";</script>
<style type="text/css">div { font-size: 18px; }</style>
</body></html>