Class: RubyScriptProvider::Storage

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

Overview

Wrapper for file access.

Constant Summary collapse

YAML_EXTENSION =
'.yml'

Instance Method Summary collapse

Constructor Details

#initialize(ctx) ⇒ Storage

Returns a new instance of Storage.



254
255
256
257
# File 'lib/rubyscriptprovider.rb', line 254

def initialize(ctx)
  @ctx = ctx
  @sfa = create_service("com.sun.star.ucb.SimpleFileAccess")
end

Instance Method Details

#choose_fileObject



337
338
339
340
341
342
343
344
345
346
347
348
# File 'lib/rubyscriptprovider.rb', line 337

def choose_file
  scripts_dir = create_service("com.sun.star.util.PathSubstitution")
      .substituteVariables("$(user)/Scripts/#{LANGUAGE.downcase}", true)
  picker = create_service("com.sun.star.ui.dialogs.FilePicker")
  picker.appendFilter("All Files (*.*)", "*.*")
  picker.appendFilter(
     "#{LANGUAGE} Files (*#{RB_EXTENSION})", "*#{RB_EXTENSION}")
  picker.setCurrentFilter("All Files (*.*)")
  picker.setDisplayDirectory(scripts_dir)
  picker.setMultiSelectionMode(false)
  picker.getFiles[0] if picker.execute > 0
end

#delete(url) ⇒ Object



279
280
281
282
# File 'lib/rubyscriptprovider.rb', line 279

def delete(url)
  @sfa.kill(url.to_s)
  return true
end

#descriptions(url) ⇒ Object



359
360
361
362
363
364
365
366
367
368
369
370
# File 'lib/rubyscriptprovider.rb', line 359

def descriptions(url)
  require 'yaml'
  ret = nil
  yaml_url = url.join(url.dirname, 
          url.basename(RB_EXTENSION) + YAML_EXTENSION)
  if exists?(yaml_url)
    text = file_content(yaml_url)
    ret = YAML.load(text) rescue nil
  end
  ret = {} unless ret
  return ret
end

#dir_contents(url) ⇒ Object



284
285
286
287
# File 'lib/rubyscriptprovider.rb', line 284

def dir_contents(url)
  return @sfa.getFolderContents(url.to_s, true) if exists?(url)
  return []
end

#dir_create(url) ⇒ Object



289
290
291
# File 'lib/rubyscriptprovider.rb', line 289

def dir_create(url)
  @sfa.createFolder(url.to_s) unless exists?(url)
end

#exists?(url) ⇒ Boolean

Returns:

  • (Boolean)


263
264
265
# File 'lib/rubyscriptprovider.rb', line 263

def exists?(url)
  return @sfa.exists(url.to_s)
end

#file_content(url) ⇒ Object



350
351
352
353
354
355
356
357
# File 'lib/rubyscriptprovider.rb', line 350

def file_content(url)
  lines = []
  text_input = create_service("com.sun.star.io.TextInputStream")
  text_input.setInputStream(@sfa.openFileRead(url.to_s))
  lines << text_input.readLine until text_input.isEOF
  text_input.closeInput
  return lines.join("\n")
end

#file_copy(source, dest, yaml = false) ⇒ Object



298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
# File 'lib/rubyscriptprovider.rb', line 298

def file_copy(source, dest, yaml=false)
  source = source.to_s
  dest = dest.to_s
  if @sfa.exists(source)
    source_input = @sfa.openFileRead(source)
    @sfa.kill(dest) if @sfa.exists(dest)
    @sfa.writeFile(dest, source_input)
    source_input.closeInput
    if yaml
      yaml_source = source[0..-File.extname(source).length-1] + 
            YAML_EXTENSION
      if @sfa.exists(yaml_source)
        yaml_dest = dest[0..-File.extname(dest).length-1] + 
            YAML_EXTENSION
        file_copy(yaml_source, yaml_dest)
      end
    end
  end
end

#file_create(url, name) ⇒ Object



293
294
295
296
# File 'lib/rubyscriptprovider.rb', line 293

def file_create(url, name)
  dir_create(url)
  write_text(url.join(name))
end

#get_method_names(url) ⇒ Object

try to find public methods from sexp tree



373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
# File 'lib/rubyscriptprovider.rb', line 373

def get_method_names(url)
  require 'ripper'
  text = file_content(url)
  result = Ripper.sexp(text, url.to_s)
  method_defs = []
  if result.length == 2 && result[0] == :program
    is_public = true
    result[1].each do |item|
      case item[0]
      when :def
        ident = find_item(item, :@ident)
        if ident
          if is_public
            method_defs << ident
          else
            method_defs.delete(ident)
          end
        end
      when :command
        ident = find_item(item, :@ident)
        case ident
        when "private", "protected", "public"
          block = find_item(item, :args_add_block)
          items = get_symbol_literals(block)
          if ident == "public"
            method_defs.concat(items)
          else
            items.each do |i|
              method_defs.delete(i)
            end
          end
        end
      when :var_ref
        ident = find_item(item, :@ident)
        is_public = ident == "public" if ident
      end
    end
    method_defs.uniq!
  end
  return method_defs
end

#is_dir?(url) ⇒ Boolean

Returns:

  • (Boolean)


267
268
269
# File 'lib/rubyscriptprovider.rb', line 267

def is_dir?(url)
  return @sfa.isFolder(url.to_s)
end

#is_readonly?(url) ⇒ Boolean

Returns:

  • (Boolean)


271
272
273
# File 'lib/rubyscriptprovider.rb', line 271

def is_readonly?(url)
  return @sfa.isReadOnly(url.to_s)
end

#modified_time(url) ⇒ Object



259
260
261
# File 'lib/rubyscriptprovider.rb', line 259

def modified_time(url)
  return @sfa.getDateTimeModified(url.to_s)
end

#rename(url, dest_url) ⇒ Object



275
276
277
# File 'lib/rubyscriptprovider.rb', line 275

def rename(url, dest_url)
  @sfa.move(url, dest_url)
end

#write_text(url, text = "") ⇒ Object



318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
# File 'lib/rubyscriptprovider.rb', line 318

def write_text(url, text="")
  file_url = url.to_s
  text_output = create_service("com.sun.star.io.TextOutputStream")
  if url.start_with?(DOC_PROTOCOL)
    pipe = create_service("com.sun.star.io.Pipe")
    text_output.setOutputStream(pipe)
    text_output.writeString(text)
    text_output.closeOutput
    @sfa.writeFile(file_url, pipe)
    pipe.closeInput
  else
    file_output = @sfa.openFileWrite(file_url)
    text_output.setOutputStream(file_output)
    text_output.writeString(text)
    text_output.flush()
    file_output.closeOutput
  end
end