tag_formatter 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY.md ADDED
@@ -0,0 +1,13 @@
1
+ HISTORY
2
+ =======
3
+
4
+ 0.0.1.pre-1 - January 21, 2012
5
+ ------------------------------
6
+ * Initial prerelease commit
7
+
8
+ 0.0.1 - May 01, 2012
9
+ --------------------
10
+ * Full release commit
11
+ * Removed pre identifier
12
+ * Updated readme with new instructions
13
+ * Updating gemspec with proper repo url and description
data/README.md ADDED
@@ -0,0 +1,57 @@
1
+ Tag Formatter
2
+ =============
3
+ **Tag Formatter** (for a lack of a better name) is—of course—a basic templating system that takes in text input with "tags", and replaces those tags with text as defined by the programmer.
4
+
5
+ Installation
6
+ ------------
7
+
8
+ ### Installation via `gem`
9
+ gem install tag_formatter
10
+
11
+ ### Installation via GIT
12
+ git clone git://github.com/mseymour/tag_formatter.git
13
+ cd tag_formatter/
14
+ gem build tag_formatter.gemspec
15
+ gem install tag_formatter-0.0.1.pre1.gem
16
+
17
+ Usage
18
+ -----
19
+ Valid option symbols for configuring an instance of `TagFormatter`:
20
+
21
+ * `tags` (`Hash`)
22
+ * `tag_start` (`String`)
23
+ * `tag_end` (`String`)
24
+ * `inline_comment_delimiter` (`String`)
25
+ * `block_comment_start` (`String`)
26
+ * `block_comment_end` (`String`)
27
+
28
+ Formatting a block of text using the default options:
29
+
30
+ text = <<-HEREDOC
31
+ Hello, I am {firstname} {lastname}.
32
+ I like {something}. #Something can be anything.
33
+ /*I do not know about you,
34
+ but block comments are pretty rad.*/
35
+ HEREDOC
36
+
37
+ tf = TagFormatter.new text, tags: {firstname: "Mark", lastname: "Seymour", something: "listening to music"}
38
+
39
+ puts tf.parse! #=> Hello, I am Mark Seymour.\nI like listening to music.
40
+
41
+ Formatting a block of text using user-supplied options:
42
+
43
+ tf = TagFormatter.new "I like to %verb% it, %verb% it!", tags: {verb: "move"}, tag_start: '%', tag_end: '%'
44
+ puts tf.parse! #=> I like to move it, move it!
45
+
46
+ Contribute
47
+ ----------
48
+ Any and all issues should be reported via the Issues tab in Github.
49
+
50
+ Fixes, additions, patches, etc. are greatly welcome.
51
+
52
+ Author information
53
+ ------------------
54
+ * Mark Seymour ('Azure')
55
+ * Email: mark.seymour.ns@gmail.com
56
+ * WWW: http://lain.rustedlogic.net/
57
+ * IRC: #shakesoda @ irc.freenode.net
@@ -0,0 +1,81 @@
1
+ # coding: utf-8
2
+ # @author Mark Seymour
3
+
4
+ module TagFormatter
5
+ class Formatter
6
+ @@_known_params = [:tags, :tag_start, :tag_end, :inline_comment_delimiter, :block_comment_start, :block_comment_end]
7
+ attr_accessor :input
8
+ attr_accessor *@@_known_params
9
+
10
+ # Creates a new instance of TagFormatter::Formatter.
11
+ #
12
+ # @param [String, File] input The input; may be either a String or a File.
13
+ # @param [Hash] params The options for parsing the String or File.
14
+ # @option params [Hash] :tags ({}) Key+value pairs representing the tags and values associated with the tags.
15
+ # @option params [String] :tag_start ({) The character(s) denoting the beginning of a tag.
16
+ # @option params [String] :tag_end (}) The character(s) denoting the end of a tag.
17
+ # @option params [String] :inline_comment_delimiter (#) The character(s) denoting an inline comment
18
+ # @option params [String] :block_comment_start (/*) The character(s) denoting the beginning of a comment block.
19
+ # @option params [String] :block_comment_end (*/) The character(s) denoting the end of a comment block.
20
+ # @raise [TypeError] #input must be a String or File.
21
+ def initialize input, params={}
22
+ params = {
23
+ tags: {},
24
+ tag_start: '{',
25
+ tag_end: '}',
26
+ inline_comment_delimiter: '#',
27
+ block_comment_start: '/*',
28
+ block_comment_end: '*/'
29
+ }.merge(params)
30
+
31
+ # Assigning input to @input if string
32
+ @input = if input.is_a? String
33
+ input
34
+ # Reading input and assigning the resultant string to @input
35
+ elsif input.is_a? File
36
+ input.read.to_s
37
+ # Raise a TypeError.
38
+ else
39
+ raise TypeError, "input was an `#{input.class.name}', expected a `String' or `File'."
40
+ end
41
+ # Assign the param values to the (known) attributes.
42
+ @@_known_params.each do |attr|
43
+ self.send(attr.to_s + "=", params[attr])
44
+ end
45
+ end
46
+
47
+ # Parses the supplied input and returned a decommented, tagified, cleaned string.
48
+ #
49
+ # @return A string with the parsed input.
50
+ def parse!
51
+ tagify(decommentify(@input)).strip
52
+ end
53
+
54
+ private
55
+
56
+ # Decommentifies the supplied input.
57
+ #
58
+ # @param [String] input The string to decommentify.
59
+ # @return A string with the decommented input.
60
+ def decommentify input
61
+ output = input.dup
62
+ # Remove multiline comments:
63
+ output.gsub!(/(#{Regexp.quote @block_comment_start}.+?#{Regexp.quote @block_comment_end})/m, "")
64
+ # Remove inline comments:
65
+ output.gsub!(/(#{Regexp.quote @inline_comment_delimiter}.+$)/,"")
66
+ return output.lines.map(&:strip).join($/)
67
+ end
68
+
69
+ # Tagifies the supplied input.
70
+ #
71
+ # @param [String] input The string to tagify.
72
+ # @raise [StandardError] @tags must not be empty.
73
+ # @return A string with the tags replaced with their values.
74
+ def tagify input
75
+ output = input.dup
76
+ raise StandardError, "@tags is empty!" if @tags.empty? #improve on this
77
+ @tags.each {|key,value| output.gsub!(tag_start.to_s+key.to_s+tag_end.to_s, value.to_s)}
78
+ return output
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,30 @@
1
+ module TagFormatter
2
+ class Version
3
+
4
+ # @return [Integer]
5
+ def self.major
6
+ 0
7
+ end
8
+
9
+ # @return [Integer]
10
+ def self.minor
11
+ 0
12
+ end
13
+
14
+ # @return [Integer]
15
+ def self.patch
16
+ 1
17
+ end
18
+
19
+ # @return [String, NilClass]
20
+ def self.pre
21
+ nil
22
+ end
23
+
24
+ # @return [String]
25
+ def self.to_s
26
+ [major, minor, patch, pre].compact.join('.')
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,22 @@
1
+ require 'tag_formatter/formatter.rb'
2
+
3
+ module TagFormatter
4
+ class << self
5
+ # Alias for TagFormatter::Formatter.new
6
+ #
7
+ # @return [TagFormatter::Formatter]
8
+ def new(input, params={})
9
+ TagFormatter::Formatter.new(input, params)
10
+ end
11
+
12
+ # Delegate to TagFormatter::Formatter
13
+ def method_missing(method, *args, &block)
14
+ return super unless new.respond_to?(method)
15
+ new.send(method, *args, &block)
16
+ end
17
+
18
+ def respond_to?(method, include_private=false)
19
+ new.respond_to?(method, include_private) || super(method, include_private)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,45 @@
1
+ require 'test/unit'
2
+ require 'tag_formatter'
3
+
4
+ class TagFormatterTest < Test::Unit::TestCase
5
+
6
+ def test_default_parser
7
+ input = "\n\n{test} #inline comment\n{test}/*multiline\nblockcomment*/{test2}{test3}\n{test4}+{unknowntest}"
8
+ expected_output = "Hello, World!\nHello, World!Test 2...Test 3\nTest 4+{unknowntest}"
9
+ my_tags = {
10
+ test: "Hello, World!",
11
+ test2: "Test 2...",
12
+ test3: "Test 3",
13
+ test4: "Test 4",
14
+ unusedtest5: "Unused test 5"
15
+ }
16
+ options = {
17
+ tags: my_tags
18
+ }
19
+ assert_equal expected_output,
20
+ TagFormatter.new(input, options).parse!
21
+ end
22
+
23
+ def test_parser_with_options
24
+ input = "\n\n%test% \/\/inline comment\n%test%(=multiline\nblockcomment=)%test2%%test3%\n%test4%+%unknowntest%"
25
+ expected_output = "Hello, World!\nHello, World!Test 2...Test 3\nTest 4+%unknowntest%"
26
+ my_tags = {
27
+ test: "Hello, World!",
28
+ test2: "Test 2...",
29
+ test3: "Test 3",
30
+ test4: "Test 4",
31
+ unusedtest5: "Unused test 5"
32
+ }
33
+ options = {
34
+ tags: my_tags,
35
+ tag_start: '%',
36
+ tag_end: '%',
37
+ inline_comment_delimiter: '//',
38
+ block_comment_start: '(=',
39
+ block_comment_end: '=)'
40
+ }
41
+ assert_equal expected_output,
42
+ TagFormatter.new(input, options).parse!
43
+ end
44
+
45
+ end
metadata ADDED
@@ -0,0 +1,52 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tag_formatter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Mark Seymour
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-05-01 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: A simple file/string templating system.
15
+ email:
16
+ - mark.seymour.ns@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - README.md
22
+ - HISTORY.md
23
+ - lib/tag_formatter/formatter.rb
24
+ - lib/tag_formatter/version.rb
25
+ - lib/tag_formatter.rb
26
+ - test/test_tag_formatter.rb
27
+ homepage: https://github.com/mseymour/tag_formatter
28
+ licenses:
29
+ - MIT
30
+ post_install_message: Happy tagging!
31
+ rdoc_options: []
32
+ require_paths:
33
+ - lib
34
+ required_ruby_version: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: 1.9.2
40
+ required_rubygems_version: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ requirements: []
47
+ rubyforge_project:
48
+ rubygems_version: 1.8.16
49
+ signing_key:
50
+ specification_version: 3
51
+ summary: Tag Formatter
52
+ test_files: []