过去,我尝试过两次实现多格式转换器。一个是Markup转换器,应该能够转换GitHub,StackOverflow,MoinMoin,MediaWiki等。另一个是Photoobook转换器,目前将ifolor转换为scribus但应该至少支持两种照片书格式加上pdf。
问题始终如一:不同的格式具有不同的功能。例如:MediaWiki和MoinMoin对宏有不同的理解,而大多数其他Markup语言不支持宏。或者ifolor有一些边界格式,这些格式很难在scribus中实现,看起来不太好。
我不喜欢为每种可能的组合实现直接转换器的想法(对于4种格式,这是12个具有大量冗余的转换器)。我开始使用“超集数据结构”,其中包含所有格式的所有功能,作为给定格式的导入和导出过滤器之间的链接,但我想知道是否有最佳实践方法来执行此类操作或类似于设计模式可能有助于了解,例如,导入和导出直接通信而没有“超级格式”的架构?
嗯,由于缺乏时间(和需求),这两个项目目前暂停,但我愿意学习下次如何做得更好。写真集为我的个人书做了工作,很快就会继续。它的代码在GitHub。
答案 0 :(得分:0)
如果有多个不同格式的文件转换器,则可以使用Dijkstra的算法查找两种文件格式之间的最短路径。本示例将dijkstar库与一系列编程语言和编译器结合使用:
from dijkstar import Graph, find_path
graph = Graph()
for edge in [
"C,JavaScript,Emscripten",
"Java,JavaScript,JSweet",
"JavaScript,Python,JS2Py",
"Python,C++,Nuitka",
"Python,JavaScript,Transcrypt",
"JavaScript,PHP,js2php"
]:
graph.add_edge(*edge.split(","))
#print a conversion path
print(find_path(graph, "JavaScript", "C++",cost_func = lambda a,b,c,d:1).edges)
在此示例中,输入格式为"JavaScript"
,输出格式为"C++"
,转换路径为['JS2Py', 'Nuitka']
。