glue 0.17.0 → 0.18.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,103 @@
1
+ require 'strscan'
2
+
3
+ module HTML#:nodoc:
4
+
5
+ # A simple HTML tokenizer. It simply breaks a stream of text into tokens, where each
6
+ # token is a string. Each string represents either "text", or an HTML element.
7
+ #
8
+ # This currently assumes valid XHTML, which means no free < or > characters.
9
+ #
10
+ # Usage:
11
+ #
12
+ # tokenizer = HTML::Tokenizer.new(text)
13
+ # while token = tokenizer.next
14
+ # p token
15
+ # end
16
+ class Tokenizer#:nodoc:
17
+
18
+ # The current (byte) position in the text
19
+ attr_reader :position
20
+
21
+ # The current line number
22
+ attr_reader :line
23
+
24
+ # Create a new Tokenizer for the given text.
25
+ def initialize(text)
26
+ @scanner = StringScanner.new(text)
27
+ @position = 0
28
+ @line = 0
29
+ @current_line = 1
30
+ end
31
+
32
+ # Return the next token in the sequence, or +nil+ if there are no more tokens in
33
+ # the stream.
34
+ def next
35
+ return nil if @scanner.eos?
36
+ @position = @scanner.pos
37
+ @line = @current_line
38
+ if @scanner.check(/<\S/)
39
+ update_current_line(scan_tag)
40
+ else
41
+ update_current_line(scan_text)
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ # Treat the text at the current position as a tag, and scan it. Supports
48
+ # comments, doctype tags, and regular tags, and ignores less-than and
49
+ # greater-than characters within quoted strings.
50
+ def scan_tag
51
+ tag = @scanner.getch
52
+ if @scanner.scan(/!--/) # comment
53
+ tag << @scanner.matched
54
+ tag << @scanner.scan_until(/--\s*>/)
55
+ elsif @scanner.scan(/!/) # doctype
56
+ tag << @scanner.matched
57
+ tag << consume_quoted_regions
58
+ else
59
+ tag << consume_quoted_regions
60
+ end
61
+ tag
62
+ end
63
+
64
+ # Scan all text up to the next < character and return it.
65
+ def scan_text
66
+ @scanner.getch + (@scanner.scan(/[^<]*/) || "")
67
+ end
68
+
69
+ # Counts the number of newlines in the text and updates the current line
70
+ # accordingly.
71
+ def update_current_line(text)
72
+ @current_line += text.scan(/\r\n|\r|\n/).length
73
+ text
74
+ end
75
+
76
+ # Skips over quoted strings, so that less-than and greater-than characters
77
+ # within the strings are ignored.
78
+ def consume_quoted_regions
79
+ text = ""
80
+ loop do
81
+ match = @scanner.scan_until(/['"<>]/) or break
82
+
83
+ delim = @scanner.matched
84
+ if delim == "<"
85
+ match = match.chop
86
+ @scanner.pos -= 1
87
+ end
88
+
89
+ text << match
90
+ break if delim == "<" || delim == ">"
91
+
92
+ # consume the conqued region
93
+ while match = @scanner.scan_until(/[\\#{delim}]/)
94
+ text << match
95
+ break if @scanner.matched == delim
96
+ text << @scanner.getch # skip the escaped character
97
+ end
98
+ end
99
+ text
100
+ end
101
+ end
102
+
103
+ end
@@ -0,0 +1,11 @@
1
+ module HTML#:nodoc:
2
+ module Version#:nodoc:
3
+
4
+ MAJOR = 0
5
+ MINOR = 5
6
+ TINY = 0
7
+
8
+ STRING = [ MAJOR, MINOR, TINY ].join(".")
9
+
10
+ end
11
+ end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.10
3
3
  specification_version: 1
4
4
  name: glue
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.17.0
7
- date: 2005-05-16
6
+ version: 0.18.0
7
+ date: 2005-06-01
8
8
  summary: Glue utilities
9
9
  require_paths:
10
10
  - lib
@@ -36,6 +36,7 @@ files:
36
36
  - doc/LICENSE
37
37
  - doc/AUTHORS
38
38
  - lib/glue
39
+ - lib/html
39
40
  - lib/glue.rb
40
41
  - lib/glue/logger.rb
41
42
  - lib/glue/array.rb
@@ -43,18 +44,20 @@ files:
43
44
  - lib/glue/flexob.rb
44
45
  - lib/glue/hash.rb
45
46
  - lib/glue/property.rb
46
- - lib/glue/inflector.rb
47
+ - lib/glue/sanitize.rb
47
48
  - lib/glue/number.rb
48
- - lib/glue/dynamic_include.rb
49
49
  - lib/glue/aspects.rb
50
50
  - lib/glue/misc.rb
51
51
  - lib/glue/time.rb
52
52
  - lib/glue/attribute.rb
53
- - lib/glue/cache.rb
54
53
  - lib/glue/string.rb
55
54
  - lib/glue/object.rb
56
55
  - lib/glue/mixins.rb
57
56
  - lib/glue/pool.rb
57
+ - lib/html/document.rb
58
+ - lib/html/node.rb
59
+ - lib/html/version.rb
60
+ - lib/html/tokenizer.rb
58
61
  - test/glue
59
62
  - test/glue/tc_strings.rb
60
63
  - test/glue/tc_validation.rb
@@ -63,33 +66,9 @@ files:
63
66
  - test/glue/tc_logger.rb
64
67
  - test/glue/tc_aspects.rb
65
68
  - test/glue/tc_property_type_checking.rb
66
- - test/glue/tc_cache.rb
67
69
  - test/glue/tc_hash.rb
68
70
  - test/glue/tc_attribute.rb
69
71
  - test/glue/tc_property.rb
70
- - vendor/extensions
71
- - vendor/binding_of_caller.rb
72
- - vendor/breakpoint.rb
73
- - vendor/blankslate.rb
74
- - vendor/README
75
- - vendor/breakpoint_client.rb
76
- - vendor/extensions/kernel.rb
77
- - vendor/extensions/array.rb
78
- - vendor/extensions/enumerable.rb
79
- - vendor/extensions/hash.rb
80
- - vendor/extensions/module.rb
81
- - vendor/extensions/numeric.rb
82
- - vendor/extensions/ostruct.rb
83
- - vendor/extensions/class.rb
84
- - vendor/extensions/symbol.rb
85
- - vendor/extensions/string.rb
86
- - vendor/extensions/object.rb
87
- - vendor/extensions/io.rb
88
- - vendor/extensions/all.rb
89
- - vendor/extensions/_base.rb
90
- - vendor/extensions/binding.rb
91
- - vendor/extensions/continuation.rb
92
- - vendor/extensions/_template.rb
93
72
  test_files: []
94
73
  rdoc_options:
95
74
  - "--main"
@@ -115,5 +94,5 @@ dependencies:
115
94
  -
116
95
  - ">="
117
96
  - !ruby/object:Gem::Version
118
- version: 0.7.1
97
+ version: 0.7.2
119
98
  version:
@@ -1,136 +0,0 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # * Anastasios Koutoumanos <ak@navel.gr>
3
-
4
- module Glue
5
-
6
- # A cache utilizing a simple LRU (Least Recently Used) policy.
7
- # The items managed by this cache must respond to the #key method.
8
- # Attempts to optimize reads rather than inserts!
9
- #
10
- # LRU semantics are enforced by inserting the items in a queue.
11
- # The lru item is always at the tail. Two special sentinels
12
- # (head, tail) are used to simplify (?) the code.
13
-
14
- class LRUCache < Hash
15
-
16
- # Mix this in your class to make LRU-managable.
17
-
18
- module Item
19
- attr_accessor :lru_key, :lru_prev, :lru_next
20
- end
21
-
22
- # head-tail sentinels
23
-
24
- class Sentinel; include Item; end
25
-
26
- # the maximum number of items in the cache.
27
-
28
- attr_accessor :max_items
29
-
30
- # the head sentinel
31
-
32
- attr :head
33
-
34
- # the tail sentinel, tail.prev points to the lru item.
35
-
36
- attr :tail
37
-
38
- def initialize(max_items)
39
- @max_items = max_items
40
- lru_clear()
41
- end
42
-
43
- # Lookup an item in the cache.
44
-
45
- def [](key)
46
- if item = super
47
- return lru_touch(item)
48
- end
49
- end
50
-
51
- # The inserted item is considered mru!
52
-
53
- def []=(key, item)
54
- item = super
55
- item.lru_key = key
56
- lru_insert(item)
57
- end
58
-
59
- # Delete an item from the cache.
60
-
61
- def delete(key)
62
- if item = super
63
- lru_delete(item)
64
- end
65
- end
66
-
67
- # Clear the cache.
68
-
69
- def clear
70
- super
71
- lru_clear()
72
- end
73
-
74
- # The first (mru) element in the cache.
75
-
76
- def first
77
- @head.lru_next
78
- end
79
-
80
- # The last (lru) element in the cache.
81
-
82
- def last
83
- @tail.lru_prev
84
- end
85
- alias_method :lru, :last
86
-
87
- private
88
-
89
- # Delete an item from the lru list.
90
-
91
- def lru_delete(item)
92
- lru_join(item.lru_prev, item.lru_next)
93
- return item
94
- end
95
-
96
- # Join two items in the lru list.
97
- # Return y to allow for chaining.
98
-
99
- def lru_join(x, y)
100
- x.lru_next = y
101
- y.lru_prev = x
102
- return y
103
- end
104
-
105
- # Append a child item to a parent item in the lru list
106
- # (Re)inserts the child in the list.
107
-
108
- def lru_append(parent, child)
109
- lru_join(child, parent.lru_next)
110
- lru_join(parent, child)
111
- end
112
-
113
- # Insert an item
114
-
115
- def lru_insert(item)
116
- delete(last.lru_key) if size() > @max_items
117
- lru_append(@head, item)
118
- end
119
-
120
- # Touch an item, make mru!
121
- # Returns the item.
122
-
123
- def lru_touch(item)
124
- lru_append(@head, lru_delete(item))
125
- end
126
-
127
- # Clear the lru.
128
-
129
- def lru_clear
130
- @head = Sentinel.new
131
- @tail = Sentinel.new
132
- lru_join(@head, @tail)
133
- end
134
- end
135
-
136
- end
@@ -1,45 +0,0 @@
1
- # = Dynamic include
2
- #
3
- # Allows you to include dyanamic mixins.
4
- #
5
- # === Example
6
- #
7
- # module Mixin
8
- # def self.append_dynamic_features(base, options)
9
- # base.class_eval %{
10
- # def hello
11
- # puts 'Hello from #{options[:name]}'
12
- # end
13
- # }
14
- # end
15
- # end
16
- #
17
- # class MyClass
18
- # include Mixin, :name => 'tml'
19
- # end
20
- #
21
- # m = MyClass.new
22
- # m.hello -> 'Hello from tml'
23
- #
24
- # * George Moschovitis <gm@navel.gr>
25
- # (c) 2004-2005 Navel, all rights reserved.
26
- # $Id: dynamic_include.rb 1 2005-04-11 11:04:30Z gmosx $
27
-
28
- class Module
29
-
30
- alias_method :__include_without_options__, :include
31
-
32
- def include(*args)
33
- options = args.last.is_a?(Hash) ? args.pop : {}
34
-
35
- for mod in args
36
- if mod.respond_to?(:append_dynamic_features)
37
- mod.append_dynamic_features(self, options)
38
- end
39
- end
40
-
41
- __include_without_options__(*args)
42
- end
43
- alias_method :dynamic_include, :include
44
-
45
- end
@@ -1,91 +0,0 @@
1
- # Code from RubyOnRails (http://www.rubyonrails.com)
2
- # Copyright (c) 2004-2005 David Heinemeier Hansson.
3
-
4
- module Glue
5
-
6
- # The Inflector transforms words from singular to plural,
7
- # class names to table names, modulized class names to ones without,
8
- # and class names to foreign keys.
9
-
10
- module Inflector
11
- extend self
12
-
13
- def pluralize(word)
14
- result = word.dup
15
- plural_rules.each do |(rule, replacement)|
16
- break if result.gsub!(rule, replacement)
17
- end
18
- return result
19
- end
20
-
21
- def singularize(word)
22
- result = word.dup
23
- singular_rules.each do |(rule, replacement)|
24
- break if result.gsub!(rule, replacement)
25
- end
26
- return result
27
- end
28
-
29
- def camelize(lower_case_and_underscored_word)
30
- lower_case_and_underscored_word.gsub(/(^|_)(.)/){$2.upcase}
31
- end
32
-
33
- def underscore(camel_cased_word)
34
- camel_cased_word.gsub(/([A-Z]+)([A-Z])/,'\1_\2').gsub(/([a-z])([A-Z])/,'\1_\2').downcase
35
- end
36
-
37
- def demodulize(class_name_in_module)
38
- class_name_in_module.gsub(/^.*::/, '')
39
- end
40
-
41
- def foreign_key(class_name, separate_class_name_and_id_with_underscore = true)
42
- Inflector.underscore(Inflector.demodulize(class_name)) +
43
- (separate_class_name_and_id_with_underscore ? "_id" : "id")
44
- end
45
-
46
- # Convert a class to a name.
47
-
48
- def name(klass)
49
- Inflector.underscore(Inflector.demodulize(klass.to_s))
50
- end
51
-
52
- # Convert a class to a name in plural
53
-
54
- def plural_name(klass)
55
- Inflector.pluralize(Inflector.underscore(Inflector.demodulize(klass.to_s)))
56
- end
57
-
58
- private
59
- def plural_rules #:doc:
60
- [
61
- [/(x|ch|ss)$/, '\1es'], # search, switch, fix, box, process, address
62
- [/([^aeiouy]|qu)y$/, '\1ies'], # query, ability, agency
63
- [/(?:([^f])fe|([lr])f)$/, '\1\2ves'], # half, safe, wife
64
- [/sis$/, 'ses'], # basis, diagnosis
65
- [/([ti])um$/, '\1a'], # datum, medium
66
- [/person$/, 'people'], # person, salesperson
67
- [/man$/, 'men'], # man, woman, spokesman
68
- [/child$/, 'children'], # child
69
- [/s$/, 's'], # no change (compatibility)
70
- [/$/, 's']
71
- ]
72
- end
73
-
74
- def singular_rules #:doc:
75
- [
76
- [/(x|ch|ss)es$/, '\1'],
77
- [/([^aeiouy]|qu)ies$/, '\1y'],
78
- [/([lr])ves$/, '\1f'],
79
- [/([^f])ves$/, '\1fe'],
80
- [/(analy|ba|diagno|parenthe|progno|synop|the)ses$/, '\1sis'],
81
- [/([ti])a$/, '\1um'],
82
- [/people$/, 'person'],
83
- [/men$/, 'man'],
84
- [/status$/, 'status'],
85
- [/children$/, 'child'],
86
- [/s$/, '']
87
- ]
88
- end
89
- end
90
-
91
- end