class DokuWiki::DokuWikiAccess

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 )

Constants

COOKIES

filename for cookie cache

EXTENSION

extension for files in dokuwiki syntax

Attributes

media_dir[RW]

directory for media download cache

upload_dir[RW]

directory for upload cache

Public Class Methods

new( hostname, urlpath = nil ) click to toggle source

define server location

# 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

Public Instance Methods

downloaded?( filename, buffer ) click to toggle source

check if downloaded file has changed

# 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 ) click to toggle source

make edit url

# File lib/dokuwiki.rb, line 93
def edit_url( wikipath )
  "#{@dokuwiki_page_url}#{wikipath}&do=edit"
end
file_put_contents( filename, buffer, mode = 'w+' ) click to toggle source

write buffer to file

# 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 ) click to toggle source

get url

# File lib/dokuwiki.rb, line 107
def get( url )
  p url
  wait_second
  @agent.get( url )
end
login( wikipath, user, pass ) click to toggle source

login into DokuWiki at given path

# File lib/dokuwiki.rb, line 114
def login( 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 ) click to toggle source

convert path to namesape

# File lib/dokuwiki.rb, line 88
def namespace( wikipath )
  wikipath.gsub( ':', '%3A' ).freeze
end
save_uploaded( filename ) click to toggle source

save content to avoid useless edits

# File lib/dokuwiki.rb, line 220
def save_uploaded( filename )
  print system( "cp -pv '#{filename}' '#{@upload_dir}/'" )
end
save_wiki_body( filename, url ) click to toggle source

save wiki body to file

# 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 ) click to toggle source

save wiki media body to file

# 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 ) click to toggle source

save wiki path to file

# 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 ) click to toggle source

save wiki source to file

# 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 ) click to toggle source

upload a file at given path

# 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 ) click to toggle source

upload media file at path

# 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 ) click to toggle source

make upload url

# 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 ) click to toggle source

edit wiki source at path

# 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 ) click to toggle source

check if uploaded file has changed

# 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_second() click to toggle source

be nice to the server

# 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