blockly_interpreter 0.2.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 +7 -0
- data/.gitignore +8 -0
- data/.travis.yml +4 -0
- data/CHANGELOG.md +12 -0
- data/COPYING +8 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +91 -0
- data/Guardfile +22 -0
- data/README.md +72 -0
- data/Rakefile +10 -0
- data/app/assets/javascripts/blockly_interpreter/extension_blocks.js +1 -0
- data/app/assets/javascripts/blockly_interpreter/extension_blocks/dates.js +16 -0
- data/app/assets/javascripts/blockly_interpreter/extension_blocks/debugging.js +17 -0
- data/app/assets/javascripts/blockly_interpreter/extension_blocks/lists.js +45 -0
- data/app/assets/javascripts/blockly_interpreter/extension_blocks/logic.js +274 -0
- data/app/assets/javascripts/blockly_interpreter/extension_blocks/text.js.erb +21 -0
- data/bin/_guard-core +16 -0
- data/bin/console +14 -0
- data/bin/guard +16 -0
- data/bin/rake +16 -0
- data/bin/setup +7 -0
- data/blockly_interpreter.gemspec +33 -0
- data/exe/blocklyi +13 -0
- data/exe/rublocklyc +31 -0
- data/lib/blockly_interpreter.rb +25 -0
- data/lib/blockly_interpreter/block.rb +113 -0
- data/lib/blockly_interpreter/block_library.rb +14 -0
- data/lib/blockly_interpreter/console_interpreter.rb +15 -0
- data/lib/blockly_interpreter/core_blocks.rb +55 -0
- data/lib/blockly_interpreter/core_blocks/arithmetic_operator_block.rb +24 -0
- data/lib/blockly_interpreter/core_blocks/boolean_block.rb +23 -0
- data/lib/blockly_interpreter/core_blocks/comparison_operator_block.rb +50 -0
- data/lib/blockly_interpreter/core_blocks/for_block.rb +68 -0
- data/lib/blockly_interpreter/core_blocks/for_each_block.rb +42 -0
- data/lib/blockly_interpreter/core_blocks/get_variable_block.rb +19 -0
- data/lib/blockly_interpreter/core_blocks/if_block.rb +105 -0
- data/lib/blockly_interpreter/core_blocks/lists_create_empty_block.rb +17 -0
- data/lib/blockly_interpreter/core_blocks/lists_create_with_block.rb +48 -0
- data/lib/blockly_interpreter/core_blocks/lists_get_index_block.rb +95 -0
- data/lib/blockly_interpreter/core_blocks/logic_negate_block.rb +20 -0
- data/lib/blockly_interpreter/core_blocks/logical_operator_block.rb +22 -0
- data/lib/blockly_interpreter/core_blocks/number_block.rb +23 -0
- data/lib/blockly_interpreter/core_blocks/procedure_block.rb +49 -0
- data/lib/blockly_interpreter/core_blocks/procedures_call_no_return_block.rb +21 -0
- data/lib/blockly_interpreter/core_blocks/procedures_call_return_block.rb +21 -0
- data/lib/blockly_interpreter/core_blocks/procedures_def_no_return_block.rb +31 -0
- data/lib/blockly_interpreter/core_blocks/procedures_def_return_block.rb +64 -0
- data/lib/blockly_interpreter/core_blocks/procedures_if_return_block.rb +45 -0
- data/lib/blockly_interpreter/core_blocks/repeat_times_block.rb +33 -0
- data/lib/blockly_interpreter/core_blocks/set_variable_block.rb +24 -0
- data/lib/blockly_interpreter/core_blocks/text_block.rb +23 -0
- data/lib/blockly_interpreter/core_blocks/text_change_case_block.rb +32 -0
- data/lib/blockly_interpreter/core_blocks/text_join_block.rb +50 -0
- data/lib/blockly_interpreter/dsl.rb +291 -0
- data/lib/blockly_interpreter/dsl_generator.rb +147 -0
- data/lib/blockly_interpreter/engine.rb +8 -0
- data/lib/blockly_interpreter/execution_context.rb +72 -0
- data/lib/blockly_interpreter/extension_blocks.rb +25 -0
- data/lib/blockly_interpreter/extension_blocks/date_today_block.rb +17 -0
- data/lib/blockly_interpreter/extension_blocks/debug_message_block.rb +18 -0
- data/lib/blockly_interpreter/extension_blocks/lists_append_block.rb +34 -0
- data/lib/blockly_interpreter/extension_blocks/lists_concat_block.rb +37 -0
- data/lib/blockly_interpreter/extension_blocks/lists_include_operator_block.rb +52 -0
- data/lib/blockly_interpreter/extension_blocks/object_present_block.rb +21 -0
- data/lib/blockly_interpreter/extension_blocks/switch_block.rb +107 -0
- data/lib/blockly_interpreter/extension_blocks/text_inflect_block.rb +27 -0
- data/lib/blockly_interpreter/generic_block_dsl_generator.rb +64 -0
- data/lib/blockly_interpreter/interpreter.rb +25 -0
- data/lib/blockly_interpreter/parser.rb +117 -0
- data/lib/blockly_interpreter/program.rb +51 -0
- data/lib/blockly_interpreter/program_cache.rb +19 -0
- data/lib/blockly_interpreter/test_helper.rb +98 -0
- data/lib/blockly_interpreter/version.rb +3 -0
- metadata +272 -0
@@ -0,0 +1,21 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
goog.provide('BlocklyInterpreter.ExtensionBlocks.text');
|
4
|
+
goog.require('Blockly.Blocks');
|
5
|
+
|
6
|
+
Blockly.Blocks['text_inflect'] = {
|
7
|
+
init: function() {
|
8
|
+
var inflections = <%= BlocklyInterpreter::ExtensionBlocks::TextInflectBlock::INFLECTIONS.to_json %>;
|
9
|
+
var dropdownOptions = _.map(inflections, function (inflection) {
|
10
|
+
return [inflection, inflection]
|
11
|
+
});
|
12
|
+
|
13
|
+
this.appendValueInput('TEXT')
|
14
|
+
.appendField(new Blockly.FieldDropdown(dropdownOptions), 'OP')
|
15
|
+
.appendField('text')
|
16
|
+
.setCheck('String');
|
17
|
+
|
18
|
+
this.setOutput(true, 'String');
|
19
|
+
this.setColour(Blockly.Blocks.texts.HUE);
|
20
|
+
}
|
21
|
+
}
|
data/bin/_guard-core
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application '_guard-core' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('guard', '_guard-core')
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "blockly_interpreter"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/guard
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'guard' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('guard', 'guard')
|
data/bin/rake
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rake' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('rake', 'rake')
|
data/bin/setup
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'blockly_interpreter/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "blockly_interpreter"
|
8
|
+
spec.version = BlocklyInterpreter::VERSION
|
9
|
+
spec.authors = ["Nat Budin"]
|
10
|
+
spec.email = ["natbudin@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{An interpreter for Blockly programs}
|
13
|
+
spec.description = %q{Blockly is a library from Google for building visual programming editors. This gem is an interpreter for Blockly programs in Ruby.}
|
14
|
+
spec.homepage = "https://github.com/patientslikeme/blockly_interpreter"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
|
+
spec.bindir = "exe"
|
18
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "nokogiri"
|
22
|
+
spec.add_dependency "activesupport"
|
23
|
+
|
24
|
+
spec.add_development_dependency "bundler", "~> 1.10"
|
25
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
26
|
+
spec.add_development_dependency "minitest"
|
27
|
+
spec.add_development_dependency "minitest-reporters"
|
28
|
+
spec.add_development_dependency "timecop"
|
29
|
+
spec.add_development_dependency "pry"
|
30
|
+
spec.add_development_dependency "guard"
|
31
|
+
spec.add_development_dependency "guard-minitest"
|
32
|
+
spec.add_development_dependency "terminal-notifier-guard"
|
33
|
+
end
|
data/exe/blocklyi
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "blockly_interpreter"
|
5
|
+
|
6
|
+
program_name = ARGV[0]
|
7
|
+
unless program_name
|
8
|
+
puts "Please specify a program name to run."
|
9
|
+
exit!
|
10
|
+
end
|
11
|
+
|
12
|
+
xml = File.open(program_name).read
|
13
|
+
BlocklyInterpreter::ConsoleInterpreter.new(xml).execute
|
data/exe/rublocklyc
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "blockly_interpreter"
|
5
|
+
|
6
|
+
program_name = ARGV[0]
|
7
|
+
unless program_name
|
8
|
+
puts "Please specify a program name to compile."
|
9
|
+
exit!
|
10
|
+
end
|
11
|
+
|
12
|
+
module ConsoleDSL
|
13
|
+
def console_print(content = nil, &proc)
|
14
|
+
block :console_print do
|
15
|
+
value :VALUE do
|
16
|
+
if block_given?
|
17
|
+
instance_exec &proc
|
18
|
+
else
|
19
|
+
text content
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
BlocklyInterpreter::DSL::BlockContext.send :include, ConsoleDSL
|
26
|
+
|
27
|
+
xml = BlocklyInterpreter::DSL.build_xml do
|
28
|
+
binding.eval(File.open(program_name).read, program_name)
|
29
|
+
end
|
30
|
+
|
31
|
+
STDOUT.write xml
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "blockly_interpreter/version"
|
2
|
+
require "active_support/dependencies/autoload"
|
3
|
+
require "active_support/core_ext"
|
4
|
+
|
5
|
+
if defined?(::Rails::Engine)
|
6
|
+
# Rails autoloading will take care of the requires for us, and explicitly doing it will
|
7
|
+
# break it.
|
8
|
+
require 'blockly_interpreter/engine'
|
9
|
+
else
|
10
|
+
module BlocklyInterpreter
|
11
|
+
extend ActiveSupport::Autoload
|
12
|
+
|
13
|
+
autoload :Block
|
14
|
+
autoload :BlockLibrary
|
15
|
+
autoload :CoreBlocks
|
16
|
+
autoload :DSL
|
17
|
+
autoload :DSLGenerator
|
18
|
+
autoload :ExecutionContext
|
19
|
+
autoload :GenericBlockDSLGenerator
|
20
|
+
autoload :Interpreter
|
21
|
+
autoload :Parser
|
22
|
+
autoload :ProgramCache
|
23
|
+
autoload :Program
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
|
3
|
+
class BlocklyInterpreter::Block
|
4
|
+
class << self
|
5
|
+
attr_accessor :block_type
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader :block_type, :values, :statements, :fields, :next_block, :mutation, :comment, :comment_pinned, :is_shadow, :x, :y
|
9
|
+
alias_method :is_shadow?, :is_shadow
|
10
|
+
|
11
|
+
def initialize(block_type, fields, values, statements, next_block, mutation, comment, comment_pinned, is_shadow, x, y)
|
12
|
+
@block_type = block_type
|
13
|
+
@fields = fields
|
14
|
+
@values = values
|
15
|
+
@statements = statements
|
16
|
+
@next_block = next_block
|
17
|
+
@mutation = mutation
|
18
|
+
@comment = comment
|
19
|
+
@comment_pinned = comment_pinned
|
20
|
+
@is_shadow = is_shadow
|
21
|
+
@x = x
|
22
|
+
@y = y
|
23
|
+
end
|
24
|
+
|
25
|
+
def execute_statement(execution_context)
|
26
|
+
end
|
27
|
+
|
28
|
+
def value(execution_context)
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
|
32
|
+
def each_block(iterate_subblocks = true)
|
33
|
+
return to_enum(:each_block, iterate_subblocks) unless block_given?
|
34
|
+
|
35
|
+
yield self
|
36
|
+
|
37
|
+
if iterate_subblocks
|
38
|
+
statements.each do |key, statement|
|
39
|
+
statement.each_block(iterate_subblocks) do |block|
|
40
|
+
yield block
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
if next_block
|
46
|
+
next_block.each_block(iterate_subblocks) do |block|
|
47
|
+
yield block
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def to_dsl
|
53
|
+
BlocklyInterpreter::GenericBlockDSLGenerator.new(self).dsl
|
54
|
+
end
|
55
|
+
|
56
|
+
def has_comment?
|
57
|
+
comment.present?
|
58
|
+
end
|
59
|
+
|
60
|
+
def has_position?
|
61
|
+
x || y
|
62
|
+
end
|
63
|
+
|
64
|
+
def to_xml_element(document)
|
65
|
+
tag_name = is_shadow ? 'shadow' : 'block'
|
66
|
+
|
67
|
+
Nokogiri::XML::Element.new(tag_name, document).tap do |node|
|
68
|
+
node['type'] = block_type
|
69
|
+
node['x'] = x if x
|
70
|
+
node['y'] = y if y
|
71
|
+
node.add_child(mutation.dup) if mutation
|
72
|
+
|
73
|
+
if comment
|
74
|
+
comment_node = Nokogiri::XML::Element.new('comment', document)
|
75
|
+
comment_node['pinned'] = 'true' if comment_pinned
|
76
|
+
node.add_child comment_node
|
77
|
+
end
|
78
|
+
|
79
|
+
fields.each do |name, value|
|
80
|
+
field_node = Nokogiri::XML::Element.new('field', document)
|
81
|
+
field_node['name'] = name
|
82
|
+
field_node.add_child Nokogiri::XML::Text.new(value, document)
|
83
|
+
node.add_child field_node
|
84
|
+
end
|
85
|
+
|
86
|
+
values.each do |name, value|
|
87
|
+
value_node = Nokogiri::XML::Element.new('value', document)
|
88
|
+
value_node['name'] = name
|
89
|
+
value_node.add_child value.to_xml_element(document)
|
90
|
+
node.add_child value_node
|
91
|
+
end
|
92
|
+
|
93
|
+
statements.each do |name, value|
|
94
|
+
statement_node = Nokogiri::XML::Element.new('statement', document)
|
95
|
+
statement_node['name'] = name
|
96
|
+
statement_node.add_child value.to_xml_element(document)
|
97
|
+
node.add_child statement_node
|
98
|
+
end
|
99
|
+
|
100
|
+
if next_block
|
101
|
+
next_block_node = Nokogiri::XML::Element.new('next_block', document)
|
102
|
+
next_block_node.add_child next_block.to_xml_element(document)
|
103
|
+
node.add_child next_block_node
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def to_xml(options = {})
|
109
|
+
doc = Nokogiri::XML::Document.new
|
110
|
+
element = to_xml_element(doc)
|
111
|
+
element.to_xml(options = {})
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module BlocklyInterpreter::BlockLibrary
|
2
|
+
attr_accessor :block_classes
|
3
|
+
|
4
|
+
def block_classes
|
5
|
+
@block_classes ||= []
|
6
|
+
end
|
7
|
+
|
8
|
+
def register!(parser_class = BlocklyInterpreter::Parser, block_context_class = BlocklyInterpreter::DSL::BlockContext)
|
9
|
+
block_classes.each do |block_class|
|
10
|
+
parser_class.register_block_class block_class
|
11
|
+
block_context_class.register_block_class block_class
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class BlocklyInterpreter::ConsoleInterpreter < BlocklyInterpreter::Interpreter
|
2
|
+
class ConsolePrintBlock < BlocklyInterpreter::Block
|
3
|
+
def execute_statement(execution_context)
|
4
|
+
puts values['VALUE'].value(execution_context)
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
def block_class_for_element(element)
|
9
|
+
case element['type']
|
10
|
+
when 'console_print' then ConsolePrintBlock
|
11
|
+
else
|
12
|
+
super(element)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module BlocklyInterpreter::CoreBlocks
|
2
|
+
extend ActiveSupport::Autoload
|
3
|
+
extend BlocklyInterpreter::BlockLibrary
|
4
|
+
|
5
|
+
autoload :ArithmeticOperatorBlock
|
6
|
+
autoload :BooleanBlock
|
7
|
+
autoload :ComparisonOperatorBlock
|
8
|
+
autoload :ForBlock
|
9
|
+
autoload :ForEachBlock
|
10
|
+
autoload :GetVariableBlock
|
11
|
+
autoload :IfBlock
|
12
|
+
autoload :ListsCreateEmptyBlock
|
13
|
+
autoload :ListsCreateWithBlock
|
14
|
+
autoload :ListsGetIndexBlock
|
15
|
+
autoload :LogicNegateBlock
|
16
|
+
autoload :LogicalOperatorBlock
|
17
|
+
autoload :NumberBlock
|
18
|
+
autoload :ProcedureBlock
|
19
|
+
autoload :ProceduresCallNoReturnBlock
|
20
|
+
autoload :ProceduresCallReturnBlock
|
21
|
+
autoload :ProceduresDefNoReturnBlock
|
22
|
+
autoload :ProceduresDefReturnBlock
|
23
|
+
autoload :ProceduresIfReturnBlock
|
24
|
+
autoload :RepeatTimesBlock
|
25
|
+
autoload :SetVariableBlock
|
26
|
+
autoload :TextBlock
|
27
|
+
autoload :TextChangeCaseBlock
|
28
|
+
autoload :TextJoinBlock
|
29
|
+
|
30
|
+
self.block_classes = [
|
31
|
+
ArithmeticOperatorBlock,
|
32
|
+
BooleanBlock,
|
33
|
+
ComparisonOperatorBlock,
|
34
|
+
ForBlock,
|
35
|
+
ForEachBlock,
|
36
|
+
GetVariableBlock,
|
37
|
+
IfBlock,
|
38
|
+
ListsCreateEmptyBlock,
|
39
|
+
ListsCreateWithBlock,
|
40
|
+
ListsGetIndexBlock,
|
41
|
+
LogicNegateBlock,
|
42
|
+
LogicalOperatorBlock,
|
43
|
+
NumberBlock,
|
44
|
+
ProceduresCallNoReturnBlock,
|
45
|
+
ProceduresCallReturnBlock,
|
46
|
+
ProceduresDefNoReturnBlock,
|
47
|
+
ProceduresDefReturnBlock,
|
48
|
+
ProceduresIfReturnBlock,
|
49
|
+
RepeatTimesBlock,
|
50
|
+
SetVariableBlock,
|
51
|
+
TextBlock,
|
52
|
+
TextChangeCaseBlock,
|
53
|
+
TextJoinBlock
|
54
|
+
]
|
55
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class BlocklyInterpreter::CoreBlocks::ArithmeticOperatorBlock < BlocklyInterpreter::Block
|
2
|
+
self.block_type = :math_arithmetic
|
3
|
+
|
4
|
+
def value(execution_context)
|
5
|
+
a = values['A'].value(execution_context)
|
6
|
+
b = values['B'].value(execution_context)
|
7
|
+
|
8
|
+
case fields['OP'].to_s.upcase
|
9
|
+
when 'ADD' then a + b
|
10
|
+
when 'MINUS' then a - b
|
11
|
+
when 'MULTIPLY' then a * b
|
12
|
+
when 'DIVIDE' then a / b
|
13
|
+
when 'POWER' then a ** b
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module DSLMethods
|
18
|
+
def math_arithmetic(op, a = nil, b = nil, &proc)
|
19
|
+
@blocks << BlocklyInterpreter::DSL::BinaryOperationBlockBuilder.new("math_arithmetic", op, a, b).tap do |builder|
|
20
|
+
builder.instance_exec(&proc) if block_given?
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class BlocklyInterpreter::CoreBlocks::BooleanBlock < BlocklyInterpreter::Block
|
2
|
+
self.block_type = :logic_boolean
|
3
|
+
|
4
|
+
def to_bool
|
5
|
+
fields['BOOL'] == 'TRUE'
|
6
|
+
end
|
7
|
+
|
8
|
+
def value(execution_context)
|
9
|
+
to_bool
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_dsl
|
13
|
+
"logic_boolean #{to_bool.inspect}"
|
14
|
+
end
|
15
|
+
|
16
|
+
module DSLMethods
|
17
|
+
def logic_boolean(value)
|
18
|
+
block :logic_boolean do
|
19
|
+
field :BOOL, value ? "TRUE" : "FALSE"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|