Moin Moin On Windows

FrontPage|FindPage|TitleIndex|RecentChanges| UserPreferences P RSS
윈도우 환경에서 모인모인 설치하는데 도움될 글입니다. 할줄 모르는 파이썬 만지기 어렵네요. 휴 이것 저것 설치하기 힘들군요. --픽하튜

1. Syntax

enscript 가 필요하다. enscript는 gettext가 필요 gettext는 libiconv가 필요하다. gnuwin32에서 모두 다운받는다. 설치하다 실패했다. popen2.popen4 를 하는 부분에서 에러가 났다. 무슨 에러냐 하면 프로그램에서 난 에러이다. 잘못된 연산... 음..

2. Processor의 LaTeXGnuPlot 프로세서 넣기

먼저 LaTeX에서 원래 안되던 이유는 cd 디렉토리;latex ?? 등의 명령이 안되었기 때문이다. 여기서 tex와 convert라는 프로그램이 필요하다. 전자는 KTUG에서 배포하는 miktex을 깔면 쉽게 설치 가능하고 후자는 ImageMagick 이란 프로그램을 설치하면 된다. 참 그리고 한참 헤매었는데 ps파일을 png로 변환하기 위해서 convert란 프로그램은 고스트스크립트가 필요하다고 한다. 그것도 깔아야한다.

LaTex.py 말고 다른 파일 하나에 한줄짜리 처리 스크립트가 있다. 그부분도 마찬가지로 비슷하게 고친다. 한줄 처리는 무신님께서 추가하신 것 같다. 고무신님께서 올리신거 아니면 안 고쳐도 될 것이다.

"""
    MoinMoin - Processor for LaTeX Highlighting

    Copyright (c) 2002 by Won-kyu Park <wkpark@kldp.org>
    All rights reserved, see COPYING for details.

    $Id $
"""

import string, sys, os, re, sha
from MoinMoin import config

config_cache_dir='.\\pds'
config_cache_url=config.url_prefix+'/pds'
#latex 파일의 절대경로
config_external_latex='C:\\texmf\\miktex\\bin\\latex'
#이미지매직 convert의 절대경로
config_external_convert='convert'
config_vartmp_dir='c:\\temp'

def process(request, formatter, lines):
    if string.strip(lines[0]) == "#!latex":
        del lines[0]

    texstr = string.join(lines, '\n')
    texstr = string.strip(texstr)

    imgname = re.sub('\s+', ' ',texstr)
    imgname = sha.new(imgname).hexdigest()

    outpath = "%s\\LaTeX\\attachments\\%s.png" % (config_cache_dir,imgname)
    outurl = "%s/LaTeX/attachments/%s.png" % (config_cache_url,imgname)
    if not os.path.isdir(config_cache_dir + "\\LaTeX\\attachments"):
        os.makedirs(config_cache_dir + "\\LaTeX\\attachments", 0777)

    if not os.path.exists(outpath):
        data = open("%s\\%s.tex" % (config_vartmp_dir,imgname), "w")
        data.write(r"""
\documentclass[10pt,notitlepage]{article}
\usepackage{amsmath}
\usepackage{amsfonts}
%%\usepackage[all]{xy}
\begin{document}
\pagestyle{empty}
%s
\end{document}
""" % texstr)
        data.close()

        options="-interaction=batchmode -output-directory="+config_vartmp_dir

        cmd = "%(latex)s %(options)s %(dir)s\\%(tex)s" % {
           "options": options,
           "dir": config_vartmp_dir,
           "latex": config_external_latex,
           "tex": imgname
        }
        os.system(cmd)

        os.system("dvips " + config_vartmp_dir +"\\"+ imgname + ".dvi " +
           "-o " + config_vartmp_dir +"\\"+ imgname + ".ps")
        os.system(config_external_convert + " -crop 0x0 -density 120x120 " +
           config_vartmp_dir + "\\" + imgname + ".ps " + outpath)
        os.system("del " + config_vartmp_dir + "\\" + imgname + ".*")

    sys.stdout.write(formatter.image(src="%s" % outurl, alt=texstr, align='absmiddle'))


GnuPlot은 cygwin용 GnuPlot을 깔면 된다. 깔 필요도 없고 그냥 압축만 풀면 wgnuplot.exe가 들어 있다. 생각해보니 이건 안 고치고 원본 그대로인것 같다.
{{{
"""
    MoinMoin - Processor for the Gnuplot

    Copyright (c) 2002 by Won-kyu Park <wkpark@kldp.org>
    All rights reserved, see COPYING for details.

    $Id: MoinMoinOnWindows,v 1.1 2005/08/25 04:31:57 no-smok Exp no-smok $

    Usage:
    {{{#!gnuplot
plot sin(x)

"""

import string, sys, os, re, sha
from MoinMoin import config

config_gnuplot_terminal='png'
config_cache_dir='./pds'
config_cache_url=config.url_prefix+'/pds'
config_vartmp_dir='c:/temp'
config_external_gnuplot='c:/gnuplot/wgnuplot'
config_gnuplot_options=''

def process(request, formatter, lines):
    if string.strip(lines[0]) == "#!gnuplot":
       del lines[0]

    text = string.join(lines,'\n')
    str = string.strip(text)
    str = '\n'+str+'\n'
    str = re.sub('\n!.*\n','\n',str) # strip dangerous shell commands
    str = re.sub('[ ]+',' ',str) # compress all spaces
    str = re.sub('^\s*','',str) # strip out first spaces
    str = re.sub('\n\s*','\n',str)
    str = re.sub('\nset\s+(t|o|si).*\n', '\n',str)

    str = re.sub('\n+','\n',str)

    imgname = sha.new(str).hexdigest()

    if config_gnuplot_terminal=='svg':
        term='svg'
        ext='svg'
        size='set size 0.5,0.5'
        mime='image/svg-xml'
    else:
        term='png'
        ext='png'
        size='set size 0.5,0.6'

    outpath = "%s/GnuPlot/attachments/%s.%s" % (config_cache_dir,imgname,ext)
    outurl = "%s/GnuPlot/attachments/%s.%s" % (config_cache_url,imgname,ext)
    if not os.path.isdir(config_cache_dir + "/GnuPlot/attachments"):
        os.makedirs(config_cache_dir + "/GnuPlot/attachments", 0777)

    if not os.path.exists(outpath) or not os.path.getsize(outpath):
        data = open("%s/%s.plt" % (config_vartmp_dir,imgname), "w")
        data.write('set term %s\n' % term)
        data.write('%s\n' % size)
        data.write('set out "%s"\n' % outpath)
        data.write('%s\n' % config_gnuplot_options)
        data.write(str)
        data.close()
        cmd = "%(gnuplot)s %(plot)s >CON" % {
           "gnuplot": config_external_gnuplot,
           "plot": config_vartmp_dir + '/' + imgname + '.plt',
        }
        log=os.popen(cmd,"r")
        lines = log.read()
        log.close()
        if lines:
            print "<pre class='errconsole'>"
            print lines
            print '<font color=red>If there is no fatal error, just reload this page</font>\n'
            print "</pre>"
            term='err'
        del lines
# this may emmit an error under win32 
        os.unlink(config_vartmp_dir + "/" + imgname + ".plt")

    if term == 'err':
        return ''
    if term == 'svg':
        sys.stdout.write(formatter.embed(
        src="%s%s" % outurl,
        width='300',
        height='240',
        type=mime,
        alt='Gnuplot'))
    else:
        sys.stdout.write(formatter.image(src="%s" % outurl, alt='Gnuplot'))
}}}

=== Macro의 DueDate 수정 ===
{{{
import time

def getFullTime(aText,aTime):
	year,month,day=aTime[0],aTime[1],aTime[2]

	if len(aText)==2:
		if aText<"%02d"%day:
			month+=1
		if month>12:
			year,month=year+1,1
		aText="%04d%02d"%(year,month)+aText
	elif len(aText)==4:
		if aText<"%02d%02d"%(month,day):
			year+=1
		aText="%04d"%year+aText

	year,month,day=int(aText[0:4]),int(aText[4:6]),int(aText[6:8])
	return year,month,day,0,0,0,0,0,0
#이부분이 고친곳임 return 문에 있던 time.strptime이 윈도우에서 안됨
        
def execute(macro, text):
	localtime = time.localtime() 
	localtime = localtime[0],localtime[1],localtime[2],0,0,0,0,0,0
	ddayTuple=getFullTime(text,localtime)

	timeDiff=(time.mktime(ddayTuple)-time.mktime(localtime))/86400
	date=time.strftime("%Y년 %m월 %d일",ddayTuple)
	msg=date
	if timeDiff >0:
		msg+='까지 %d일 남았습니다.' % timeDiff
	elif timeDiff == 0 : 
		msg =' 오늘입니다.' 
	else: 
		msg+='로부터 %d일 지났습니다.' % abs(timeDiff)
	return msg
}}}
----
MoniWiki 에서 설정바꾸느라 애썼으나, crop 옵션이 안되서 포기 상태입니다. 옵션 중에 -aux-directory 세팅도 해줘야 log나 aux 파일도 깨끗이 지워집니다.
----
[모인모인분류]

"; if (isset($options[timer])) print $menu.$banner."
".$options[timer]->Write()."
"; else print $menu.$banner."
".$timer; ?> # # ?>