写在最前

之前把自己的Typecho博客静态化了,从最初的脚本到独立的私有的Typecho-Handsome-Java程序、从最初通过curlhtml保存下来到用JavaFX配合jdbc-sqlite ,han-lp等第三方库完全自主将markdown渲染成html

我从这个项目上得到了许多关于宝贵的经验、欢乐与成就感,当然也付出了多个休息日。

不过Typecho-Handsome-Java (简称THJ)有两个问题:

  • 从名字就可以看出它用到了Hamdsome主题,这也是为何私有的原因,而T则表示它用到了Typecho的数据库表的命名(仅此而已)
  • JavaFX 8macOS Catalina上有一个BUG,每次需要切换窗口再切换回来,否则菜单栏无法使用

考虑到这两个问题,以及因为我想学习swift开发还有各种各样的原因,所以我创建了一个全新的Macondo程序,并且在github上以MIT License开源,当然完成这个项目需要移植整个THJ,并且需要一个全新或者仿照Handsome模样(仅模样)的默认主题。

完成这个项目需要时间,以及解决下面的问题

  • 适应swift的语法,以及中文swiftUI资料的匮乏
  • 一个sqlite的swift库(已解决)
  • 一个渲染markdown的swift库(已解决)

另外,我之前没有学习过swift,更没有swift开发经验,简而言之我就是swift萌新,所以如果有地方写的不好的欢迎告知我修改。

平台及工具选择

  • macOS 10.15 Catalina(等macOS 11 Big Sur正式版发布,也会升级)
  • Xcode 11.3(随版本升级而升级)
  • 使用swiftUI

开发历程

项目地址(MIT 协议开源):https://github.com/CinemaMediaGroup/Macondo

0f99e2f

第一次提交,包括创建项目,默认可以生成Hello World的代码

 import SwiftUI

 struct ContentView: View {
     var body: some View {
         Text("Hello, World!")
             .frame(maxWidth: .infinity, maxHeight: .infinity)
     }
 }


 struct ContentView_Previews: PreviewProvider {
     static var previews: some View {
         ContentView()
     }
 }

74bf829

Data.swift中添加用于文章和页面的结构PostData

 import Foundation

 struct PostData{
     var cid : Int
     //'0' stands for 'post' while
     //'1' stands for 'page'.
     var type : Int
     //The 'slug' field has been deprecated, but you still need to let it has the same value of 'title'
     var title : String
     var slug : String
     var created : String
     var modified : String
     var text : String
     var thumbUrl : String
     var summary : String

     init() {
         cid = 0
         type = 0
         title = ""
         slug = ""
         created = ""
         modified = ""
         text = ""
         thumbUrl = ""
         summary = ""
     }

     init(cid : Int,type : Int,title : String,slug : String,created : String,modified : String,text : String,thumbUrl : String,summary : String) {
         self.cid = cid
         self.type = type
         self.title = title
         self.slug = title //let it has the same value of 'title'
         self.created = created
         self.modified = modified
         self.text = text
         self.thumbUrl = thumbUrl
         self.summary = summary
     }
 }

daf3cab

添加猫爪图标,太可爱了(图标由一位小姐姐制作,仅授权本项目)

a708f0a ~ 9195db4

试用sqlite.swift来创建postDatas

import Foundation
import SQLite

struct Sqlite {
    static func createTables(){
        var database : Connection
        let path = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).first! + "/" + Bundle.main.bundleIdentifier!
        print(path)
        do{
            //create parent directory iff it doesn’t exist
            try FileManager.default.createDirectory(atPath: path, withIntermediateDirectories: true, attributes: nil)

            //open database
            database = try Connection("\(path)/blog.db")
        
            //postDatas table
            let pd = Table("postDatas")
            
            //postDatas columns settings
            let cid = Expression<Int64>("cid")
            let pdType = Expression<Int64>("type")
            let pdTitle = Expression<String>("title")
            let pdSlug = Expression<String>("slug")
            let pdCreated = Expression<String>("created")
            let pdModified = Expression<String>("modified")
            let pdText = Expression<String>("text")
            let pdThumbUrl = Expression<String>("thumbUrl")
            let pdSummary = Expression<String>("summary")
        
            //create postDatas table
            try database.run(pd.create{t in
                t.column(cid,primaryKey: true)
                t.column(pdType)
                t.column(pdTitle)
                t.column(pdSlug)
                t.column(pdCreated)
                t.column(pdModified)
                t.column(pdText)
                t.column(pdThumbUrl)
                t.column(pdSummary)
            })
        }catch{
            print(error)
        }
    }
}

e1588eb ~ 33c7008

之后代码就不贴了,不然这篇文章会很长。

这个部分主要是建立了一堆数据的存储struct,以及在sqlite.swift中建立数据表

d093ca1

这里给开app的首屏写了GUI,从这个样式就可以看出是源自Xcode的(坏笑

图片131

4568cd7

这次commit是个未成品,因为在Xcode11和macOS Catalina的正式版中,apple没有官方提供类似于TextArea的组件在swiftUI中,关于自己实现我没有什么好想法。

相关的官方组件TextEditor在Xcode12和macOS Big Sur才提供,而这两玩意的正式版**「今秋推出」**(4568cd7于2020年7月21日提交)。

这swiftUI一事无成,像极了我的人生。

fcb08c4

重建storyboard。

d9afacf

添加BASE64支持,用于处理写入sqlite时的引号问题。

4355b9b

添加「获取时间」的库,用于生成文章新建和修改的时间

da32aeb

现在可以新建文章!

dca302b ~ 02c1492

GUI更动

6ed8c14

现在支持深色模式!

b0b1004

在未输入内容,禁用「发布按钮」

d323516 ~ 639609a

GUI更动

最后修改:2020-07-23 22:12:54