joplin 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 709555c1917e195e956c526a75979ea74deb8f3da829afe0f6d34ab7d074fad5
4
- data.tar.gz: a09ac659f62def224a04adf7766d90231d8034335190dc99402d7b3715a763f3
3
+ metadata.gz: 894bad22eddabf7759d835d3a2c2f94ef60bf0c0e7767bb902d8bfb107e70a19
4
+ data.tar.gz: 1a29dc5fe553d92a7e84c5e9292d542247111de8b1098bf01b98a54270b05608
5
5
  SHA512:
6
- metadata.gz: a53a2aae8f8a7c073cbef92668097171a5038357ad8c16c045e01b4336b16b4369abef498ecb0961dfa14b8592be1b34c0998a4da37e3470e602e314d7f01f91
7
- data.tar.gz: 50f3207ad27c7eaa968fa031b4bd3b052c8d58014701f2d64166b8594a753fa9422e03e7ecedb758bdce9f9e11a188e19e8a2046ee493ec0f57e08ee79618bc3
6
+ metadata.gz: 74047ff08fb61576bc9689dea85829cc58920436d410d3604a93e769c6314d2000adc244abfdbb6dea40ac38d0ad97ec0f82a8ccf5ae392aa12532dfe1c2b5f4
7
+ data.tar.gz: e390de0be3ff25e34d59dde77a84068bb62f7179aecd192c8afe2e0f00ec2df9dd681e4e0d44d8ba1414419f8738998b4e4aecafd0f5a6d02344c24d9e416db4
data/Gemfile CHANGED
@@ -4,3 +4,5 @@ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
5
  # Specify your gem's dependencies in joplin.gemspec
6
6
  gemspec
7
+
8
+ gem "pandoc_binary", "~> 3.1"
data/Gemfile.lock CHANGED
@@ -29,6 +29,7 @@ GEM
29
29
  llhttp-ffi (0.4.0)
30
30
  ffi-compiler (~> 1.0)
31
31
  rake (~> 13.0)
32
+ pandoc_binary (3.1.1)
32
33
  public_suffix (5.0.1)
33
34
  rake (13.0.6)
34
35
  rspec (3.12.0)
@@ -56,6 +57,7 @@ PLATFORMS
56
57
  DEPENDENCIES
57
58
  bundler (~> 2.0)
58
59
  joplin!
60
+ pandoc_binary (~> 3.1)
59
61
  rake (~> 13.0)
60
62
  rspec (~> 3.12.0)
61
63
 
data/Makefile CHANGED
@@ -1,3 +1,5 @@
1
+ foo:
2
+
1
3
  test:
2
4
  rake spec
3
5
 
@@ -6,6 +8,7 @@ build:
6
8
 
7
9
  push: clean build
8
10
  gem push *gem
11
+ git tag `grep VERSION lib/joplin/version.rb | sed -e 's/^.*VERSION = "\(.*\)"/\1/'`
9
12
 
10
13
  clean:
11
14
  rm -f *gem
data/bin/joplin CHANGED
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ # REF: https://joplinapp.org/help/api/references/rest_api/
4
+
3
5
  $:.unshift File.expand_path('../lib', __dir__)
4
6
 
5
7
  require 'joplin'
@@ -49,6 +51,23 @@ class MyCLI < Thor
49
51
  note.write
50
52
  end
51
53
 
54
+ desc :stats, 'statistics on joplin data'
55
+ long_desc 'Get some statistics on the joplin instance, the number of notebooks, notes'
56
+ option :token
57
+ def stats
58
+ notes_total = 0
59
+ notebooks = Joplin::Notebook.all
60
+ notebooks.each do |notebook|
61
+ notes_count = notebook.notes.size # Get the count of notes in the notebook
62
+ notes_total += notebook.notes.size
63
+ end
64
+ puts <<~HEREDOC
65
+ Token: #{token}
66
+ Notebooks: #{notebooks.size}
67
+ Notes: #{notes_total}
68
+ HEREDOC
69
+ end
70
+
52
71
  desc :nb2n, 'concate all notes in a notebook to one note. Possible PDF export'
53
72
  long_desc 'The idea is to make a big note from all the notes in a notebook. PDF export or whatever export can happen from that. The notes are concatenated with a separator.'
54
73
  option :token
@@ -88,7 +107,6 @@ class MyCLI < Thor
88
107
  DESC
89
108
 
90
109
  def epub(id)
91
- abort 'You need to install pandoc and have it in your path' unless has_exec? 'pandoc'
92
110
  build_note = Joplin::Note.new(id:)
93
111
  note = build(id)
94
112
  note.write
@@ -97,7 +115,7 @@ class MyCLI < Thor
97
115
  `pandoc '#{note.title}.md' -o '../#{note.title}.epub' -t epub3 -f markdown+smart --title '#{note.title}' --toc --toc-depth=3 --metadata title='#{note.title}'`
98
116
  note.delete!
99
117
  FileUtils.cd '..'
100
- FileUtils.rm_rf note.title
118
+ # FileUtils.rm_rf note.title
101
119
  abort 'Omg. pandoc failed!' if $?.exitstatus != 0
102
120
  puts "OK. Done. Your book is #{note.title}.epub"
103
121
  end
@@ -126,7 +144,7 @@ class MyCLI < Thor
126
144
  end
127
145
  yml = extract_yaml_header_for_epub(note)
128
146
  new_note = Joplin::Note.new parent_id: note.parent_id
129
- new_note.title = yml ? yml['title'] : "built: #{note.title}"
147
+ new_note.title = yml ? title_from_yml(yml) : "built: #{note.title}"
130
148
  new_note.body = "#{Psych.dump yml}...\n" if yml
131
149
  new_note.body += notes.map { |n| "\# #{n.title}\n\n#{n.body}" }.join
132
150
  new_note.save!
@@ -135,6 +153,18 @@ class MyCLI < Thor
135
153
 
136
154
  private
137
155
 
156
+ # if using subtitle with pandoc it has a different format
157
+ # https://pandoc.org/MANUAL.html#epubs
158
+ def title_from_yml(yml)
159
+ if yml['title'].is_a? Array
160
+ yml['title'].each do |title|
161
+ return title['text'] if title['type'] == 'main'
162
+ end
163
+ end
164
+
165
+ yml['title']
166
+ end
167
+
138
168
  def extract_yaml_header_for_epub(note)
139
169
  yml = Psych.load note.body
140
170
  return nil unless yml.is_a? Hash
@@ -142,13 +172,9 @@ class MyCLI < Thor
142
172
  yml
143
173
  end
144
174
 
145
- def has_exec?(command)
146
- !`which #{command}`.empty?
147
- end
148
-
149
175
  def token
150
176
  Joplin.token = Joplin.get_token || options[:token]
151
- return if Joplin.token
177
+ return Joplin.token if Joplin.token
152
178
 
153
179
  raise "Couldn't find token in local database and it wasn't passed as an option. You better check yourself!"
154
180
  end
@@ -1,3 +1,3 @@
1
1
  module Joplin
2
- VERSION = "1.0.1"
2
+ VERSION = "1.1.0"
3
3
  end
data/lib/joplin.rb CHANGED
@@ -205,10 +205,50 @@ module Joplin
205
205
  end
206
206
 
207
207
  def notes
208
- url = "#{Joplin.uri}/folders/#{@id}/notes?token=#{Joplin.token}"
209
- res = HTTP.get url
210
- notes = JSON.parse res.body
211
- notes.map! { |n| Joplin::Note.new n['id'] }
208
+ notes = []
209
+ page = 1
210
+
211
+ loop do
212
+ url = "#{Joplin.uri}/folders/#{@id}/notes?token=#{Joplin.token}&page=#{page}"
213
+ response = HTTP.get(url)
214
+
215
+ raise Error, "Failed to fetch notes: #{response}" if response.status != 200
216
+
217
+ data = JSON.parse(response.body)
218
+
219
+ items = data['items']
220
+ items.each { |note_data| notes << Joplin::Note.new(id: note_data['id']) }
221
+
222
+ break unless data['has_more']
223
+
224
+ page += 1
225
+ end
226
+
227
+ notes
228
+ end
229
+
230
+ def self.all
231
+ notebooks = []
232
+ page = 1
233
+
234
+ loop do
235
+ url = "#{Joplin.uri}/folders?token=#{Joplin.token}&page=#{page}"
236
+ response = HTTP.get(url)
237
+
238
+ raise Error, "Failed to fetch notebooks: #{response}" if response.status != 200
239
+
240
+ data = JSON.parse(response.body)
241
+ items = data['items']
242
+
243
+ break if items.empty?
244
+
245
+ # Collect Notebook instances
246
+ items.each { |notebook_data| notebooks << Notebook.new(notebook_data['id']) }
247
+
248
+ page += 1
249
+ end
250
+
251
+ notebooks
212
252
  end
213
253
  end
214
254
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: joplin
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Bretoi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-07-02 00:00:00.000000000 Z
11
+ date: 2024-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http
@@ -139,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
139
  - !ruby/object:Gem::Version
140
140
  version: '0'
141
141
  requirements: []
142
- rubygems_version: 3.4.10
142
+ rubygems_version: 3.5.11
143
143
  signing_key:
144
144
  specification_version: 4
145
145
  summary: joplin API