我正在使用Skim pdf查看器。
您可以通过下拉菜单搜索书签:
我在another answer读到,Skim将它锁在一个plist中:
~/Library/Preferences/net.sourceforge.skim-app.skim.bookmarks.plist
所以我通过跟随blog post:
将此文件转换为xml文件plutil -convert xml1 bookmarks.plist
请参阅下面的完整转储。
现在,我正在尝试处理这个xml而不会造成太大的麻烦。我尝试使用active_support
并且能够挖掘并找到我的书签:
[3] pry(main)> require 'active_support/core_ext/hash/conversions'
=> true
[5] pry(main)> h = Hash.from_xml(File.read('bookmarks.plist'))
[39] pry(main)> h['plist']['dict']['array'].first['dict'].each {|h| puts "#{h['integer']} : #{h['string'].first}" }
0 : some info about foobar
386 : some important bookmark about migrations
389 : some important note about anatomy of migrations
158 : cat
有更好的方法吗?
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>bookmarks</key>
<array>
<dict>
<key>_BDAlias</key>
<data>
AAAAAAGaAAIAAAhVbnRpdGxlZAAAAAAAAAAAAAAAAAAAAAAAAADU
QCbVSCsAAABwgnQIc29tZS5wZGYAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCW
8dTPxIpQREYgAAAAAP////8AAAkgAAAAAAAAAAAAAAAAAAAAEHBk
Zm1pbmVyX3Rlc3RpbmcAEAAIAADUQIlFAAAAEQAIAADU0DUKAAAA
AQAYAHCCdAAPmYwAD5dgAA+WSAAGLMUAAmb9AAIAQ1VudGl0bGVk
OlVzZXJzOgBtYXg6AERyb3Bib3g6AHdvcms6AHRtcDoAcGRmbWlu
ZXJfdGVzdGluZzoAc29tZS5wZGYAAA4AEgAIAHMAbwBtAGUALgBw
AGQAZgAPABIACABVAG4AdABpAHQAbABlAGQAEgA0VXNlcnMvbWF4
L0Ryb3Bib3gvd29yay90bXAvcGRmbWluZXJfdGVzdGluZy9zb21l
LnBkZgATAAEvAAAVAAIACv//AAA=
</data>
<key>label</key>
<string>some info about foobar</string>
<key>pageIndex</key>
<integer>0</integer>
<key>type</key>
<string>bookmark</string>
</dict>
<dict>
<key>_BDAlias</key>
<data>
AAAAAAFOAAIAAAhVbnRpdGxlZAAAAAAAAAAAAAAAAAAAAAAAAADU
QCbVSCsAAABZDB8JYWdpbGUucGRmAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCb
LdTPyHJQREYgAAAAAP////8AAAkgAAAAAAAAAAAAAAAAAAAABi5U
cmFzaAAQAAgAANRAiUUAAAARAAgAANTQOPIAAAABAAwAWQwfAAYs
xQACZv0AAgAmVW50aXRsZWQ6VXNlcnM6AG1heDoALlRyYXNoOgBh
Z2lsZS5wZGYADgAUAAkAYQBnAGkAbABlAC4AcABkAGYADwASAAgA
VQBuAHQAaQB0AGwAZQBkABIAGlVzZXJzL21heC8uVHJhc2gvYWdp
bGUucGRmABMAAS8AABUAAgAK//8AAA==
</data>
<key>label</key>
<string>some important bookmark about migrations</string>
<key>pageIndex</key>
<integer>386</integer>
<key>type</key>
<string>bookmark</string>
</dict>
<dict>
<key>_BDAlias</key>
<data>
AAAAAAFOAAIAAAhVbnRpdGxlZAAAAAAAAAAAAAAAAAAAAAAAAADU
QCbVSCsAAABZDB8JYWdpbGUucGRmAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCb
LdTPyHJQREYgAAAAAP////8AAAkgAAAAAAAAAAAAAAAAAAAABi5U
cmFzaAAQAAgAANRAiUUAAAARAAgAANTQOPIAAAABAAwAWQwfAAYs
xQACZv0AAgAmVW50aXRsZWQ6VXNlcnM6AG1heDoALlRyYXNoOgBh
Z2lsZS5wZGYADgAUAAkAYQBnAGkAbABlAC4AcABkAGYADwASAAgA
VQBuAHQAaQB0AGwAZQBkABIAGlVzZXJzL21heC8uVHJhc2gvYWdp
bGUucGRmABMAAS8AABUAAgAK//8AAA==
</data>
<key>label</key>
<string>some important note about anatomy of migrations</string>
<key>pageIndex</key>
<integer>389</integer>
<key>type</key>
<string>bookmark</string>
</dict>
<dict>
<key>_BDAlias</key>
<data>
AAAAAAGeAAIAAAhVbnRpdGxlZAAAAAAAAAAAAAAAAAAAAAAAAADU
QCbVSCsAAABwgnQJYWdpbGUucGRmAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHDV
PNTP2+YAAAAAAAAAAP////8AAAkgAAAAAAAAAAAAAAAAAAAAEHBk
Zm1pbmVyX3Rlc3RpbmcAEAAIAADUQIlFAAAAEQAIAADU0ExmAAAA
AQAYAHCCdAAPmYwAD5dgAA+WSAAGLMUAAmb9AAIARFVudGl0bGVk
OlVzZXJzOgBtYXg6AERyb3Bib3g6AHdvcms6AHRtcDoAcGRmbWlu
ZXJfdGVzdGluZzoAYWdpbGUucGRmAA4AFAAJAGEAZwBpAGwAZQAu
AHAAZABmAA8AEgAIAFUAbgB0AGkAdABsAGUAZAASADVVc2Vycy9t
YXgvRHJvcGJveC93b3JrL3RtcC9wZGZtaW5lcl90ZXN0aW5nL2Fn
aWxlLnBkZgAAEwABLwAAFQACAAr//wAA
</data>
<key>label</key>
<string>cat</string>
<key>pageIndex</key>
<integer>158</integer>
<key>type</key>
<string>bookmark</string>
</dict>
</array>
<key>recentDocuments</key>
<array>
<dict>
<key>_BDAlias</key>
<data>
AAAAAAGeAAIAAAhVbnRpdGxlZAAAAAAAAAAAAAAAAAAAAAAAAADU
QCbVSCsAAABwgnQJYWdpbGUucGRmAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHDV
PNTP2+YAAAAAAAAAAP////8AAAkgAAAAAAAAAAAAAAAAAAAAEHBk
Zm1pbmVyX3Rlc3RpbmcAEAAIAADUQIlFAAAAEQAIAADU0ExmAAAA
AQAYAHCCdAAPmYwAD5dgAA+WSAAGLMUAAmb9AAIARFVudGl0bGVk
OlVzZXJzOgBtYXg6AERyb3Bib3g6AHdvcms6AHRtcDoAcGRmbWlu
ZXJfdGVzdGluZzoAYWdpbGUucGRmAA4AFAAJAGEAZwBpAGwAZQAu
AHAAZABmAA8AEgAIAFUAbgB0AGkAdABsAGUAZAASADVVc2Vycy9t
YXgvRHJvcGJveC93b3JrL3RtcC9wZGZtaW5lcl90ZXN0aW5nL2Fn
aWxlLnBkZgAAEwABLwAAFQACAAr//wAA
</data>
<key>pageIndex</key>
<integer>38</integer>
</dict>
<dict>
<key>_BDAlias</key>
<data>
AAAAAAGaAAIAAAhVbnRpdGxlZAAAAAAAAAAAAAAAAAAAAAAAAADU
QCbVSCsAAABwgnQIc29tZS5wZGYAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCW
8dTPxIpQREYgAAAAAP////8AAAkgAAAAAAAAAAAAAAAAAAAAEHBk
Zm1pbmVyX3Rlc3RpbmcAEAAIAADUQIlFAAAAEQAIAADU0DUKAAAA
AQAYAHCCdAAPmYwAD5dgAA+WSAAGLMUAAmb9AAIAQ1VudGl0bGVk
OlVzZXJzOgBtYXg6AERyb3Bib3g6AHdvcms6AHRtcDoAcGRmbWlu
ZXJfdGVzdGluZzoAc29tZS5wZGYAAA4AEgAIAHMAbwBtAGUALgBw
AGQAZgAPABIACABVAG4AdABpAHQAbABlAGQAEgA0VXNlcnMvbWF4
L0Ryb3Bib3gvd29yay90bXAvcGRmbWluZXJfdGVzdGluZy9zb21l
LnBkZgATAAEvAAAVAAIACv//AAA=
</data>
<key>pageIndex</key>
<integer>0</integer>
</dict>
<dict>
<key>_BDAlias</key>
<data>
AAAAAAFOAAIAAAhVbnRpdGxlZAAAAAAAAAAAAAAAAAAAAAAAAADU
QCbVSCsAAABZDB8JYWdpbGUucGRmAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCb
LdTPyHJQREYgAAAAAP////8AAAkgAAAAAAAAAAAAAAAAAAAABi5U
cmFzaAAQAAgAANRAiUUAAAARAAgAANTQOPIAAAABAAwAWQwfAAYs
xQACZv0AAgAmVW50aXRsZWQ6VXNlcnM6AG1heDoALlRyYXNoOgBh
Z2lsZS5wZGYADgAUAAkAYQBnAGkAbABlAC4AcABkAGYADwASAAgA
VQBuAHQAaQB0AGwAZQBkABIAGlVzZXJzL21heC8uVHJhc2gvYWdp
bGUucGRmABMAAS8AABUAAgAK//8AAA==
</data>
<key>pageIndex</key>
<integer>393</integer>
</dict>
</array>
</dict>
</plist>