Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
CSDN編者按】很少有文章,介紹如何將大型應(yīng)用,移植到Flutter。而本文的作者——一位來自澳洲的Native iOS & Flutter的開發(fā)者,嘗試這樣做了,結(jié)果讓他十分驚訝。到底是什么情況?一起來看文章吧!
澳大利亞有一個(gè)名為Easy Diet Diary的原生iOS應(yīng)用程序。
該應(yīng)用:
? 已被下載120萬次;
? 用Objective-C和Swift編寫,后端是Amazon AWS;
? 代碼統(tǒng)計(jì)工具CLOC,報(bào)告該應(yīng)用包含75,000行代碼。
我在這家小公司工作了很長一段時(shí)間,他們的任務(wù)列表上一直有個(gè)安卓版本,但我們一直沒有開發(fā),因?yàn)椋?/p>
? 支持兩個(gè)代碼庫需要太多精力且難以管理。
? 跨平臺(tái)開發(fā)的主要選擇Xamarin和React Native都有重要缺陷(這是另一個(gè)故事)。
最后,我們選擇進(jìn)入Flutter的世界!
Flutter的速度很快,并且可以保證用戶界面體驗(yàn),而且一切都與原生應(yīng)用沒有區(qū)別(特別是有了2018年9月加入的iOS小窗體之后)。
以下是本文的主干:
? 代碼行數(shù)與開發(fā)速度
? 架構(gòu)
? 社區(qū)
? 性能
? 語言
? 還缺少什么?
? 結(jié)論
第一階段我預(yù)估需要6個(gè)人月。但是,項(xiàng)目進(jìn)度居然領(lǐng)先了!對(duì)我來說,這簡(jiǎn)直太不可思議了。
為什么?
Flutter的布局并不是像iOS那樣,使用的不是Storyboard,或者像安卓那樣使用XML,而是在代碼中將窗體組合成窗體樹,即可創(chuàng)建應(yīng)用程序的用戶界面。這對(duì)我來說聽起來有點(diǎn)可怕,但是我做了嘗試,雖然花了一些時(shí)間來習(xí)慣,但不久我就可以靈活地使用這些窗體樹了。
然后,大約第一個(gè)階段進(jìn)展到第三個(gè)月的時(shí)候,發(fā)生了一件很奇怪的事情。隨著我越來越熟練、越來越快地移植功能,項(xiàng)目中的代碼行卻開始迅速減少了。這很奇怪,因?yàn)槲乙浦驳臉I(yè)務(wù)邏輯數(shù)量非常龐大,這些邏輯在代碼數(shù)量上的比例幾乎是一比一。
事情的真相是,我可以通過創(chuàng)建類和編寫函數(shù)來重用用戶界面部分的代碼,這比使用原生iOS更容易。通常,我可以利用幾個(gè)額外的參數(shù),簡(jiǎn)單地重構(gòu)用戶界面的窗體就可以重用它們。如果這樣不行,我還可以簡(jiǎn)單地在現(xiàn)有的窗體周圍再包上另一個(gè)窗體,就可以實(shí)現(xiàn)需要的行為了。這簡(jiǎn)直太贊了!
最終我預(yù)計(jì)代碼行數(shù)將少于30,000(而原生iOS版本為75,000行)。當(dāng)然,原生iOS版本包含一些雖然當(dāng)時(shí)開發(fā)了最終卻被取代或未被使用的代碼。我估計(jì)未使用的代碼占15,000行。換句話說,需要移植的代碼量為60,000行。
因此,總的來說,F(xiàn)lutter的代碼量只有原生iOS原有代碼的一半!
此外,F(xiàn)lutter項(xiàng)目不包含任何Storyboard XML。Storyboard中有很多XML。原生iOS項(xiàng)目包含:
? 15個(gè)Storyboard;
? 47個(gè)Nib文件;
? 92個(gè)View Controllers。
我與Storyboard斗爭(zhēng)了很多年,一直在嘗試遵循最佳實(shí)踐,最后感覺在Flutter中構(gòu)建用戶界面非常自由而且速度很快。
以前我沒有意識(shí)到自己的大部分時(shí)間都用在了編寫與用戶界面相關(guān)的代碼,還要忍受大量的Storyboard和自動(dòng)布局限制。
我無數(shù)次聽人說應(yīng)該將用戶界面布局與代碼分開,我非常同意,但就我的Flutter經(jīng)驗(yàn)而言,這一點(diǎn)未必是真的。而且關(guān)于用戶界面分離的這種概念也不僅僅是原生iOS的最佳實(shí)踐。
我記得自己在微軟WPF中與XML作斗爭(zhēng),也見過Quora上有人問《為什么安卓使用XML來定義用戶界面而不僅僅是Java代碼?》
Storyboard是一種自上至下的布局方式(適用于桌面應(yīng)用程序),而窗體采用自下而上的方法,在構(gòu)建移動(dòng)應(yīng)用程序時(shí),窗體可以極大地簡(jiǎn)化編程。我聽說這種方式類似于React Native和CSS flex-boxes的布局方式。Wm Leler在Hacker Noon上發(fā)表的文章《Flutter帶來了哪些創(chuàng)新》很好地解釋了這個(gè)問題。
以下方式對(duì)于利用窗體構(gòu)建用戶界面很有幫助性:
? 大多數(shù)情況下,F(xiàn)lutter中支持狀態(tài)的“熱重載”功能可以在幾秒鐘內(nèi),將代碼更改無縫地整合到正在運(yùn)行的應(yīng)用程序中;
? Android Studio的快捷鍵Alt + Enter可以插入或刪除用戶界面的窗體(行、列或容器)。請(qǐng)查看這篇文章《使用Android Studio開發(fā)Flutter應(yīng)用程序的小竅門》(https://medium.com/@liewjuntung/tips-on-using-android-studio-to-develop-flutter-apps-9e42c047b7f4)。
我覺得VS Code中應(yīng)該有類似的東西。這似乎微不足道,但我覺得這個(gè)快捷鍵十分有用。使用熱重載和Alt + Enter,我可以在幾分鐘內(nèi)做好一個(gè)畫面,甚至可以在用戶界面上做實(shí)驗(yàn)。
? 將debugPaintSizeEnabled設(shè)置為true。這會(huì)在所有用戶界面的窗體周圍顯示鮮艷的邊框。實(shí)際上這個(gè)功能用得并不如想象得多,但是當(dāng)布局出現(xiàn)問題時(shí)該功能確實(shí)非常有用。
我在選擇架構(gòu)時(shí)做了如下幾件事:
? 看了幾遍Brian Egan的這個(gè)演講《保持簡(jiǎn)單、有狀態(tài):Flutter應(yīng)用的架構(gòu)》(https://www.youtube.com/watch?v=zKXz3pUkw9A&feature=youtu.be)。
? 讀了幾遍Eric Windmill的這篇文章《有效地使用Flutter的繼承窗體》(https://ericwindmill.com/posts/inherited_widget/)。
? 閱讀Flutter架構(gòu)示例:http://fluttersamples.com/。
最終,我按照Eric的建議使用了一種名為Lifting State Up的架構(gòu)模式,這是Redux的第一步,看起來非常誘人。然而,Redux對(duì)我來說遙不可及。由于開發(fā)時(shí)間緊迫,學(xué)習(xí)和嘗試Redux似乎太令人生畏了。
一路走來,我從Stack Overflowers上的人解答的關(guān)于架構(gòu)的問題中得到了許多幫助。這讓我想到了社區(qū)。
有關(guān)Flutter的開源社區(qū)非常多元化,并且非常樂于助人,讓我看到了人類的希望(特別是在這些瘋狂的時(shí)期)。
舉個(gè)例子,當(dāng)時(shí)我正在使用Romain Rastel編寫的flutter_slidable軟件包,而且我還提了一個(gè)改善建議,僅僅48小時(shí)之內(nèi)他就實(shí)現(xiàn)了一個(gè)比我想象的更好的解決方案......類似這樣的事情比比皆是。
我唯一遺憾的是,我一直忙于移植工作,與我收到的幫助相比,我給予別人的遠(yuǎn)遠(yuǎn)不夠。
總的來說,參加了內(nèi)部測(cè)試的用戶對(duì)Flutter的“活潑”非常滿意。在同一臺(tái)iOS設(shè)備上,同時(shí)并排運(yùn)行iOS應(yīng)用與Flutter應(yīng)用時(shí),并沒有看到性能明顯下降。
我們的應(yīng)用沒有很多需要大量圖形的任務(wù),但有一個(gè)功能需要從數(shù)百個(gè)JSON文件讀取數(shù)據(jù),然后對(duì)該數(shù)據(jù)進(jìn)行一系列浮點(diǎn)計(jì)算,在該功能中Flutter的應(yīng)用明顯更快。
我沒有花時(shí)間去研究導(dǎo)致差異的究竟是是讀取文件的功能、還是JSON解析或者是日期處理等等,因此我無法做出類別上的判斷,但我感覺這無疑是Flutter桂冠上的一顆明珠。
很期待看到其他人能給出怎樣的性能測(cè)試數(shù)據(jù)。
Flutter使用Dart,這種語言已經(jīng)在Google之外萎靡不振,直到最近才隨著Flutter再次興起。
然而,這門語言很成熟且易于學(xué)習(xí)。幸運(yùn)的是,我在加入Dart隊(duì)伍時(shí),擁有更強(qiáng)大的類型功能的Dart 2.0剛剛出現(xiàn),所以無需再在代碼中不斷地敲“new”關(guān)鍵字了。
Dart可能沒有Swift和Kotlin所擁有的Null和非Null類型,但我很喜歡它的簡(jiǎn)單性。 例如:
? 以下劃線開頭的函數(shù)為私有;
? 自動(dòng)格式化意味著不必再頭疼我的習(xí)慣問題——我喜歡在末尾加上逗號(hào)將參數(shù)分行;
? 包管理很簡(jiǎn)單。
還有很多很多。我喜歡這些功能,也許其他人可能不喜歡。對(duì)我而言,最重要的是我可以更快地(用奇怪但很愉悅的方式)實(shí)現(xiàn)功能。
沒有太多缺少的東西。在原生iOS應(yīng)用中:
? 我在XCode中使用了很多Targets,并結(jié)合一堆#define創(chuàng)建bundle ID不同的各種版本的應(yīng)用。我不知道在Flutter中怎么處理這個(gè)問題;
? 我在iOS中使用了一個(gè)很好的第三方日志框架,叫做CocoaLumberjack。還沒找到能代替它的東西;
? 我使用UIKit框架中的WKWebView來加載并渲染本地的HTML文件(如使用條款、隱私政策等)。我在Flutter中沒找到正確的包來實(shí)現(xiàn)這個(gè)功能。最后只能使用一個(gè)包HTML2MD將HTML轉(zhuǎn)換成Markdown再使用另一個(gè)包flutter_markdown來渲染;
? 我使用AVFoundation框架,在單一的全屏視圖中實(shí)現(xiàn)條碼掃描、QR二維碼掃描和拍照。在Flutter中我還不能如此細(xì)致地進(jìn)行控制,雖然它的Camera包很適合拍照,另一個(gè)由facundomedica編寫的包fast_qr_reader_view很適合掃描條碼。在安卓設(shè)備上,這個(gè)包與Firebase的ML Kit配合從Camera包中獲取實(shí)時(shí)圖像。
讀到這里,你肯定不會(huì)驚訝為什么我如此贊美Flutter。到目前為止:
? Flutter的用戶界面幾乎與原生安卓和原生iOS的用戶界面沒有區(qū)別;
? 得益于Flutter用戶界面的構(gòu)建方式,利用Flutter制作新功能比原生代碼更快;
? 測(cè)試沒有收到有關(guān)性能劣化的報(bào)告;
? iOS版和安卓版之間的代碼共享目前達(dá)到了90%以上。我還沒有集成蘋果的HealthKit或Google Fit,但我覺得共享率應(yīng)該不會(huì)下降太多。
盡管Flutter還不成熟(2018年5月才發(fā)布正式版),但對(duì)于我來說它已經(jīng)足夠強(qiáng)壯了。
我遇到的唯一問題就是Dart同步讀取目錄的函數(shù)List Sync在最近的一次發(fā)布中出現(xiàn)了崩潰。我將它加到了Flutter在Github上的代碼庫中,然后改用異步版本。
原文:https://medium.com/flutter-community/porting-a-75-000-line-native-ios-app-to-flutter-57c6571c57b4
作者:Gary Hunter,Native iOS & Flutter的開發(fā)者。
譯者:彎月,責(zé)編:胡巍巍
“征稿啦!”
CSDN 公眾號(hào)秉持著「與千萬技術(shù)人共成長」理念,不僅以「極客頭條」、「暢言」欄目在第一時(shí)間以技術(shù)人的獨(dú)特視角描述技術(shù)人關(guān)心的行業(yè)焦點(diǎn)事件,更有「技術(shù)頭條」專欄,深度解讀行業(yè)內(nèi)的熱門技術(shù)與場(chǎng)景應(yīng)用,讓所有的開發(fā)者緊跟技術(shù)潮流,保持警醒的技術(shù)嗅覺,對(duì)行業(yè)趨勢(shì)、技術(shù)有更為全面的認(rèn)知。
如果你有優(yōu)質(zhì)的文章,或是行業(yè)熱點(diǎn)事件、技術(shù)趨勢(shì)的真知灼見,或是深度的應(yīng)用實(shí)踐、場(chǎng)景方案等的新見解,歡迎聯(lián)系 CSDN 投稿,聯(lián)系方式:微信(guorui_1118,請(qǐng)備注投稿+姓名+公司職位),郵箱(guorui@csdn.net)。
ypora 是一款支持實(shí)時(shí)預(yù)覽的 Markdown 文本編輯器。它有 OS X、Windows、Linux 三個(gè)平臺(tái)的版本,目前完全免費(fèi)。
https://typora.io/#
Markdown是一種輕量級(jí)標(biāo)記語言,創(chuàng)始人為約翰·格魯伯(英語:John Gruber)。 它允許人們使用易讀易寫的純文本格式編寫文檔,然后轉(zhuǎn)換成有效的XHTML(或者HTML)文檔。這種語言吸收了很多在電子郵件中已有的純文本標(biāo)記的特性。
由于Markdown的輕量化、易讀易寫特性,并且對(duì)于圖片,圖表、數(shù)學(xué)式都有支持,目前許多網(wǎng)站都廣泛使用Markdown來撰寫幫助文檔或是用于論壇上發(fā)表消息。 如GitHub、Reddit、Diaspora、Stack Exchange、OpenStreetMap 、SourceForge、簡(jiǎn)書等,甚至還能被使用來撰寫電子書。
在使用Dreamweaver編寫網(wǎng)頁時(shí),遇到需要插入代碼塊、流程圖、數(shù)學(xué)公式時(shí),總是顯得很無力,效率很低,效果不好,使用Typora會(huì)讓這些問題迎刃而解,且輕便,簡(jiǎn)單。
直接看一個(gè)demo:
導(dǎo)出為html:
html網(wǎng)頁源代碼:
其可以導(dǎo)出的格式有:
流程圖樣式包括:
1、標(biāo)準(zhǔn)流程圖源碼格式(橫向):
```flow
st=>start: 開始框
op=>operation: 處理框
cond=>condition: 判斷框(是或否?)
sub1=>subroutine: 子流程
io=>inputoutput: 輸入輸出框
e=>end: 結(jié)束框
st(right)->op(right)->cond
cond(yes)->io(bottom)->e
cond(no)->sub1(right)->op
```
2 mermaid語言庫繪流程圖
Mermaid 是一個(gè)用于畫流程圖、狀態(tài)圖、時(shí)序圖、甘特圖的庫,使用 JS 進(jìn)行本地渲染,廣泛集成于許多 Markdown 編輯器中。
Mermaid 作為一個(gè)使用 JS 渲染的庫,生成的不是一個(gè)“圖片”,而是一段 HTML 代碼,因此安全許多。
官網(wǎng):https://mermaidjs.github.io/
Github 項(xiàng)目地址:https://github.com/knsv/mermaid
2.1 橫向流程圖源碼格式:
graph LR
A[方形] -->B(圓角)
B --> C{條件a}
C -->|a=1| D[結(jié)果1]
C -->|a=2| E[結(jié)果2]
2.2 豎向流程圖源碼格式:
sequenceDiagram
Title: 標(biāo)題:復(fù)雜使用
對(duì)象A->對(duì)象B: 對(duì)象B你好嗎?(請(qǐng)求)
Note right of 對(duì)象B: 對(duì)象B的描述
Note left of 對(duì)象A: 對(duì)象A的描述(提示)
對(duì)象B-->對(duì)象A: 我很好(響應(yīng))
對(duì)象B->小三: 你好嗎
小三-->>對(duì)象A: 對(duì)象B找我了
對(duì)象A->對(duì)象B: 你真的好嗎?
Note over 小三,對(duì)象B: 我們是朋友
participant C
Note right of C: 沒人陪我玩
2.3 時(shí)序圖源碼復(fù)雜樣例
gantt
dateFormat YYYY-MM-DD
title 軟件開發(fā)甘特圖
section 設(shè)計(jì)
需求 :done, des1, 2014-01-06,2014-01-08
原型 :active, des2, 2014-01-09, 3d
UI設(shè)計(jì) : des3, after des2, 5d
未來任務(wù) : des4, after des3, 5d
section 開發(fā)
學(xué)習(xí)準(zhǔn)備理解需求 :crit, done, 2014-01-06,24h
設(shè)計(jì)框架 :crit, done, after des2, 2d
開發(fā) :crit, active, 3d
未來任務(wù) :crit, 5d
耍 :2d
section 測(cè)試
功能測(cè)試 :active, a1, after des3, 3d
壓力測(cè)試 :after a1 , 20h
測(cè)試報(bào)告 : 48h
2.4 甘特圖樣例:
gantt
dateFormat YYYY-MM-DD
title 軟件開發(fā)甘特圖
section 設(shè)計(jì)
需求 :done, des1, 2014-01-06,2014-01-08
原型 :active, des2, 2014-01-09, 3d
UI設(shè)計(jì) : des3, after des2, 5d
未來任務(wù) : des4, after des3, 5d
section 開發(fā)
學(xué)習(xí)準(zhǔn)備理解需求 :crit, done, 2014-01-06,24h
設(shè)計(jì)框架 :crit, done, after des2, 2d
開發(fā) :crit, active, 3d
未來任務(wù) :crit, 5d
耍 :2d
section 測(cè)試
功能測(cè)試 :active, a1, after des3, 3d
壓力測(cè)試 :after a1 , 20h
測(cè)試報(bào)告 : 48h
教程:
Markdown 高級(jí)技巧 | 菜鳥教程(使用 Typora 編輯器講解 Markdown 的語法)
https://www.runoob.com/markdown/md-advance.html
ref
1 Typora 完全使用詳解
https://sspai.com/post/54912/
2 用什么軟件畫流程圖好?-悟空問答
https://www.wukong.com/question/6809962012198568195/
3 Mermaid 實(shí)用教程
https://blog.csdn.net/fenghuizhidao/article/details/79440583
-End-
關(guān)工具:
1.PyMuPdf 組件, python組件包,含mupdf的核心功能并與mutool功能兼容
備選: FreePic2Pdf.exe 第三方PDF書簽管理工具,可直接提取PDF文檔目錄
2.Python SDK包及PyCharm開發(fā)工具(PyCharm只需下載社區(qū)版本即可)
相關(guān)操作:
提取pdf的索引目錄: 有多種方法,常見的如: 1.直接拷貝目錄/OCR識(shí)別目錄 2.PDF閱讀器自帶獲取目錄 3.通過zotero和zotfile的提取功能 4.devonthink來創(chuàng)建TOC 5.通過FreePic2Pdf第三方提取軟件 6.通過mutool命令行工具包 都可以實(shí)現(xiàn), 這里放幾張展示圖:
獲取PDF目錄(不需要Python):
方法一:mutool工具執(zhí)行命令行獲取TOC方法二:mutool run javascript腳本來獲取方法三:FreePic2Pdf等第三方提取軟件
如上所示: 我們提供的多種方法都可以不依賴Python實(shí)現(xiàn)提取PDF目錄,但為了后續(xù)的文章技術(shù)進(jìn)階,以及操作流程自動(dòng)化,我們?cè)诒疚拈_始引入python來實(shí)現(xiàn)我們的需求.因此這里我們采用的是PyMuPdf來實(shí)現(xiàn).具體的下載鏈接已放置于文章開頭.
獲取PDF目錄(使用了Python)
步驟一:配置基礎(chǔ)的開發(fā)環(huán)境
Python的安裝比較簡(jiǎn)單,官網(wǎng)下載安裝包雙擊安裝即可,因此本文不再詳細(xì)講解,(只是要注意本文我們要下載大于2.7的版本來使用,如果你的python環(huán)境有問題,請(qǐng)和我的3.9版本保持一致)
到官網(wǎng)下載后雙擊安裝
上面安裝好python環(huán)境后,接著我們來安裝PyMuPDF Python組件包,相關(guān)幫助文檔可參考如下:
按python版本二種方式選一種來安裝
這里我們選擇的是下載whl包安裝按自己系統(tǒng)下載,我下載的是macos-cp39
按上面方式2下載whl文件并雙擊安裝Mupdf Python組件后,接著我們開始配置PyCharm開發(fā)工具, 用最前面的鏈接下載PyCharm軟件并設(shè)置好PyCharm的Python SDK版本,具體如下所示:
確保用的是Python3的SDK
步驟二: 編寫Python代碼,執(zhí)行生成HTML:
## 提取章節(jié)信息import fitz # = PyMuPDFpdfName = "java2.pdf"doc = fitz.open(pdfName) # open PDFtoc = doc.getToC() # get current table of contentswith open("chapter-t.html", mode="w", encoding="utf-8") as f: for t in toc: t[2] = pdfName + "-" + str(t[2]) # show what we have so far chapterInfo = "{}{}-{}{}".format("<p>", t[1], t[2], "</p> ") print(chapterInfo) f.write(chapterInfo)
用IE瀏覽器打開上面生成的HTML,用Ctrl+Shift+A導(dǎo)入至SuperMemo進(jìn)行Split命令分割,如圖:
IE瀏覽器打開展示效果SM中使用自定義符號(hào)來分割PDF索引目錄導(dǎo)入SM操作最終的索引目錄導(dǎo)入效果
步驟三: 開始PDF文檔的增量學(xué)習(xí)
我們對(duì)上面的分支添加學(xué)習(xí)計(jì)劃并Ctrl+L開始學(xué)習(xí),同樣左側(cè)排列SM軟件,右側(cè)排列PDF閱讀器: 提示: 取消SuperMemo軟件的窗口背景選項(xiàng),才能進(jìn)行如下二個(gè)軟件的左右布局
當(dāng)復(fù)習(xí)到對(duì)應(yīng)的元素時(shí)打開PDF(PDF學(xué)習(xí))
基于Alfred/AHK/Quicker來編寫腳本,實(shí)現(xiàn)搜索并打開PDF,接著按頁或章節(jié)內(nèi)容跳轉(zhuǎn)到指定章節(jié)
按PDF索引數(shù)據(jù)打開PDF基于PDF索引的增量閱讀
添加/檢索/及批量管理注釋書簽(PDF提取)
使用福昕閱讀器的注釋功能PDF注釋添加/刪除/管理(PDF提取)
增量提取的子注釋同步回SM軟件(提取同步)
因?yàn)槲覀兊腜DF內(nèi)容提取是在PDF閱讀器中實(shí)現(xiàn)的,為了能使提取的文章內(nèi)容也能在SM軟件中增量,我們考慮同步回SM軟件中,這個(gè)操作可按自己的需求或頻次來決定,不一定非得同步回SM軟件.
同步回SM時(shí)唯一要注意的是最好不要覆蓋掉原來同步過的子元素內(nèi)容(確保保留學(xué)習(xí)進(jìn)度) 具體如何避免這個(gè)問題我在文章末尾會(huì)有較詳細(xì)的概述及相關(guān)方法.
用福昕來閱讀只能導(dǎo)出文本注釋
提示 : 上面導(dǎo)出的福昕閱讀器內(nèi)容注釋我們處理如下,接著再導(dǎo)入SuperMemo進(jìn)行Split分割:
自己手動(dòng)處理下段落分割符號(hào)
上面的注釋文本復(fù)制進(jìn)SuperMemo軟件,再使用Split命令分割就是按段落內(nèi)容正確的分割了.
導(dǎo)入SuperMemo來分割處理最終處理結(jié)果(PDF提取同步)
如上所述: 整個(gè)PDF增量閱讀提取流程結(jié)束.以后我們只需重復(fù)執(zhí)行這些步驟來閱讀即可.你可以參考我之前寫的一篇內(nèi)容來了解基于PDF目錄索引來進(jìn)行增量學(xué)習(xí)PDF文件的流程(鏈接如下):
主要講解的是Mac系統(tǒng)下使用DevonThink及PDFExpert閱讀器來實(shí)現(xiàn)SuperMemo增量學(xué)習(xí)的整體思路.如果你用的是Windows系統(tǒng),那么你可以使用Everything/FileLocator Pro 工具代替DevonThink的功能,使用福昕閱讀器或者BookxNote閱讀器來代替PDFExpert的功能.
考慮到要支持注釋中含有圖片的問題,我推薦在Mac操作系統(tǒng)下使用Highlights PDF閱讀器,在Windows下使用BookxNote閱讀器.如果還不能滿足你特定的需求,則建議用本文的PyMuPdf組件編寫一些簡(jiǎn)單的Python代碼,來實(shí)現(xiàn)更復(fù)雜及更自由化的需求.
Mac系統(tǒng)下的Highlights演示:
Mac下的Highlights閱讀器靈活豐富的注釋導(dǎo)出功能
由于html導(dǎo)出的是base64的圖片存儲(chǔ),因此建議導(dǎo)出TextBundle(本地圖片|markdown)格式:
導(dǎo)出成markdown再轉(zhuǎn)成html
說明:
如上所示,如果是MAC系統(tǒng)使用Highlight作為PDF閱讀器,導(dǎo)出注釋時(shí). 第一種可以直接拷貝右側(cè)的注釋內(nèi)容至SuperMemo中,第二種則是導(dǎo)出右側(cè)注釋為TextBundle格式(圖片本地存儲(chǔ))并把md文件轉(zhuǎn)換成Html(如果直接Highlights導(dǎo)出為Html注釋筆記,里面的圖片為base64編碼,不能在SuperMemo直接導(dǎo)入)再導(dǎo)入SuperMemo.
TextBundle對(duì)應(yīng)為本地圖片和md
## MarkDown -> Htmlpandoc text.md -o text1.html
Windows下BookxNote的演示:
下圖為BookxNote閱讀器的功能演示,可在Windows下作為代替Mac端Highlights軟件部分功能:
Windows下BookxNote演示
步驟四: 提取內(nèi)容同步回SM軟件時(shí)保留學(xué)習(xí)進(jìn)度
通過Python腳本來實(shí)現(xiàn)進(jìn)度同步功能,流程上依賴于時(shí)間戳標(biāo)記(不同于官方默認(rèn)的按ID同步),即閱讀時(shí)在PDF文件中通過文本注釋的形式添加時(shí)間戳標(biāo)識(shí)作為書簽,閱讀中斷后,我們會(huì)按上面的方式導(dǎo)出注釋,作為書簽使用的這個(gè)時(shí)間戳?xí)趯?dǎo)出的注釋(最終的html)中存在,這個(gè)html導(dǎo)入SuperMemo分割時(shí),用此時(shí)間戳作為分割符號(hào),即生成了每個(gè)元素都有了一個(gè)時(shí)間戳作為唯一ID使用.因此在重復(fù)導(dǎo)入的多個(gè)不同的集合中(跨集合)我們也可以遷移舊的學(xué)習(xí)進(jìn)度至新集合.
PDF閱讀加時(shí)間戳作書簽及分割符腳本使用腳本來實(shí)現(xiàn)學(xué)習(xí)進(jìn)度同步功能該圖所示的網(wǎng)盤下載地址在評(píng)論區(qū)
完結(jié):
以上進(jìn)度同步功能的具體操作,后期會(huì)考慮直接錄制視頻來演示.因此本文不再繼續(xù)對(duì)細(xì)節(jié)進(jìn)行說明. 說明: 上圖的腳本下載鏈接詳見評(píng)論區(qū)...
我是一只熱愛學(xué)習(xí)的小胖子,如果你也熱愛學(xué)習(xí),并且對(duì)SuperMemo感興趣,歡迎轉(zhuǎn)發(fā)和評(píng)論!
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。