├── 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 |
--------------------------------------------------------------------------------