├── features ├── support │ └── setup.rb └── cli.feature ├── lib ├── miyano │ ├── version.rb │ ├── build │ │ ├── index.rb │ │ ├── default_css.rb │ │ ├── tags.rb │ │ ├── html.rb │ │ └── bear.rb │ ├── builder.rb │ ├── cli │ │ ├── build.rb │ │ └── push.rb │ ├── post.rb │ ├── cli.rb │ └── site.rb └── miyano.rb ├── .travis.yml ├── Rakefile ├── Gemfile ├── .gitignore ├── exe └── miyano ├── spec ├── spec_helper.rb └── miyano_spec.rb ├── LICENSE.txt ├── miyano.gemspec └── README.md /features/support/setup.rb: -------------------------------------------------------------------------------- 1 | require "aruba/cucumber" 2 | -------------------------------------------------------------------------------- /lib/miyano/version.rb: -------------------------------------------------------------------------------- 1 | module Miyano 2 | VERSION = "0.3.7" 3 | end 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: ruby 3 | rvm: 4 | - 2.4.0 5 | before_install: gem install bundler -v 1.16.1 6 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require "bundler/gem_tasks" 2 | require "rspec/core/rake_task" 3 | 4 | RSpec::Core::RakeTask.new(:spec) 5 | 6 | task :default => :spec 7 | -------------------------------------------------------------------------------- /lib/miyano.rb: -------------------------------------------------------------------------------- 1 | $VERBOSE = nil 2 | require "miyano/version" 3 | require "miyano/site" 4 | require "miyano/post" 5 | require "miyano/cli" 6 | require "miyano/builder" 7 | 8 | module Miyano 9 | end 10 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } 4 | 5 | # Specify your gem's dependencies in miyano.gemspec 6 | gemspec 7 | 8 | # local bear test 9 | 10 | #gem "beardown", :path => "" 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.bundle/ 2 | /.yardoc 3 | /_yardoc/ 4 | /coverage/ 5 | /doc/ 6 | /pkg/ 7 | /spec/reports/ 8 | /tmp/ 9 | 10 | # rspec failure tracking 11 | .rspec_status 12 | 13 | # add 14 | /.sass-cache/ 15 | .DS_Store 16 | .rspec 17 | /bin/ 18 | Gemfile.lock 19 | /_site/ 20 | /post/ 21 | /layout/ 22 | -------------------------------------------------------------------------------- /lib/miyano/build/index.rb: -------------------------------------------------------------------------------- 1 | module Miyano 2 | class Builder 3 | protected 4 | def build_index 5 | template = Tilt.new "layout/index.html.erb" 6 | File.open("_site/index.html", "w") do |html| 7 | html.write template.render @site 8 | end 9 | end 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /lib/miyano/build/default_css.rb: -------------------------------------------------------------------------------- 1 | module Miyano 2 | class Builder 3 | protected 4 | def build_default_css 5 | css = "layout/default.scss" 6 | template = Tilt.new css 7 | File.open("_site/default.css", "w") do |f| 8 | f.write template.render 9 | end 10 | end 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /features/cli.feature: -------------------------------------------------------------------------------- 1 | Feature: Miyano Cli 2 | 3 | Scenario: Show version 4 | When I run `miyano version` 5 | Then the output should contain "Miyano 0.3.0" 6 | 7 | Scenario: New Project with markdown compatibility mode 8 | When I run `miyano new PROJECT -m` 9 | Then I cd to "PROJECT/post" 10 | And the file ".compat" should exist 11 | -------------------------------------------------------------------------------- /exe/miyano: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require "miyano" 4 | 5 | if ARGV.empty? 6 | conf = File.join Dir.home, ".miyano" 7 | if File.exist? conf 8 | blog_root = File.read(conf).strip 9 | unless blog_root.empty? 10 | ARGV[0] = "push" 11 | FileUtils.cd blog_root do 12 | Miyano::CLI.start 13 | end 14 | return 15 | end 16 | end 17 | end 18 | Miyano::CLI.start 19 | 20 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | require "bundler/setup" 2 | require "miyano" 3 | $VERBOSE = false 4 | RSpec.configure do |config| 5 | # Enable flags like --only-failures and --next-failure 6 | config.example_status_persistence_file_path = ".rspec_status" 7 | 8 | # Disable RSpec exposing methods globally on `Module` and `main` 9 | config.disable_monkey_patching! 10 | 11 | config.expect_with :rspec do |c| 12 | c.syntax = :expect 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /lib/miyano/build/tags.rb: -------------------------------------------------------------------------------- 1 | module Miyano 2 | class Builder 3 | protected 4 | def build_tags 5 | @site._tags.each do |tag, _| 6 | site = Site.new 7 | site.current_tag = tag 8 | @site.posts.each do |post| 9 | site.add_post post if post.tags.include? tag 10 | end 11 | template = Tilt.new "layout/index.html.erb" 12 | FileUtils.mkdir_p "_site/tag/#{tag}" 13 | File.open("_site/tag/#{tag}/index.html", "w") do |html| 14 | html.write template.render site 15 | end 16 | end 17 | end 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /lib/miyano/builder.rb: -------------------------------------------------------------------------------- 1 | require "miyano/build/bear" 2 | require "miyano/build/html" 3 | require "miyano/build/default_css" 4 | require "miyano/build/index" 5 | require "miyano/build/tags" 6 | 7 | module Miyano 8 | class Builder 9 | 10 | def initialize 11 | @site = Site.new 12 | end 13 | 14 | def build_the_world 15 | # post 16 | ["bear","html"].each do |attr| 17 | send "build_#{attr}" 18 | end 19 | 20 | # layout 21 | ["default_css", "index", "tags"].each do |attr| 22 | send "build_#{attr}" 23 | end 24 | end 25 | end 26 | end 27 | -------------------------------------------------------------------------------- /lib/miyano/cli/build.rb: -------------------------------------------------------------------------------- 1 | module Miyano 2 | class Build < Thor::Group 3 | def check_root 4 | unless Dir.exist?("post") and Dir.exist?("layout") 5 | fail "!!wrong dirctory" 6 | end 7 | end 8 | 9 | def clean 10 | if Dir.exist?("_site") 11 | FileUtils.cd "_site" do 12 | files = Dir["*"] 13 | files.delete "CNAME" 14 | files.each do |f| 15 | FileUtils.rm_rf f 16 | end 17 | end 18 | end 19 | end 20 | 21 | def build 22 | Builder.new.build_the_world 23 | end 24 | end 25 | end 26 | -------------------------------------------------------------------------------- /lib/miyano/build/html.rb: -------------------------------------------------------------------------------- 1 | module Miyano 2 | class Builder 3 | protected 4 | 5 | def build_html 6 | files = Dir["post/*.html"] 7 | files.each do |f| 8 | name = File.basename(f, ".*") 9 | FileUtils.mkdir_p "_site/#{name}" 10 | FileUtils.cp f, "_site/#{name}/index.html" 11 | render_html f 12 | end 13 | end 14 | 15 | def render_html(f) 16 | name = File.basename f, ".*" 17 | cre_date = File.birthtime f 18 | mod_date = File.mtime f 19 | 20 | post = Post.new name, cre_date, mod_date, name 21 | @site.add_post post 22 | end 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /spec/miyano_spec.rb: -------------------------------------------------------------------------------- 1 | require "spec_helper" 2 | 3 | RSpec.describe Miyano do 4 | 5 | it "has a version number" do 6 | expect(Miyano::VERSION).not_to be nil 7 | end 8 | 9 | it "can use beardown" do 10 | require "beardown" 11 | input = "* list1\n\n\n* beardown\n" 12 | output = "\n
\n
\n\n" 13 | expect(Beardown.new(input).to_html).to eql output 14 | end 15 | 16 | it "can get tag from bearnote" do 17 | require "beardown" 18 | bear = Beardown.new "#tag1/tag2/tag3" 19 | expect(bear.tags).to eql ["tag1", "tag1/tag2", "tag1/tag2/tag3"] 20 | end 21 | 22 | it "can use site global share variable" do 23 | #expect(@@site.class).to eql Miyano::Site 24 | end 25 | 26 | it "can build the world" do 27 | Miyano::Builder.new.build_the_world 28 | end 29 | 30 | it "can delete cached files and dirs when building" do 31 | #Miyano::Build.new.clean 32 | end 33 | end 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /lib/miyano/post.rb: -------------------------------------------------------------------------------- 1 | module Miyano 2 | class Post 3 | attr_reader :name, :title, 4 | :cre_date, :mod_date, 5 | :content, :text, 6 | :url 7 | 8 | def initialize(name, cre_date, mod_date, title="", content="", 9 | text="", tags=[]) 10 | @name, @title = name, title 11 | @cre_date, @mod_date = cre_date, mod_date 12 | @content, @text, @tags = content, text, tags 13 | @url = "/#{@name}/" 14 | end 15 | 16 | def date(format="%b %-d, %Y") 17 | @mod_date.strftime format 18 | end 19 | 20 | def tags 21 | @tags 22 | end 23 | 24 | def summary 25 | @text[(@title.length+2)..-1].delete "#*" 26 | end 27 | 28 | def content_no_assets 29 | res = @content.gsub //, "" 30 | res[(@title.length+9)..-1] 31 | end 32 | 33 | def content_for_homepage 34 | res=@content.gsub /\=\"assets\//, %(="#{@url}assets/) 35 | res[(@title.length+9)..-1] 36 | end 37 | 38 | end 39 | end 40 | -------------------------------------------------------------------------------- /lib/miyano/cli.rb: -------------------------------------------------------------------------------- 1 | require "thor" 2 | require "webrick" 3 | require "miyano/cli/build" 4 | require "miyano/cli/push" 5 | 6 | module Miyano 7 | class CLI < Thor 8 | desc "version", "show version" 9 | def version 10 | puts "Miyano #{Miyano::VERSION}" 11 | end 12 | 13 | desc "new [DIR]", "create new blog" 14 | method_option :compat, :aliases => "-m", :desc => "Markdown Compatibility Mode" 15 | def new(dir) 16 | url = "https://github.com/wuusn/miyano_template.git" 17 | `git clone --depth 1 #{url} #{dir}` 18 | `touch #{dir}/post/.compat` if options[:compat] 19 | `rm -rf #{dir}/.git*` 20 | end 21 | 22 | desc "try", "try as a local web server" 23 | def try 24 | root = "_site" 25 | server = WEBrick::HTTPServer.new :Port => 8000, 26 | :DocumentRoot => root 27 | trap "INT" do server.shutdown end 28 | server.start 29 | end 30 | 31 | register(Build, "build", "build", "build posts and layouts") 32 | register(Push, "push", "push", "push to Github Pages") 33 | end 34 | end 35 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 wuusn 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /lib/miyano/cli/push.rb: -------------------------------------------------------------------------------- 1 | module Miyano 2 | class Push < Thor::Group 3 | def configs 4 | @dir = "_site".freeze 5 | end 6 | 7 | def check_root 8 | unless Dir.exist?("post") and Dir.exist?("layout") 9 | fail "!!wrong dirctory" 10 | end 11 | end 12 | 13 | def check_if_first 14 | unless Dir.exist? File.join @dir, ".git" 15 | FileUtils.mkdir_p @dir 16 | FileUtils.cd @dir do 17 | p "Enter the url of your Github Pages repo" 18 | p "(eg: https://github.com/username/username.github.io)" 19 | p "WARN: It will delete all files already in the repo" 20 | print "repo url:";repo = STDIN.gets.chomp 21 | `git init` 22 | `git remote add origin #{repo}` 23 | `git pull origin master` 24 | files = Dir["*"] 25 | files.delete "CNAME" 26 | files.each do |f| 27 | FileUtils.rm_rf f 28 | end 29 | end 30 | end 31 | end 32 | 33 | def build_everytime 34 | CLI.new.build 35 | end 36 | 37 | def push 38 | FileUtils.cd @dir do 39 | `git add .` 40 | `git commit -m "site updated at #{Time.now}"` 41 | `git push -u origin master` 42 | end 43 | end 44 | end 45 | end 46 | -------------------------------------------------------------------------------- /lib/miyano/site.rb: -------------------------------------------------------------------------------- 1 | module Miyano 2 | class Site 3 | 4 | def initialize 5 | @posts = [] 6 | @tags = {} 7 | end 8 | 9 | def posts 10 | @posts 11 | end 12 | 13 | def add_post(post) 14 | @posts << post 15 | @posts.sort_by! {|p| [p.mod_date, p.cre_date]} 16 | @posts.reverse! 17 | 18 | post.tags.each do |tag| 19 | if @tags.include? tag 20 | @tags[tag] += 1 21 | else 22 | @tags[tag] = 1 23 | end 24 | end 25 | @tags = @tags.sort_by {|key, value| [-value, key.length]} 26 | .to_h 27 | end 28 | 29 | def _tags 30 | @tags 31 | end 32 | 33 | def tags 34 | prefix = @current_tag 35 | ret_tags = [] 36 | 37 | if prefix.nil? 38 | @tags.each do |_t, _| 39 | t = _t.split("/").first 40 | ret_tags << t unless ret_tags.include? t 41 | end 42 | return ret_tags 43 | end 44 | 45 | @tags.each do |_t, _| 46 | next if _t.length <= prefix.length 47 | if _t.start_with? prefix 48 | t = _t.delete_prefix prefix 49 | t = t.delete_prefix! "/" 50 | t = t.split("/").first if t 51 | ret_tags << t unless t.nil? or ret_tags.include? t 52 | end 53 | end 54 | return ret_tags 55 | end 56 | 57 | def current_tag 58 | @current_tag 59 | end 60 | 61 | def current_tag=(tag) 62 | @current_tag = tag 63 | end 64 | end 65 | end 66 | -------------------------------------------------------------------------------- /miyano.gemspec: -------------------------------------------------------------------------------- 1 | lib = File.expand_path("../lib", __FILE__) 2 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 3 | require "miyano/version" 4 | 5 | Gem::Specification.new do |spec| 6 | spec.name = "miyano" 7 | spec.version = Miyano::VERSION 8 | spec.authors = ["wuusn"] 9 | spec.email = ["wuusin@gmail.com"] 10 | 11 | spec.summary = %q{A BearNote Blog system depoly on Github Pages.} 12 | spec.homepage = "https://github.com/wuusn/miyano" 13 | spec.license = "MIT" 14 | 15 | # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host' 16 | # to allow pushing to a single host or delete this section to allow pushing to any host. 17 | if spec.respond_to?(:metadata) 18 | spec.metadata["allowed_push_host"] = "https://rubygems.org" 19 | else 20 | raise "RubyGems 2.0 or newer is required to protect against " \ 21 | "public gem pushes." 22 | end 23 | 24 | spec.files = `git ls-files -z`.split("\x0").reject do |f| 25 | f.match(%r{^(test|spec|features)/}) 26 | end 27 | spec.bindir = "exe" 28 | spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } 29 | spec.require_paths = ["lib"] 30 | 31 | spec.add_development_dependency "bundler", "~> 1.16" 32 | spec.add_development_dependency "rake", "~> 10.0" 33 | spec.add_development_dependency "rspec", "~> 3.0" 34 | spec.add_development_dependency "cucumber", "~> 3.1.0" 35 | spec.add_development_dependency "aruba", "~> 0.14.3" 36 | 37 | spec.add_dependency "thor", "~> 0.20.0" 38 | spec.add_dependency "sass", "~> 3.5.5" 39 | spec.add_dependency "tilt", "~> 2.0.8" 40 | spec.add_dependency "rubyzip", "~> 1.2.1" 41 | spec.add_dependency "rouge", "~> 3.1.1" 42 | spec.add_dependency "beardown", ">= 0.1.4" 43 | spec.add_dependency "beardown-compat", ">= 0.1.2" 44 | 45 | spec.required_ruby_version = ">= 2.5.0" 46 | end 47 | -------------------------------------------------------------------------------- /lib/miyano/build/bear.rb: -------------------------------------------------------------------------------- 1 | require "zip" 2 | require "beardown" 3 | require "tilt" 4 | 5 | module Miyano 6 | class Builder 7 | protected 8 | def build_bear 9 | require "beardown/compat" if File.exist? "post/.compat" 10 | files = Dir["post/*.bearnote"] 11 | files.each do |f| 12 | name = File.basename(f, ".*") 13 | bearnote = Zip::File.open f 14 | 15 | # the name of the zip file maybe different from the name of zip dir 16 | # i.e. first zip as `foo.zip`, the zip dir is `foo`, then rename to `bar.zip`, the zip dir still remains `foo` 17 | #zipdir = File.dirname bearnote.entries[0].name 18 | #zipdir = zipdir.force_encoding "UTF-8" 19 | zipdir = getZipDir bearnote.entries[0].name 20 | assets = bearnote.glob("#{zipdir}/assets/*") 21 | dir = "_site/#{name}/assets" 22 | assets.each do |asset| 23 | FileUtils.mkdir_p dir 24 | path = File.join dir, File.basename(asset.name) 25 | asset.extract path unless File.exist? path 26 | end 27 | 28 | text = bearnote.glob("#{zipdir}/text.txt") 29 | .first.get_input_stream 30 | .read.force_encoding("UTF-8") 31 | 32 | FileUtils.mkdir_p "_site/#{name}" 33 | File.open("_site/#{name}/index.html", "w") do |html| 34 | html.write render_bear(f, text) 35 | end 36 | auto_orient_imgs(dir) if Dir.exist? dir 37 | end 38 | end 39 | 40 | def render_bear(f, text) 41 | doc = Beardown.new text 42 | name = File.basename f, ".*" 43 | name = name 44 | cre_date = File.birthtime f 45 | mod_date = File.mtime f 46 | 47 | post = Post.new name, cre_date, mod_date, doc.title, 48 | doc.html, doc.content, doc.tags 49 | @site.add_post post 50 | 51 | template = Tilt.new "layout/post.html.erb" 52 | template.render post 53 | end 54 | 55 | def getZipDir(str) 56 | while(str.include? "/") 57 | str = File.dirname str 58 | end 59 | return str 60 | end 61 | 62 | def auto_orient_imgs(dir) 63 | return unless check_imagemagick 64 | imgs = Dir["#{dir}/*.{jpg,jpeg,JPG,JPEG}"] 65 | imgs.each do |img| 66 | `convert -auto-orient #{img.inspect} #{img.inspect}` 67 | end 68 | end 69 | 70 | def check_imagemagick 71 | system "convert -version >/dev/null" 72 | system "brew install imagemagick graphicsmagick" unless $?.success? 73 | unless $?.success? 74 | system "/usr/bin/ruby -e '$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)'" 75 | system "brew install imagemagick graphicsmagick" if $?.success? 76 | end 77 | system "convert -version >/dev/null" 78 | end 79 | 80 | end 81 | end 82 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Miyano 2 | 3 | This small tool is designed for [Bear](http://www.bear-writer.com) lovers. 4 | 5 | Focus on the right thing - writing the content. 6 | 7 | To use this tool, you need to export your bearnotes and run some simple commands in the Terminal App. 8 | 9 | ## Requirements 10 | 11 | - MacOS 12 | - [Ruby >= 2.5.0](https://gorails.com/setup/osx/10.13-high-sierra/#ruby) 13 | 14 | ## Installation 15 | 16 | $ gem install miyano 17 | 18 | ## Usage 19 | 20 | ### About the commands 21 | $ miyano help 22 | Commands: 23 | miyano build # build posts and layouts 24 | miyano help [COMMAND] # Describe available commands or one specific command 25 | miyano new [DIR] # create new blog 26 | miyano push # push to Github Pages 27 | miyano try # try as a local web server 28 | miyano version # show version 29 | 30 | ### Create new blog 31 | 32 | $ miyano new myblog 33 | 34 | If you use Bear in **Markdown Compatibility Mode**, use option `-m` 35 | 36 | $ miyano new myblog -m 37 | 38 | ### Change dir 39 | 40 | $ cd myblog 41 | 42 | ### Open Bear App and Export your selected notes into the Post Dictionary 43 | 44 | ### Build and Try it 45 | 46 | $ miyano build // convert the bearnotes to html files 47 | 48 | $ miyano try // start a local server 49 | 50 | Or 51 | 52 | $ miyano build; miyano try 53 | 54 | Then open browser and go to `localhost:8000` 55 | `Ctrl + C` to Quit 56 | 57 | ### Serve at Github Pages 58 | 59 | $ miyano push 60 | 61 | ### Serve at VPS 62 | 63 | You need to config the *git* server at your VPS to sync the static html files, and `miyano push` to that server. 64 | Then don't use the `miyano try` as a Web Server, use `Nginx` as a proxy instead. 65 | 66 | ### Themes 67 | 68 | For programmers.(Html, Css, and Basic OOP) 69 | 70 | The `layout` folder determines how the blog looks like. 71 | I use `erb` as a template. 72 | 73 | The `index.html.erb` has the instance of Class `Site`, check the methods you can use in the source [lib/miyano/site.rb](https://github.com/wuusn/miyano/blob/master/lib/miyano/site.rb). 74 | 75 | Similarly, the `post.html.erb` has a instance of Class `Post`, check [lib/miyano/post.rb](https://github.com/wuusn/miyano/blob/master/lib/miyano/post.rb). 76 | 77 | Check more on the [Wiki Page](https://github.com/wuusn/miyano/wiki/Theme-and-Layout) 78 | 79 | ## Parser of Polar Bear Markup Language 80 | I made these parsers, [beardown](https://github.com/wuusn/beardown) and [beardown-compat](https://github.com/wuusn/beardown-compat). 81 | 82 | If you find any error render(different from the Bear App), contact me 83 | or open an issue in [Beardown Issues](https://github.com/wuusn/beardown/issues) 84 | 85 | ## Join the Telegram Group to get support 86 | [Miyano for Bear](https://t.me/m1yano) 87 | 88 | ## If you like it, please give a star to let me know 89 | 90 | ## Contributing 91 | 92 | Bug reports and pull requests are welcome on GitHub at https://github.com/wuusn/miyano. 93 | 94 | ## License 95 | 96 | The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT). 97 | --------------------------------------------------------------------------------