middleman-org 0.1.0

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: f2cda372c2e2651915077bfb548761d0ec832213
4
+ data.tar.gz: b25e56515d08b6a858414f159225c9c066601182
5
+ SHA512:
6
+ metadata.gz: cb94d0dc36a263675e6f65a718523fed6ff48e5db5fbb2473ad295393d164671993fb8eb13d7855bb57bac78a441087d05eb16b60d7e30850bd17ea216d3edc8
7
+ data.tar.gz: e8cbe2ddae85763996df5eca673dafc8bf8cbb29acb110c0d1a58613ef2c51f298d9cc2eff9c058c34331149b086045639b706f79ea94e968f521515e50c809b
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ # Ignore bundler lock file
2
+ /Gemfile.lock
3
+
4
+ # Ignore pkg folder
5
+ /pkg
data/Gemfile ADDED
@@ -0,0 +1,20 @@
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 middleman-org.gemspec
6
+ gemspec
7
+
8
+ group :development do
9
+ gem 'rake'
10
+ gem 'rdoc'
11
+ gem 'yard'
12
+ gem 'pry'
13
+ end
14
+
15
+ group :test do
16
+ gem 'cucumber'
17
+ gem 'fivemat'
18
+ gem 'aruba'
19
+ gem 'rspec'
20
+ end
data/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # middleman-org
2
+
3
+
4
+ ## What and Why
5
+
6
+ `middleman-org` is an extention for [middleman](https://middlemanapp.com) to generate static pages from [org file](http://orgmode.org).
7
+ It is highly inspired by the offical blog extention [middleman-blog](https://github.com/middleman/middleman-blog), but it is not another blogging extention.
8
+
9
+ ## Advantages of using `middleman-org`
10
+
11
+ ### Linking
12
+
13
+ Org mode is powerful as a whole system. You expect connections between files. Or being able to reference some kind of resource files (e.g. input data, image etc.) within org. `middleman-org` preserve the complete structure of your system, so that you will have the whole set exported with no breaking links.
14
+
15
+ ### No more `front mater`
16
+
17
+ Is it just me or... I found the `yaml front mater` is just annoying in such scenario. You don't want to pollute your org files with it, do you? `middleman-org` uses native org-mode in buffer settings as metadata of your article.
18
+ So instead of
19
+
20
+ ```yaml
21
+ ---
22
+ title: my polluted article
23
+ date: 2015-04-09
24
+ tags: polluted, lame
25
+ ---
26
+ ```
27
+
28
+ You can use
29
+
30
+ ```org
31
+ #+TITLE: my awesome article
32
+ #+DATE: <2015-04-09 Thu>
33
+ #+KEYWORDS: awesome nice
34
+ ```
35
+
36
+ ### Selective Publish
37
+
38
+ This is implemented by [org-ruby](https://github.com/bdewey/org-ruby), the rendering engine we use in `middleman-org`. Just simply apply [export settings](http://orgmode.org/manual/Export-settings.html) natively in your org file, sections with exclusion tags will not be published.
39
+
40
+ ## Installation
41
+
42
+ Add `middleman-org` to your `Gemfile` and run `bundle install`.
43
+ ## Configuration
44
+
45
+ And activate it in `config.rb`.
46
+
47
+ ```ruby
48
+ activate :org
49
+ ```
50
+
51
+ With default settings, create a folder `org` inside your `source` folder and dump all your org files into it.
52
+ If you use git to manage your org files, it is highly recommaned to add your org repository as a submodule.
53
+
54
+ option | default | meaning
55
+ ---|---|---
56
+ `layout` | 'layout' | article specific layout
57
+ `root` | 'org' | root folder for org files (relative to `source` folder)
58
+ `prefix` | nil | prefix on root and destination path
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 --format #{ENV['CUCUMBER_FORMAT'] || 'Fivemat'}"
8
+ end
9
+
10
+ require 'rake/clean'
11
+
12
+ task test: ['cucumber']
13
+
14
+ task default: :test
@@ -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', 'middleman-org')
@@ -0,0 +1,52 @@
1
+ require 'middleman-org/org_data'
2
+ require 'middleman-org/org_article'
3
+ require 'middleman-org/helpers'
4
+
5
+ module Middleman
6
+ class OrgExtension < ::Middleman::Extension
7
+ option :layout, 'layout', 'article specific layout'
8
+ option :root, 'org', 'source folder for org files'
9
+ option :prefix, nil, 'prefix on destination and root path'
10
+ # option :resources, 'resources', 'folder name for resources'
11
+
12
+ attr_reader :data
13
+
14
+ self.defined_helpers = [Middleman::Org::Helpers]
15
+ def initialize(app, options_hash = {}, &block)
16
+ # Call super to build options from the options_hash
17
+ super
18
+
19
+ # Require libraries only when activated
20
+ require 'org-ruby'
21
+ require 'middleman-org/org_data'
22
+
23
+ options.root = File.join(options.prefix, options.root) if options.prefix
24
+
25
+ app.after_configuration do
26
+ template_extensions org: :html
27
+ end
28
+
29
+ # set up your extension
30
+ # puts options.my_option
31
+ end
32
+
33
+ def after_configuration
34
+ ::Middleman::Org.controller = self
35
+
36
+ # Make sure ActiveSupport's TimeZone stuff has something to work with,
37
+ # allowing people to set their desired time zone via Time.zone or
38
+ # set :time_zone
39
+ Time.zone = app.config[:time_zone] if app.config[:time_zone]
40
+ time_zone = Time.zone || 'UTC'
41
+ zone_default = Time.find_zone!(time_zone)
42
+ unless zone_default
43
+ raise 'Value assigned to time_zone not recognized.'
44
+ end
45
+ Time.zone_default = zone_default
46
+
47
+ @data = Org::OrgData.new(@app, self, options)
48
+ @app.sitemap.register_resource_list_manipulator(:"org_articles", @data, false)
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,38 @@
1
+ module Middleman
2
+ module Org
3
+
4
+ def self.controller
5
+ @controller ||= nil
6
+ end
7
+
8
+ def self.controller=(v)
9
+ @controller = v
10
+ end
11
+
12
+ module Helpers
13
+ def self.included(base)
14
+ end
15
+
16
+ def org_controller
17
+ ::Middleman::Org.controller
18
+ end
19
+
20
+ def org_data
21
+ org_controller.data
22
+ end
23
+
24
+ def current_article
25
+ article = current_resource
26
+ if article && article.is_a?(OrgArticle)
27
+ article
28
+ else
29
+ nil
30
+ end
31
+ end
32
+
33
+ def articles
34
+ org_data.articles
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,102 @@
1
+ require 'active_support/time_with_zone'
2
+ require 'active_support/core_ext/time/acts_like'
3
+ require 'active_support/core_ext/time/calculations'
4
+ require 'nokogiri'
5
+
6
+ module Middleman
7
+ module Org
8
+
9
+ module OrgArticle
10
+ def self.extended(base)
11
+ base.class.send(:attr_accessor, :org_controller)
12
+ end
13
+
14
+ def org_data
15
+ org_controller.data
16
+ end
17
+
18
+ def org_options
19
+ org_controller.options
20
+ end
21
+
22
+ IN_BUFFER_SETTING_REGEXP = /^#\+(\w+):\s*(.*)$/
23
+
24
+ def in_buffer_setting
25
+ return @_in_buffer_setting if @_in_buffer_setting
26
+
27
+ @_in_buffer_setting = {}
28
+ File.open(source_file, 'r') do |f|
29
+ f.each_line do |line|
30
+ if line =~ IN_BUFFER_SETTING_REGEXP
31
+ @_in_buffer_setting[$1] = $2
32
+ end
33
+ end
34
+ end
35
+ @_in_buffer_setting
36
+ end
37
+
38
+ def render(opts={}, locs={}, &block)
39
+ unless opts.has_key?(:layout)
40
+ opts[:layout] = org_options.layout if opts[:layout].nil?
41
+ # Convert to a string unless it's a boolean
42
+ opts[:layout] = opts[:layout].to_s if opts[:layout].is_a? Symbol
43
+ end
44
+
45
+ content = super(opts, locs, &block)
46
+ fix_links(content)
47
+ end
48
+
49
+ def fix_links(content)
50
+ html = ::Nokogiri::HTML(content)
51
+ html.xpath("//@src | //@href | //@poster").each do |attribute|
52
+ attribute.value = attribute.value.gsub(/^(.+)\.org$/, '\1.html')
53
+ end
54
+ html.to_s
55
+ end
56
+
57
+ def title
58
+ in_buffer_setting['TITLE'] || File.basename(source_file, '.*')
59
+ end
60
+
61
+ def tags
62
+ article_tags = in_buffer_setting['KEYWORDS']
63
+ return [] unless article_tags
64
+
65
+ if article_tags.is_a? String
66
+ article_tags.split(' ').map(&:strip)
67
+ else
68
+ Array(article_tags).map(&:to_s)
69
+ end
70
+ end
71
+
72
+ def published?
73
+ true
74
+ end
75
+
76
+ def body
77
+ render layout: false
78
+ end
79
+
80
+ def date
81
+ return @_date if @_date
82
+
83
+ @_date = in_buffer_setting['DATE']
84
+
85
+ # frontmatter_date = data['date']
86
+
87
+ # # First get the date from frontmatter
88
+ # if frontmatter_date.is_a? Time
89
+ # @_date = frontmatter_date.in_time_zone
90
+ # else
91
+ # @_date = Time.zone.parse(frontmatter_date.to_s)
92
+ # end
93
+
94
+ @_date
95
+ end
96
+
97
+ def slug
98
+ end
99
+
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,56 @@
1
+ require 'middleman-core/util'
2
+
3
+ module Middleman
4
+ module Org
5
+
6
+ class OrgData
7
+ attr_reader :options
8
+ attr_reader :controller
9
+
10
+ def initialize(app, controller, options)
11
+ @app = app
12
+ @options = options
13
+ @controller = controller
14
+
15
+ @_articles = []
16
+ end
17
+
18
+ def articles
19
+ @_articles
20
+ end
21
+
22
+ def tags
23
+ []
24
+ end
25
+
26
+ def manipulate_resource_list(resources)
27
+ @_posts = []
28
+ resources.each do |resource|
29
+ next unless resource.path =~ /^#{options.root}/
30
+
31
+ resource.destination_path = resource.path.gsub(/^#{options.root}/,
32
+ options.prefix)
33
+ if File.extname(resource.source_file) == '.org'
34
+ article = convert_to_article resource
35
+ puts article.source_file
36
+ next unless publishable?(article)
37
+ @_articles << article
38
+ end
39
+
40
+ end
41
+ end
42
+
43
+ def publishable?(article)
44
+ @app.environment == :development || article.published?
45
+ end
46
+
47
+ def convert_to_article(resource)
48
+ return resource if resource.is_a?(OrgArticle)
49
+ resource.extend OrgArticle
50
+ resource.org_controller = controller
51
+ resource
52
+ end
53
+
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,5 @@
1
+ module Middleman
2
+ module Org
3
+ VERSION = '0.1.0'
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ require 'middleman-core'
2
+ require 'middleman-org/version'
3
+
4
+ ::Middleman::Extensions.register(:org) do
5
+ require 'middleman-org/extension'
6
+ ::Middleman::OrgExtension
7
+ end
@@ -0,0 +1 @@
1
+ require 'middleman-org'
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $LOAD_PATH.push File.expand_path('../lib', __FILE__)
3
+ require 'middleman-org/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'middleman-org'
7
+ s.version = Middleman::Org::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ['Xiaoxing Hu']
10
+ s.email = ['dawnstar.hu@gmail.com']
11
+ s.homepage = 'http://github.com/xiaoxinghu/middleman-org'
12
+ s.summary = %q{org-mode extension for middleman}
13
+ s.description = %q{Middleman extension for publishing org-mode project}
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
+ s.license = 'MIT'
19
+ # The version of middleman-core your extension depends on
20
+ s.add_runtime_dependency('middleman-core', ['~> 3.3'])
21
+
22
+ # Additional dependencies
23
+ s.add_runtime_dependency('org-ruby', '~> 0.9.12')
24
+ s.add_runtime_dependency('addressable', '~> 2.3')
25
+ s.add_runtime_dependency('nokogiri', '~> 1.6')
26
+ end
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: middleman-org
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Xiaoxing Hu
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-09 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.3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: org-ruby
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.12
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.12
41
+ - !ruby/object:Gem::Dependency
42
+ name: addressable
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.3'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: nokogiri
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.6'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.6'
69
+ description: Middleman extension for publishing org-mode project
70
+ email:
71
+ - dawnstar.hu@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - Gemfile
78
+ - README.md
79
+ - Rakefile
80
+ - features/support/env.rb
81
+ - lib/middleman-org.rb
82
+ - lib/middleman-org/extension.rb
83
+ - lib/middleman-org/helpers.rb
84
+ - lib/middleman-org/org_article.rb
85
+ - lib/middleman-org/org_data.rb
86
+ - lib/middleman-org/version.rb
87
+ - lib/middleman_extension.rb
88
+ - middleman-org.gemspec
89
+ homepage: http://github.com/xiaoxinghu/middleman-org
90
+ licenses:
91
+ - MIT
92
+ metadata: {}
93
+ post_install_message:
94
+ rdoc_options: []
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ requirements: []
108
+ rubyforge_project:
109
+ rubygems_version: 2.4.6
110
+ signing_key:
111
+ specification_version: 4
112
+ summary: org-mode extension for middleman
113
+ test_files:
114
+ - features/support/env.rb
115
+ has_rdoc: