christmas_tree 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6cb268f381e6f5ba32946a2d8a4e2cb08143c6a14fe0da10712657d822571915
4
+ data.tar.gz: '086a429650087299acd5b3057b169699f9018399de7d0b4b0bd1221344626efb'
5
+ SHA512:
6
+ metadata.gz: 9998e5cbfdfacd6b244ee4aa264b1bbf84ec38948991152718fe202bf81b900c05a3234a31a9d7f48dae88396d8dfb97163be5b3a3383c35e64c950972d7f505
7
+ data.tar.gz: 1c9861ea92dbd39530818009ebd7eff9b9af33150de7a6e6e31a9ad72ab63b03aee13230a28d4305539000e334231ebd0f2acba165cfcce8ae5a06452e0612a4
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 Mark24
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 all
13
+ 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 THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # ChristmasTree
2
+
3
+ christmas tree cli
4
+
5
+ # dependency
6
+
7
+ System dependencies:
8
+
9
+ - Ruby 3.0+
10
+ - Ncurses: macos: `brew install ncurses`
11
+
12
+ Ruby Gem:
13
+
14
+ - Curses: `gem install curses``
15
+
16
+ # local run
17
+
18
+ `ruby christmas_tree.rb`
19
+
20
+ `./christmas_tree.rb`
21
+
22
+ ## add your name
23
+
24
+ `./christmas_tree.rb --name <your name>`
25
+
26
+ # remote run
27
+
28
+ `ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Mark24Code/christmas_tree/main/christmas_tree.rb)"`
29
+
30
+ ## add your name
31
+
32
+ `ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Mark24Code/christmas_tree/main/christmas_tree.rb)" -- -n <your name>`
33
+
34
+ # preview
35
+
36
+ ![img](./demo.png)
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ task default: %i[]
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/christmas_tree/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "christmas_tree"
7
+ spec.version = ChristmasTree::VERSION
8
+ spec.authors = ["Mark24Code"]
9
+ spec.email = ["mark.zhangyoung@gmail.com"]
10
+
11
+ spec.summary = "Christmas tree cli "
12
+ spec.description = "Christmas tree cli "
13
+ spec.homepage = "https://github.com/Mark24Code/christmas_tree"
14
+ spec.license = "MIT"
15
+ spec.required_ruby_version = ">= 2.6.0"
16
+
17
+ spec.metadata["homepage_uri"] = spec.homepage
18
+ spec.metadata["source_code_uri"] = "https://github.com/Mark24Code/christmas_tree"
19
+ spec.metadata["changelog_uri"] = "https://github.com/Mark24Code/christmas_tree"
20
+
21
+ # Specify which files should be added to the gem when it is released.
22
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
+ spec.files = Dir.chdir(__dir__) do
24
+ `git ls-files -z`.split("\x0").reject do |f|
25
+ (File.expand_path(f) == __FILE__) ||
26
+ f.start_with?(*%w[bin/ test/ spec/ features/ .git appveyor Gemfile])
27
+ end
28
+ end
29
+ spec.bindir = "exe"
30
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
31
+ spec.require_paths = ["lib"]
32
+
33
+ # Uncomment to register a new dependency of your gem
34
+ spec.add_dependency "curses", "~> 1.4.4"
35
+
36
+ # For more information and examples about making a new gem, check out our
37
+ # guide at: https://bundler.io/guides/creating_gem.html
38
+ end
data/christmas_tree.rb ADDED
File without changes
data/demo.png ADDED
Binary file
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+ require 'curses'
3
+ require_relative '../lib/christmas_tree'
4
+
5
+ begin
6
+ options = {}
7
+ OptionParser.new do |opts|
8
+ opts.banner = "Usage: example.rb [options]"
9
+
10
+ opts.on("-nNAME", "--name=NAME", "name") do |name|
11
+ options[:name] = name
12
+ end
13
+ end.parse!
14
+
15
+ ChristmasTree::Tree.new(options[:name]).draw
16
+ ensure
17
+ Curses.close_screen
18
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ChristmasTree
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,184 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "christmas_tree/version"
4
+
5
+ require 'optparse'
6
+ require 'curses'
7
+
8
+
9
+ Curses.init_screen
10
+ Curses.noecho
11
+ Curses.curs_set(0)
12
+
13
+ COLORS_ORDER = [
14
+ :black, :red, :green, :yellow, :blue, :magenta, :cyan, :white,
15
+ :bright_black, :bright_red, :bright_green, :bright_yellow,
16
+ :bright_blue, :bright_magenta, :bright_cyan, :bright_white
17
+ ]
18
+
19
+ COLORS_MAP = {}
20
+ Curses.start_color
21
+ COLORS_ORDER.length.times { |i|
22
+ Curses.init_pair(i, i, 0)
23
+ COLORS_MAP[COLORS_ORDER[i]] = Curses.color_pair(i)
24
+ }
25
+
26
+ FONT_WEIGHT_MAP = {
27
+ normal: Curses::A_NORMAL,
28
+ bold: Curses::A_BOLD,
29
+ }
30
+
31
+
32
+ module ChristmasTree
33
+ class Token
34
+ attr_accessor :content, :font_weight, :color_pair
35
+ def initialize(content, color_pair = nil, font_weight = nil)
36
+ @content = content
37
+ @font_weight = font_weight || :normal
38
+ @color_pair = color_pair || :white
39
+ end
40
+
41
+ def length
42
+ @content.length
43
+ end
44
+
45
+ def draw(&block)
46
+ Curses.attron(COLORS_MAP[@color_pair] | FONT_WEIGHT_MAP[@font_weight] ){
47
+ yield @content
48
+ }
49
+ end
50
+ end
51
+
52
+ class Error < StandardError; end
53
+
54
+ class Tree
55
+ CHAR_SPACE = ' '
56
+ def initialize(name = nil, layer_count = 10)
57
+ @name = name
58
+ @buffer_count = layer_count
59
+ @scale = 3
60
+ @buffer = []
61
+ @light_char = 'o'
62
+ @snow_char = '*'
63
+ @light_colors = COLORS_ORDER
64
+ @speed = 3 # 3 times per second
65
+ @width = nil
66
+ end
67
+
68
+ def tree_crown
69
+ (1..@buffer_count).each do |count|
70
+ total = 2*count-1
71
+ index_arr = []
72
+ line = []
73
+
74
+ total.times.each do |i|
75
+ index_arr.push(i)
76
+ line << Token.new("*", :green)
77
+ end
78
+
79
+
80
+
81
+ # snow
82
+ snow_random_count = (total * 0.3).to_i
83
+ snow_random_count.times {
84
+ choose_index = index_arr.sample
85
+ line[choose_index] = Token.new(@snow_char, :white)
86
+ }
87
+
88
+ # light
89
+ light_random_count = (total * 0.3).to_i
90
+ light_random_count.times {
91
+ choose_index = index_arr.sample
92
+ line[choose_index] = Token.new(@light_char, @light_colors.sample)
93
+ }
94
+ @buffer << line
95
+ end
96
+ end
97
+
98
+ def tree_trunk(height=2)
99
+ height.times {
100
+ @buffer << [Token.new("mWm", :white)]
101
+ }
102
+ end
103
+
104
+
105
+ def color_tokens(text)
106
+ text.split("").map {|c| Token.new(c, @light_colors.sample, :bold)}
107
+ end
108
+
109
+ def footer_text
110
+ @buffer << [Token.new("MARRY CHRISTMAS", :yellow)]
111
+
112
+ # name
113
+ if @name
114
+ name = "@"+@name.strip
115
+ line = []
116
+ color_tokens(name).each do |code|
117
+ line << code
118
+ end
119
+
120
+ @buffer << line
121
+ end
122
+
123
+ # code
124
+ line = [Token.new("And lots of ", :yellow)]
125
+ color_tokens("CODE").each do |code|
126
+ line << code
127
+ end
128
+ line << Token.new(" in #{Time.now.year + 1}", :yellow)
129
+ @buffer << line
130
+ end
131
+
132
+ def border(height=4)
133
+ height.times {
134
+ @buffer << [Token.new(CHAR_SPACE)]
135
+ }
136
+ end
137
+
138
+ def draw_canvas
139
+ @buffer = []
140
+ border(3)
141
+ tree_crown
142
+ tree_trunk
143
+ footer_text
144
+ border(3)
145
+
146
+ if !@width
147
+ @width = (@buffer.map {|l| real_width(l)}).max * @scale
148
+ end
149
+
150
+ @buffer.each_with_index do |buffer_line,y|
151
+ x = (@width - real_width(buffer_line)) / 2
152
+ Curses.setpos(y, x)
153
+ buffer_line.each do |token|
154
+ token.draw do |text|
155
+ Curses.addstr(text)
156
+ end
157
+ end
158
+ end
159
+ end
160
+
161
+ def line_process(line)
162
+ half_space = CHAR_SPACE * ((@width - real_width(line)) / 2)
163
+ "#{half_space}#{line}#{half_space}"
164
+ end
165
+
166
+ def real_width(line)
167
+ line.map {|token| token.length }.sum
168
+ end
169
+
170
+
171
+ def clean_screen
172
+ Curses.clear
173
+ end
174
+
175
+ def draw
176
+ clean_screen
177
+ while true
178
+ draw_canvas
179
+ Curses.refresh
180
+ sleep 1.0/@speed
181
+ end
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,4 @@
1
+ module ChristmasTree
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: christmas_tree
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Mark24Code
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2023-12-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: curses
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.4.4
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.4.4
27
+ description: 'Christmas tree cli '
28
+ email:
29
+ - mark.zhangyoung@gmail.com
30
+ executables:
31
+ - christmas_tree
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - LICENSE
36
+ - README.md
37
+ - Rakefile
38
+ - christmas_tree.gemspec
39
+ - christmas_tree.rb
40
+ - demo.png
41
+ - exe/christmas_tree
42
+ - lib/christmas_tree.rb
43
+ - lib/christmas_tree/version.rb
44
+ - sig/christmas_tree.rbs
45
+ homepage: https://github.com/Mark24Code/christmas_tree
46
+ licenses:
47
+ - MIT
48
+ metadata:
49
+ homepage_uri: https://github.com/Mark24Code/christmas_tree
50
+ source_code_uri: https://github.com/Mark24Code/christmas_tree
51
+ changelog_uri: https://github.com/Mark24Code/christmas_tree
52
+ post_install_message:
53
+ rdoc_options: []
54
+ require_paths:
55
+ - lib
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 2.6.0
61
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ requirements: []
67
+ rubygems_version: 3.4.22
68
+ signing_key:
69
+ specification_version: 4
70
+ summary: Christmas tree cli
71
+ test_files: []