style-script 1.0.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.
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) Danilo Lekovic, Jeremy Ashkenas
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
data/bin/style ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "#{File.dirname(__FILE__)}/../lib/style_script/command_line.rb"
4
+
5
+ StyleScript::CommandLine.new
@@ -0,0 +1,57 @@
1
+ # After wycats' http://yehudakatz.com/2010/02/07/the-building-blocks-of-ruby/
2
+
3
+ # Sinatra.
4
+ get '/hello', ->
5
+ 'Hello World'
6
+
7
+
8
+ # Append.
9
+ append: (location, data) ->
10
+ path: new Pathname location
11
+ throw "Location does not exist" unless path.exists()
12
+
13
+ File.open path, 'a', (file) ->
14
+ file.puts YAML.dump data
15
+
16
+ data
17
+
18
+
19
+ # Rubinius' File.open implementation.
20
+ File.open: (path, mode, block) ->
21
+ io: new File path, mode
22
+
23
+ return io unless block
24
+
25
+ try
26
+ block io
27
+ finally
28
+ try
29
+ io.close() unless io.closed()
30
+ catch error
31
+ # nothing, just swallow them.
32
+
33
+
34
+ # Write.
35
+ write: (location, data) ->
36
+ path = new Pathname location
37
+ raise "Location does not exist" unless path.exists()
38
+
39
+ File.open path, 'w', (file) ->
40
+ return false if Digest.MD5.hexdigest(file.read()) is data.hash()
41
+ file.puts YAML.dump data
42
+ true
43
+
44
+
45
+ # Rails' respond_to.
46
+ index: ->
47
+ people: Person.find 'all'
48
+
49
+ respond_to (format) ->
50
+ format.html()
51
+ format.xml -> render { xml: people.xml() }
52
+
53
+
54
+ # Synchronization.
55
+ synchronize: (block) ->
56
+ lock()
57
+ try block() finally unlock()
@@ -0,0 +1,173 @@
1
+ # Functions:
2
+ square: (x) -> x * x
3
+
4
+ sum: (x, y) -> x + y
5
+
6
+ odd: (x) -> x % 2 isnt 0
7
+
8
+ even: (x) -> x % 2 is 0
9
+
10
+ run_loop: ->
11
+ fire_events((e) -> e.stopPropagation())
12
+ listen()
13
+ wait()
14
+
15
+ # Objects:
16
+ dense_object_literal: {one: 1, two: 2, three: 3}
17
+
18
+ spaced_out_multiline_object: {
19
+ pi: 3.14159
20
+ list: [1, 2, 3, 4]
21
+ regex: /match[ing](every|thing|\/)/gi
22
+ three: new Idea()
23
+
24
+ inner_obj: {
25
+ freedom: -> _.freedom()
26
+ }
27
+ }
28
+
29
+ # Arrays:
30
+ stooges: [{moe: 45}, {curly: 43}, {larry: 46}]
31
+
32
+ exponents: [(x) -> x, (x) -> x * x, (x) -> x * x * x]
33
+
34
+ empty: []
35
+
36
+ multiline: [
37
+ 'line one'
38
+ 'line two'
39
+ ]
40
+
41
+ # Conditionals and ternaries.
42
+ if submarine.shields_up
43
+ full_speed_ahead()
44
+ fire_torpedos()
45
+ else if submarine.sinking
46
+ abandon_ship()
47
+ else
48
+ run_away()
49
+
50
+ eldest: if 25 > 21 then liz else marge
51
+
52
+ decoration: medal_of_honor if war_hero
53
+
54
+ go_to_sleep() unless style
55
+
56
+ # Returning early:
57
+ race: ->
58
+ run()
59
+ walk()
60
+ crawl()
61
+ if tired then return sleep()
62
+ race()
63
+
64
+ # Conditional assignment:
65
+ good ||= evil
66
+ wine &&= cheese
67
+
68
+ # Nested property access and calls.
69
+ ((moon.turn(360))).shapes[3].move({x: 45, y: 30}).position['top'].offset('x')
70
+
71
+ a: b: c: 5
72
+
73
+ # Embedded JavaScript.
74
+ callback(
75
+ `function(e) { e.stop(); }`
76
+ )
77
+
78
+ # Try/Catch/Finally/Throw.
79
+ try
80
+ all_hell_breaks_loose()
81
+ dogs_and_cats_living_together()
82
+ throw "up"
83
+ catch error
84
+ print(error)
85
+ finally
86
+ clean_up()
87
+
88
+ try all_hell_breaks_loose() catch error then print(error) finally clean_up()
89
+
90
+ # While loops, break and continue.
91
+ while demand > supply
92
+ sell()
93
+ restock()
94
+
95
+ while supply > demand then buy()
96
+
97
+ while true
98
+ break if broken
99
+ continue if continuing
100
+
101
+ # Unary operators.
102
+ !!true
103
+
104
+ # Lexical scoping.
105
+ v_1: 5
106
+ change_a_and_set_b: ->
107
+ v_1: 10
108
+ v_2: 15
109
+ v_2: 20
110
+
111
+ # Array comprehensions.
112
+ supper: food.capitalize() for food in ['toast', 'cheese', 'wine']
113
+
114
+ drink(bottle) for bottle, i in ['soda', 'wine', 'lemonade'] when even(i)
115
+
116
+ # Switch statements ("else" serves as a default).
117
+ activity: switch day
118
+ when "Tuesday" then eat_breakfast()
119
+ when "Sunday" then go_to_church()
120
+ when "Saturday" then go_to_the_park()
121
+ when "Wednesday"
122
+ if day is bingo_day
123
+ go_to_bingo()
124
+ else
125
+ eat_breakfast()
126
+ go_to_work()
127
+ eat_dinner()
128
+ else go_to_work()
129
+
130
+ # Semicolons can optionally be used instead of newlines.
131
+ wednesday: -> eat_breakfast(); go_to_work(); eat_dinner()
132
+
133
+ # Array slice literals.
134
+ zero_to_nine: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
135
+ three_to_six: zero_to_nine[3..6]
136
+
137
+ # Multiline strings with inner quotes.
138
+ story: "Lorem ipsum dolor \"sit\" amet, consectetuer adipiscing elit,
139
+ sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna
140
+ aliquam erat volutpat. Ut wisi enim ad."
141
+
142
+ # Inheritance and calling super.
143
+ Animal: ->
144
+ Animal::move: (meters) ->
145
+ alert(this.name + " moved " + meters + "m.")
146
+
147
+ Snake: (name) -> this.name: name
148
+ Snake extends Animal
149
+ Snake::move: ->
150
+ alert('Slithering...')
151
+ super(5)
152
+
153
+ Horse: (name) -> this.name: name
154
+ Horse extends Animal
155
+ Horse::move: ->
156
+ alert('Galloping...')
157
+ super(45)
158
+
159
+ sam: new Snake("Sammy the Snake")
160
+ tom: new Horse("Tommy the Horse")
161
+
162
+ sam.move()
163
+ tom.move()
164
+
165
+ # Numbers.
166
+ a_googol: 1e100
167
+ hex: 0xff0000
168
+ negative: -1.0
169
+ infinity: Infinity
170
+ nan: NaN
171
+
172
+ # Deleting.
173
+ delete secret.identity
@@ -0,0 +1 @@
1
+ console.log "Hey"
@@ -0,0 +1,186 @@
1
+ # Examples from the Poignant Guide.
2
+
3
+ # ['toast', 'cheese', 'wine'].each { |food| print food.capitalize }
4
+
5
+ ['toast', 'wine', 'cheese'].each (food) -> print(food.capitalize())
6
+
7
+
8
+
9
+ # class LotteryTicket
10
+ # def picks; @picks; end
11
+ # def picks=(var); @picks = var; end
12
+ # def purchased; @purchased; end
13
+ # def purchased=(var); @purchased = var; end
14
+ # end
15
+
16
+ LotteryTicket: {
17
+ get_picks: -> this.picks
18
+ set_picks: (nums) -> this.picks: nums
19
+ get_purchase: -> this.purchase
20
+ set_purchase: (amount) -> this.purchase: amount
21
+ }
22
+
23
+
24
+
25
+ # class << LotteryDraw
26
+ # def play
27
+ # result = LotteryTicket.new_random
28
+ # winners = {}
29
+ # @@tickets.each do |buyer, ticket_list|
30
+ # ticket_list.each do |ticket|
31
+ # score = ticket.score( result )
32
+ # next if score.zero?
33
+ # winners[buyer] ||= []
34
+ # winners[buyer] << [ ticket, score ]
35
+ # end
36
+ # end
37
+ # @@tickets.clear
38
+ # winners
39
+ # end
40
+ # end
41
+
42
+ LotteryDraw: {
43
+ play: ->
44
+ result: LotteryTicket.new_random()
45
+ winners: {}
46
+ this.tickets.each (buyer, ticket_list) ->
47
+ ticket_list.each (ticket) ->
48
+ score: ticket.score(result)
49
+ return if score is 0
50
+ winners[buyer] ||= []
51
+ winners[buyer].push([ticket, score])
52
+ this.tickets: {}
53
+ winners
54
+ }
55
+
56
+
57
+
58
+ # module WishScanner
59
+ # def scan_for_a_wish
60
+ # wish = self.read.detect do |thought|
61
+ # thought.index( 'wish: ' ) == 0
62
+ # end
63
+ # wish.gsub( 'wish: ', '' )
64
+ # end
65
+ # end
66
+
67
+ WishScanner: {
68
+ scan_for_a_wish: ->
69
+ wish: this.read().detect((thought) -> thought.index('wish: ') is 0)
70
+ wish.replace('wish: ', '')
71
+ }
72
+
73
+
74
+
75
+ # class Creature
76
+ #
77
+ # # This method applies a hit taken during a fight.
78
+ # def hit( damage )
79
+ # p_up = rand( charisma )
80
+ # if p_up % 9 == 7
81
+ # @life += p_up / 4
82
+ # puts "[#{ self.class } magick powers up #{ p_up }!]"
83
+ # end
84
+ # @life -= damage
85
+ # puts "[#{ self.class } has died.]" if @life <= 0
86
+ # end
87
+ #
88
+ # # This method takes one turn in a fight.
89
+ # def fight( enemy, weapon )
90
+ # if life <= 0
91
+ # puts "[#{ self.class } is too dead to fight!]"
92
+ # return
93
+ # end
94
+ #
95
+ # # Attack the opponent
96
+ # your_hit = rand( strength + weapon )
97
+ # puts "[You hit with #{ your_hit } points of damage!]"
98
+ # enemy.hit( your_hit )
99
+ #
100
+ # # Retaliation
101
+ # p enemy
102
+ # if enemy.life > 0
103
+ # enemy_hit = rand( enemy.strength + enemy.weapon )
104
+ # puts "[Your enemy hit with #{ enemy_hit } points of damage!]"
105
+ # self.hit( enemy_hit )
106
+ # end
107
+ # end
108
+ #
109
+ # end
110
+
111
+ Creature : {
112
+
113
+ # This method applies a hit taken during a fight.
114
+ hit: (damage) ->
115
+ p_up: Math.rand(this.charisma)
116
+ if p_up % 9 is 7
117
+ this.life += p_up / 4
118
+ puts("[" + this.name + " magick powers up " + p_up + "!]")
119
+ this.life -= damage
120
+ if this.life <= 0 then puts("[" + this.name + " has died.]")
121
+
122
+ # This method takes one turn in a fight.
123
+ fight: (enemy, weapon) ->
124
+ if this.life <= 0 then return puts("[" + this.name + "is too dead to fight!]")
125
+
126
+ # Attack the opponent.
127
+ your_hit: Math.rand(this.strength + weapon)
128
+ puts("[You hit with " + your_hit + "points of damage!]")
129
+ enemy.hit(your_hit)
130
+
131
+ # Retaliation.
132
+ puts(enemy)
133
+ if enemy.life > 0
134
+ enemy_hit: Math.rand(enemy.strength + enemy.weapon)
135
+ puts("[Your enemy hit with " + enemy_hit + "points of damage!]")
136
+ this.hit(enemy_hit)
137
+
138
+ }
139
+
140
+
141
+
142
+ # # Get evil idea and swap in code words
143
+ # print "Enter your new idea: "
144
+ # idea = gets
145
+ # code_words.each do |real, code|
146
+ # idea.gsub!( real, code )
147
+ # end
148
+ #
149
+ # # Save the jibberish to a new file
150
+ # print "File encoded. Please enter a name for this idea: "
151
+ # idea_name = gets.strip
152
+ # File::open( "idea-" + idea_name + ".txt", "w" ) do |f|
153
+ # f << idea
154
+ # end
155
+
156
+ # Get evil idea and swap in code words
157
+ print("Enter your new idea: ")
158
+ idea: gets()
159
+ code_words.each((real, code) -> idea.replace(real, code))
160
+
161
+ # Save the jibberish to a new file
162
+ print("File encoded. Please enter a name for this idea: ")
163
+ idea_name: gets().strip()
164
+ File.open("idea-" + idea_name + '.txt', 'w', (file) -> file.write(idea))
165
+
166
+
167
+
168
+ # def wipe_mutterings_from( sentence )
169
+ # unless sentence.respond_to? :include?
170
+ # raise ArgumentError,
171
+ # "cannot wipe mutterings from a #{ sentence.class }"
172
+ # end
173
+ # while sentence.include? '('
174
+ # open = sentence.index( '(' )
175
+ # close = sentence.index( ')', open )
176
+ # sentence[open..close] = '' if close
177
+ # end
178
+ # end
179
+
180
+ wipe_mutterings_from: (sentence) ->
181
+ throw new Error("cannot wipe mutterings") unless sentence.indexOf
182
+ while sentence.indexOf('(') >= 0
183
+ open: sentence.indexOf('(') - 1
184
+ close: sentence.indexOf(')') + 1
185
+ sentence: sentence[0..open] + sentence[close..sentence.length]
186
+ sentence