Перевести github приправленное регулярное выражение markdown из ruby ​​в python - PullRequest
0 голосов
/ 28 января 2011

Я пытаюсь реализовать реализацию разметки github со вкусом, работающую на python, но без удачи ... У меня нет особых навыков в области регулярных выражений.

Вот код рубина от github :

# in very clear cases, let newlines become <br /> tags
text.gsub!(/(\A|^$\n)(^\w[^\n]*\n)(^\w[^\n]*$)+/m) do |x|
  x.gsub(/^(.+)$/, "\\1  ")
end

И вот что я придумал в Python 2.5:

def newline_callback(matchobj):
    return re.sub(r'^(.+)$','\1 ',matchobj.group(0))     
text = re.sub(r'(\A|^$\n)(^\w[^\n]*\n)(^\w[^\n]*$)+', newline_callback, text)

Кажется, что никакого эффекта вообще нет: - /

Если у кого-нибудь есть полностью работоспособная реализация github, уцененная в python, кроме этой (кажется, не работает для новых строк), я бы хотел услышать об этом. Я действительно больше всего обеспокоен новыми строками.

Это тесты для регулярного выражения из кода Ruby github:

>>> gfm_pre_filter('apple\\npear\\norange\\n\\nruby\\npython\\nerlang')
'apple  \\npear  \\norange\\n\\nruby  \\npython  \\nerlang'
>>> gfm_pre_filter('test \\n\\n\\n something')
'test \\n\\n\\n something'
>>> gfm_pre_filter('# foo\\n# bar')
'# foo\\n# bar'
>>> gfm_pre_filter('* foo\\n* bar')
'* foo\\n* bar'

Ответы [ 2 ]

1 голос
/ 29 января 2011

Эта версия Ruby имеет многострочный модификатор в регулярном выражении, поэтому вам нужно сделать то же самое в python:

def newline_callback(matchobj):
    return re.sub(re.compile(r'^(.+)$', re.M),r'\1  ',matchobj.group(0))     

text = re.sub(re.compile(r'(\A|^$\n)(^\w[^\n]*\n)(^\w[^\n]*$)+', re.M), newline_callback, text)

Таким образом, этот код (как и версия Ruby) добавит два пробела после новой строки, за исключением случаев, когда у нас есть две строки (абзац).

Правильно ли указаны эти тестовые строки? У того файла, который вы связали, есть этот, и он работает с этим фиксированным кодом:

"apple\npear\norange\n\nruby\npython\nerlang"
->
"apple  \npear  \norange\n\nruby  \npython  \nerlang"
0 голосов
/ 28 января 2011
return re.sub(r'^(.+)$',r'\1 ',matchobj.group(0))
                       ^^^--------------------------- you forgot this. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...