dokuwiki 1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 063c8012a01a44893ac209de95730fc6c1791544a303790a789d208f0085cbc3
4
+ data.tar.gz: aa12c6b4182d2dbaf2f7cc14d6aed64260e138775ed9be7fd03098ed54632896
5
+ SHA512:
6
+ metadata.gz: 3dd8743a3a31682f78d436ca2018602e175f49fe0f2365e7accdc4ab82a5de1cfcfe45235f1a3b803659821688ad4ace8dd9b8f6cae9615fff9a42db47de22cd
7
+ data.tar.gz: f3f401e9630ccc90c75e2a659e9fafe909a4a33ee69faf47fc1e230813c1c1f9e3ff75998f37fb6236fc1ba1dcec74815c63514209865993b635d06a15bc676d
@@ -0,0 +1,25 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ # Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBrackets.
4
+ # SupportedStyles: space, no_space, compact
5
+ # SupportedStylesForEmptyBrackets: space, no_space
6
+ Layout/SpaceInsideArrayLiteralBrackets:
7
+ EnforcedStyle: space
8
+ Exclude:
9
+ - 'dokuwiki.gemspec'
10
+
11
+ # Configuration parameters: EnforcedStyle.
12
+ # SupportedStyles: space, no_space
13
+ Layout/SpaceInsideParens:
14
+ EnforcedStyle: space
15
+
16
+ # Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBrackets.
17
+ # SupportedStyles: space, no_space
18
+ # SupportedStylesForEmptyBrackets: space, no_space
19
+ Layout/SpaceInsideReferenceBrackets:
20
+ EnforcedStyle: space
21
+
22
+ # URISchemes: http, https
23
+ Metrics/LineLength:
24
+ Exclude:
25
+ - 'dokuwiki.gemspec'
@@ -0,0 +1,3 @@
1
+ ## 1.0 (2019-09-16)
2
+
3
+ - Initial Release.
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in dokuwiki.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2018-2019 Dirk Meyer
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,56 @@
1
+ # DokuWiki
2
+
3
+ The DokuWiki library is used for automating interaction with a DokuWiki Server.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's `Gemfile`:
8
+
9
+ gem 'dokuwiki'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install dokuwiki
18
+
19
+ ## Usage
20
+
21
+ ########################
22
+ # Example 1 Download
23
+ ########################
24
+
25
+ # Initialize and access the wiki at http://www.example.org/dokuwiki/
26
+ dokuwiki = DokuWiki::DokuWikiAccess.new( 'www.example.org', '/dokuwiki' )
27
+
28
+ # Login at specific Namespace
29
+ dokuwiki.login( 'dir:index', username, password )
30
+
31
+ # Download a specific Namespace
32
+ dokuwiki.save_wiki_path( 'dir:page' )
33
+
34
+ ########################
35
+ # Example 2 Upload
36
+ ########################
37
+
38
+ # Initialize and access the wiki at http://www.example.org/
39
+ dokuwiki = DokuWiki::DokuWikiAccess.new( 'www.example.org' )
40
+
41
+ # Login at specific Namespace
42
+ dokuwiki.login( 'dir:index', username, password )
43
+
44
+ # create the cache dir
45
+ dokuwiki.upload_dir = 'UPLOAD'
46
+ File.mkdir( dokuwiki.upload_dir )
47
+
48
+ # Upload a specific Namespace
49
+ dokuwiki.upload_file( 'dir:page', 'result.pdf' )
50
+
51
+ ### File formats
52
+
53
+ The extensions decides the Format used.
54
+ '.wiki': Page in DokuWiki source
55
+ '.txt', '.css', '.jpg', '.png', 'pdf': MediaManager file.
56
+
@@ -0,0 +1,268 @@
1
+ #!/usr/local/bin/ruby -w
2
+
3
+ # = dokuwiki.rb
4
+ #
5
+ # Author:: Dirk Meyer
6
+ # Copyright:: Copyright (c) 2018 - 2019 Dirk Meyer
7
+ # License:: Distributes under the same terms as Ruby
8
+ #
9
+ # == module DokuWiki
10
+ #
11
+ # Namespace for accessing DokuWiki
12
+ #
13
+
14
+ require 'rubygems'
15
+ require 'http-cookie'
16
+ require 'mechanize'
17
+ require 'pp'
18
+
19
+ # Module for accessing DokuWiki
20
+ module DokuWiki
21
+ # === Class Functions
22
+ #
23
+ # require 'dokuwiki"
24
+ #
25
+ # DokuWiki.new( hostname, urlpath = nil )
26
+ # DokuWiki.media_dir
27
+ # DokuWiki.upload_dir
28
+ # DokuWiki.wait_second
29
+ # DokuWiki.namespace( wikipath )
30
+ # DokuWiki.edit_url( wikipath )
31
+ # DokuWiki.get( url )
32
+ # DokuWiki.login( wikipath, user, pass )
33
+ # DokuWiki.downloaded?( filename, buffer )
34
+ # DokuWiki.file_put_contents( filename, line, mode = 'w+' )
35
+ # DokuWiki.save_wiki_source( page, filename )
36
+ # DokuWiki.save_wiki_body( filename, url )
37
+ # DokuWiki.save_wiki_media( filename, url )
38
+ # DokuWiki.save_wiki_path( wikipath )
39
+ # DokuWiki.uploaded?( filename, buffer )
40
+ # DokuWiki.save_uploaded( filename )
41
+ # DokuWiki.upload_media_file?( wikipath, filename )
42
+ # DokuWiki.upload_wiki_file( wikipath, filename )
43
+ # DokuWiki.upload_file( wikipath, filename )
44
+ #
45
+ class DokuWikiAccess
46
+ # extension for files in dokuwiki syntax
47
+ EXTENSION = 'wiki'.freeze
48
+ # filename for cookie cache
49
+ COOKIES = 'cookies.txt'.freeze
50
+
51
+ # directory for media download cache
52
+ attr_accessor :media_dir
53
+ # directory for upload cache
54
+ attr_accessor :upload_dir
55
+
56
+ # define server location
57
+ def initialize( hostname, urlpath = nil )
58
+ @site = "https://#{hostname}"
59
+ @site << urlpath unless urlpath.nil?
60
+ @site.freeze
61
+ @dokuwiki_page_url = "#{@site}/doku.php?id=".freeze
62
+ @dokuwiki_css_url = "#{@site}/lib/exe/css.php?t=".freeze
63
+ @dokuwiki_media_url = "#{@site}/lib/exe/fetch.php?cache=&media=".freeze
64
+ @dokuwiki_media_upload_url = "#{@site}/lib/exe/ajax.php?" \
65
+ 'tab_files=files&tab_details=view&do=media&ns='.freeze
66
+ @media_dir = nil
67
+ @upload_dir = nil
68
+ @lastpage = nil
69
+ @cookies = nil
70
+ @sectok = nil
71
+ @agent = nil
72
+ end
73
+
74
+ # be nice to the server
75
+ def wait_second
76
+ now = Time.now.to_i
77
+ # p [ 'wait_second', now, $lastpage ]
78
+ unless @lastpage.nil?
79
+ if now <= @lastpage + 2
80
+ sleep 2
81
+ now = Time.now.to_i
82
+ end
83
+ end
84
+ @lastpage = now
85
+ end
86
+
87
+ # convert path to namesape
88
+ def namespace( wikipath )
89
+ wikipath.gsub( ':', '%3A' ).freeze
90
+ end
91
+
92
+ # make edit url
93
+ def edit_url( wikipath )
94
+ "#{@dokuwiki_page_url}#{wikipath}&do=edit"
95
+ end
96
+
97
+ # make upload url
98
+ def upload_url( wikipath, filename )
99
+ namespace = namespace( wikipath )
100
+ url = "#{@dokuwiki_media_upload_url}#{namespace}&sectok=#{@sectok}"
101
+ url << '&mediaid=&call=mediaupload'
102
+ url << "&qqfile=#{filename}&ow=true"
103
+ url
104
+ end
105
+
106
+ # get url
107
+ def get( url )
108
+ p url
109
+ wait_second
110
+ @agent.get( url )
111
+ end
112
+
113
+ # login into DokuWiki at given path
114
+ def login( wikipath, user, pass )
115
+ Timeout.timeout( 300 ) do
116
+ @agent = Mechanize.new
117
+ @agent.agent.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
118
+ @agent.agent.http.reuse_ssl_sessions = false
119
+ # @agent.agent.http.ca_file = ca_path
120
+ if @cookies.nil?
121
+ url = @dokuwiki_page_url + wikipath
122
+ page = get( url )
123
+ # Submit the login form
124
+ wait_second
125
+ page = page.form_with( id: 'dw__login' ) do |f|
126
+ f.field_with( name: 'u' ).value = user
127
+ f.field_with( name: 'p' ).value = pass
128
+ f.checkbox_with( name: 'r' ).check
129
+ end.click_button
130
+ f = page.forms[ 1 ]
131
+ @sectok = f.field_with( name: 'sectok' ).value
132
+ @agent.cookie_jar.save( COOKIES )
133
+ else
134
+ @agent.cookie_jar.load( COOKIES )
135
+ end
136
+ end
137
+ end
138
+
139
+ # check if downloaded file has changed
140
+ def downloaded?( filename, buffer )
141
+ return false unless File.exist?( filename )
142
+
143
+ old = File.read( filename, encoding: buffer.encoding )
144
+ return true if buffer == old
145
+
146
+ false
147
+ end
148
+
149
+ # write buffer to file
150
+ def file_put_contents( filename, buffer, mode = 'w+' )
151
+ return if downloaded?( filename, buffer )
152
+
153
+ File.open( filename, mode ) do |f|
154
+ f.write( buffer )
155
+ f.close
156
+ end
157
+ end
158
+
159
+ # save wiki source to file
160
+ def save_wiki_source( page, filename )
161
+ f = page.form_with( id: 'dw__editform' )
162
+ wikitext = f.field_with( name: 'wikitext' ).value.delete( "\r" )
163
+ file_put_contents( filename, wikitext )
164
+ button = f.button_with( name: 'do[draftdel]' )
165
+ @agent.submit( f, button )
166
+ end
167
+
168
+ # save wiki body to file
169
+ def save_wiki_body( filename, url )
170
+ page = get( url )
171
+ file_put_contents( filename, page.body )
172
+ end
173
+
174
+ # save wiki media body to file
175
+ def save_wiki_media( filename, url )
176
+ path =
177
+ if @media_dir.nil?
178
+ filename
179
+ else
180
+ "#{MEDIA_DIR}/#{filename}"
181
+ end
182
+ save_wiki_body( path, url )
183
+ end
184
+
185
+ # save wiki path to file
186
+ def save_wiki_path( wikipath )
187
+ filename = wikipath.split( ':' ).last
188
+ case wikipath
189
+ when /[.]jpe?g$/, /[.]png$/, /[.]pdf$/
190
+ url = @dokuwiki_media_url + wikipath
191
+ save_wiki_media( filename, url )
192
+ when /[.]css$/
193
+ url = @dokuwiki_css_url + wikipath.sub( /[.]css$/, '' )
194
+ save_wiki_media( filename, url )
195
+ when /[.]html$/
196
+ url = @dokuwiki_page_url + wikipath.sub( /[.]html$/, '' )
197
+ save_wiki_body( filename, url )
198
+ else
199
+ url = edit_url( wikipath )
200
+ filename << ".#{EXTENSION}"
201
+ page = get( url )
202
+ save_wiki_source( page, filename )
203
+ end
204
+ end
205
+
206
+ # check if uploaded file has changed
207
+ def uploaded?( filename, buffer )
208
+ return false if @upload_dir.nil?
209
+
210
+ savedfile = "#{@upload_dir}/#{filename}"
211
+ return false unless File.exist?( savedfile )
212
+
213
+ old = File.read( savedfile, encoding: buffer.encoding )
214
+ return true if buffer == old
215
+
216
+ false
217
+ end
218
+
219
+ # save content to avoid useless edits
220
+ def save_uploaded( filename )
221
+ print system( "cp -pv '#{filename}' '#{@upload_dir}/'" )
222
+ end
223
+
224
+ # upload media file at path
225
+ def upload_media_file( wikipath, filename, raw )
226
+ p filename
227
+ headers = {
228
+ 'Content-Type' => 'application/octet-stream',
229
+ 'X-File-Name' => filename
230
+ }
231
+ url = upload_url( wikipath, filename )
232
+ p url
233
+ wait_second
234
+ pp @agent.post( url, raw, headers )
235
+ save_uploaded( filename )
236
+ end
237
+
238
+ # edit wiki source at path
239
+ def upload_wiki_file( wikipath, filename )
240
+ raw = File.read( filename ).gsub( "\n", "\r\n" )
241
+ basename = filename.sub( /[.]#{EXTENSION}$/, '' )
242
+ finalpath = "#{wikipath}:#{basename}"
243
+ page = get( edit_url( finalpath ) )
244
+ f = page.form_with( id: 'dw__editform' )
245
+ f.field_with( name: 'wikitext' ).value = raw
246
+ f.field_with( name: 'summary' ).value = 'automated by qscript'
247
+ button = f.button_with( name: 'do[save]' )
248
+ pp @agent.submit( f, button )
249
+ save_uploaded( filename )
250
+ end
251
+
252
+ # upload a file at given path
253
+ def upload_file( wikipath, filename )
254
+ p filename
255
+ raw = File.read( filename )
256
+ return if uploaded?( filename, raw )
257
+
258
+ case filename
259
+ when /[.]#{EXTENSION}$/
260
+ upload_wiki_file( wikipath, filename )
261
+ else
262
+ upload_media_file( wikipath, filename, raw )
263
+ end
264
+ end
265
+ end
266
+ end
267
+
268
+ # eof
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dokuwiki
3
+ version: !ruby/object:Gem::Version
4
+ version: '1.0'
5
+ platform: ruby
6
+ authors:
7
+ - Dirk Meyer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-09-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: http-cookie
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.0.3
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.0.3
33
+ - !ruby/object:Gem::Dependency
34
+ name: mechanize
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.7'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 2.7.6
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '2.7'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 2.7.6
53
+ description: The DokuWiki library is used for automating interaction with a DokuWiki
54
+ server.
55
+ email:
56
+ executables: []
57
+ extensions: []
58
+ extra_rdoc_files: []
59
+ files:
60
+ - ".rubocop.yml"
61
+ - CHANGELOG.md
62
+ - Gemfile
63
+ - LICENSE.txt
64
+ - README.md
65
+ - lib/dokuwiki.rb
66
+ homepage: https://rubygems.org/gems/dokuwiki
67
+ licenses:
68
+ - MIT
69
+ metadata: {}
70
+ post_install_message:
71
+ rdoc_options: []
72
+ require_paths:
73
+ - lib
74
+ required_ruby_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ required_rubygems_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ requirements: []
85
+ rubygems_version: 3.0.6
86
+ signing_key:
87
+ specification_version: 4
88
+ summary: access DokuWiki server
89
+ test_files: []