Python论坛  - 讨论区

标题:[python-chinese] 如何把Docbook转换为wiki的代码

2005年11月05日 星期六 12:35

张沈鹏 zsp747 at gmail.com
Sat Nov 5 12:35:36 HKT 2005

如何把Docbook转换为wiki的代码?有写好的xlst吗?

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年11月05日 星期六 21:19

limodou limodou at gmail.com
Sat Nov 5 21:19:05 HKT 2005

2005/11/5, 张沈鹏 <zsp747 at gmail.com>:
> 如何把Docbook转换为wiki的代码?有写好的xlst吗?

要转成moinmoin格式吗?可以先转为html,然后再转为moin。我写了一个利用NewEdit来转换html为moin格式的script。

下载地址: http://wiki.woodpecker.org.cn/moin/NewEditScripts


--
I like python!
My Blog: http://www.donews.net/limodou
NewEdit Maillist: http://groups.google.com/group/NewEdit

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年11月06日 星期日 02:07

张沈鹏 zsp747 at gmail.com
Sun Nov 6 02:07:43 HKT 2005

limodou 写道:

>2005/11/5, 张沈鹏 <zsp747 at gmail.com>:
>  
>
>>如何把Docbook转换为wiki的代码?有写好的xlst吗?
>>    
>>
>
>要转成moinmoin格式吗?可以先转为html,然后再转为moin。我写了一个利用NewEdit来转换html为moin格式的script。
>
>下载地址: http://wiki.woodpecker.org.cn/moin/NewEditScripts
>
>
>--
>I like python!
>My Blog: http://www.donews.net/limodou
>NewEdit Maillist: http://groups.google.com/group/NewEdit
>  
>
>------------------------------------------------------------------------
>
>_______________________________________________
>python-chinese list
>python-chinese at lists.python.cn
>http://python.cn/mailman/listinfo/python-chinese
>  
>
我用附件中的文件试了一下您的script,出错提示如下:
编译脚本错误。

出错跟踪:

Traceback (most recent call last):
  File "mixins\Import.pyo", line 3231, in OnScriptItems
UnicodeEncodeError: 'ascii' codec can't encode characters in position 
30-31: ordinal not in range(128)
请问可以解决吗?

-------------- next part --------------
A non-text attachment was scrubbed...
Name: =?UTF-8?B?56iL5bqP5ZGY77yM5Zyo6Lev5LiKLnhodG1s?=
Type: application/xhtml+xml
Size: 20296 bytes
Desc: not available
Url : http://lists.exoweb.net/pipermail/python-chinese/attachments/20051106/55cbc991/UTF-8B56iL5bqP5ZGY77yM5Zyo6Lev5LiKLnhodG1s-0001.xhtml

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年11月06日 星期日 12:02

limodou limodou at gmail.com
Sun Nov 6 12:02:52 HKT 2005

> 我用附件中的文件试了一下您的script,出错提示如下:
> 编译脚本错误。
>
> 出错跟踪:
>
> Traceback (most recent call last):
>   File "mixins\Import.pyo", line 3231, in OnScriptItems
> UnicodeEncodeError: 'ascii' codec can't encode characters in position
> 30-31: ordinal not in range(128)
> 请问可以解决吗?
>

把你的具体操作步骤写一下,感觉是编码的问题,不知道你的原文档是不是有特殊的内容。

--
I like python!
My Blog: http://www.donews.net/limodou
NewEdit Maillist: http://groups.google.com/group/NewEdit

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年11月06日 星期日 12:45

张沈鹏 zsp747 at gmail.com
Sun Nov 6 12:45:27 HKT 2005

limodou 写道:

>>我用附件中的文件试了一下您的script,出错提示如下:
>>编译脚本错误。
>>
>>出错跟踪:
>>
>>Traceback (most recent call last):
>>  File "mixins\Import.pyo", line 3231, in OnScriptItems
>>UnicodeEncodeError: 'ascii' codec can't encode characters in position
>>30-31: ordinal not in range(128)
>>请问可以解决吗?
>>
>>    
>>
>
>把你的具体操作步骤写一下,感觉是编码的问题,不知道你的原文档是不是有特殊的内容。
>
>--
>I like python!
>My Blog: http://www.donews.net/limodou
>NewEdit Maillist: http://groups.google.com/group/NewEdit
>  
>
>------------------------------------------------------------------------
>
>_______________________________________________
>python-chinese list
>python-chinese at lists.python.cn
>http://python.cn/mailman/listinfo/python-chinese
>  
>
用newEdit打开附件中的Html,选择“工具-〉脚本-〉html2moin.py”,然后出错, 
您可以用附件中的文件试一试
-------------- next part --------------
A non-text attachment was scrubbed...
Name: =?UTF-8?B?56iL5bqP5ZGY77yM5Zyo6Lev5LiKLnhodG1s?=
Type: application/xhtml+xml
Size: 20296 bytes
Desc: not available
Url : http://lists.exoweb.net/pipermail/python-chinese/attachments/20051106/e978b4e1/UTF-8B56iL5bqP5ZGY77yM5Zyo6Lev5LiKLnhodG1s-0001.xhtml

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年11月06日 星期日 13:41

limodou limodou at gmail.com
Sun Nov 6 13:41:10 HKT 2005

> 用newEdit打开附件中的Html,选择"工具-〉脚本-〉html2moin.py",然后出错,
> 您可以用附件中的文件试一试
>

我试了一下,没有问题呀。不过我使用的应该是我的最新版本,不知道有没有关系。转换后的内容见附件里。建议下载新的NewEdit试一试,从svn中最好。

--
I like python!
My Blog: http://www.donews.net/limodou
NewEdit Maillist: http://groups.google.com/group/NewEdit
-------------- next part --------------
= 程序员,在路上 =

=== 张沈鹏 ===<[mailto:zsp747 at gmail.com zsp747 at gmail.com]>
----


'''目录'''


  1. 初学wxWidgets

  
    
      第一个程序

      事件驱动(Event-Driven)

      让一个事件可以被多次处理

      在窗体中加载/移出事件表

      动态事件表
    
  

  2. (其他)大二诗集

  
    
      风中
    
  


'''插图清单'''


  1.1. 第一个程序的截图


'''范例清单'''


  1.1. 一个事件表

  1.2. 一个事件表中被绑定的函数的声明

  1.3. helloWorld改版----wxCommandEven::skip()的示例

  1.4. helloWorld改版----wxWindow::PopEventHandler的示例


== 第 1 章 初学wxWidgets ==

'''目录'''


  第一个程序

  事件驱动(Event-Driven)

  让一个事件可以被多次处理

  在窗体中加载/移出事件表

  动态事件表


== 第一个程序 ==

wxWidgets库的,是一个结构类似于MFC的开源的C++库,它的特点是跨平台:一次编程便可以在从XP到Linux,苹果机,WinCE等等操作系统上重新编译,运行.

安装和编译wxWidgets库我就不说了,大家可以参考Code Project上的"Introduction to wxWidgets"(作者:Priyank Bolia,期待哪位英文好的高手翻译一下).


  
    ../binaryfiles/images/caution.png

    注意:"Introduction to wxWidgets"中路径设置的问题
  

  
    
      环境变量"WXWIN"应该设置为"c:\???"而不是"c:\???\",然后包含目录的时候格式为"$(WXWIN)\include\"而不是"$(WXWIN)include\".我也提供了一个VS2003修正版的"HelloWorld"的解决方案(本文的源代码只需直接复制到hello.cpp中便可编译运行).
    
  


照着这篇文章安装,编译,设置环境变量之后,就可以开始我们的程序了.我的IDE是VS2003(Microsoft Visual Studio .NET 2003),wxWidgets库的版本是2.6.1.

'''图 1.1. 第一个程序的截图'''../binaryfiles/figures/hello_world.png

先了解一下"HelloWorld"的源代码

'''过程 1.1. 程序的调用顺序'''


   1. 
    用宏绑定main函数
  

   1. 
    MyApp::OnInit()

    
       1. 
        MyFrame初始化:设置界面布局,绑定按钮到事件表
      

       1. 
        通知计算机显示MyFrame
      
    
  

  
    被按下按钮-->回调事件表中的相应函数
  

{{{#!python

#include "wx/wx.h" 
#include "mainico.xpm"//包含图标文件,格式为XPM,我在源代码之后有该格式的说明

//新建一个窗体
class MyFrame: public wxFrame
{
public:

        MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);

        //事件处理函数
        void OnQuit(wxCommandEvent& event);
        void OnAbout(wxCommandEvent& event);

        //这个呢,写过MFC的朋友一定眼熟,就是消息映射了,wxWidgets叫事件表
        DECLARE_EVENT_TABLE()
};

enum
{
        ID_Quit,
        ID_About,
};

//这里是事件的映射,当触发什么事件(如MENU_ABOUT)时候,调用什么函数(MyApp::OnAbout)
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_Quit, MyFrame::OnQuit)
EVT_MENU(ID_About, MyFrame::OnAbout)
END_EVENT_TABLE()

//初始化程序
class MyApp: public wxApp
{
        virtual bool OnInit();
};

//把main函数放在这里
IMPLEMENT_APP(MyApp)

//程序初始化的代码
bool MyApp::OnInit()
{
        /*
        wxT("Hello World")中"wxT"是一个宏,也可以写作"_T()",用于在编译时改变文字的编码.
        比如,一个程序可以分别编译为ASCLL码版(只支持英文)和UTF-8版(支持多国语言)
        */
        MyFrame *frame = new MyFrame( wxT("Hello World"), wxPoint(299,250), wxSize(340,340) );
        frame->Show(TRUE);
        SetTopWindow(frame);
        return TRUE;
} 

MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
: wxFrame((wxFrame *)NULL, -1, title, pos, size)
{
        SetIcon(wxIcon(mainico_xpm));//设置图标(mainico_xpm变量在mainico.xpm被声明)

        wxMenu *menuFile = new wxMenu;//菜单条中一个条目

        menuFile->Append( ID_About, wxT("&A;菜单项--弹出窗口") );
        menuFile->AppendSeparator();
        menuFile->Append( ID_Quit, wxT("&Q;退出") );

        wxMenuBar *menuBar = new wxMenuBar;//菜单条
        menuBar->Append( menuFile, wxT("&M;菜单条中的条目" ));

        SetMenuBar( menuBar );

        CreateStatusBar();
        SetStatusText(wxT( "欢迎使用wxWidgets!") );//状态栏
}

void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
        Close(TRUE);
}

void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
        wxMessageBox(wxT("消息框的文字:地球人,你好!"),
                wxT("消息框的标题"),
                wxOK | wxICON_MASK ,
                this);
}
}}}


  
    ../binaryfiles/images/tip.png

    XPM图像格式说明
  

  
    
      把其他图片格式转换为XPM格式可以用一个免费软件XnView(有汉化版),另外图片该程序的图标大小应该为16*16像素。 用文本编辑器打开XPM文件后可以看到内容如下:
      {{{#!python

/* XPM */
static char *mainico_xpm[] = {
/* width height num_colors chars_per_pixel */
"    16    16      256            2",
/* colors */
"`` c #000000",
"`. c #173b03",
"`# c #62ce19",
...................等等
}}}
    
  


== 事件驱动(Event-Driven) ==

所谓事件驱动,简单地说就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数).当然事件不仅限于用户的操作.

weWidgets的中所有可以处理事件的类都继承自'''wxEvtHandler''',其中包含frames, buttons, menus, even documents,所有的窗体类(即从wxWindow继承的类)和程序类(application class).

这些类可以有一个事件表,用来绑定事件和被调用的函数(handler functions).

'''过程 1.2. 建立一个静态事件表(即编译时生成的事件表)的操作步骤'''


   1. 
    建立一个新类(直接或间接从wxEvtHandler继承)
  

   1. 
    为每个要处理的事件声明被调用的函数
  

   1. 
    在被处理的事件所在的类的声明中加入宏'''DECLARE_EVENT_TABLE'''
  

   1. 
    在宏'''BEGIN_EVENT_TABLE... END_EVENT_TABLE(就是事件表)'''中将函数与枚举的数字绑定(因为产生该类型的事件的按钮不唯一,要用枚举数来区分);有些事件不必与枚举数绑定,因为产生该类型的事件的对象可以确定(比如就是this).

    '''例 1.1. 一个事件表'''
    {{{#!python

BEGIN_EVENT_TABLE(MyFrame, wxFrame)
    EVT_MENU     (wxID_ABOUT,     MyFrame::OnAbout)
    EVT_MENU     (wxID_EXIT,      MyFrame::OnQuit)

    EVT_SIZE     (                MyFrame::OnSize)
        //不必与枚举数绑定,因为产生该类型的事件的对象是this

    EVT_BUTTON   (wxID_OK,        MyFrame::OnButtonOK)
END_EVENT_TABLE()

}}}
  

   1. 
    在事件中指定被绑定的数字,wxWidgets会将其映射到对应的函数,并调用函数
  


所有在事件表中被绑定的函数有相似的形式:返回值都是void,不是virtual函数,参数为wxCommandEvent类型

'''例 1.2. 一个事件表中被绑定的函数的声明'''
{{{#!python

void OnButtonOK(wxCommandEvent& event);
}}}

一般说来,事件会从子类的事件表开始查询调用,如果没有找到对应的调用,再依次查询其各个父类的事件表.但以下的事件例外,不会调用父类事件表wxActivate Event, wxCloseEvent, wxEraseEvent, wxFocusEvent, wxKeyEvent, wxIdleEvent, wxInitDialogEvent, wxJoystickEvent, wxMenuEvent, wxMouseEvent, wxMoveEvent, wxPaintEvent, wxQueryLayoutInfoEvent, wxSizeEvent, wxScrollWinEvent, and wxSysColourChangedEvent(都是些啥玩意?以后慢慢学)

== 让一个事件可以被多次处理 ==

一个事件只能被处理一次,随即从消息队列(就是所有等待处理的事件)中被删除,也就是说,子类的事件表中处理过的事件,父类事件表中不会再次处理.如果想让该事件消息继续保留在消息队列中,可以使用wxCommandEven中的skip()函数.

skip实际用途举例:限制用户输入为数字,而具体的处理交付给父类去做.

'''例 1.3. helloWorld改版----wxCommandEven::skip()的示例'''
{{{#!python

#include "wx/wx.h" 
#include "mainico.xpm"
class MyFrame: public wxFrame
{
public:

        MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
        void OnQuit(wxCommandEvent& event);
        void OnAbout(wxCommandEvent& event);
        DECLARE_EVENT_TABLE()
};

//新增代码
class MySkip:public MyFrame
{
public:
        MySkip(const wxString& title, const wxPoint& pos, const wxSize& size):MyFrame(title,pos,size),i(1)
        {};
        void OnAbout2(wxCommandEvent& event)
        {
                i*=-1;
                if (i>0) {
                        wxMessageBox(wxT("i>0,not SKip(不跳过)"));
                }
                else
                {
                        wxMessageBox(wxT("i<0,will SKip(将跳过)"));
                        event.Skip();
                }
        }
private:
        int i;
DECLARE_EVENT_TABLE()
};

enum
{
        ID_Quit,
        ID_About,
};


//这里是MyFrame事件的映射
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_Quit, MyFrame::OnQuit)
EVT_MENU(ID_About, MyFrame::OnAbout)
END_EVENT_TABLE()

//这里是MySkip事件的映射
BEGIN_EVENT_TABLE(MySkip, MyFrame)
EVT_MENU(ID_About, MySkip::OnAbout2)
END_EVENT_TABLE()

class MyApp: public wxApp
{
        virtual bool OnInit();
};


IMPLEMENT_APP(MyApp)


bool MyApp::OnInit()
{

        MySkip *frame = new MySkip( wxT("Hello World"), wxPoint(299,250), wxSize(340,340) );
        frame->Show(TRUE);
        SetTopWindow(frame);
        return TRUE;
} 

MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
: wxFrame((wxFrame *)NULL, -1, title, pos, size)
{
        SetIcon(wxIcon(mainico_xpm));
        wxMenu *menuFile = new wxMenu;
        menuFile->Append( ID_About, wxT("&wxCommandEven;::skip()函数演示") );
        menuFile->AppendSeparator();
        menuFile->Append( ID_Quit, wxT("&Q;退出") );

        wxMenuBar *menuBar = new wxMenuBar;
        menuBar->Append( menuFile, wxT("&M;菜单条中的条目" ));

        SetMenuBar( menuBar );

        CreateStatusBar();
        SetStatusText(wxT( "欢迎使用wxWidgets!") );
}

void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
        Close(TRUE);
}

void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
        wxMessageBox(wxT("消息框的文字:地球人,你好!"),
                wxT("消息框的标题"),
                wxOK | wxICON_MASK ,
                this);
}

}}}

== 在窗体中加载/移出事件表 ==

你除了可以用窗体类的子类来处理事件,也可以用继承wxEvtHandler的类来处理事件。给wxEvtHandler的子类定义一个事件表,并用wxWindow::PushEventHandler函数把这个对象加入该窗体的事件处理流程(栈堆)中去,该对象的事件表会在窗体的事件表之前被处理。当然PushEventHandler也可以用于添加窗体类的子类到该对象的事件表中去.

另外,用wxWindow::PopEventHandler会弹出(就是删除)事件表栈堆顶端的对象,如果执行成功则返回true。

而wxWindow::GetEventHandler可以返回事件表栈堆顶端的对象(如果你没有用PushEventHandler,那么GetEventHandler一般返回窗体自身)。

用独立的事件处理对象(不继承自窗体类)能够把不同的窗体中共同的事件处理动作分离出来,以便重复利用(复用).

有了以上知识我们可以临时或永久的改变一个窗体的事件处理方式.

PushEventHandler实际用途举例:一个学习《概率论》的程序,主窗体中在讲述了一个概念之后,弹出一个对话框让用户作练习,这时你可以用PushEventHandler临时把鼠标的事件处理权交给该对话框.完成之后用PopEventHandler返回.

'''例 1.4. helloWorld改版----wxWindow::PopEventHandler的示例'''
{{{#!python


#include "wx/wx.h" 
#include "mainico.xpm"
enum
{
        ID_Quit,
        ID_About,
        ID_Add,
        ID_Move
};
//新增代码
class MyEvt:public wxEvtHandler{
public:
        
        MyEvt();
        void OnClick(wxCommandEvent& e);
        ~MyEvt();
private:
        int i;
static int number;
        int myNumber;
DECLARE_EVENT_TABLE()
};
int MyEvt::number=0;

BEGIN_EVENT_TABLE(MyEvt,wxEvtHandler)
EVT_MENU(ID_About,MyEvt::OnClick)
END_EVENT_TABLE()

MyEvt::MyEvt(){
                i=1;
                number+=1;
                myNumber=number;
        }
MyEvt::~MyEvt()
{
        number-=1;
}

void MyEvt::OnClick(wxCommandEvent& e)
{
        wxString show=wxT("第");
        show<0)
        {               show+=wxT("个事件表 MyEvt::OnClick被调用!");
                wxMessageBox(show,
                        wxT("张沈鹏的演示程序"),
                        wxOK  );
        }
        else
        {
                show+=wxT("个事件表 MyEvt::OnClick被调用, 然后wxCommandEvent::Skip!");
                wxMessageBox(show,
                        wxT("张沈鹏的演示程序"),
                        wxOK );
                e.Skip();
        }
        i*=-1;
}

class MyFrame:public wxFrame
{
public:

        MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);


        void OnQuit(wxCommandEvent& event);
        void OnAbout(wxCommandEvent& event);
        void OnAdd(wxCommandEvent& event);
        void OnMove(wxCommandEvent& event);
private:
        MyEvt *evtPro;
        
        DECLARE_EVENT_TABLE()
};


BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_Quit, MyFrame::OnQuit)
EVT_MENU(ID_About, MyFrame::OnAbout)
EVT_MENU(ID_Add,MyFrame::OnAdd)
EVT_MENU(ID_Move,MyFrame::OnMove)
END_EVENT_TABLE()

class MyApp: public wxApp
{
        virtual bool OnInit();
};


IMPLEMENT_APP(MyApp)

bool MyApp::OnInit()
{

        MyFrame *frame = new MyFrame( wxT("Hello World"), wxPoint(299,250), wxSize(340,340) );
        frame->Show(TRUE);
        SetTopWindow(frame);

        return TRUE;
} 

MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
: wxFrame((wxFrame *)NULL, -1, title, pos, size)
{
        SetIcon(wxIcon(mainico_xpm));

        wxMenu *menuFile = new wxMenu;

        menuFile->Append( ID_About, wxT("&A;当前的事件表--弹出窗口") );
        menuFile->Append(ID_Add,_T("加载事件表(你可以尝试加载多次事件表然后看Skip的结果)"));
        menuFile->Append(ID_Move,_T("弹出事件表(就是删除当前的事件表,如果没有加载就删除会有错误)"));
        menuFile->AppendSeparator();
        menuFile->Append( ID_Quit, wxT("&Q;退出") );

        wxMenuBar *menuBar = new wxMenuBar;
        menuBar->Append( menuFile, wxT("&M;菜单条中的条目" ));

        SetMenuBar( menuBar );

        CreateStatusBar();
        SetStatusText(wxT( "欢迎使用wxWidgets!") );
}

void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
        Close(TRUE);
}

void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
        wxMessageBox(wxT("MyFrame::OnAbout:地球人,你好!"),
                wxT("消息框的标题"),
                wxOK | wxICON_MASK ,
                this);
}
void MyFrame::OnAdd(wxCommandEvent& event)
{
        evtPro=new MyEvt;
        this->PushEventHandler(evtPro);
}
void MyFrame::OnMove(wxCommandEvent& event)
{
        this->PopEventHandler(); 
        delete evtPro;
}
}}}

== 动态事件表 ==

== 第 2 章 (其他)大二诗集 ==

'''目录'''


  风中


== 风中 ==


  
    '''修订历史'''
  

  
    

    2005-11-2

     
  


在曾经的星空,做一个天长地久的梦。

落花飞舞的匆匆,飘扬着千古不变的痛。

苦涩的泪,麻木的心是否再也不会感动。

一个人,走过一片血雨腥风。

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年11月17日 星期四 15:55

JackPhil allisfree at gmail.com
Thu Nov 17 15:55:37 HKT 2005

moin 1.3.5增加了docbook parser,不过我还没用过

http://moinmoin.wikiwikiweb.de/MoinMoinRelease1.3/CHANGES


limodou <limodou at gmail.com> writes:

> 要转成moinmoin格式吗?可以先转为html,然后再转为moin。我写了一个利用NewEdit来转换html为moin格式的script。
>
> 下载地址: http://wiki.woodpecker.org.cn/moin/NewEditScripts
>

-- 
我且不取你解经论
我亦不取你国王大臣
我亦不取你辩似悬河
我亦不取你聪明智慧
──唯要你真正见解!

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号