Class: DokuWiki::DokuWikiAccess

Inherits:
Object
  • Object
show all
Defined in:
lib/dokuwiki.rb

Overview

Class Functions

require 'dokuwiki"

DokuWiki.new( hostname, urlpath = nil )
DokuWiki.media_dir
DokuWiki.upload_dir
DokuWiki.wait_second
DokuWiki.namespace( wikipath )
DokuWiki.edit_url( wikipath )
DokuWiki.get( url )
DokuWiki.login( wikipath, user, pass )
DokuWiki.downloaded?( filename, buffer )
DokuWiki.file_put_contents( filename, line, mode = 'w+' )
DokuWiki.save_wiki_source( page, filename )
DokuWiki.save_wiki_body( filename, url )
DokuWiki.save_wiki_media( filename, url )
DokuWiki.save_wiki_path( wikipath )
DokuWiki.uploaded?( filename, buffer )
DokuWiki.save_uploaded( filename )
DokuWiki.upload_media_file?( wikipath, filename )
DokuWiki.upload_wiki_file( wikipath, filename )
DokuWiki.upload_file( wikipath, filename )

Constant Summary collapse

EXTENSION =

extension for files in dokuwiki syntax

'wiki'.freeze
COOKIES =

filename for cookie cache

'cookies.txt'.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(hostname, urlpath = nil) ⇒ DokuWikiAccess

define server location



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/dokuwiki.rb', line 57

def initialize( hostname, urlpath = nil )
  @site = "https://#{hostname}"
  @site << urlpath unless urlpath.nil?
  @site.freeze
  @dokuwiki_page_url = "#{@site}/doku.php?id=".freeze
  @dokuwiki_css_url = "#{@site}/lib/exe/css.php?t=".freeze
  @dokuwiki_media_url = "#{@site}/lib/exe/fetch.php?cache=&media=".freeze
  @dokuwiki_media_upload_url = "#{@site}/lib/exe/ajax.php?" \
    'tab_files=files&tab_details=view&do=media&ns='.freeze
  @media_dir = nil
  @upload_dir = nil
  @lastpage = nil
  @cookies = nil
  @sectok = nil
  @agent = nil
end

Instance Attribute Details

#media_dirObject

directory for media download cache



52
53
54
# File 'lib/dokuwiki.rb', line 52

def media_dir
  @media_dir
end

#upload_dirObject

directory for upload cache



54
55
56
# File 'lib/dokuwiki.rb', line 54

def upload_dir
  @upload_dir
end

Instance Method Details

#downloaded?(filename, buffer) ⇒ Boolean

check if downloaded file has changed

Returns:

  • (Boolean)


140
141
142
143
144
145
146
147
# File 'lib/dokuwiki.rb', line 140

def downloaded?( filename, buffer )
  return false unless File.exist?( filename )

  old = File.read( filename, encoding: buffer.encoding )
  return true if buffer == old

  false
end

#edit_url(wikipath) ⇒ Object

make edit url



93
94
95
# File 'lib/dokuwiki.rb', line 93

def edit_url( wikipath )
  "#{@dokuwiki_page_url}#{wikipath}&do=edit"
end

#file_put_contents(filename, buffer, mode = 'w+') ⇒ Object

write buffer to file



150
151
152
153
154
155
156
157
# File 'lib/dokuwiki.rb', line 150

def file_put_contents( filename, buffer, mode = 'w+' )
  return if downloaded?( filename, buffer )

  File.open( filename, mode ) do |f|
    f.write( buffer )
    f.close
  end
end

#get(url) ⇒ Object

get url



107
108
109
110
111
# File 'lib/dokuwiki.rb', line 107

def get( url )
  p url
  wait_second
  @agent.get( url )
end

#login(wikipath, user, pass) ⇒ Object

login into DokuWiki at given path



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/dokuwiki.rb', line 114

def ( wikipath, user, pass )
  Timeout.timeout( 300 ) do
    @agent = Mechanize.new
    @agent.agent.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    @agent.agent.http.reuse_ssl_sessions = false
    # @agent.agent.http.ca_file = ca_path
    if @cookies.nil?
      url = @dokuwiki_page_url + wikipath
      page = get( url )
      # Submit the login form
      wait_second
      page = page.form_with( id: 'dw__login' ) do |f|
        f.field_with( name: 'u' ).value = user
        f.field_with( name: 'p' ).value = pass
        f.checkbox_with( name: 'r' ).check
      end.click_button
      f = page.forms[ 1 ]
      @sectok = f.field_with( name: 'sectok' ).value
      @agent.cookie_jar.save( COOKIES )
    else
      @agent.cookie_jar.load( COOKIES )
    end
  end
end

#namespace(wikipath) ⇒ Object

convert path to namesape



88
89
90
# File 'lib/dokuwiki.rb', line 88

def namespace( wikipath )
  wikipath.gsub( ':', '%3A' ).freeze
end

#save_uploaded(filename) ⇒ Object

save content to avoid useless edits



220
221
222
# File 'lib/dokuwiki.rb', line 220

def save_uploaded( filename )
  print system( "cp -pv '#{filename}' '#{@upload_dir}/'" )
end

#save_wiki_body(filename, url) ⇒ Object

save wiki body to file



169
170
171
172
# File 'lib/dokuwiki.rb', line 169

def save_wiki_body( filename, url )
  page = get( url )
  file_put_contents( filename, page.body )
end

#save_wiki_media(filename, url) ⇒ Object

save wiki media body to file



175
176
177
178
179
180
181
182
183
# File 'lib/dokuwiki.rb', line 175

def save_wiki_media( filename, url )
  path =
    if @media_dir.nil?
      filename
    else
      "#{MEDIA_DIR}/#{filename}"
    end
  save_wiki_body( path, url )
end

#save_wiki_path(wikipath) ⇒ Object

save wiki path to file



186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
# File 'lib/dokuwiki.rb', line 186

def save_wiki_path( wikipath )
  filename = wikipath.split( ':' ).last
  case wikipath
  when /[.]jpe?g$/, /[.]png$/, /[.]pdf$/
    url = @dokuwiki_media_url + wikipath
    save_wiki_media( filename, url )
  when /[.]css$/
    url = @dokuwiki_css_url + wikipath.sub( /[.]css$/, '' )
    save_wiki_media( filename, url )
  when /[.]html$/
    url = @dokuwiki_page_url + wikipath.sub( /[.]html$/, '' )
    save_wiki_body( filename, url )
  else
    url = edit_url( wikipath )
    filename << ".#{EXTENSION}"
    page = get( url )
    save_wiki_source( page, filename )
  end
end

#save_wiki_source(page, filename) ⇒ Object

save wiki source to file



160
161
162
163
164
165
166
# File 'lib/dokuwiki.rb', line 160

def save_wiki_source( page, filename )
  f = page.form_with( id: 'dw__editform' )
  wikitext = f.field_with( name: 'wikitext' ).value.delete( "\r" )
  file_put_contents( filename, wikitext )
  button = f.button_with( name: 'do[draftdel]' )
  @agent.submit( f, button )
end

#upload_file(wikipath, filename) ⇒ Object

upload a file at given path



253
254
255
256
257
258
259
260
261
262
263
264
# File 'lib/dokuwiki.rb', line 253

def upload_file( wikipath, filename )
  p filename
  raw = File.read( filename )
  return if uploaded?( filename, raw )

  case filename
  when /[.]#{EXTENSION}$/
    upload_wiki_file( wikipath, filename )
  else
    upload_media_file( wikipath, filename, raw )
  end
end

#upload_media_file(wikipath, filename, raw) ⇒ Object

upload media file at path



225
226
227
228
229
230
231
232
233
234
235
236
# File 'lib/dokuwiki.rb', line 225

def upload_media_file( wikipath, filename, raw )
  p filename
  headers = {
    'Content-Type' => 'application/octet-stream',
    'X-File-Name' => filename
  }
  url = upload_url( wikipath, filename )
  p url
  wait_second
  pp @agent.post( url, raw, headers )
  save_uploaded( filename )
end

#upload_url(wikipath, filename) ⇒ Object

make upload url



98
99
100
101
102
103
104
# File 'lib/dokuwiki.rb', line 98

def upload_url( wikipath, filename )
  namespace = namespace( wikipath )
  url = "#{@dokuwiki_media_upload_url}#{namespace}&sectok=#{@sectok}"
  url << '&mediaid=&call=mediaupload'
  url << "&qqfile=#{filename}&ow=true"
  url
end

#upload_wiki_file(wikipath, filename) ⇒ Object

edit wiki source at path



239
240
241
242
243
244
245
246
247
248
249
250
# File 'lib/dokuwiki.rb', line 239

def upload_wiki_file( wikipath, filename )
  raw = File.read( filename ).gsub( "\n", "\r\n" )
  basename = filename.sub( /[.]#{EXTENSION}$/, '' )
  finalpath = "#{wikipath}:#{basename}"
  page = get( edit_url( finalpath ) )
  f = page.form_with( id: 'dw__editform' )
  f.field_with( name: 'wikitext' ).value = raw
  f.field_with( name: 'summary' ).value = 'automated by qscript'
  button = f.button_with( name: 'do[save]' )
  pp @agent.submit( f, button )
  save_uploaded( filename )
end

#uploaded?(filename, buffer) ⇒ Boolean

check if uploaded file has changed

Returns:

  • (Boolean)


207
208
209
210
211
212
213
214
215
216
217
# File 'lib/dokuwiki.rb', line 207

def uploaded?( filename, buffer )
  return false if @upload_dir.nil?

  savedfile = "#{@upload_dir}/#{filename}"
  return false unless File.exist?( savedfile )

  old = File.read( savedfile, encoding: buffer.encoding )
  return true if buffer == old

  false
end

#wait_secondObject

be nice to the server



75
76
77
78
79
80
81
82
83
84
85
# File 'lib/dokuwiki.rb', line 75

def wait_second
  now = Time.now.to_i
  # p [ 'wait_second', now, $lastpage ]
  unless @lastpage.nil?
    if now <= @lastpage + 2
      sleep 2
      now = Time.now.to_i
    end
  end
  @lastpage = now
end