コスティキャンのゲーム論pdf変換スクリプト

そういえば、昔『コスティキャンのゲーム論』のpdf変換スクリプトを作ったので公開します。

これは何?

コスティキャンのゲーム論はゲームを作る人の間では有名な文章みたいです。ただ、このサイトが昔ながらのサイトで、brで刻まれまくっているので結構読みづらく感じました。そこで適当にpdfへの変換スクリプトを書いた…訳ですがなにこのスクリプト読めない…

どんな感じ?

使い方

Python2系Beautiful SoupTeXインスコします。
僕はどうやってやったか忘れましたがTeXに関してはインストーラを使えばいいのではないでしょうか。環境変数をたたくので多分インスコ後に再起動が必要です。PythonもPATHを通しておいてね!
適当にフォルダを作って、その中に適当な名前(test.pyでやりました。)で以下のスクリプトを保存してください。また、同じフォルダにsource.htmlという名前で『コスティキャンのゲーム論』のページをダウンロードしてください。
test.pyを実行してください。test.txtができると思います。(うまくいかなかったら作ったフォルダをカレントディレクトリにしてコマンドラインからやってくだしあ)
最後に、「platex test.txt」を実行して「test.dvi」をつくり、「dvipdfmx test.dvi」で「test.pdf」ができます。これで終わりです。

スクリプト本体

#encoding:cp932
import urllib2
from BeautifulSoup import Tag, NavigableString
from BeautifulSoup import BeautifulSoup
import codecs

def countBreaks(start_):
    cnt = 0
    if start_.__class__ == Tag and start_.name == 'br':
        cnt += 1
    else:
        return 0, start_
    while 1:
        if start_.nextSibling == None:
            break
        else:
            if start_.nextSibling.__class__ is Tag and start_.nextSibling.name == 'br':
                cnt += 1
                start_ = start_.nextSibling
            else:
                if start_.nextSibling == '\n':
                    start_ = start_.nextSibling
                else:
                    break
    return cnt, start_

def parseMain(start_, in3br=False):
    nonfirst = False
    secondhr = False
    inh5 = False
    while(1):
        if nonfirst:
            if start_.nextSibling == None:
                return
            else:
                start_ = start_.nextSibling
        else:
            nonfirst = True
        try:
            if start_.name == u'hr':
                if secondhr:
                    return
                else:
                    secondhr = True
        except AttributeError:
            pass
        if (start_.__class__ is Tag):
            if start_.name == 'br':
                brcnt, start_ = countBreaks(start_)
                if brcnt == 1:
                    yield "", start_
                elif brcnt == 2:
                    yield "\n\n", start_
                elif brcnt == 3:
                    if in3br:
                        print "out 3br"
                        return
                    else:
                        if (start_.nextSibling == None or start_.nextSibling == '\n') or unicode(start_.nextSibling).find(u"さて") != -1:
                            yield "", start_
                        else:
                            yield "\\begin{screen}", start_
                            for i in parseMain(start_, True):
                                start_ = i[1]
                                yield i[0], start_
                            if start_.nextSibling != None:
                                start_ = start_.nextSibling
                            start_ = countBreaks(start_)[1]
                            yield "\\end{screen}", start_
            elif start_.name == 'h4':
                str = unicode(start_.contents[0].string)[0:]
                str = str.replace(u"・", u"")
                yield "\\section{" + str+ "}\n", start_
                inh5 = False
            elif start_.name == 'p':
                for i in parseMain(start_.contents[0]):
                    start_ = i[1]
                    yield i[0], start_
                start_ = start_.parent
            elif start_.name == 'address':
                for i in parseMain(start_.contents[0]):
                    start_ = i[1]
                    yield i[0], start_
                start_ = start_.parent
            elif start_.name == 'strong':
                for i in parseMain(start_.contents[0]):
                    start_ = i[1]
                    yield i[0], start_
                start_ = start_.parent
            elif start_.name == 'span':
                yield unicode(start_.contents[0].string)[0:], start_
            elif start_.name == 'h5':
                if inh5:
                    str = unicode(start_.contents[0].string)[0:]
                    str = str.replace(u"・", u"")
                    yield "\\subsubsection{" + str+ "}\n", start_
                else:
                    str = unicode(start_.contents[0].string)[0:]
                    str = str.replace(u"・", u"")
                    yield "\\subsection{" + str + "}\n", start_
                    inh5 = True
            elif start_.name == 'em':
                yield "\\Conclusion{", start_
                for i in parseMain(start_.contents[0]):
                    start_ = i[1]
                    yield i[0], start_
                yield "}", start_
                start_ = start_.parent
            else:
                pass
        else:
            if start_.string != None:
                str = unicode(start_.string)
                str = str.replace("\n", "")
                str = str.replace("&amp", "")
                str = str.replace(u"→", "")
                yield str, start_
            else:
                yield "", start_
    return

f = codecs.open("source.html", "r")
page = "\n".join(f.readlines())
page = page.replace(" ", "")
f.close()

soup = BeautifulSoup(page)
body = soup.html.body
f = codecs.open("test.txt", "w", "cp932")
header = u"""
\\documentclass{jsarticle}
\\usepackage{ascmac}
\\newcommand{\\Conclusion}[1]{{\\large{→#1}}}
\\begin{document}
\\title{コスティキャンのゲーム論\\\\
{\\small 言葉ではなく、デザインのみが、ゲームを語ってくれる}}
\\date{}
\\maketitle
\\setcounter{tocdepth}{3}
\\tableofcontents

"""
f.write(header)
for i in parseMain(body.findAll('hr')[1]):
    f.write(i[0])
footer = """
\\end{document}
"""
f.write(footer)
f.close()

汚くないですか?

ごめん

unicode(start_.nextSibling).find(u"さて") != -1とかないですよね

ごめん

分からないことあったら

聞いてね!

受験ひと段落。

国立大学前期入試*1が終わり、ひと段落です。絵とか環境整備とか、あとそこそこ真面目に英語をやってみたいなとか。少なくとも第二志望までの私立は正規合格していまして、あと手続きのミスさえしなければ大学生になれる状態です。裏二周目にはなりません。
今年度もよろしくお願いします。

*1:国立大学は前期後期に試験が分かれておりどちらか一方に受かれば大学に入れる。ただ、最近は後期の枠を絞るところが多く、あってないようなもの

いろいろ紹介していただきマンモス

いろいろなところで紹介していただいています。ありがたやー

Vectorソフトレビューでオリハルコンブが紹介されました。http://www.vector.co.jp/magazine/softnews/100915/n1009152.html

Windows 100% 12月号で森武伝(Molybdenum)が紹介されました。

Windows 100% 2010年 12月号 [雑誌]

Windows 100% 2010年 12月号 [雑誌]

http://www.shinyusha.co.jp/~top/00win100/win100.htm


Vectorソフトレビューに載るなんてつい最近まで夢のまた夢だったんだけどなー。小学生ぐらいのときはかなりお世話になったものです。さらには雑誌にも載るなんて。罰が当たりそうです。…でも大学に落ちる罰はいやだな…

サイト移転

一応受験生なのでブログは書きたくないなと思っていたのですが、isweb終了のお知らせでサイト移転を余儀なくされました。しかも時期がかなり急なので早めにしなければと。新しいサイトは
http://ashiato45.shichihuku.com/
です。すでに上のバナーのリンクも張り替えてあります。あと、新しいレンタルスペースはファイル要領制限が厳しくてうpしきれなかった分があるので、その分はVectorさんとSkyDriveさんにお任せすることにしました。Vectorのほうはまだ登録申請がすんでないのでそれからまた更新します。

ではでは。

積み本とか

メモ。

買った本

  • 遊びと人間(ロジェ・カイオワ)

倫理の先生の紹介で。遊びについて体系的な分類をして、いろいろ考察してるみたい。冒頭のほう読んだら面白そうだったんだけど、途中でラテン語由来のカタカナ語がたくさん定義されてよくわからなくなり挫折。きちんと机の上で、単語表を作りながら読みたい本。

  • 語源中心英単語辞典(田代雅雄)

語源から集めた英単語の本。面白そうだったから買った。電車とかで読む。

とある縁で購入。ユークリッド(エウクレイデス?)の原論を再構築したヒルベルトの公理を中学生向けに再編成して語る。多分受験に直接役に立つことはないと思うけど楽しそう。後ろの公理とか定理とか系とかの関係を表した図が圧巻。中学生向けだけど高校生に渡しても歯ごたえあるし、大人に渡しても理系じゃないと辛いと思う。

  • じっくり学ぶ曲線と曲面(中内 伸光)

数学の先生の紹介で。でもまだ17頁ぐらいしか読んでないorz

1〜2巻を理解するまで買わない、と心に決めたにもかかわらず購入。そして読んだ、というか目を通したというほうが適切。最後のほうは定義ラッシュと不慣れとゆっくり読む余裕のなさで心が折れた。ごめんなさい。イプシロンデルタあたりは予備知識があったので割りとすんなり。対角線論法とか、なぜあれを思いつくのか謎。伝記とか読めばいいのかしら…

  • いかにして問題を解くか(G・ポリア)

一・二年前に購入して流し読みし、そのまま友達に貸したけどまた読みたくなった。

中学生時代の愛読書。の割によく覚えていないので読み直したい。