• Opera书签转换器


    注:程序使用python + wxpython + pywin32实现,如果需要运行源代码,需要先安装上述库。另程序无法处理一些特殊符号,例如:●◎等

    程序功能:

    将Opera导出的adr文件转换为URL快捷方式,可以直接导入到IE收藏夹中,也可以间接的导入到Chrome等浏览器中。

    程序截图:

    程序代码:

    #-*- coding: utf-8 -*-
    ## 
    #  Copyright (C) 
    # 
    # This program is free software; you can redistribute it and/or
    # modify it under the terms of the GNU General Public License
    # as published by the Free Software Foundation.
    # 
    ##
    # @file: operabookmarkconvert.py
    # @author: moose
    # @blog: http://www.pystack.org
    # @mail: admin@pystack.org
    # @QQ: 852354673
    # @date: 2013-3-19
    # 
    import wx
    import sys
    import os
    import win32com.client
    
    debug = True
    
    class ConvertFrame(wx.Frame):
        def __init__(self, parent, id):
            wx.Frame.__init__(self, parent, id, "Opera Bookmark Convert",size=(400,600))
            self.Center()
            self.SetIcon(wx.Icon("convert.ico", wx.BITMAP_TYPE_ICO))
            
            panel = wx.Panel(self)
            
            #set menu bar
            self.SetMenuBar(self.CreateMenubar())
            
            #sizer     
            framesizer = wx.BoxSizer(wx.VERTICAL)   
            
            #bookmark button
            self.textctrl_bm = wx.TextCtrl(panel, -1, "", size=(380,26))
            self.button_bm = wx.Button(panel, -1, "Choose Bookmark File",size=(-1,40))
            self.Bind(wx.EVT_BUTTON, self.OnBMBtnClick, self.button_bm)
            self.textctrl_bm.Bind(wx.EVT_LEFT_DCLICK, self.OnBMBtnClick)
            
            #save path
            self.textctrl_sp = wx.TextCtrl(panel, -1, "", size=(380,26))
            self.button_sp = wx.Button(panel, -1, "Save To",size=(-1,40))
            self.Bind(wx.EVT_BUTTON, self.OnSPBtnClick, self.button_sp)
            self.textctrl_sp.Bind(wx.EVT_LEFT_DCLICK, self.OnSPBtnClick)        
            
            #start convert
            self.button_start = wx.Button(panel, -1, "Start Convert",size=(-1,40))
            self.Bind(wx.EVT_BUTTON, self.OnSCBtnClick, self.button_start)        
            
            #log text info
            self.textctrl_log = wx.TextCtrl(panel, -1, "", style=wx.TE_MULTILINE,size=(-1,160))
            
            #layout
            framesizer.Add(self.textctrl_bm,0,wx.ALL|wx.EXPAND,2)
            framesizer.Add(self.button_bm,0,wx.CENTER)
            framesizer.Add((-1,10))
            framesizer.Add(self.textctrl_sp,0,wx.ALL|wx.EXPAND,2)
            framesizer.Add(self.button_sp,0,wx.CENTER)
            framesizer.Add((-1,10))
            framesizer.Add(self.button_start,0,wx.CENTER)
            framesizer.Add((-1,10))
            framesizer.Add(self.textctrl_log,1,wx.ALL|wx.EXPAND,2)   #1 for auto size
            
            #status bar
            self.statusbar = self.CreateStatusBar()
            self.statusbar.SetFieldsCount(2)
            self.statusbar.SetStatusWidths([-4,-2])
            
            panel.SetSizer(framesizer)
            framesizer.Fit(self)
            
        def CreateMenubar(self):
            #menu bar
            menubar = wx.MenuBar()
            
            menu_file = wx.Menu()
            menubar.Append(menu_file, "&File")
            
            menu_help = wx.Menu()
            menubar.Append(menu_help, "&Help")
            
            menu_open = menu_file.Append(wx.NewId(), "&Open Bookmark","Open an opera...")
            menu_path = menu_file.Append(wx.NewId(), "&Save To","Save bookmark To...")
            menu_file.AppendSeparator()
            menu_exit = menu_file.Append(wx.ID_EXIT,"&Exit","Exit this application.")
                    
            menu_doc = menu_help.Append(wx.NewId(),"&Help Contents","Manual about this application.")
            menu_about = menu_help.Append(wx.ID_ABOUT,"&About","This is a free software.")
            
            self.Bind(wx.EVT_MENU, self.OnOpenBookmark, menu_open)
            self.Bind(wx.EVT_MENU, self.OnSavepath, menu_path)
            self.Bind(wx.EVT_MENU, self.OnAbout, menu_about)
            self.Bind(wx.EVT_MENU, self.OnExit, menu_exit)
            
            return menubar
            
        def OnBMBtnClick(self, event):
            self.OnOpenBookmark(event)    
            
        def OnSPBtnClick(self, event):
            self.OnSavepath(event)
            
        def OnSCBtnClick(self, event):
            currbm = self.textctrl_bm.GetValue()
            currsp = self.textctrl_sp.GetValue()
            
            if currbm:
                if not currsp:
                    currsp = os.path.basename(currbm)
                    self.textctrl_log.AppendText("Url links save to: %s"%currsp)
                self.StartConvert(currbm, currsp)
            else:
                self.textctrl_log.AppendText("Error: Information needs to be complete\n")
                event.Skip()
        
        def OnSavepath(self, event):
            dirdlg = wx.DirDialog(self, "Choose path...",  os.getcwd())
            
            if dirdlg.ShowModal() == wx.ID_OK:
                savepath = dirdlg.GetPath()
                self.textctrl_sp.SetValue(savepath)
                if debug:
                    print "Save To: %s"%savepath
                self.textctrl_log.AppendText("Save To: %s\n"%savepath)
            
            dirdlg.Destroy()
        
        def OnOpenBookmark(self, event):
            operabmfile = "Opera Bookmark File(*.adr)|*.adr|All files(*.*)|*.*"
            opendlg = wx.FileDialog(self, "Open opera bookmark...",os.getcwd(), style=wx.OPEN, wildcard=operabmfile)
            
            if opendlg.ShowModal() == wx.ID_OK:
                bmpath = opendlg.GetPath()
                self.textctrl_bm.SetValue(bmpath)
                if debug:
                    print "Bookmark: %s"%bmpath
                self.textctrl_log.AppendText("Bookmark: %s\n"%bmpath)
                
            opendlg.Destroy()
        
        def OnAbout(self, event):
            msgbox = wx.MessageBox("This is a bookmark convert application\nAuthor: www.pystack.org\nVersion: 1.0","About Me")
            
        def OnExit(self, event):
            self.Destroy()
            
        def StartConvert(self, bmfile, sppath):
            self.textctrl_log.AppendText("Running...\n")
            if os.path.exists(bmfile) and os.path.exists(sppath):                 
                self.ws = win32com.client.Dispatch("wscript.shell")   
                    
                bmfile = open(bmfile, 'r')
                issubfld = 0
                bmfldpath = ""
                bmfldname = ""
                foldercount = 0
                urlcount = 0
                self.urlok = 0
                    
                while 1:
                    bmline = bmfile.readline()
                    if len(bmline) == 0:
                        break
                        
                    if bmline.strip() == "-":
                        issubfld = 0
                    elif bmline.find("#FOLDER") <> -1:
                        bmfldid = bmfile.readline().split("=")[1]
                        if issubfld:
                            bmfldname = os.path.join(bmfldname, unicode(bmfile.readline().split("=")[1].strip(),"utf-8"))
                        else:
                            bmfldname = unicode(bmfile.readline().split("=")[1].strip(),"utf-8")
                        
                        bmfldpath = os.path.join(sppath, bmfldname)
                        if not os.path.exists(bmfldpath):
                            os.mkdir(bmfldpath)
                            if debug : print "+ Create folder: %s"%bmfldpath
                            self.textctrl_log.AppendText("+ Create folder: %s\n"%bmfldpath)
                        foldercount += 1
                        issubfld=1
                    elif bmline.find("#URL") <> -1:
                        urlcount += 1
                        bmurlid = bmfile.readline().split("=")[1]
                        bmurlname = unicode(bmfile.readline().split("=")[1].strip(),"utf-8")
                        bmurlurl = unicode(bmfile.readline().split("=")[1].strip(),"utf-8")
                        
                        bmurlname = self.LegalFileName(bmurlname)
                        bmurlpath = os.path.join(bmfldpath,bmurlname+".url")
                        
                        if not os.path.exists(bmurlpath):
                            self.GenerateUrlLink(bmurlurl, bmurlpath)
                            if debug: print "  + Create Url (%s)"%bmurlname
                            self.textctrl_log.AppendText("  + Create Url (%s)\n"%bmurlurl)
                        else:
                            if debug: print "Url exists ! (%s)"%bmurlname
                            self.textctrl_log.AppendText("Url exists ! (%s)\n"%bmurlurl)
                        
                bmfile.close()
                self.textctrl_log.AppendText("\nFolderCount: %s    UrlCount: %s    UrlCreated: %s\n"%(foldercount, urlcount, self.urlok))
                self.textctrl_log.AppendText("Finish convert.\n\n")
            else:
                self.textctrl_log.AppendText("Error: Bookmark file not exists !\nPlease check you input...\n\n")
                
        def LegalFileName(self, fname):
            illegalchars = ['<','>','/','|','\\',':','"','*','?']
            for illchar in illegalchars:
                if fname.find(illchar) <> -1:
                    fname = fname.replace(illchar, " ")
                    
            return fname
        
        def GenerateUrlLink(self, bmurl, bmpath):        
            if debug: print 'Exec: "%s" "%s"'%(bmurl, bmpath)
            
            #use py win32
            try:
                scut = self.ws.CreateShortcut(bmpath)
                scut.TargetPath=bmurl  
                scut.Save()
                self.urlok += 1
            except :
                if debug: print "Unable to generate shortcut for: %s\n"%bmurl
                self.textctrl_log.AppendText("  --Unable to generate shortcut: %s\n"%bmurl)
            
    if __name__ == "__main__":
        app = wx.PySimpleApp()
        frame = ConvertFrame(None, -1)
        frame.Show()
        app.MainLoop()
     

    原文地址: https://www.pystack.org/opera-bookmark-convert/

     程序打包下载地址:http://pan.baidu.com/share/link?shareid=425160&uk=990788854

  • 相关阅读:
    EFCore.BulkExtensions Demo
    查询处理器用尽了内部资源,无法生成查询计划。这种情况很少出现,只有在查询极其复杂或引用了大量表或分区时才会出现。请简化查询。如果您认为该消息的出现纯属错误,请与客户支持服务部门联系,了解详细信息
    .net core 删除主表,同时删除子表
    java 数据类型优先级
    string.Join 的用法
    JDK-13下载安装及环境变量配置
    Java 前加加和后加加 总结
    变量类型查看-type
    路径:获取 & 更改
    用sql获取数据库中所有的表名、字段名
  • 原文地址:https://www.cnblogs.com/cstudio/p/2970191.html
Copyright © 2020-2023  润新知