middleman-spellcheck 0.2

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: af6acef72c4a8c1198d0af0035eeb3300ea7b522
4
+ data.tar.gz: 5d13b60d36b5fbcc3201a53bb1b9e04a75036e7f
5
+ SHA512:
6
+ metadata.gz: a4278e8b1e7c25e82bab5b6bb127ce40fff257fe22e896aed4aaca5c972ee9fa8f0a5f03a9e60dece55f23a8a61b1ac916195b87c89091b073067152a45c1713
7
+ data.tar.gz: 2aef6a45b02d6ee5b9c5159cfacaeccb0b9854fd500c52f4a9a491b9b2b3ca3e558c5ab91ef60d925c06bfdeb88ed55315797e74ca4f2d9dcf89128636c6e8e3
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem "middleman", :github => "middleman/middleman", :branch => "v3-stable"
4
+
5
+ gemspec
6
+
7
+ group :test do
8
+ gem "cucumber", "~> 1.3.1"
9
+ gem "fivemat"
10
+ gem "aruba", "~> 0.5.1"
11
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Ivan Zarea
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,45 @@
1
+ # Middleman::Spellcheck
2
+
3
+ Run a spell checker job after the app is built. Requires 'aspell'.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'middleman-spellcheck'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Add the following to middleman's `config.rb`:
16
+
17
+ activate :spellcheck
18
+
19
+ ## Usage
20
+
21
+ You can spellcheck only some resources using a regex with the URL:
22
+
23
+ ```ruby
24
+ activate :spellcheck, page: "documentation/*" # you can use regexes, too, e.g. /post_[1-9]/
25
+ ```
26
+
27
+ You can limit which tags the spell checker will only run through:
28
+
29
+ ```ruby
30
+ activate :spellcheck, tags: :p # pass an array of tags if you have more!
31
+ ```
32
+
33
+ If there are some words that you would like to be allowed
34
+
35
+ ```ruby
36
+ activate :spellcheck, allow: ["Gooby", "pls"]
37
+ ```
38
+
39
+ ## Contributing
40
+
41
+ 1. Fork it
42
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
43
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
44
+ 4. Push to the branch (`git push origin my-new-feature`)
45
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ require "bundler/gem_tasks"
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'cucumber/rake/task'
5
+
6
+ Cucumber::Rake::Task.new(:cucumber, 'Run features that should pass') do |t|
7
+ exempt_tags = ""
8
+ exempt_tags << "--tags ~@nojava " if RUBY_PLATFORM == "java"
9
+ t.cucumber_opts = "--color --tags ~@wip #{exempt_tags} --strict --format #{ENV['CUCUMBER_FORMAT'] || 'pretty'}"
10
+ end
11
+
12
+ task :test => ["cucumber"]
13
+ task :default => :test
@@ -0,0 +1,6 @@
1
+ Feature: Building an application with the spell checker allowed for some words
2
+
3
+ Scenario: The spelling errors in the allowed words is ignored
4
+ Given a fixture app "allow_app"
5
+ When I run `middleman build`
6
+ Then the exit status should be 0
@@ -0,0 +1,6 @@
1
+ Feature: Building an application with the spell checker enabled for some tags
2
+
3
+ Scenario: The spelling errors in other tags are ignored
4
+ Given a fixture app "only_tags_app"
5
+ When I run `middleman build`
6
+ Then the exit status should be 0
@@ -0,0 +1,6 @@
1
+ Feature: Building an application with the spell checker enabled for some paths
2
+
3
+ Scenario: The spelling errors in the parameters that do not match the path are ignored
4
+ Given a fixture app "spelling_path_app"
5
+ When I run `middleman build`
6
+ Then the exit status should be 0
@@ -0,0 +1,6 @@
1
+ Feature: Launching a plain application
2
+
3
+ Scenario: Shows a simple page
4
+ Given the Server is running at "plain_app"
5
+ When I go to "/"
6
+ Then I should see 'Hello, test'
@@ -0,0 +1,11 @@
1
+ Feature: Building an application with the spell checker enabled
2
+
3
+ Scenario: When the spelling is correct
4
+ Given a fixture app "correct_spelling_app"
5
+ When I run `middleman build`
6
+ Then the exit status should be 0
7
+
8
+ Scenario: When the spelling is incorrect
9
+ Given a fixture app "incorrect_spelling_app"
10
+ When I run `middleman build`
11
+ Then the exit status should be 1
@@ -0,0 +1,6 @@
1
+ PROJECT_ROOT_PATH = File.dirname(File.dirname(File.dirname(__FILE__)))
2
+ ENV['TEST'] = 'true'
3
+ require "middleman-core"
4
+ require "middleman-core/step_definitions"
5
+ require File.join(PROJECT_ROOT_PATH, 'lib', 'middleman-spellcheck')
6
+
@@ -0,0 +1 @@
1
+ activate :spellcheck, allow: ["dolan"]
@@ -0,0 +1 @@
1
+ Dolan walks into a park. dolan feels good.
@@ -0,0 +1 @@
1
+ activate :spellcheck
@@ -0,0 +1 @@
1
+ No spelling issues found here!
@@ -0,0 +1 @@
1
+ activate :spellcheck
@@ -0,0 +1 @@
1
+ Some speling isuses here!
@@ -0,0 +1 @@
1
+ activate :spellcheck, tags: :p
@@ -0,0 +1,4 @@
1
+ <p>This is written correctly</p>
2
+ <div>Dis shud be ignord 4ever! im 13 what is div</div>
3
+ <p>This is also written correctly</p>
4
+ <p>This, too!</p>
File without changes
@@ -0,0 +1 @@
1
+ Hello, <%= "TEST".downcase %>
@@ -0,0 +1 @@
1
+ activate :spellcheck, page: "[^no_]check/*"
@@ -0,0 +1 @@
1
+ There are no spelling errors here
@@ -0,0 +1 @@
1
+ Theer are soome splelling erors her! Gooby pls.
@@ -0,0 +1,7 @@
1
+ require "middleman-core"
2
+ require "middleman-spellcheck/version"
3
+
4
+ ::Middleman::Extensions.register(:spellcheck) do
5
+ require "middleman-spellcheck/extension"
6
+ ::Middleman::Spellcheck::SpellcheckExtension
7
+ end
@@ -0,0 +1,84 @@
1
+ require 'middleman-spellcheck/spellchecker'
2
+ require 'nokogiri'
3
+
4
+ module Middleman
5
+ module Spellcheck
6
+ class SpellcheckExtension < Extension
7
+ option :page, "/*", "Run only pages that match the regex through the spellchecker"
8
+ option :tags, [], "Run spellcheck only on some tags from the output"
9
+ option :allow, [], "Allow specific words to be misspelled"
10
+
11
+ def after_build(builder)
12
+ filtered = filter_resources(app, options.page)
13
+ total_misspelled = []
14
+
15
+ filtered.each do |resource|
16
+ builder.say_status :spellcheck, "Running spell checker for #{resource.url}", :blue
17
+ current_misspelled = run_check(select_content(resource))
18
+ current_misspelled.each do |misspell|
19
+ builder.say_status :misspell, error_message(misspell), :red
20
+ end
21
+ total_misspelled += current_misspelled
22
+ end
23
+
24
+ unless total_misspelled.empty?
25
+ raise Thor::Error, "Build failed. There are spelling errors."
26
+ end
27
+ end
28
+
29
+ def select_content(resource)
30
+ rendered_resource = resource.render(layout: false)
31
+ doc = Nokogiri::HTML(rendered_resource)
32
+
33
+ if options.tags.empty?
34
+ doc.text
35
+ else
36
+ select_tagged_content(doc, option_tags)
37
+ end
38
+ end
39
+
40
+ def option_tags
41
+ if options.tags.is_a? Array
42
+ options.tags
43
+ else
44
+ [options.tags]
45
+ end
46
+ end
47
+
48
+ def select_tagged_content(doc, tags)
49
+ tags.map { |tag| texts_for_tag(doc, tag.to_s) }.flatten.join(' ')
50
+ end
51
+
52
+ def texts_for_tag(doc, tag)
53
+ doc.css(tag).map(&:text)
54
+ end
55
+
56
+ def filter_resources(app, pattern)
57
+ app.sitemap.resources.select { |resource| resource.url.match(pattern) }
58
+ end
59
+
60
+ def run_check(text, dictionary="en")
61
+ results = Spellchecker.check(text, dictionary)
62
+ results = exclude_allowed(results)
63
+ results.reject { |entry| entry[:correct] }
64
+ end
65
+
66
+ def exclude_allowed(results)
67
+ results.reject { |entry| option_allowed.include? entry[:original].downcase }
68
+ end
69
+
70
+ def option_allowed
71
+ allowed = if options.allow.is_a? Array
72
+ options.allow
73
+ else
74
+ [options.allow]
75
+ end
76
+ allowed.map(&:downcase)
77
+ end
78
+
79
+ def error_message(misspell)
80
+ "The word '#{misspell[:original]}' is misspelled"
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,47 @@
1
+ class Spellchecker
2
+ require 'net/https'
3
+ require 'uri'
4
+ require 'rexml/document'
5
+
6
+ ASPELL_WORD_DATA_REGEX = Regexp.new(/\&\s\w+\s\d+\s\d+(.*)$/)
7
+
8
+ @@aspell_path = "aspell"
9
+
10
+ def self.aspell_path=(path)
11
+ @@aspell_path = path
12
+ end
13
+
14
+ def self.aspell_path
15
+ @@aspell_path
16
+ end
17
+
18
+ def self.check(text, lang='en')
19
+ tmp = Tempfile.new('spellchecker-tmp')
20
+ tmp << text
21
+ tmp.flush
22
+ tmp.close
23
+ spell_check_response = `cat "#{tmp.path}" | #{@@aspell_path} -a -l #{lang}`
24
+ if spell_check_response == ''
25
+ raise 'Aspell command not found'
26
+ elsif text == ''
27
+ return []
28
+ else
29
+ response = text.split(' ').collect { |original| {:original => original} }
30
+ results = spell_check_response.split("\n").slice(1..-1)
31
+ result_index = 0
32
+ response.each_with_index do |word_hash, index|
33
+ if word_hash[:original] =~ /[a-zA-z\[\]\?]/
34
+ if results[result_index] =~ ASPELL_WORD_DATA_REGEX
35
+ response[index].merge!(:correct => false, :suggestions => results[result_index].split(':')[1].strip.split(',').map(&:strip))
36
+ else
37
+ response[index].merge!(:correct => true)
38
+ end
39
+ result_index += 1
40
+ else
41
+ response[index].merge!(:correct => true)
42
+ end
43
+ end
44
+ return response
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,5 @@
1
+ module Middleman
2
+ module Spellcheck
3
+ VERSION = "0.2"
4
+ end
5
+ end
@@ -0,0 +1 @@
1
+ require "middleman-spellcheck"
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'middleman-spellcheck/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "middleman-spellcheck"
8
+ spec.version = Middleman::Spellcheck::VERSION
9
+ spec.authors = ["Ivan Zarea"]
10
+ spec.email = ["zarea.ion@gmail.com"]
11
+ spec.description = %q{Run spell checks as a build phase in middleman}
12
+ spec.summary = %q{Run spell checks as a build phase in middleman}
13
+ spec.homepage = "https://www.github.com/minivan/middleman-spellcheck"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(spec)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_runtime_dependency "middleman-core", ["~> 3.2"]
22
+ spec.add_runtime_dependency "nokogiri"
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.3"
25
+ spec.add_development_dependency "rake"
26
+ end
metadata ADDED
@@ -0,0 +1,130 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: middleman-spellcheck
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.2'
5
+ platform: ruby
6
+ authors:
7
+ - Ivan Zarea
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-01-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: middleman-core
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '3.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '3.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: nokogiri
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Run spell checks as a build phase in middleman
70
+ email:
71
+ - zarea.ion@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - Gemfile
78
+ - LICENSE.txt
79
+ - README.md
80
+ - Rakefile
81
+ - features/allowed.feature
82
+ - features/only_tags.feature
83
+ - features/page_params.feature
84
+ - features/plain_app.feature
85
+ - features/spelling_check.feature
86
+ - features/support/env.rb
87
+ - fixtures/allow_app/config.rb
88
+ - fixtures/allow_app/source/index.html.erb
89
+ - fixtures/correct_spelling_app/config.rb
90
+ - fixtures/correct_spelling_app/source/index.html.erb
91
+ - fixtures/incorrect_spelling_app/config.rb
92
+ - fixtures/incorrect_spelling_app/source/index.html.erb
93
+ - fixtures/only_tags_app/config.rb
94
+ - fixtures/only_tags_app/source/index.html.erb
95
+ - fixtures/plain_app/config.rb
96
+ - fixtures/plain_app/source/index.html.erb
97
+ - fixtures/spelling_path_app/config.rb
98
+ - fixtures/spelling_path_app/source/check/index.html
99
+ - fixtures/spelling_path_app/source/no_check/index.html
100
+ - lib/middleman-spellcheck.rb
101
+ - lib/middleman-spellcheck/extension.rb
102
+ - lib/middleman-spellcheck/spellchecker.rb
103
+ - lib/middleman-spellcheck/version.rb
104
+ - lib/middleman_extension.rb
105
+ - middleman-spellcheck.gemspec
106
+ homepage: https://www.github.com/minivan/middleman-spellcheck
107
+ licenses:
108
+ - MIT
109
+ metadata: {}
110
+ post_install_message:
111
+ rdoc_options: []
112
+ require_paths:
113
+ - lib
114
+ required_ruby_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - '>='
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ requirements: []
125
+ rubyforge_project:
126
+ rubygems_version: 2.1.10
127
+ signing_key:
128
+ specification_version: 4
129
+ summary: Run spell checks as a build phase in middleman
130
+ test_files: []