OSDN Git Service

add wp_imgswap2.py for new OSDN Magazine
[otptools/otptools.git] / sfmag2wiki / sfmag_html2wiki.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 """convert sfjpmagazine's story to sfjpwiki-style text."""
4
5 import sys
6 import re
7 import os
8 import os.path
9 import urlparse
10 import urllib
11 import dircache
12 import shutil
13
14 import html2sfjpwiki
15
16 usage = """%s <html_pathname> <base_dir> <output_base_dir>""" % sys.argv[0]
17
18 def quote_title(str):
19     return str.replace(" ", "_").replace("+", "_").replace("/", "_")
20
21
22 try:
23     html_pathname = sys.argv[1]
24     base_dir = sys.argv[2]
25     output_base_dir = sys.argv[3]
26 except IndexError:
27     sys.exit(usage)
28
29 try:
30     fh = open(html_pathname, "r")
31 except IOError:
32     sys.exit(usage)
33
34 print >> sys.stderr, "converting %s..." % html_pathname
35
36 body = fh.read()
37 fh.close()
38
39 rex = re.compile(r"<\s*script[^>]*?>.*?</script>", re.S)
40 rex2 = re.compile(r"<\s*noscript[^>]*?>.*?</noscript>", re.S)
41 tmp = rex.sub("", body)
42 tmp = rex2.sub("", tmp)
43
44 # parse
45 c = html2sfjpwiki.Html2SfjpWiki()
46 c.set_url_replace_list("/Users/hylom/otptools/sfmag2wiki/urltitle.txt")
47 r = c.parse(tmp, "article-body")
48 title = c.title.replace("- SourceForge.JP Magazine : オープンソースの話題満載", "").strip()
49
50 html_dir = os.path.dirname(html_pathname)
51
52 # calculate pages
53 pdir = os.path.dirname(html_dir)
54 p = 1
55 while os.path.isdir(os.path.join(pdir, str(p))):
56     p += 1
57 last_page = p-1
58 current_page = int(os.path.basename(html_dir))
59
60 # calculate pathes
61 rel_dir = os.path.relpath(html_dir, base_dir)
62 if last_page == 1:
63     output_dir = os.path.join(output_base_dir, os.path.dirname(rel_dir).replace(os.path.sep, "-"))
64 else:
65     output_dir = os.path.join(output_base_dir, rel_dir.replace(os.path.sep, "-"))
66
67
68 # calculate titles
69 if last_page == 1:
70     page_title = title
71     page_filename = title
72 else:
73     page_title = title + "(%d/%d)" % (current_page, last_page)
74     page_filename = title + "_p%d" % current_page
75
76 page_filename_quoted = urllib.quote(quote_title(page_filename))
77
78 # output
79 if not os.path.isdir(output_dir):
80     os.makedirs(output_dir)
81 o_pathname = os.path.join(output_dir, "wiki.txt")
82 try:
83     fo = open(o_pathname, "w")
84 except IOError:
85     sys.exit("cannot open output file: %s." % o_pathname)
86
87 fo.write(page_filename_quoted + "\n")
88 fo.write(page_title + "\n\n")
89 fo.write("[[PageNavi(NavigationList)]]\n\n")
90 if current_page == 1:
91     fo.write("== %s ==\n\n" % title)
92 fo.write("\n")
93 fo.write(r)
94 fo.write("\n\n[[PageNavi(NavigationList)]]\n\n")
95 fo.close()
96
97 def copy_attachments(from_dir, dest_dir):
98     d = dircache.listdir(from_dir)
99     rex = re.compile(r"\.(png|jpg|gif)$")
100     for item in d:
101         p = os.path.join(from_dir, item)
102         dest = os.path.join(dest_dir, item)
103         if rex.search(item) and (not os.path.isdir(p)) and (not os.path.exists(dest)):
104             shutil.copy2(p, dest_dir)
105
106 copy_attachments(html_dir, output_dir)
107
108 # generate index page
109 def get_preface(str):
110     l = r.split("\n")
111     rex = re.compile(r"^\s*$")
112     preface = ""
113     break_cnt = 0
114     for p in l:
115         if rex.match(p):
116             continue
117         else:
118             break_cnt += 1
119             preface = preface + p + "\n\n"
120             if break_cnt == 2:
121                 break
122     return preface
123
124 if current_page == 1 and last_page != 1:
125     index_dir = re.sub(r"-[^-]*$", "", output_dir)
126     title_name = title + " PDF"
127     file_name = urllib.quote(quote_title(title))
128     pre = get_preface(r)
129     
130     # output
131     if not os.path.isdir(index_dir):
132         os.makedirs(index_dir)
133     o_pathname = os.path.join(index_dir, "wiki.txt")
134     try:
135         fo = open(o_pathname, "w")
136     except IOError:
137         sys.exit("cannot open output file: %s." % o_pathname)
138
139
140     fo.write(file_name + "\n")
141     fo.write(title_name + "\n")
142     fo.write("\n\n")
143     fo.write("== %s ==\n\n" % title)
144     fo.write(pre)
145
146     t = """ * [[http://sourceforge.jp/projects/test11/wiki/!pdf/%s_all.pdf 全ページをPDF形式でダウンロード]]
147
148 """
149     fo.write(t % quote_title(title))
150
151     t = " * 記事個別ページ:\n"
152     fo.write(t)
153     for n in range(1, last_page+1):
154         t1 = "%s_p%d" % (quote_title(title), n)
155         t2 = "%s(%d/%d)" % (title, n, last_page)
156         t = "   * [%s %s]" % (t1, t2)
157         fo.write(t)
158         fo.write("\n")
159     fo.write("\n\n")
160     fo.close()
161
162
163     # generate _all page
164     index_dir = re.sub(r"-[^-]*$", "_all", output_dir)
165     title_name = title
166     file_name = urllib.quote(quote_title(title) + "_all")
167
168     # output
169     if not os.path.isdir(index_dir):
170         os.makedirs(index_dir)
171     o_pathname = os.path.join(index_dir, "wiki.txt")
172     try:
173         fo = open(o_pathname, "w")
174     except IOError:
175         sys.exit("cannot open output file: %s." % o_pathname)
176
177     fo.write(file_name + "\n")
178     fo.write(title_name + "\n")
179     fo.write("\n\n")
180     for n in range(1, last_page+1):
181         t = "%s_p%d" % (quote_title(title), n)
182         fo.write("[[include(%s)]]" % t)
183         fo.write("\n")
184     fo.write("\n\n")
185     fo.close()
186
187     # generate navigation page
188     o_pathname = os.path.join(index_dir, "navigation.txt")
189     try:
190         fo = open(o_pathname, "w")
191     except IOError:
192         sys.exit("cannot open output file: %s." % o_pathname)
193
194     quoted_title = quote_title(title)
195     fo.write(" * [FrontPage HPC/並列プログラミングポータルトップページ]\n")
196     fo.write("   * [%s [記事全文PDFのダウンロード]]\n" % quoted_title)
197     fo.write("     * [FrontPage HPC/並列プログラミングポータルトップページ]\n")
198     if last_page == 1:
199         fo.write("     * [%s %s]\n" % (quoted_title, title))
200     else:
201         for n in range(1, last_page+1):
202             fo.write("     * [%s_p%d %s(%d/%d)]\n" % (quoted_title, n, title, n, last_page))
203     fo.write("     * [FrontPage HPC/並列プログラミングポータルトップページ]\n")
204     fo.close()