bem_html 1.0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c3b18970639fd699f7614d5b2894e9c51007d6bf
4
+ data.tar.gz: fccca43f3f35e40f1c5c55c6adfdb0222cff6b34
5
+ SHA512:
6
+ metadata.gz: a6ab8f5a0ef7dc586b014732876b7c84feaa8b18b2681a44b6b7296dda5a7563dbdb08ab5475d7b5e945aba661c529058c2df7be0f1be1dcde686b8747e2fa16
7
+ data.tar.gz: 517466b78e4e1a78925eb405be73624463aae2be87d7cfe5111cd327b64c2bf494cd6e4394ed33d7428902554b8f3a766ee7a1552e3e82ef0d85fdd410e07471
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ *.gem
2
+
3
+ # Ignore bundler lock file
4
+ /Gemfile.lock
5
+
6
+ # Ignore pkg folder
7
+ /pkg
data/Gemfile ADDED
@@ -0,0 +1,18 @@
1
+ # If you do not have OpenSSL installed, update
2
+ # the following line to use "http://" instead
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in bem_html.gemspec
6
+ gemspec
7
+
8
+ group :development do
9
+ gem 'rake'
10
+ gem 'rdoc'
11
+ gem 'yard'
12
+ end
13
+
14
+ group :test do
15
+ gem 'cucumber'
16
+ gem 'aruba'
17
+ gem 'rspec'
18
+ end
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ require 'bundler'
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
+ t.cucumber_opts = '--color --tags ~@wip --strict'
8
+ end
9
+
10
+ require 'rake/clean'
11
+
12
+ task test: ['cucumber']
13
+
14
+ task default: :test
data/Readme.md ADDED
@@ -0,0 +1,64 @@
1
+ # bem_html
2
+
3
+ BEM helpers for HTML.
4
+
5
+ Utility to convert HTML attributes (`bem-block`, `bem-element`, and `bem-modifiers`) to proper CSS classnames for use in BEM.
6
+
7
+ ## Purpose
8
+
9
+ In large projects, BEM namespacing can get fairly complicated. In Sass and PostCSS, there exist a number of helper methods to simply the creation of nested Block, Element, Modifier classes; however, this plugin provides similar helper methods within HTML itself.
10
+
11
+ ## Sample Usage
12
+
13
+ Say you had a BEM block called "widget" that had the following structure in HTML:
14
+
15
+ ~~~html
16
+
17
+ <div class="widget">
18
+ <h1 class="widget__heading widget__heading--lime">Heading</h1>
19
+ <section class="widget__content">
20
+ <p class="widget__content__first-paragraph">First Paragraph</p>
21
+ </section>
22
+ </div>
23
+ ~~~
24
+
25
+ With bem-html, you could define that structure instead as the following:
26
+
27
+ ~~~html
28
+ <div bem-block="widget">
29
+ <h1 bem-element="heading" modifiers="[:lime]">Heading</h1>
30
+ <section bem-element="content">
31
+ <p bem-element="first-paragraph">First Paragraph</p>
32
+ </section>
33
+ </div>
34
+ ~~~
35
+
36
+ And this extension would produce the desired HTML.
37
+
38
+ Originally, this extension was specifically designed for HAML, where it really shines:
39
+
40
+ ~~~haml
41
+ %div{bem:{block: :widget}}
42
+ %h1{bem:{element: :heading, modifiers: [:lime]}} Heading
43
+ %section{bem:{element: :content}}
44
+ %p{bem: {element: "first-paragraph"}} First Paragraph
45
+ ~~~
46
+
47
+ ## Installation
48
+
49
+ Install using `gem bem_html`
50
+
51
+ ## Usage
52
+
53
+ Sample Ruby code:
54
+
55
+ ~~~ ruby
56
+ require "bem_html"
57
+
58
+ html = IO.read("index.html")
59
+ BemHtml.parse(html) # -> Will output index.html with bem-* tags converted to CSS names
60
+ ~~~
61
+
62
+ ## Todo
63
+
64
+ * Binary parser for CLI usage
data/bem_html.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "bem_html"
6
+ s.version = "1.0.1"
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ["Andrew Pilsch"]
9
+ s.email = ["apilsch@tamu.edu"]
10
+ s.homepage = "https://github.com/oncomouse/bem_html"
11
+ s.summary = %q{Build BEM class tags on HTML elements from HTML attributes (bem-block, bem-element, and bem-modifiers).}
12
+ # s.description = %q{A longer description of your extension}
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.require_paths = ["lib"]
18
+
19
+ # The version of middleman-core your extension depends on
20
+ s.add_runtime_dependency("nokogiri", ["~> 1.6"])
21
+
22
+ s.license = "ISC"
23
+
24
+ # Additional dependencies
25
+ # s.add_runtime_dependency("gem-name", "gem-version")
26
+ end
@@ -0,0 +1,4 @@
1
+ PROJECT_ROOT_PATH = File.dirname(File.dirname(File.dirname(__FILE__)))
2
+ require 'middleman-core'
3
+ require 'middleman-core/step_definitions'
4
+ require File.join(PROJECT_ROOT_PATH, 'lib', 'bem_html')
data/lib/bem_html.rb ADDED
@@ -0,0 +1,69 @@
1
+ require 'json'
2
+ require 'nokogiri'
3
+
4
+ class BemHtml
5
+ def self.parse(content)
6
+ html_doc = Nokogiri::HTML(content)
7
+ html_doc.xpath('.//*[@bem-block]|*[@bem-block]').each do |blockNode|
8
+ currentBlock = blockNode["bem-block"]
9
+ blockNode.attributes["bem-block"].remove
10
+ if(not blockNode['class'])
11
+ blockNode['class'] = ""
12
+ end
13
+ blockNode['class'] += " #{currentBlock}"
14
+ nextBlock = [currentBlock]
15
+ if(blockNode.attributes["bem-modifiers"])
16
+ JSON.parse(blockNode.attributes["bem-modifiers"].value.gsub(/\:(\w+)/,'"\1"')).each do |modifier|
17
+ nextBlock.push("#{currentBlock}--#{modifier}")
18
+ blockNode['class'] += " #{currentBlock}--#{modifier}"
19
+ end
20
+ blockNode.attributes["bem-modifiers"].remove
21
+ end
22
+ processingQueue = [[nextBlock, blockNode.children]]
23
+ while processingQueue.length > 0
24
+ topQueue = processingQueue.shift
25
+ currentBlock = topQueue[0]
26
+ nodes = topQueue[1]
27
+ nodes.each do |node|
28
+ next if not node.attributes
29
+ next if node.attributes["bem-block"]
30
+ next if not node.attributes["bem-element"]
31
+
32
+ if(not node['class'])
33
+ node['class'] = ""
34
+ end
35
+
36
+ element = node.attributes["bem-element"]
37
+ node.attributes["bem-element"].remove
38
+ if(currentBlock.respond_to? :push)
39
+ nextBlock = currentBlock.map do |cb|
40
+ node['class'] += " #{cb}__#{element}"
41
+ "#{cb}__#{element}"
42
+ end
43
+ else
44
+ nextBlock = "#{currentBlock}__#{element}"
45
+ node['class'] += " #{nextBlock}"
46
+ end
47
+
48
+ if(node.attributes["bem-modifiers"])
49
+ JSON.parse(node.attributes["bem-modifiers"].value.gsub(/\:(\w+)/,'"\1"')).each do |modifier|
50
+ if(currentBlock.respond_to? :push)
51
+ currentBlock.each do |cb|
52
+ node['class'] += " #{cb}__#{element}--#{modifier}"
53
+ nextBlock.push("#{cb}__#{element}--#{modifier}")
54
+ end
55
+ else
56
+ node['class'] += " #{currentBlock}__#{element}--#{modifier}"
57
+ end
58
+ end
59
+ node.attributes["bem-modifiers"].remove
60
+ end
61
+ if(node.children.length > 0)
62
+ processingQueue.push([nextBlock, node.children])
63
+ end
64
+ end
65
+ end
66
+ end
67
+ html_doc.to_s
68
+ end
69
+ end
metadata ADDED
@@ -0,0 +1,67 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bem_html
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Andrew Pilsch
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-07-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ description:
28
+ email:
29
+ - apilsch@tamu.edu
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - ".gitignore"
35
+ - Gemfile
36
+ - Rakefile
37
+ - Readme.md
38
+ - bem_html.gemspec
39
+ - features/support/env.rb
40
+ - lib/bem_html.rb
41
+ homepage: https://github.com/oncomouse/bem_html
42
+ licenses:
43
+ - ISC
44
+ metadata: {}
45
+ post_install_message:
46
+ rdoc_options: []
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubyforge_project:
61
+ rubygems_version: 2.5.1
62
+ signing_key:
63
+ specification_version: 4
64
+ summary: Build BEM class tags on HTML elements from HTML attributes (bem-block, bem-element,
65
+ and bem-modifiers).
66
+ test_files:
67
+ - features/support/env.rb