md_inc 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in md_inc.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 TODO: Write your name
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,76 @@
1
+ # MdInc
2
+
3
+ MdInc is a text utility that allows you to suck text from one file into another.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'md_inc'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install md_inc
18
+
19
+ ## Usage
20
+
21
+ MdInc is a simple text inclusion filter intended for use
22
+ with markdown and similar text formatting utilities.
23
+ MdInc provides simple 'include this other file' kind
24
+ of processing. Using md_inc is straight forwark: Just require
25
+ it in and use the process method:
26
+
27
+ require 'md_inc'
28
+
29
+ v = MdInc::TextProcessor.new
30
+ output = v.process 'The quick brown fox'
31
+
32
+ In the simple case like the one above, md_inc simply
33
+ returns the text unchanged. The interesting bit is
34
+ when your input text includes commands that md_inc
35
+ recognizes. MdInc commands all start with a . in
36
+ the first column of a line. The most basic is
37
+ `.inc`. Here is some input that includes an `.inc`
38
+ command:
39
+
40
+ Here is the first line.
41
+ Now I'm going to include another file.
42
+ .inc 'some_other_file.md'
43
+ And the last line.
44
+
45
+ Run the file above through md_inc and the output
46
+ will include the contents of `some_other_file.md`
47
+ embedded in it.
48
+
49
+ You can also pluck out only part of the included
50
+ file based on a pair of regular expressions:
51
+
52
+ Here we are going to include only part of file1,
53
+ just the lines between START and END.
54
+ .between(/START/, /END/, inc('file1'))
55
+ Note that the lines matching START and END are
56
+ not included in the output.
57
+
58
+ And you can exclude lines based on a regular expression:
59
+
60
+ Pull in the contents of file1, skipping any
61
+ lines that contain DONTWANT
62
+ .skip(/DONTWANT/, inc('file1'))
63
+
64
+ As you can probably guess from this last example,
65
+ the MdInc dot commands are really just inline Ruby
66
+ code that gets executed during file processing.
67
+ Because of this it's easy to extend MdInc with
68
+ your own commands. See the specs for an example.
69
+
70
+ ## Contributing
71
+
72
+ 1. Fork it
73
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
74
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
75
+ 4. Push to the branch (`git push origin my-new-feature`)
76
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require 'rspec/core/rake_task'
4
+ require 'rake/clean'
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task :default => [:spec, :build]
9
+
10
+ CLEAN.include 'pkg'
@@ -0,0 +1,58 @@
1
+ module MdInc
2
+ module Commands
3
+ public :instance_eval
4
+
5
+ class << self
6
+ attr_accessor :root
7
+
8
+ def full_path(path)
9
+ @root ? File.join(@root, path) : path
10
+ end
11
+
12
+ def x(*args)
13
+ []
14
+ end
15
+
16
+ def inc(path)
17
+ lines = File.readlines(full_path(path))
18
+ lines.map &:rstrip!
19
+ end
20
+
21
+ def code_inc(path, re1=nil, re2=nil)
22
+ if re1
23
+ code(between(re1, re2, inc(path)))
24
+ else
25
+ code(inc(path))
26
+ end
27
+ end
28
+
29
+ def code(lines)
30
+ lines.map {|l| l.rstrip.prepend(' ')}
31
+ end
32
+
33
+ def between(re1, re2, lines)
34
+ state = :outside
35
+ output = []
36
+ lines.each do |l|
37
+ if state == :outside && re1 =~ l
38
+ state = :inside
39
+ elsif state == :inside && re2 =~ l
40
+ state = :outside
41
+ else
42
+ output << l if state==:inside
43
+ end
44
+ end
45
+ STDERR.puts "Warning: no output from included file" if output.empty?
46
+ output
47
+ end
48
+
49
+ def skip(re, lines)
50
+ output = []
51
+ lines.each do |l|
52
+ output << l unless l =~ re
53
+ end
54
+ output
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,3 @@
1
+ module MdInc
2
+ VERSION = "0.2.1"
3
+ end
data/lib/md_inc.rb ADDED
@@ -0,0 +1,24 @@
1
+ require 'md_inc/version'
2
+ require 'md_inc/md_inc_commands'
3
+
4
+ module MdInc
5
+ class TextProcessor
6
+ def process(content)
7
+ output = []
8
+ content.split("\n").each do |line|
9
+ if /^\./ =~ line
10
+ output << process_command(line)
11
+ else
12
+ output << line
13
+ end
14
+ end
15
+ out = output.flatten.join("\n")
16
+ out
17
+ end
18
+
19
+ def process_command(command_line)
20
+ cmd = command_line[1..-1]
21
+ Commands.instance_eval(cmd)
22
+ end
23
+ end
24
+ end
data/md_inc.gemspec ADDED
@@ -0,0 +1,17 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/md_inc/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Russ Olsen"]
6
+ gem.email = ["russ@russolsen.com"]
7
+ gem.description = %q{MdInc is a simple text inclusion utility (it sucks in files) intended for use with markdown and similar utilities.}
8
+ gem.summary = %q{A simple text inclusion utility}
9
+ gem.homepage = ""
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "md_inc"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = MdInc::VERSION
17
+ end
@@ -0,0 +1,65 @@
1
+ require 'md_inc'
2
+ require 'fileutils'
3
+
4
+ describe MdInc::TextProcessor do
5
+ let(:mdi) { MdInc::TextProcessor.new }
6
+
7
+ context 'basic processing' do
8
+ it 'copies input to output by default' do
9
+ text = "aaa\nbbb\nccc"
10
+ mdi.process(text).should == text
11
+ end
12
+
13
+ it 'handles empty input' do
14
+ text = ''
15
+ mdi.process(text).should == text
16
+ end
17
+
18
+ it 'can require in plain old ruby files' do
19
+ text = '.x require "set"'
20
+ mdi.process(text).should == ''
21
+ end
22
+ end
23
+
24
+ context 'commands' do
25
+ before :each do
26
+ File.open("temp1",'w') {|f| f.puts("aaa\nbbb\n")}
27
+
28
+ File.open("temp2",'w') do |f|
29
+ 1.upto(10) {|n| f.puts "line #{n}" }
30
+ end
31
+ end
32
+
33
+ after :each do
34
+ FileUtils.rm_f("temp1")
35
+ FileUtils.rm_f("temp2")
36
+ end
37
+
38
+ it 'can pull in the contents of another file with inc' do
39
+ text = "first\n.inc 'temp1'\nlast"
40
+ output = mdi.process(text)
41
+ output.should == "first\naaa\nbbb\nlast"
42
+ end
43
+
44
+ it 'can do include just the lines between two matching lines' do
45
+ text = "first\n.between(/line 4/, /line 7/, inc('temp2') )\nlast"
46
+ output = mdi.process(text)
47
+ output.should == "first\nline 5\nline 6\nlast"
48
+ end
49
+
50
+ it 'can skip lines matching a regular expression' do
51
+ text = "first\n.skip(/1|2/, inc('temp2'))\nlast"
52
+ output = mdi.process(text)
53
+ output.should_not match("line 1")
54
+ output.should_not match("line 2")
55
+ output.should match("line 3")
56
+ output.should match("line 4")
57
+ end
58
+
59
+ it 'can allows for new commands to be added' do
60
+ text = ".x require 'new_commands'\nfirst\n.inc_up 'temp1'\nlast"
61
+ output = mdi.process(text)
62
+ output.should == "first\nAAA\nBBB\nlast"
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,11 @@
1
+ # This is an example of what you need to do to
2
+ # Add a new command to MdInc: Just add a new
3
+ # module level method to the Vacuum::Commands
4
+ # module and off you go.
5
+ module MdInc
6
+ module Commands
7
+ def self.inc_up(path)
8
+ inc(path).map {|s| s.upcase!}
9
+ end
10
+ end
11
+ end
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: md_inc
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Russ Olsen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-12 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: MdInc is a simple text inclusion utility (it sucks in files) intended
15
+ for use with markdown and similar utilities.
16
+ email:
17
+ - russ@russolsen.com
18
+ executables: []
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - .gitignore
23
+ - Gemfile
24
+ - LICENSE
25
+ - README.md
26
+ - Rakefile
27
+ - lib/md_inc.rb
28
+ - lib/md_inc/md_inc_commands.rb
29
+ - lib/md_inc/version.rb
30
+ - md_inc.gemspec
31
+ - spec/md_inc_spec.rb
32
+ - spec/new_commands.rb
33
+ homepage: ''
34
+ licenses: []
35
+ post_install_message:
36
+ rdoc_options: []
37
+ require_paths:
38
+ - lib
39
+ required_ruby_version: !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ required_rubygems_version: !ruby/object:Gem::Requirement
46
+ none: false
47
+ requirements:
48
+ - - ! '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ requirements: []
52
+ rubyforge_project:
53
+ rubygems_version: 1.8.10
54
+ signing_key:
55
+ specification_version: 3
56
+ summary: A simple text inclusion utility
57
+ test_files:
58
+ - spec/md_inc_spec.rb
59
+ - spec/new_commands.rb