smklib 1.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/app/assets/images/add.png +0 -0
- data/app/assets/images/button_cancel.png +0 -0
- data/app/assets/images/button_ok.png +0 -0
- data/app/assets/images/cmseditor/16x16/text_block.png +0 -0
- data/app/assets/images/cmseditor/16x16/text_bold.png +0 -0
- data/app/assets/images/cmseditor/16x16/text_center.png +0 -0
- data/app/assets/images/cmseditor/16x16/text_italic.png +0 -0
- data/app/assets/images/cmseditor/16x16/text_left.png +0 -0
- data/app/assets/images/cmseditor/16x16/text_right.png +0 -0
- data/app/assets/images/cmseditor/16x16/text_strike.png +0 -0
- data/app/assets/images/cmseditor/16x16/text_sub.png +0 -0
- data/app/assets/images/cmseditor/16x16/text_super.png +0 -0
- data/app/assets/images/cmseditor/16x16/text_under.png +0 -0
- data/app/assets/images/cmseditor/22x22/text_block.png +0 -0
- data/app/assets/images/cmseditor/22x22/text_bold.png +0 -0
- data/app/assets/images/cmseditor/22x22/text_center.png +0 -0
- data/app/assets/images/cmseditor/22x22/text_italic.png +0 -0
- data/app/assets/images/cmseditor/22x22/text_left.png +0 -0
- data/app/assets/images/cmseditor/22x22/text_right.png +0 -0
- data/app/assets/images/cmseditor/22x22/text_strike.png +0 -0
- data/app/assets/images/cmseditor/22x22/text_sub.png +0 -0
- data/app/assets/images/cmseditor/22x22/text_super.png +0 -0
- data/app/assets/images/cmseditor/22x22/text_under.png +0 -0
- data/app/assets/images/trashcan_empty.png +0 -0
- data/app/assets/javascripts/collapsable.js +56 -0
- data/app/assets/javascripts/hide_show.js +39 -0
- data/app/assets/javascripts/jscalendar-1.0/calendar-setup.js +200 -0
- data/app/assets/javascripts/jscalendar-1.0/calendar.js +1806 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-af.js +39 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-al.js +101 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-bg.js +124 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-big5-utf8.js +123 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-big5.js +123 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-br.js +108 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-ca.js +123 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-cs-utf8.js +65 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-cs-win.js +65 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-da.js +123 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-de.js +124 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-du.js +45 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-el.js +89 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-en.js +127 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-es.js +129 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-fi.js +98 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-fr.js +125 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-he-utf8.js +123 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-hr-utf8.js +49 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-hr.js +0 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-hu.js +124 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-it.js +124 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-jp.js +45 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-ko-utf8.js +120 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-ko.js +120 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-lt-utf8.js +114 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-lt.js +114 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-lv.js +123 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-nl.js +73 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-no.js +114 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-pl-utf8.js +93 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-pl.js +56 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-pt.js +123 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-ro.js +66 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-ru.js +123 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-ru_win_.js +123 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-si.js +94 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-sk.js +99 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-sp.js +110 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-sv.js +93 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-tr.js +58 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/calendar-zh.js +119 -0
- data/app/assets/javascripts/jscalendar-1.0/lang/cn_utf8.js +123 -0
- data/app/assets/stylesheets/jscalendar-1.0/skins/aqua/active-bg.gif +0 -0
- data/app/assets/stylesheets/jscalendar-1.0/skins/aqua/dark-bg.gif +0 -0
- data/app/assets/stylesheets/jscalendar-1.0/skins/aqua/hover-bg.gif +0 -0
- data/app/assets/stylesheets/jscalendar-1.0/skins/aqua/menuarrow.gif +0 -0
- data/app/assets/stylesheets/jscalendar-1.0/skins/aqua/normal-bg.gif +0 -0
- data/app/assets/stylesheets/jscalendar-1.0/skins/aqua/rowhover-bg.gif +0 -0
- data/app/assets/stylesheets/jscalendar-1.0/skins/aqua/status-bg.gif +0 -0
- data/app/assets/stylesheets/jscalendar-1.0/skins/aqua/theme.css +236 -0
- data/app/assets/stylesheets/jscalendar-1.0/skins/aqua/title-bg.gif +0 -0
- data/app/assets/stylesheets/jscalendar-1.0/skins/aqua/today-bg.gif +0 -0
- data/app/views/error_mailer/snapshot.rhtml +71 -0
- data/lib/smklib.rb +6 -0
- data/lib/smklib/array_ext.rb +76 -0
- data/lib/smklib/browsers.rb +69 -0
- data/lib/smklib/builder_ext.rb +103 -0
- data/lib/smklib/date_ext.rb +23 -0
- data/lib/smklib/debug_support.rb +27 -0
- data/lib/smklib/error_mailer.rb +70 -0
- data/lib/smklib/hash_ext.rb +19 -0
- data/lib/smklib/htmlutils.rb +604 -0
- data/lib/smklib/movable_children.rb +28 -0
- data/lib/smklib/object_ext.rb +34 -0
- data/lib/smklib/php_serialize.rb +309 -0
- data/lib/smklib/railtie.rb +6 -0
- data/lib/smklib/somekool_scaffold.rb +198 -0
- data/lib/smklib/super_looking_list.rb +63 -0
- data/lib/smklib/version.rb +11 -0
- data/vendor/calendar_helper.rb +100 -0
- data/vendor/htmltokenizer.rb +259 -0
- metadata +158 -0
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'smklib/builder_ext'
|
2
|
+
|
3
|
+
class SuperLookingList
|
4
|
+
|
5
|
+
attr_accessor :model, :list, :columns, :speed, :table_width, :options
|
6
|
+
|
7
|
+
def initialize(model, list, columns, speed, table_width, options = {})
|
8
|
+
@model, @list, @columns, @speed, @table_width, @options = model, list, columns, speed, table_width, options
|
9
|
+
end
|
10
|
+
|
11
|
+
def format_column(item, column)
|
12
|
+
c = column[:field]
|
13
|
+
val = item.send(c)
|
14
|
+
if column[:format]
|
15
|
+
val = column[:format].call(item, c)
|
16
|
+
else
|
17
|
+
if item.respond_to? :format_for_display
|
18
|
+
STDERR.puts "Warning: {model}::format_for_display is deprecated (#{item.to_s})"
|
19
|
+
val = item.format_for_display(c)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
val = "n/a" if val.to_s.empty?
|
23
|
+
return val.to_s
|
24
|
+
end
|
25
|
+
|
26
|
+
def render(xml = nil, &block)
|
27
|
+
xml ||= Builder::XmlMarkup.new(:indent => 2)
|
28
|
+
xml.div do
|
29
|
+
xml.tight_table("border" => "1", "width" => table_width.to_s, "cellpadding" => "2", "class" => "SuperTableList #{@model.capitalize}") do
|
30
|
+
xml.tr do
|
31
|
+
columns.each { |c|
|
32
|
+
xml.th {
|
33
|
+
if options[:header_format]
|
34
|
+
options[:header_format].call(xml, c)
|
35
|
+
else
|
36
|
+
xml << c[:label]
|
37
|
+
end
|
38
|
+
}
|
39
|
+
}
|
40
|
+
end
|
41
|
+
idx = 0
|
42
|
+
for item in list
|
43
|
+
style = ((idx % 2 == 0) ? "even" : "odd") + " type_#{item.class}"
|
44
|
+
xml.tr("id" => "#{model}_row_#{idx}", "onclick" => "proceed_on_click(this, #{speed})", "onmouseover" => "show_details(this);", "class" => style, "onmouseout" => "hide_last_shown(this);") do
|
45
|
+
columns.each do |col|
|
46
|
+
xml.td("class" => "field_#{col[:field]}") { xml << format_column(item, col) }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
xml.tr("class" => "current", "id" => "#{model}_row_#{idx}_details", "style" => "display: none;") do
|
50
|
+
xml.td("colspan" => columns.size) do
|
51
|
+
xml.div("style" => "overflow: auto;", "id" => "#{model}_row_#{idx}_block_details") do
|
52
|
+
yield(xml, item)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
idx += 1
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# CalendarHelper allows you to draw a databound calendar with fine-grained CSS formatting
|
2
|
+
# Copyright (C) 2005 Jeremy Voorhis, Shachaf Ben-Kiki
|
3
|
+
#
|
4
|
+
# This library is free software; you can redistribute it and/or
|
5
|
+
# modify it under the terms of the GNU Lesser General Public
|
6
|
+
# License as published by the Free Software Foundation; either
|
7
|
+
# version 2.1 of the License, or (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This library is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
12
|
+
# Lesser General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU Lesser General Public
|
15
|
+
# License along with this library; if not, write to the Free Software
|
16
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
17
|
+
|
18
|
+
module CalendarHelper
|
19
|
+
# Returns an HTML calendar. In its simplest form, this method generates a plain
|
20
|
+
# calendar (which can then be customized using CSS) for a given month and year.
|
21
|
+
# However, this may be customized in a variety of ways -- changing the default CSS
|
22
|
+
# classes, generating the individual day entries yourself, and so on.
|
23
|
+
#
|
24
|
+
# The following options are required:
|
25
|
+
# :year # The year number to show the calendar for.
|
26
|
+
# :month # The month number to show the calendar for.
|
27
|
+
#
|
28
|
+
# The following are optional, available for customizing the default behaviour:
|
29
|
+
# :table_class => "calendar" # The class for the <table> tag.
|
30
|
+
# :month_name_class => "monthName" # The class for the name of the month, at the top of the table.
|
31
|
+
# :other_month_class => "otherMonthClass" # Not implemented yet.
|
32
|
+
# :day_name_class => "dayName" # The class is for the names of the weekdays, at the top.
|
33
|
+
# :day_class => "day" # The class for the individual day number cells.
|
34
|
+
# This may or may not be used if you specify a block (see below).
|
35
|
+
# :abbrev => (0..2) # This option specifies how the day names should be abbreviated.
|
36
|
+
# Use (0..2) for the first three letters, (0..0) for the first, and
|
37
|
+
# (0..-1) for the entire name.
|
38
|
+
#
|
39
|
+
# For more customization, you can pass a code block to this method, that will get one argument, a Date object,
|
40
|
+
# and return a values for the individual table cells. The block can return an array, [cell_text, cell_attrs],
|
41
|
+
# cell_text being the text that is displayed and cell_attrs a hash containing the attributes for the <td> tag
|
42
|
+
# (this can be used to change the <td>'s class for customization with CSS).
|
43
|
+
# This block can also return the cell_text only, in which case the <td>'s class defaults to the value given in
|
44
|
+
# +:day_class+. If the block returns nil, the default options are used.
|
45
|
+
#
|
46
|
+
# Example usage:
|
47
|
+
# calendar(:year => 2005, :month => 6) # This generates the simplest possible calendar.
|
48
|
+
# calendar({:year => 2005, :month => 6, :table_class => "calendar_helper"}) # This generates a calendar, as
|
49
|
+
# # before, but the <table>'s class
|
50
|
+
# # is set to "calendar_helper".
|
51
|
+
# calendar(:year => 2005, :month => 6, :abbrev => (0..-1)) # This generates a simple calendar but shows the
|
52
|
+
# # entire day name ("Sunday", "Monday", etc.) instead
|
53
|
+
# # of only the first three letters.
|
54
|
+
# calendar(:year => 2005, :month => 5) do |d| # This generates a simple calendar, but gives special days
|
55
|
+
# if listOfSpecialDays.include?(d) # (days that are in the array listOfSpecialDays) one CSS class,
|
56
|
+
# [d.mday, {:class => "specialDay"}] # "specialDay", and gives the rest of the days another CSS class,
|
57
|
+
# else # "normalDay". You can also use this highlight today differently
|
58
|
+
# [d.mday, {:class => "normalDay"}] # from the rest of the days, etc.
|
59
|
+
# end
|
60
|
+
def calendar(options = {}, &block)
|
61
|
+
raise ArgumentError, "No year given" unless defined? options[:year]
|
62
|
+
raise ArgumentError, "No month given" unless defined? options[:month]
|
63
|
+
|
64
|
+
block ||= Proc.new {|d| nil}
|
65
|
+
options[:table_class ] ||= "calendar"
|
66
|
+
options[:month_name_class ] ||= "monthName"
|
67
|
+
options[:other_month_class ] ||= "otherMonth"
|
68
|
+
options[:day_name_class ] ||= "dayName"
|
69
|
+
options[:day_class ] ||= "day"
|
70
|
+
options[:abbrev ] ||= (0..2)
|
71
|
+
|
72
|
+
first = Date.civil(options[:year], options[:month], 1)
|
73
|
+
last = Date.civil(options[:year], options[:month], -1)
|
74
|
+
|
75
|
+
cal = <<EOF
|
76
|
+
<table class="#{options[:table_class]}">
|
77
|
+
<thead>
|
78
|
+
<tr class="#{options[:month_name_class]}">
|
79
|
+
<th colspan="7">#{Date::MONTHNAMES[options[:month]]}</th>
|
80
|
+
</tr>
|
81
|
+
<tr class="#{options[:day_name_class]}">
|
82
|
+
EOF
|
83
|
+
Date::DAYNAMES.each {|d| cal << " <th>#{d[options[:abbrev]]}</th>"}
|
84
|
+
cal << " </tr>
|
85
|
+
</thead>
|
86
|
+
<tbody>
|
87
|
+
<tr>"
|
88
|
+
0.upto(first.wday - 1) {|d| cal << " <td class='#{options[:other_month_class]}'></td>"} unless first.wday == 0
|
89
|
+
first.upto(last) do |cur|
|
90
|
+
cell_text, cell_attrs = block.call(cur)
|
91
|
+
cell_text ||= cur.mday
|
92
|
+
cell_attrs ||= {:class => options[:day_class]}
|
93
|
+
cell_attrs = cell_attrs.map {|k, v| "#{k}='#{v}'"}.join(' ')
|
94
|
+
cal << " <td #{cell_attrs}>#{cell_text}</td>"
|
95
|
+
cal << " </tr>\n <tr>" if cur.wday == 6
|
96
|
+
end
|
97
|
+
last.wday.upto(5) {|d| cal << " <td class='#{options[:other_month_class]}'></td>"} unless last.wday == 6
|
98
|
+
cal << " </tr>\n </tbody>\n</table>"
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,259 @@
|
|
1
|
+
# Copyright (C) 2003 Ben Giddings
|
2
|
+
#
|
3
|
+
# Author Ben Giddings
|
4
|
+
#
|
5
|
+
# This file may be used under the same license as Ruby
|
6
|
+
#
|
7
|
+
# Description:
|
8
|
+
# This is a partial port of the functionality behind Perl's TokeParser
|
9
|
+
# Provided a page it progressively returns tokens from that page
|
10
|
+
|
11
|
+
# $Id: htmltokenizer.rb,v 1.3 2004/03/04 21:28:16 merc Exp $
|
12
|
+
class HTMLTokenizer
|
13
|
+
attr_reader :page
|
14
|
+
def initialize(content)
|
15
|
+
@page = content
|
16
|
+
@cur_pos = 0
|
17
|
+
end
|
18
|
+
|
19
|
+
def reset
|
20
|
+
@cur_pos = 0
|
21
|
+
end
|
22
|
+
|
23
|
+
def peekNextToken
|
24
|
+
if @cur_pos == @page.length then return nil end
|
25
|
+
|
26
|
+
if ?< == @page[@cur_pos]
|
27
|
+
# Next token is a tag of some kind
|
28
|
+
if '!--' == @page[(@cur_pos + 1), 3]
|
29
|
+
# Token is a comment
|
30
|
+
tag_end = @page.index('-->', (@cur_pos + 1))
|
31
|
+
if tag_end.nil?
|
32
|
+
raise "No end found to started comment:\n#{@page[@cur_pos,80]}"
|
33
|
+
end
|
34
|
+
# p @page[@cur_pos .. (tag_end+2)]
|
35
|
+
HTMLComment.new(@page[@cur_pos .. (tag_end + 2)])
|
36
|
+
else
|
37
|
+
# Token is a html tag
|
38
|
+
tag_end = @page.index('>', (@cur_pos + 1))
|
39
|
+
if tag_end.nil?
|
40
|
+
raise "No end found to started tag:\n#{@page[@cur_pos,80]}"
|
41
|
+
end
|
42
|
+
# p @page[@cur_pos .. tag_end]
|
43
|
+
HTMLTag.new(@page[@cur_pos .. tag_end])
|
44
|
+
end
|
45
|
+
else
|
46
|
+
# Next token is text
|
47
|
+
text_end = @page.index('<', @cur_pos)
|
48
|
+
text_end = text_end.nil? ? -1 : (text_end - 1)
|
49
|
+
# p @page[@cur_pos .. text_end]
|
50
|
+
HTMLText.new(@page[@cur_pos .. text_end])
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def getNextToken
|
55
|
+
token = peekNextToken
|
56
|
+
if token
|
57
|
+
# @page = @page[token.raw.length .. -1]
|
58
|
+
# @page.slice!(0, token.raw.length)
|
59
|
+
@cur_pos += token.raw.length
|
60
|
+
end
|
61
|
+
#p token
|
62
|
+
#print token.raw
|
63
|
+
return token
|
64
|
+
end
|
65
|
+
|
66
|
+
def getTag(*sought_tags)
|
67
|
+
sought_tags.collect! {|elm| elm.downcase}
|
68
|
+
|
69
|
+
while (tag = getNextToken)
|
70
|
+
if tag.kind_of?(HTMLTag) and
|
71
|
+
(0 == sought_tags.length or sought_tags.include?(tag.tag_name))
|
72
|
+
break
|
73
|
+
end
|
74
|
+
end
|
75
|
+
tag
|
76
|
+
end
|
77
|
+
|
78
|
+
def getText(until_tag = nil)
|
79
|
+
if until_tag.nil?
|
80
|
+
if ?< == @page[@cur_pos]
|
81
|
+
# Next token is a tag, not text
|
82
|
+
""
|
83
|
+
else
|
84
|
+
# Next token is text
|
85
|
+
getNextToken.text
|
86
|
+
end
|
87
|
+
else
|
88
|
+
ret_str = ""
|
89
|
+
|
90
|
+
while (tag = peekNextToken)
|
91
|
+
if tag.kind_of?(HTMLTag) and tag.tag_name == until_tag
|
92
|
+
break
|
93
|
+
end
|
94
|
+
|
95
|
+
if ("" != tag.text)
|
96
|
+
ret_str << (tag.text + " ")
|
97
|
+
end
|
98
|
+
getNextToken
|
99
|
+
end
|
100
|
+
|
101
|
+
ret_str
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def getTrimmedText(until_tag = nil)
|
106
|
+
getText(until_tag).strip.gsub(/\s+/m, " ")
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
class HTMLToken
|
112
|
+
attr_accessor :raw
|
113
|
+
def initialize(text)
|
114
|
+
@raw = text
|
115
|
+
end
|
116
|
+
|
117
|
+
def to_s
|
118
|
+
raw
|
119
|
+
end
|
120
|
+
|
121
|
+
def text
|
122
|
+
# By default tokens have no text representation
|
123
|
+
""
|
124
|
+
end
|
125
|
+
|
126
|
+
def trimmed_text
|
127
|
+
text.strip.gsub(/\s+/m, " ")
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
class HTMLText < HTMLToken
|
132
|
+
def text
|
133
|
+
raw
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
class HTMLComment < HTMLToken
|
138
|
+
attr_accessor :contents
|
139
|
+
def initialize(text)
|
140
|
+
super(text)
|
141
|
+
temp_arr = text.scan(/^<!--\s*(.*?)\s*-->$/m)
|
142
|
+
if temp_arr[0].nil?
|
143
|
+
raise "Text passed to HTMLComment.initialize is not a comment"
|
144
|
+
end
|
145
|
+
|
146
|
+
@contents = temp_arr[0][0]
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
class HTMLTag < HTMLToken
|
151
|
+
attr_reader :end_tag, :tag_name
|
152
|
+
def initialize(text)
|
153
|
+
super(text)
|
154
|
+
if ?< != text[0] or ?> != text[-1]
|
155
|
+
raise "Text passed to HTMLComment.initialize is not a comment"
|
156
|
+
end
|
157
|
+
|
158
|
+
@attr_hash = Hash.new
|
159
|
+
@raw = text
|
160
|
+
|
161
|
+
tag_name = text.scan(/[\w:]+/)[0]
|
162
|
+
if tag_name.nil?
|
163
|
+
raise "Error, tag is nil: #{tag_name}"
|
164
|
+
end
|
165
|
+
|
166
|
+
if ?/ == text[1]
|
167
|
+
# It's an end tag
|
168
|
+
@end_tag = true
|
169
|
+
@tag_name = '/' + tag_name.downcase
|
170
|
+
else
|
171
|
+
@end_tag = false
|
172
|
+
@tag_name = tag_name.downcase
|
173
|
+
end
|
174
|
+
|
175
|
+
@hashed = false
|
176
|
+
end
|
177
|
+
|
178
|
+
def attr_hash
|
179
|
+
# Lazy initialize == don't build the hash until it's needed
|
180
|
+
if !@hashed
|
181
|
+
if !@end_tag
|
182
|
+
# Get the attributes
|
183
|
+
attr_arr = @raw.scan(/<[\w:]+\s+(.*)>/m)[0]
|
184
|
+
if attr_arr.kind_of?(Array)
|
185
|
+
# Attributes found, parse them
|
186
|
+
attrs = attr_arr[0]
|
187
|
+
attr_arr = attrs.scan(/\s*([\w:]+)(?:\s*=\s*("[^"]*"|'[^']*'|([^"'][^\s>]+)))?/m)
|
188
|
+
# clean up the array by:
|
189
|
+
# * setting all nil elements to true
|
190
|
+
# * removing enclosing quotes
|
191
|
+
attr_arr.each {
|
192
|
+
|item|
|
193
|
+
val = if item[1].nil?
|
194
|
+
true
|
195
|
+
elsif '"'[0] == item[1][0] or '\''[0] == item[1][0]
|
196
|
+
item[1][1 .. -2]
|
197
|
+
else
|
198
|
+
item[1]
|
199
|
+
end
|
200
|
+
@attr_hash[item[0].downcase] = val
|
201
|
+
}
|
202
|
+
end
|
203
|
+
end
|
204
|
+
@hashed = true
|
205
|
+
end
|
206
|
+
|
207
|
+
#p self
|
208
|
+
|
209
|
+
@attr_hash
|
210
|
+
end
|
211
|
+
|
212
|
+
def text
|
213
|
+
if !end_tag
|
214
|
+
case tag_name
|
215
|
+
when 'img'
|
216
|
+
if !attr_hash['alt'].nil?
|
217
|
+
return attr_hash['alt']
|
218
|
+
end
|
219
|
+
when 'applet'
|
220
|
+
if !attr_hash['alt'].nil?
|
221
|
+
return attr_hash['alt']
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
return ''
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
if $0 == __FILE__
|
230
|
+
page = "<HTML>
|
231
|
+
<HEAD>
|
232
|
+
<TITLE>This is the title</TITLE>
|
233
|
+
</HEAD>
|
234
|
+
<!-- Here comes the <a href=\"missing.link\">blah</a>
|
235
|
+
body
|
236
|
+
-->
|
237
|
+
<BODY>
|
238
|
+
<H1>This is the header</H1>
|
239
|
+
<P>
|
240
|
+
This is the paragraph, it contains
|
241
|
+
<a href=\"link.html\">links</a>,
|
242
|
+
<img src=\"blah.gif\" optional alt='images
|
243
|
+
are
|
244
|
+
really cool'>. Ok, here is some more text and
|
245
|
+
<A href=\"http://another.link.com/\">another link</A>.
|
246
|
+
</P>
|
247
|
+
</body>
|
248
|
+
</HTML>
|
249
|
+
"
|
250
|
+
toke = HTMLTokenizer.new(page)
|
251
|
+
p toke.getTag("IMG", "A")
|
252
|
+
p toke.getTrimmedText
|
253
|
+
#p toke.getTrimmedText("/P")
|
254
|
+
#while (t = toke.getNextToken)
|
255
|
+
# p t
|
256
|
+
# print t.trimmed_text + " "
|
257
|
+
#end
|
258
|
+
#p toke.page
|
259
|
+
end
|
metadata
ADDED
@@ -0,0 +1,158 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: smklib
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.6
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mathieu Jobin
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-12-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: railties
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description:
|
28
|
+
email:
|
29
|
+
- mathieu@justbudget.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- app/assets/images/add.png
|
35
|
+
- app/assets/images/button_cancel.png
|
36
|
+
- app/assets/images/button_ok.png
|
37
|
+
- app/assets/images/cmseditor/16x16/text_block.png
|
38
|
+
- app/assets/images/cmseditor/16x16/text_bold.png
|
39
|
+
- app/assets/images/cmseditor/16x16/text_center.png
|
40
|
+
- app/assets/images/cmseditor/16x16/text_italic.png
|
41
|
+
- app/assets/images/cmseditor/16x16/text_left.png
|
42
|
+
- app/assets/images/cmseditor/16x16/text_right.png
|
43
|
+
- app/assets/images/cmseditor/16x16/text_strike.png
|
44
|
+
- app/assets/images/cmseditor/16x16/text_sub.png
|
45
|
+
- app/assets/images/cmseditor/16x16/text_super.png
|
46
|
+
- app/assets/images/cmseditor/16x16/text_under.png
|
47
|
+
- app/assets/images/cmseditor/22x22/text_block.png
|
48
|
+
- app/assets/images/cmseditor/22x22/text_bold.png
|
49
|
+
- app/assets/images/cmseditor/22x22/text_center.png
|
50
|
+
- app/assets/images/cmseditor/22x22/text_italic.png
|
51
|
+
- app/assets/images/cmseditor/22x22/text_left.png
|
52
|
+
- app/assets/images/cmseditor/22x22/text_right.png
|
53
|
+
- app/assets/images/cmseditor/22x22/text_strike.png
|
54
|
+
- app/assets/images/cmseditor/22x22/text_sub.png
|
55
|
+
- app/assets/images/cmseditor/22x22/text_super.png
|
56
|
+
- app/assets/images/cmseditor/22x22/text_under.png
|
57
|
+
- app/assets/images/trashcan_empty.png
|
58
|
+
- app/assets/javascripts/collapsable.js
|
59
|
+
- app/assets/javascripts/hide_show.js
|
60
|
+
- app/assets/javascripts/jscalendar-1.0/calendar-setup.js
|
61
|
+
- app/assets/javascripts/jscalendar-1.0/calendar.js
|
62
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-af.js
|
63
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-al.js
|
64
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-bg.js
|
65
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-big5-utf8.js
|
66
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-big5.js
|
67
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-br.js
|
68
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-ca.js
|
69
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-cs-utf8.js
|
70
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-cs-win.js
|
71
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-da.js
|
72
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-de.js
|
73
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-du.js
|
74
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-el.js
|
75
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-en.js
|
76
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-es.js
|
77
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-fi.js
|
78
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-fr.js
|
79
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-he-utf8.js
|
80
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-hr-utf8.js
|
81
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-hr.js
|
82
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-hu.js
|
83
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-it.js
|
84
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-jp.js
|
85
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-ko-utf8.js
|
86
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-ko.js
|
87
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-lt-utf8.js
|
88
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-lt.js
|
89
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-lv.js
|
90
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-nl.js
|
91
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-no.js
|
92
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-pl-utf8.js
|
93
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-pl.js
|
94
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-pt.js
|
95
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-ro.js
|
96
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-ru.js
|
97
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-ru_win_.js
|
98
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-si.js
|
99
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-sk.js
|
100
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-sp.js
|
101
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-sv.js
|
102
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-tr.js
|
103
|
+
- app/assets/javascripts/jscalendar-1.0/lang/calendar-zh.js
|
104
|
+
- app/assets/javascripts/jscalendar-1.0/lang/cn_utf8.js
|
105
|
+
- app/assets/stylesheets/jscalendar-1.0/skins/aqua/active-bg.gif
|
106
|
+
- app/assets/stylesheets/jscalendar-1.0/skins/aqua/dark-bg.gif
|
107
|
+
- app/assets/stylesheets/jscalendar-1.0/skins/aqua/hover-bg.gif
|
108
|
+
- app/assets/stylesheets/jscalendar-1.0/skins/aqua/menuarrow.gif
|
109
|
+
- app/assets/stylesheets/jscalendar-1.0/skins/aqua/normal-bg.gif
|
110
|
+
- app/assets/stylesheets/jscalendar-1.0/skins/aqua/rowhover-bg.gif
|
111
|
+
- app/assets/stylesheets/jscalendar-1.0/skins/aqua/status-bg.gif
|
112
|
+
- app/assets/stylesheets/jscalendar-1.0/skins/aqua/theme.css
|
113
|
+
- app/assets/stylesheets/jscalendar-1.0/skins/aqua/title-bg.gif
|
114
|
+
- app/assets/stylesheets/jscalendar-1.0/skins/aqua/today-bg.gif
|
115
|
+
- app/views/error_mailer/snapshot.rhtml
|
116
|
+
- lib/smklib.rb
|
117
|
+
- lib/smklib/array_ext.rb
|
118
|
+
- lib/smklib/browsers.rb
|
119
|
+
- lib/smklib/builder_ext.rb
|
120
|
+
- lib/smklib/date_ext.rb
|
121
|
+
- lib/smklib/debug_support.rb
|
122
|
+
- lib/smklib/error_mailer.rb
|
123
|
+
- lib/smklib/hash_ext.rb
|
124
|
+
- lib/smklib/htmlutils.rb
|
125
|
+
- lib/smklib/movable_children.rb
|
126
|
+
- lib/smklib/object_ext.rb
|
127
|
+
- lib/smklib/php_serialize.rb
|
128
|
+
- lib/smklib/railtie.rb
|
129
|
+
- lib/smklib/somekool_scaffold.rb
|
130
|
+
- lib/smklib/super_looking_list.rb
|
131
|
+
- lib/smklib/version.rb
|
132
|
+
- vendor/calendar_helper.rb
|
133
|
+
- vendor/htmltokenizer.rb
|
134
|
+
homepage: https://bitbucket.org/somekool/smklib
|
135
|
+
licenses: []
|
136
|
+
metadata: {}
|
137
|
+
post_install_message:
|
138
|
+
rdoc_options: []
|
139
|
+
require_paths:
|
140
|
+
- lib
|
141
|
+
- vendor
|
142
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - ">="
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '0'
|
147
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - ">="
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
requirements: []
|
153
|
+
rubyforge_project:
|
154
|
+
rubygems_version: 2.7.8
|
155
|
+
signing_key:
|
156
|
+
specification_version: 4
|
157
|
+
summary: smklib is somekool's ruby library...
|
158
|
+
test_files: []
|