Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
wiki:moinmoin2dokuwiki [2009/07/24 00:18] |
wiki:moinmoin2dokuwiki [2009/12/25 23:53] (текущий) |
||
---|---|---|---|
Строка 15: | Строка 15: | ||
# ----------------------------------------------------------------------------------------------- # | # ----------------------------------------------------------------------------------------------- # | ||
- | # Hash for smileys replacement (actual for ubuntu.com wiki) | + | # Hash for smileys replacement |
%smileys = ( | %smileys = ( | ||
#moin doku | #moin doku | ||
Строка 60: | Строка 60: | ||
} | } | ||
- | # Link | + | # Links |
- | sub link_replacement { | + | sub linkReplacement { |
- | die "Oops!\n" if @_ != 5; | + | die "Oops!\n" unless @_ == 5; |
my ($namespace,$br,$target,$text,$params) = @_; | my ($namespace,$br,$target,$text,$params) = @_; | ||
# Attachments links | # Attachments links | ||
Строка 81: | Строка 81: | ||
} | } | ||
- | # Block | + | # Blocks |
- | sub block_replacement { | + | sub blockReplacement { |
for (my $i = 0; $i < @_ && $_[$i] =~ /^\$*$/; $i++ ) { shift @_ } # delete empty lines | for (my $i = 0; $i < @_ && $_[$i] =~ /^\$*$/; $i++ ) { shift @_ } # delete empty lines | ||
for (my $i = -1; -$i <= @_ && $_[$i] =~ /^\$*$/; $i-- ) { pop @_ } # delete empty lines | for (my $i = -1; -$i <= @_ && $_[$i] =~ /^\$*$/; $i-- ) { pop @_ } # delete empty lines | ||
Строка 96: | Строка 96: | ||
} | } | ||
- | # Table | + | # Tables |
- | sub table_replacement { | + | sub tableReplacement { |
@table = @_; | @table = @_; | ||
for (@table) { | for (@table) { | ||
Строка 107: | Строка 107: | ||
"|| $2 " . '|' x (length($1) - 2) | "|| $2 " . '|' x (length($1) - 2) | ||
/ge; | /ge; | ||
- | # Spanning | + | # Span |
# TODO | # TODO | ||
# Aligment | # Aligment | ||
Строка 150: | Строка 150: | ||
} elsif ($is_table) { | } elsif ($is_table) { | ||
$is_table = 0; | $is_table = 0; | ||
- | @table = table_replacement(@table); | + | @table = tableReplacement(@table); |
print OUTFILE @table; | print OUTFILE @table; | ||
@table = (); | @table = (); | ||
Строка 164: | Строка 164: | ||
next MOINSCAN unless ($+{text} && $+{text} !~ /^\s+$/); | next MOINSCAN unless ($+{text} && $+{text} !~ /^\s+$/); | ||
$_ = "$+{text}\n"; | $_ = "$+{text}\n"; | ||
- | } elsif (/(?<data>.+?)}{$block_sep_len}\s*(?<text>.*)\n/ && $is_block) { | + | } elsif (/(?<data>.+?)?}{$block_sep_len}\s*(?<text>.*)\n/ && $is_block) { |
$is_block = 0; | $is_block = 0; | ||
push @block, "$+{data}\n" if $+{data}; | push @block, "$+{data}\n" if $+{data}; | ||
- | @block = block_replacement(@block); | + | @block = blockReplacement(@block); |
print OUTFILE @block; | print OUTFILE @block; | ||
@block = (); | @block = (); | ||
Строка 204: | Строка 204: | ||
(??{ &inv($+{br}) x 2 }) # closing brackets | (??{ &inv($+{br}) x 2 }) # closing brackets | ||
/ | / | ||
- | &link_replacement($namespace,$+{br},$+{target},$+{text},$+{params}) | + | &linkReplacement($namespace,$+{br},$+{target},$+{text},$+{params}) |
/gxe; | /gxe; | ||
# CamelCase links | # CamelCase links | ||
Строка 228: | Строка 228: | ||
s{~\+(.+?)\+~}<$1>g; # larger text | s{~\+(.+?)\+~}<$1>g; # larger text | ||
# Lists and intends | # Lists and intends | ||
- | if (/^(?<intend>\s+)\*\s*(?<value>\S.*)\n/) { # dotted list | + | if (/^(?<intend>\s+)\*\s+(?<value>\S.*)\n/) { # dotted list |
if ($is_list) { print OUTFILE "\n" } | if ($is_list) { print OUTFILE "\n" } | ||
print OUTFILE " "x(2*length($+{intend})),"* "; | print OUTFILE " "x(2*length($+{intend})),"* "; | ||
Строка 234: | Строка 234: | ||
$intend = length $+{intend}; | $intend = length $+{intend}; | ||
$is_list = 1; | $is_list = 1; | ||
- | } elsif (/^(?<intend>\s+)[1aAiI]\.(#\d+)?\s*(?<value>\S.*)\n/) { # numeric list | + | } elsif (/^(?<intend>\s+)[1aAiI]\.(#\d+)?\s+(?<value>\S.*)\n/) { # numeric list |
if ($is_list) { print OUTFILE "\n" } | if ($is_list) { print OUTFILE "\n" } | ||
print OUTFILE " "x(2*length($+{intend})),"- "; | print OUTFILE " "x(2*length($+{intend})),"- "; | ||
Строка 288: | Строка 288: | ||
} | } | ||
if ($is_table) { | if ($is_table) { | ||
- | @table = table_replacement(@table); | + | @table = tableReplacement(@table); |
print OUTFILE @table; | print OUTFILE @table; | ||
} | } | ||
if ($is_block) { | if ($is_block) { | ||
- | @block = block_replacement(@block); | + | @block = blockReplacement(@block); |
print OUTFILE @block; | print OUTFILE @block; | ||
} | } | ||
Строка 315: | Строка 315: | ||
* http://moinmo.in/HelpOnEditing - проверить, всё ли учли | * http://moinmo.in/HelpOnEditing - проверить, всё ли учли | ||
</note> | </note> | ||
+ | |||
+ | Абсолютно то же самое, только переписанное на Python, вдруг кому пригодится. Те же комментарии, таблицы обрабатываются не до конца и нужно не забыть заменить <!/code> на %%</code>%%: | ||
+ | |||
+ | <code python> | ||
+ | #!/usr/bin/env python | ||
+ | # coding=utf8 | ||
+ | |||
+ | # Author: Vadim Nevorotin (malamut@ubuntu.ru) | ||
+ | # License: GPLv3 | ||
+ | |||
+ | # Rus: | ||
+ | # Скрипт конвертации разметки MoinMoin в разметку DokuWiki | ||
+ | # Использование: moin2doku.py moin_file doku_file [namespace] | ||
+ | # namespace - это пространство имён для всех ссылок на вложения (картинки, например) | ||
+ | |||
+ | # Скрипт не до конца обрабатывает таблицы, не учитывается склейка ячеек и выравнивание | ||
+ | # Так же не добавлена конвертация новой возможности moin: {{{#!wiki caution }}} и прочих выделений (http://moinmo.in/HelpOnAdmonitions) | ||
+ | # Всё остальное с http://moinmo.in/HelpOnEditing на 11.2009 конвертируется в полном объёме | ||
+ | |||
+ | # Eng: | ||
+ | |||
+ | # Usage: ./moin2doku.py moin_file doku_file [namespace] | ||
+ | # namespace - for all links to images ({{namespace:image.png}}) | ||
+ | |||
+ | import sys | ||
+ | import re | ||
+ | from os.path import isfile | ||
+ | |||
+ | # Hash for smileys replacement | ||
+ | smileys = { | ||
+ | #moin doku | ||
+ | 'X-(' : ':-X', | ||
+ | ':D' : ':-D', | ||
+ | '<:(' : ':-?', | ||
+ | ':o' : ':-O', | ||
+ | ':(' : ':-(', | ||
+ | ':)' : ':-)', | ||
+ | 'B)' : '8-)', | ||
+ | ':))' : ':-P', | ||
+ | ';)' : ';-)', | ||
+ | '/!\\' : ':!:', | ||
+ | '<!>' : ':!:', | ||
+ | '(!)' : ':!:', | ||
+ | ':-?' : ':-P', | ||
+ | ':\\' : ':-\\', | ||
+ | '>:>' : '^_^', | ||
+ | '|)' : ':-|', | ||
+ | ':-(' : ':-(', | ||
+ | ':-)' : ':-)', | ||
+ | 'B-)' : '8-)', | ||
+ | ':-))' : ':-P', | ||
+ | ';-)' : ';-)', | ||
+ | '|-)' : ':-|', | ||
+ | '(./)' : 'LOL', | ||
+ | '{OK}' : ':!:', | ||
+ | '{X}' : ':!:', | ||
+ | '{i}' : ':!:', | ||
+ | '{1}' : '<1>', | ||
+ | '{2}' : '<2>', | ||
+ | '{3}' : '<3>', | ||
+ | '{*}' : '<ubu>', | ||
+ | '{o}' : '<circ>', | ||
+ | } | ||
+ | |||
+ | # Convert functions | ||
+ | |||
+ | def inv(br): | ||
+ | if br == '{': return '}' | ||
+ | if br == '[': return ']' | ||
+ | return br | ||
+ | |||
+ | def linkReplacement(namespace,br,target,text): | ||
+ | if not target: | ||
+ | print >> sys.stderr, "Fatal error" | ||
+ | sys.exit(1) | ||
+ | m_att = re.match('(?:(?:attachment|drawing):)(?P<att>.+)$',target) | ||
+ | m_inter = re.match('(.+?):(?!//)(.+)$',target) | ||
+ | # Attachments links | ||
+ | if m_att: | ||
+ | if m_att.group('att'): | ||
+ | att = re.sub('(.+)/','',m_att.group('att')) # leave only filename, without namespaces | ||
+ | else: | ||
+ | att = m_att.groups('att') | ||
+ | if text: | ||
+ | return '{{'+namespace+':'+att+'|'+text+'}}' | ||
+ | else: | ||
+ | return '{{'+namespace+':'+att+'}}' | ||
+ | # InterWiki links | ||
+ | if m_inter: | ||
+ | if text: | ||
+ | return '[['+m_inter.group(1)+'>'+m_inter.group(2)+'|'+text+']]' | ||
+ | else: | ||
+ | return '[['+m_inter.group(1)+'>'+m_inter.group(2)+']]' | ||
+ | # All other links simply returned in doku format | ||
+ | if not re.search('://', target): # if target not an internet link replace all / to : (for namespaces) | ||
+ | target = re.sub('/',':',target) | ||
+ | if text: | ||
+ | return br + br + target + '|' + text + inv(br) * 2 | ||
+ | else: | ||
+ | return br + br + target + inv(br) * 2 | ||
+ | |||
+ | def tableReplacement(table): | ||
+ | for i in range(len(table)): | ||
+ | line = table[i] | ||
+ | line = re.sub('\|\|(?:\s*(<.+?>))?\s*(.+?)\s*(?=\|\|)', lambda m: '||' + m.group(1) + m.group(2) if m.group(1) else '||' + m.group(2), line) | ||
+ | line = re.sub('((?:\|\|){2,})(.+?)(?=\|\|)', lambda m: '|| '+m.group(2)+' ' + '|' * (len(m.group(1)) - 2), line) | ||
+ | line = re.sub('\|\|(\s*)(?:<.+?>\s*?)+(.*?)(?=\|\|)','||\\1\\2', line) | ||
+ | line = re.sub('\|\|','|', line) | ||
+ | table[i] = line | ||
+ | size = len(table) | ||
+ | i = 0 | ||
+ | while i < size: | ||
+ | if re.match('\|+$',table[i]): | ||
+ | table.pop(i) | ||
+ | size=size-1 | ||
+ | else: | ||
+ | i=i+1 | ||
+ | return table | ||
+ | |||
+ | def blockReplacement(block): | ||
+ | if block and not block[0].strip(): | ||
+ | block.pop(0) | ||
+ | if not block[-1].strip(): | ||
+ | block.pop() | ||
+ | if not block: | ||
+ | block.append('<code>\n') | ||
+ | elif re.match('\s*#!python',block[0]): | ||
+ | block.pop(0) | ||
+ | block.insert(0,'<code python>\n') | ||
+ | elif re.match('\s*#!cplusplus',block[0]): | ||
+ | block.pop(0) | ||
+ | block.insert(0,'<code cpp>\n') | ||
+ | elif re.match('\s*#!java',block[0]): | ||
+ | block.pop(0) | ||
+ | block.insert(0,'<code java>\n') | ||
+ | elif re.match('\s*#!pascal',block[0]): | ||
+ | block.pop(0) | ||
+ | block.insert(0,'<code pascal>\n') | ||
+ | elif re.match('\s*#!.+',block[0]): | ||
+ | block.pop(0) | ||
+ | block.insert(0,'<code>\n') | ||
+ | else: | ||
+ | block.insert(0,'<code>\n') | ||
+ | block.append('<!/code>') | ||
+ | return block | ||
+ | |||
+ | def ConvertMoinToDoku(moin_file,doku_file,namespace): | ||
+ | try: | ||
+ | infile = open(moin_file,"r") | ||
+ | outfile = open(doku_file,"w") | ||
+ | except: | ||
+ | print >> sys.stderr, "Open file error!" | ||
+ | sys.exit(1) | ||
+ | |||
+ | content=infile.readlines() | ||
+ | infile.close() | ||
+ | |||
+ | # Conversion | ||
+ | st = '~@!' # For headings conversion | ||
+ | camel = '(?<![\\[!:])\b[A-Z]+[a-z]+[A-Z][A-Za-z]*\b' # CamelCase regexp | ||
+ | conversion = ( | ||
+ | # Processing instructions | ||
+ | ('^##(.*)\n',''), | ||
+ | ('^#(pragma|format|redirect|refresh|language)(.*)\n',''), | ||
+ | ('^#deprecated(.*)\n','<note warning>This page is deprecated<note>\n'), | ||
+ | # Other elements | ||
+ | ('(<<BR>>)|(\[\[BR]])','\\\\ '), | ||
+ | ('^\s*-{4,}\s*$','----\n'), | ||
+ | ('^(.*)/\*(.+?)\*/(.*)\n','\\1\n>\\2\n\\3\n'), # inline comments | ||
+ | # Macros and another foolish - simply remove | ||
+ | ('<<.+?>>',''), | ||
+ | # Headings | ||
+ | ('^\s*=====\s*(.+?)\s*=====\s*$',st*2 + ' \\1 ' + st*2 + '\n'), | ||
+ | ('^\s*====\s*(.+?)\s*====\s*$',st*3 + ' \\1 ' + st*3 + '\n'), | ||
+ | ('^\s*===\s*(.+?)\s*===\s*$',st*4 + ' \\1 ' + st*4 + '\n'), | ||
+ | ('^\s*==\s*(.+?)\s*==\s*$',st*5 + ' \\1 ' + st*5 + '\n'), | ||
+ | ('^\s*=\s*(.+?)\s*=\s*$',st*6 + ' \\1 ' + st*6 + '\n'), | ||
+ | (st,'='), | ||
+ | # CamelCase links | ||
+ | ('('+camel+')/('+camel+')','[[\\1:\\2]]'), | ||
+ | ('\.\./('+camel+')','[[\\1]]'), | ||
+ | ('/('+camel+')','[['+namespace+':\\1]]'), | ||
+ | ('('+camel+')','[[\\1]]'), | ||
+ | # Avoid automating linking - simply remove | ||
+ | ("''''''",''), | ||
+ | ('``',''), | ||
+ | ('!([A-Z]\w+)','\\1'), | ||
+ | # Text formatting | ||
+ | ("'''''(.+?)'''''",'**//\\1//**'), | ||
+ | ("'''(.+?)'''",'**\\1**'), | ||
+ | ("''(.+?)''",'//\\1//'), | ||
+ | ('`(.+?)`',"''\\1''"), | ||
+ | (',,(.+?),,','<sub>\\1</sub>'), | ||
+ | ('\^(.+?)\^','<sup>\\1</sup>'), | ||
+ | ('--\((.+?)\)--','<del>\\1</del>'), | ||
+ | # Unsupported text formating - simply remove | ||
+ | ('~-(.+?)-~','\\1'), | ||
+ | ('~\+(.+?)\+~','\\1') | ||
+ | ) | ||
+ | |||
+ | # Values for conversion | ||
+ | intend = 0 | ||
+ | is_table = 0 | ||
+ | is_block = 0 | ||
+ | block_sep_len = 3 | ||
+ | is_list = 0 | ||
+ | table = [] | ||
+ | block = [] | ||
+ | |||
+ | for i in range(len(content)): | ||
+ | line = content[i] | ||
+ | # First of all remove all end whitespaces except \n | ||
+ | line = re.sub('\s*$','\n',line) | ||
+ | # Tables | ||
+ | m = re.search('\s*(?P<line>\|\|.+\|\|\n)',line) | ||
+ | if m and not is_block: | ||
+ | is_table = 1 | ||
+ | is_list = 0 | ||
+ | line = m.group('line') | ||
+ | elif is_table: | ||
+ | is_table = 0 | ||
+ | table = tableReplacement(table) | ||
+ | outfile.writelines(table) | ||
+ | table = [] | ||
+ | # Code blocks parser | ||
+ | if not is_block: | ||
+ | line = re.sub('\{{3}(.+?)}{3}','%%\\1%%',line) | ||
+ | m_open = re.search('(?P<text>.*?)\s*(?P<sep>\{{3,})(?P<mod>.*\n)',line) | ||
+ | m_close = re.search('(?P<data>.+?)?}{'+str(block_sep_len)+'}\s*(?P<text>.*)\n',line) | ||
+ | if m_open and not is_block and not is_table: | ||
+ | block_sep_len = len(m_open.group('sep')) | ||
+ | is_block = 1 | ||
+ | if is_list: | ||
+ | outfile.write('\n') | ||
+ | is_list = 0 | ||
+ | block = [m_open.group('mod')] | ||
+ | if not ( m_open.group('text') and not re.match('\s+$',m_open.group('text')) ): | ||
+ | continue | ||
+ | line = m_open.group('text') + '\n' | ||
+ | elif m_close and is_block: | ||
+ | is_block = 0 | ||
+ | if m_close.group('data'): | ||
+ | block.append(m_close.group('data') + '\n') | ||
+ | block = blockReplacement(block) | ||
+ | outfile.writelines(block) | ||
+ | block = [] | ||
+ | if not m_close.group('text'): | ||
+ | continue | ||
+ | line = m_close.group('text') + '\n' | ||
+ | elif is_block: | ||
+ | block.append(line) | ||
+ | continue | ||
+ | # Links | ||
+ | # Unfortunately, Python is not a Perl, so we can't convert links using only one regexp... | ||
+ | link = '' | ||
+ | s = '' | ||
+ | br = '' | ||
+ | is_link = 0 | ||
+ | last = len(line)-1 | ||
+ | for i in range(len(line)): | ||
+ | if not is_link and i != last and line[i] == '[' and line[i+1] == '[': | ||
+ | is_link = 1 | ||
+ | link = br = '[' | ||
+ | elif not is_link and i != last and line[i] == '{' and line[i+1] == '{': | ||
+ | is_link = 1 | ||
+ | link = br = '{' | ||
+ | elif is_link and line[i] == inv(br) and line[i-1] == inv(br): | ||
+ | is_link = 0 | ||
+ | link = link + line[i] | ||
+ | m = re.match('(?P<target>[^\|]+)(?:\|(?P<text>[^\|]+))?',link[2:-2]) | ||
+ | link = linkReplacement(namespace,link[0],m.group('target'),m.group('text')) | ||
+ | s = s + link | ||
+ | elif is_link: | ||
+ | link = link + line[i] | ||
+ | else: | ||
+ | s = s + line[i] | ||
+ | line = s | ||
+ | # Now convert syntax | ||
+ | for r in conversion: | ||
+ | reg=re.compile(r[0],re.I) | ||
+ | line=reg.sub(r[1],line) | ||
+ | # Lists and intends | ||
+ | m_dotted = re.match('(?P<intend>\s+)\*\s+(?P<value>\S.*)\n',line) | ||
+ | m_numeric = re.match('(?P<intend>\s+)[1aAiI]\.(#\d+)?\s+(?P<value>\S.*)\n',line) | ||
+ | m_defs = re.match('(?P<intend>\s+)(?P<key>\S[^\[\{]+)::\s+(?P<value>\S.*)\n',line) | ||
+ | m_def = re.match('(?P<intend>\s+)(?P<key>\S[^\[\{]+)::\s*',line) | ||
+ | m_desc = re.match('(?P<intend>\s+)::\s*(?P<value>\S.*)\n',line) | ||
+ | m_white = re.match('(?P<intend>\s+)(\.\s+)?\S',line) | ||
+ | if m_dotted: | ||
+ | if is_list: | ||
+ | outfile.write('\n') | ||
+ | outfile.write(" "*(2*len(m_dotted.group('intend')))+"* ") | ||
+ | line = m_dotted.group('value') | ||
+ | intend = len(m_dotted.group('intend')) | ||
+ | is_list = 1 | ||
+ | elif m_numeric: | ||
+ | if is_list: | ||
+ | outfile.write('\n') | ||
+ | outfile.write(" "*(2*len(m_numeric.group('intend')))+"- ") | ||
+ | line = m_numeric.group('value') | ||
+ | intend = len(m_numeric.group('intend')) | ||
+ | is_list = 1 | ||
+ | elif m_defs: | ||
+ | if is_list: | ||
+ | outfile.write('\n') | ||
+ | outfile.write('**'+m_defs.group('key')+'**\n') | ||
+ | outfile.write(' * ') | ||
+ | line = m_defs.group('value') | ||
+ | intend = len(m_defs.group('intend')) | ||
+ | is_list = 1 | ||
+ | elif m_def: | ||
+ | if is_list: | ||
+ | outfile.write('\n') | ||
+ | outfile.write('**'+m_def.group('key')+'**\n') | ||
+ | line = '' | ||
+ | is_list = 0 | ||
+ | elif m_desc: | ||
+ | if is_list: | ||
+ | outfile.write('\n') | ||
+ | outfile.write(' * ') | ||
+ | line = m_desc.group('value') | ||
+ | intend = len(m_desc.group('intend')) | ||
+ | is_list = 1 | ||
+ | elif m_white: | ||
+ | curr_intend = len(m_white.groups('intend')) | ||
+ | if curr_intend != intend and is_list: | ||
+ | outfile.write('\n\n') | ||
+ | is_list = 0 | ||
+ | elif curr_intend != intend and not is_list: | ||
+ | outfile.write('\n') | ||
+ | elif curr_intend == intend and is_list: | ||
+ | outfile.write(' ') | ||
+ | line = line.rstrip() | ||
+ | intend = curr_intend | ||
+ | line = re.sub('^\s*(\.\s*)?(?=\S)','',line) | ||
+ | else: | ||
+ | if is_list and not re.match('\n',line): | ||
+ | outfile.write('\n\n') | ||
+ | elif intend: | ||
+ | outfile.write('\n') | ||
+ | intend = 0 | ||
+ | is_list = 0 | ||
+ | # Smileys $) | ||
+ | for smile in smileys.keys(): | ||
+ | line = re.sub('(\s|\A)'+re.escape(smile)+'(\s)',' '+smileys[smile]+'\\2',line) | ||
+ | # Finally... | ||
+ | if is_block and is_list: | ||
+ | line += '\n' | ||
+ | if not is_table: | ||
+ | outfile.write(line) | ||
+ | else: | ||
+ | table.append(line) | ||
+ | # If we haven't close some things | ||
+ | if is_table: | ||
+ | table = tableReplacement(table) | ||
+ | outfile.writelines(table) | ||
+ | if is_block: | ||
+ | block = blockReplacement(block) | ||
+ | outfile.writelines(block) | ||
+ | outfile.close() | ||
+ | |||
+ | # Main script... | ||
+ | |||
+ | def PrintHelp(): | ||
+ | print """Usage: moin2doku moin_file doku_file [namespace] | ||
+ | Convert MoinMoin page to Doku, using namespace for pictures""" | ||
+ | sys.exit(0) | ||
+ | |||
+ | def PrintParameterError(): | ||
+ | print >> sys.stderr, "Incorrect parameters! Use --help to read more information." | ||
+ | sys.exit(1) | ||
+ | |||
+ | def CheckParameters(moin_file,doku_file): | ||
+ | if not isfile(moin_file): | ||
+ | print >> sys.stderr, "Moin file doesn't exists!" | ||
+ | sys.exit(1) | ||
+ | if not isfile(doku_file): | ||
+ | print >> sys.stderr, "Doku file doesn't exists!" | ||
+ | sys.exit(1) | ||
+ | |||
+ | if __name__ == '__main__': | ||
+ | if len(sys.argv) > 1: | ||
+ | if sys.argv[1] in ('-h', '--help'): | ||
+ | PrintHelp() | ||
+ | elif len(sys.argv) > 2: | ||
+ | moin_file = sys.argv[1] | ||
+ | doku_file = sys.argv[2] | ||
+ | if len(sys.argv) > 3: | ||
+ | namespace = sys.argv[3] | ||
+ | else: | ||
+ | namespace = '.' | ||
+ | else: | ||
+ | PrintParameterError() | ||
+ | else: | ||
+ | PrintParameterError() | ||
+ | |||
+ | CheckParameters(moin_file,doku_file) | ||
+ | |||
+ | ConvertMoinToDoku(moin_file,doku_file,namespace) | ||
+ | </code> | ||
===== Улучшенная версия ===== | ===== Улучшенная версия ===== | ||
Я ж ленивый, поэтому я написал 'обёртку' к представленной выше функции конвертации так, что бы её было удобно вызывать с различными аргументами и, кроме всего прочего, этот вариант умеет скачивать страницы и вложения из интернета. Функция конвертации здесь та же, просто она сопровождается удобным способом её вызывать. | Я ж ленивый, поэтому я написал 'обёртку' к представленной выше функции конвертации так, что бы её было удобно вызывать с различными аргументами и, кроме всего прочего, этот вариант умеет скачивать страницы и вложения из интернета. Функция конвертации здесь та же, просто она сопровождается удобным способом её вызывать. | ||
+ | |||
+ | Описание см. в POD в коде. Не забудьте заменить <!/code> на </code>. | ||
<code perl> | <code perl> |