bwkfanboy 1.1.4 → 1.2.5

Sign up to get free protection for your applications and to get access to all the features.
data/bin/bwkfanboy CHANGED
@@ -18,6 +18,8 @@ require_relative '../lib/bwkfanboy/parser'
18
18
 
19
19
  $conf = {
20
20
  mode: 'fast',
21
+ skeleton_name: 'bwkfanboy_plugin_skeleton.rb',
22
+ skeleton: Bwkfanboy::Utils.gem_dir_system() + '/plugin_skeleton.erb',
21
23
  debug: false,
22
24
  banner: "Usage: #{File.basename($0)} [options] plugin-name"
23
25
  }
@@ -88,6 +90,10 @@ o = Bwkfanboy::Utils.cl_parse(ARGV, $conf[:banner]) # create OptionParser object
88
90
  o.on('-i', 'Show some info about the plugin') { |i| $conf[:mode] = 'info' }
89
91
  o.on('-l', 'List all plugins') { |i| $conf[:mode] = 'list' }
90
92
  o.on('-p', 'List all plugins paths') { |i| $conf[:mode] = 'path' }
93
+ o.on('-t FILE', 'Write to the FILE a skeleton for a plugin') { |i|
94
+ $conf[:mode] = 'template'
95
+ $conf[:skeleton_name] = i if i !~ /^\s*$/
96
+ }
91
97
  o.on('-O', '(ignore this) Execute all bwkfanboy_* utils in a pipe') { |i| $conf[:mode] = 'pipe' }
92
98
  o.on('-D', '(ignore this) Use URI_DEBUG const instead URI in plugins') { |i| $conf[:debug] = true }
93
99
  Bwkfanboy::Utils.cl_parse(ARGV, $conf[:banner], o) # run cl parser
@@ -96,6 +102,32 @@ plugin = Plugin.new(ARGV[0])
96
102
  opt = Bwkfanboy::Utils.plugin_opts(ARGV)
97
103
 
98
104
  case $conf[:mode]
105
+ when 'template'
106
+ require 'erb'
107
+ require 'digest/md5'
108
+
109
+ t = ERB.new(File.read($conf[:skeleton]))
110
+ t.filename = $conf[:skeleton] # to report errors relative to this file
111
+ begin
112
+ md5_system = Digest::MD5.hexdigest(t.result(binding))
113
+ rescue Exception
114
+ Bwkfanboy::Utils.errx(1, "cannot read the template: #{$!}")
115
+ end
116
+
117
+ if ! File.exists?($conf[:skeleton_name])
118
+ # write a skeleton
119
+ begin
120
+ File.open($conf[:skeleton_name], 'w+') { |fp| fp.puts t.result(binding) }
121
+ rescue
122
+ Bwkfanboy::Utils.errx(1, "cannot write the skeleton: #{$!}")
123
+ end
124
+ elsif
125
+ # warn a careless user
126
+ if md5_system != Digest::MD5.file($conf[:skeleton_name]).hexdigest
127
+ Bwkfanboy::Utils.errx(1, "#{$conf[:skeleton_name]} already exists")
128
+ end
129
+ end
130
+
99
131
  when 'list'
100
132
  plugin.dirs().each {|i|
101
133
  puts "#{i}:"
data/doc/NEWS.rdoc CHANGED
@@ -1,3 +1,9 @@
1
+ === 1.2.5
2
+
3
+ - Added '-t' CL option for bwkfanboy util.
4
+
5
+ - Updated quora plugin.
6
+
1
7
  === 1.1.4
2
8
 
3
9
  - INCOMPATIBILITY: from now on, all plugins must do NOT read the stdin
data/doc/plugin.rdoc CHANGED
@@ -38,6 +38,10 @@ Here is a skeleton of a plugin:
38
38
  end
39
39
  end
40
40
 
41
+ You can get the skeleton in the current directory by typing:
42
+
43
+ % bwkfanboy -t myplugin.rb
44
+
41
45
  As you see, we are using Nokogiri for HTML parsing. You are not
42
46
  required to use it too--take the parser whatever you like. Nokogiri
43
47
  is nice, because it's able to read a broken HTML and search thought
@@ -0,0 +1,30 @@
1
+ # This is a skeleton for a <%= Bwkfanboy::Meta::NAME %> <%= Bwkfanboy::Meta::VERSION %> plugin. To understand how
2
+ # plugins work please read doc/plugins.rdoc file from <%= Bwkfanboy::Meta::NAME %>'s
3
+ # distribution.
4
+
5
+ require 'nokogiri'
6
+
7
+ class Page < Bwkfanboy::Parse
8
+ module Meta
9
+ URI = 'http://example.org/news'
10
+ ENC = 'UTF-8'
11
+ VERSION = 1
12
+ COPYRIGHT = '(c) <%= DateTime.now.year %> <%= Etc.getpwuid(Process.euid)[:gecos] %>'
13
+ TITLE = "News from example.org"
14
+ CONTENT_TYPE = 'html'
15
+ end
16
+
17
+ def myparse(stream)
18
+ # read 'stream' IO object and parse it
19
+ doc = Nokogiri::HTML(stream, nil, Meta::ENC)
20
+ doc.xpath("XPATH QUERY").each {|i|
21
+ t = clean(i.xpath("XPATH QUERY").text())
22
+ l = clean(i.xpath("XPATH QUERY").text())
23
+ u = date(i.xpath("XPATH QUERY").text())
24
+ a = clean(i.xpath("XPATH QUERY").text())
25
+ c = clean(i.xpath("XPATH QUERY").text())
26
+
27
+ self << { title: t, link: l, updated: u, author: a, content: c }
28
+ }
29
+ end
30
+ end
@@ -86,6 +86,8 @@ function prepare4eval(body) {
86
86
  "function HeaderLogo(args) { return arr(arguments) }\n" +
87
87
  "function NavElement(args) { return arr(arguments) }\n" +
88
88
  "function UserFollowLink(args) { return arr(arguments) }\n" +
89
+ "function FlashClient(args) { return arr(arguments) }\n" +
90
+ "function AddQuestionLink(args) { return arr(arguments) }\n" +
89
91
  '';
90
92
  var tail = "\n_components;\n";
91
93
 
@@ -17,7 +17,7 @@ class Page < Bwkfanboy::Parse
17
17
  URI = 'http://www.quora.com/#{opt[0]}/answers'
18
18
  URI_DEBUG = '/home/alex/lib/software/alex/bwkfanboy/test/semis/quora.html'
19
19
  ENC = 'UTF-8'
20
- VERSION = 5
20
+ VERSION = 7
21
21
  COPYRIGHT = "See bwkfanboy's LICENSE file"
22
22
  TITLE = "Last n answers (per-user) from Quora; requires nodejs"
23
23
  CONTENT_TYPE = 'html'
@@ -7,7 +7,7 @@ require 'active_support/core_ext/module/attribute_accessors'
7
7
  module Bwkfanboy
8
8
  module Meta
9
9
  NAME = 'bwkfanboy'
10
- VERSION = '1.1.4'
10
+ VERSION = '1.2.5'
11
11
  USER_AGENT = "#{NAME}/#{VERSION} (#{RUBY_PLATFORM}; N; #{Encoding.default_external.name}; #{RUBY_ENGINE}; rv:#{RUBY_VERSION}.#{RUBY_PATCHLEVEL})"
12
12
  PLUGIN_CLASS = 'Page'
13
13
  DIR_TMP = "/tmp/#{Meta::NAME}/#{ENV['USER']}"