【发布时间】:2016-10-16 15:40:51
【问题描述】:
数据
我尝试为 Sublime Text 编写转换器 Markdown 到 BBCode。
我的完整代码——https://github.com/Kristinita/1Sasha1MarkdownNoBBCode/blob/master/MarkdownToBBCode.py:
#
# Base on codes:
# https://gist.github.com/sma/1513929
# https://github.com/m3mnoch/MarkdownToBBCode/blob/master/MarkdownToBBCode.py
#
import sublime, sublime_plugin
import re, sys
class MarkdowntobbcodeCommand(sublime_plugin.TextCommand):
def run(self, edit):
allcontent = sublime.Region(0, self.view.size())
regionString = self.markdown_to_bbcode(str(self.view.substr(allcontent)))
self.view.replace(edit, allcontent, regionString)
def markdown_to_bbcode(self,s):
def translate(p="%s", g=1):
def inline(m):
s = m.group(g)
#
# Headers
#
s = re.sub(r"^#\s+(.*?)\s*$", "[h1]\\1[/h1]", s) # # Header first level
s = re.sub(r"^##\s+(.*?)\s*$", "[h2]\\1[/h2]", s) # ## Header second level
s = re.sub(r"^###\s+(.*?)\s*$", "[h3]\\1[/h3]", s) # ### Header third level
s = re.sub(r"^####\s+(.*?)\s*$", "[h4]\\1[/h4]", s)# #### Header fourth level
#
# Lists
#
s = re.sub(r"(?m)^[-+*]\s+(.*)$", translate("№[list]\n[*]%s\n[/list]"), s) # + Marked + List
s = re.sub(r"(?m)^\d+\.\s+(.*)$", translate("№[list=1]\n[*]%s\n[/list]"), s) # 1. Numbered 2. List
#
# Quote
#
s = re.sub(r"^> (.*)$", "[quote]\\1[/quote]", s) # > Quote
#
# Thematic break
#
s = re.sub(r"^-{3}(\s*)$", "[hr]", s)
return p % s
return inline
#
# URL and images
#
s = re.sub(r"!\[(.*?)\]\((.*?)\)", "[img]\\2[/img]", s) # , alt attribute not supported in many forums
s = re.sub(r"\[(.*?)\]\((.*?)\)", "[url=\\2]\\1[/url]", s)# [URL description](URL link)
s = re.sub(r"<(https?:\S+)>", "[url]\\1[/url]", s) # <URL>
#
# Code
#
s = re.sub(r"`{3}([^`]+)`{3}", "[code]\\1[/code]", s)# ```Multiline\n\code```
s = re.sub(r"`([^`]+)`", "[code]\\1[/code]", s) # `Code`
s = re.sub(r"(?m)^ {4}(.*)$", "№[code]\\1[/code]", s)# Code fragment after 4 spaces
s = re.sub(r"(?m)^\t(.*)$", "№[code]\\1[/code]", s) # Code fragment after tab
#
# Bold and italic
#
s = re.sub(r"_{2}([\s\S]+?)_{2}", "[b]\\1[/b]", s) # __Bold__
s = re.sub(r"_([^_]+?)_", "[i]\\1[/i]", s) # _Italic_ Needs hack (?<=\s), because _ symbol often use in URLs
s = re.sub(r"\*{2}([\s\S]+?)\*{2}", "[b]\\1[/b]", s)# **Bold**
s = re.sub(r"\*([^\*]+?)\*", "[i]\\1[/i]", s) # *Italic*.
#
# Strikethrough text
#
s = re.sub(r"~{2}([\s\S]+?)~{2}", "[s]\\1[\s]", s)
#
# Dependencies. Not delete these lines!
#
s = re.sub(r"(?m)^((?!№).*)$", translate(), s)
s = re.sub(r"(?m)^№\[", "[", s)
s = re.sub(r"\[/code]\n\[code(=.*?)?]", "\n", s)
s = re.sub(r"\[/list]\n\[list(=1)?]\n", "", s)
s = re.sub(r"\[/quote]\n\[quote]", "\n", s)
return s
对话示例:https://github.com/Kristinita/1Sasha1MarkdownNoBBCode。'Sasha' 转换为[code]Sasha[/code],*inaccessible height* 转换为[i]inaccessible height[/i] 等等。
(出于技术原因,我在此问题的某些地方将反引号替换为撇号 - '。)
问题
示例降价文本
[Sasha fantastic](http://example.com#example_url)
```
Example* of code
```
*Sasha* the _best_!
预期转化
[url=http://example.com#example_url]Sasha fantastic[/url]
[code]
Example* of code
[/code]
[i]Sasha[/i] the [i]best[/i]!
实际转化
[url=http://example.com#example[i]url]Sasha fantastic[/url]
[code]
Example[i] of code
[/code]
[/i]Sasha* the [/i]best_!
如果我有我的 URL 或代码符号 _ 或 *,则转换对我不利。
预期行为
- 运行网址转换和代码转换。
s = re.sub(r"'{3}([^']+)'{3}", "[code]\\1[/code]", s)
和
s = re.sub(r"\[(.*?)\]\((.*?)\)", "[url=\\2]\\1[/url]", s)
- 在
[code][/code]和[url][/url]之间不再转换任何符号。 - 如果我的降价文本不在
[code][/code]和[url][/url]之间,则将其转换为 BBCode。
问题
如何实现我的预期行为?对不起,我不是 Python 程序员,但我需要这个插件。
谢谢。
【问题讨论】:
-
第 1 步(如果你想成为一名 Python 程序员):将
translate方法分解为可消化的部分。这样您就可以自己运行一些单元测试并验证input是否等于expected_output,即区分您要添加 bold 标记的部分并查看它是否有效。然后针对组合 2 个标签 bold 和 italic 翻译运行测试,看看是否有效。这样,您的项目将很容易调试,并且您会发现它失败的地方。希望这会有所帮助。 -
那里有already exist 很多 Markdown 到用 Python 编写的 BBCode 翻译器。你为什么不把其中一个改编成 Sublime 插件呢?
-
@MattDMo,您在练习中使用此翻译器吗?谢谢。
-
我过去有过,如果我没记错的话。做正确的事情已经够难了,如果我没有必要,我不想从头开始写。
-
@MattDMo,我尝试使用许多转换器,但结果都不好。我通过了谷歌搜索结果中的几乎所有链接。所以我决定写我的转换器,虽然我不懂 Python。谢谢。
标签: python sublimetext