Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Removing (most) Closure from BlockFactory #1925

Merged
merged 20 commits into from
Jun 15, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
bee387d
Removing goog library call from block_exporter_tools.js.
AnmAtAnm Jun 13, 2018
fa2ebdb
Removing goog.provide/require('BlockExporterTools')
AnmAtAnm Jun 13, 2018
2790f8e
Removing goog.provide/require('BlocklyDevTools.Analytics')
AnmAtAnm Jun 14, 2018
d7b418c
Removing goog. (Closure) library calls from block_definition_extractor
AnmAtAnm Jun 14, 2018
412bc46
Removing goog.provide/require('BlockDefinitionExtractor')
AnmAtAnm Jun 14, 2018
81c3641
Removing Closure library goog call from factory_utils.js
AnmAtAnm Jun 14, 2018
a3a701f
Removing goog.provide/require('StandardCategories')
AnmAtAnm Jun 14, 2018
bf12e66
Removing goog.provide/require('FactoryUtils')
AnmAtAnm Jun 14, 2018
44b97bd
Removing Closure library goog calls from wfactory_generator.js
AnmAtAnm Jun 14, 2018
4fc83f2
Removing Closure library goog. calls from block_option.js
AnmAtAnm Jun 14, 2018
66c4fe0
Removing goog.provide/require('BlockOption')
AnmAtAnm Jun 14, 2018
1817ea1
Removing goog.provide/require('BlockFactory')
AnmAtAnm Jun 14, 2018
1a1228f
Removing Closure library goo. calls from block_library_view.js
AnmAtAnm Jun 14, 2018
5d6e247
Removing goog.provide/require('BlockLibraryView')
AnmAtAnm Jun 14, 2018
01578ff
Removing goog.provide/require('BlockLibraryStorage')
AnmAtAnm Jun 14, 2018
e8c50a7
Removing Closure from block_library_controller.js
AnmAtAnm Jun 14, 2018
e443970
Removing goog.provide/require('BlockExporterView')
AnmAtAnm Jun 14, 2018
7d19f2f
Removing goog.provide/require('BlockExporterController')
AnmAtAnm Jun 14, 2018
4cd4f3b
Removing Closure library goog. calls from app_controller.js
AnmAtAnm Jun 15, 2018
99fb78d
Replace .innerHTML assignments with .textContent
AnmAtAnm Jun 15, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion demos/blockfactory/analytics.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@
* @fileoverview Stubbed interface functions for analytics integration.
*/

goog.provide('BlocklyDevTools.Analytics');
var BlocklyDevTools = BlocklyDevTools || Object.create(null);
BlocklyDevTools.Analytics = BlocklyDevTools.Analytics || Object.create(null);

/**
* Whether these stub methods should log analytics calls to the console.
Expand Down
41 changes: 13 additions & 28 deletions demos/blockfactory/app_controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,8 @@
*
* @author quachtina96 (Tina Quach)
*/
goog.provide('AppController');

goog.require('BlockFactory');
goog.require('BlocklyDevTools.Analytics');
goog.require('FactoryUtils');
goog.require('BlockLibraryController');
goog.require('BlockExporterController');
goog.require('goog.dom.classlist');
goog.require('goog.ui.PopupColorPicker');
goog.require('goog.ui.ColorPicker');

goog.require('goog.dom.xml'); // Used to detect Closure

/**
* Controller for the Blockly Factory
Expand Down Expand Up @@ -161,9 +152,7 @@ AppController.prototype.exportBlockLibraryToFile = function() {
*/
AppController.prototype.formatBlockLibraryForExport_ = function(blockXmlMap) {
// Create DOM for XML.
var xmlDom = goog.dom.createDom('xml', {
'xmlns':"http://www.w3.org/1999/xhtml"
});
var xmlDom = document.createElementNS('http://www.w3.org/1999/xhtml', 'xml');

// Append each block node to XML DOM.
for (var blockType in blockXmlMap) {
Expand All @@ -184,29 +173,25 @@ AppController.prototype.formatBlockLibraryForExport_ = function(blockXmlMap) {
* @private
*/
AppController.prototype.formatBlockLibraryForImport_ = function(xmlText) {
var xmlDom = Blockly.Xml.textToDom(xmlText);

// Get array of XMLs. Use an asterisk (*) instead of a tag name for the XPath
// selector, to match all elements at that level and get all factory_base
// blocks.
var blockNodes = goog.dom.xml.selectNodes(xmlDom, '*');
var inputXml = Blockly.Xml.textToDom(xmlText);
// Convert the live HTMLCollection of child Elements into a static array,
// since the addition to editorWorkspaceXml below removes it from inputXml.
var inputChildren = Array.from(inputXml.children);

// Create empty map. The line below creates a truly empy object. It doesn't
// have built-in attributes/functions such as length or toString.
var blockXmlTextMap = Object.create(null);

// Populate map.
for (var i = 0, blockNode; blockNode = blockNodes[i]; i++) {

for (var i = 0, blockNode; blockNode = inputChildren[i]; i++) {
// Add outer XML tag to the block for proper injection in to the
// main workspace.
// Create DOM for XML.
var xmlDom = goog.dom.createDom('xml', {
'xmlns':"http://www.w3.org/1999/xhtml"
});
xmlDom.appendChild(blockNode);
var editorWorkspaceXml =
document.createElementNS('http://www.w3.org/1999/xhtml', 'xml');
editorWorkspaceXml.appendChild(blockNode);

xmlText = Blockly.Xml.domToText(xmlDom);
xmlText = Blockly.Xml.domToText(editorWorkspaceXml);
// All block types should be lowercase.
var blockType = this.getBlockTypeFromXml_(xmlText).toLowerCase();
// Some names are invalid so fix them up.
Expand Down Expand Up @@ -376,9 +361,9 @@ AppController.prototype.onTab = function() {
AppController.prototype.styleTabs_ = function() {
for (var tabName in this.tabMap) {
if (this.selectedTab == tabName) {
goog.dom.classlist.addRemove(this.tabMap[tabName], 'taboff', 'tabon');
this.tabMap[tabName].classList.replace('taboff', 'tabon');
} else {
goog.dom.classlist.addRemove(this.tabMap[tabName], 'tabon', 'taboff');
this.tabMap[tabName].classList.replace('tabon', 'taboff');
}
}
};
Expand Down
39 changes: 17 additions & 22 deletions demos/blockfactory/block_definition_extractor.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,29 +23,23 @@
'use strict';

/**
* Namespace for BlockDefinitionExtractor.
*/
goog.provide('BlockDefinitionExtractor');


/**
* Class to contain all functions needed to extract block definition from
* Namespace to contain all functions needed to extract block definition from
* the block preview data structure.
* @namespace
*/
BlockDefinitionExtractor = BlockDefinitionExtractor || Object.create(null);
var BlockDefinitionExtractor = BlockDefinitionExtractor || Object.create(null);

/**
* Builds a BlockFactory workspace that reflects the block structure of the
* exmaple block.
* example block.
*
* @param {!Blockly.Block} block The reference block from which the definition
* will be extracted.
* @return {!Element} Returns the root workspace DOM <xml> for the block editor
* workspace.
*/
BlockDefinitionExtractor.buildBlockFactoryWorkspace = function(block) {
var workspaceXml = goog.dom.createDom('xml');
var workspaceXml = document.createElement('xml');
workspaceXml.append(
BlockDefinitionExtractor.factoryBase_(block, block.type));

Expand All @@ -64,7 +58,7 @@ BlockDefinitionExtractor.buildBlockFactoryWorkspace = function(block) {
*/
BlockDefinitionExtractor.newDomElement_ = function(name, opt_attrs, opt_text) {
// Avoid createDom(..)'s attributes argument for being too HTML specific.
var elem = goog.dom.createDom(name);
var elem = document.createElement(name);
if (opt_attrs) {
for (var key in opt_attrs) {
elem.setAttribute(key, opt_attrs[key]);
Expand Down Expand Up @@ -164,16 +158,17 @@ BlockDefinitionExtractor.factoryBase_ = function(block, name) {
factoryBaseEl.append(helpUrlValue);

// Convert colour_ to hue value 0-360 degrees
// TODO(#1247): Solve off-by-one errors.
// TODO: Deal with colors that don't map to standard hues. (Needs improved
// block definitions.)
var colour_hue = Math.floor(
goog.color.hexToHsv(block.colour_)[0]); // Off by one... sometimes
var colourBlock = BlockDefinitionExtractor.colourBlockFromHue_(colour_hue);
var colourInputValue =
BlockDefinitionExtractor.newDomElement_('value', {name: 'COLOUR'});
colourInputValue.append(colourBlock);
factoryBaseEl.append(colourInputValue);
var colour_hue = block.getHue(); // May be null if not set via hue.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are these TODOs actually done now?

Copy link
Contributor Author

@AnmAtAnm AnmAtAnm Jun 15, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#1247 was solved by #1293, which added the .getHue() method.

if (colour_hue) {
var colourBlock = BlockDefinitionExtractor.colourBlockFromHue_(colour_hue);
var colourInputValue =
BlockDefinitionExtractor.newDomElement_('value', {name: 'COLOUR'});
colourInputValue.append(colourBlock);
factoryBaseEl.append(colourInputValue);
} else {
// Editor will not have a colour block and preview will render black.
// TODO: Support RGB colours in the block editor.
}
return factoryBaseEl;
};

Expand Down Expand Up @@ -480,7 +475,7 @@ BlockDefinitionExtractor.buildFieldDropdown_ = function(dropdown) {
var menuGenerator = dropdown.menuGenerator_;
if (typeof menuGenerator === 'function') {
var options = menuGenerator();
} else if (goog.isArray(menuGenerator)) {
} else if (Array.isArray(menuGenerator)) {
var options = menuGenerator;
} else {
throw new Error('Unrecognized type of menuGenerator: ' + menuGenerator);
Expand Down
16 changes: 3 additions & 13 deletions demos/blockfactory/block_exporter_controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,22 +29,12 @@

'use strict';

goog.provide('BlockExporterController');

goog.require('BlocklyDevTools.Analytics');
goog.require('FactoryUtils');
goog.require('StandardCategories');
goog.require('BlockExporterView');
goog.require('BlockExporterTools');
goog.require('goog.dom.xml');


/**
* BlockExporter Controller Class
* @param {!BlockLibrary.Storage} blockLibStorage Block Library Storage.
* @constructor
*/
BlockExporterController = function(blockLibStorage) {
function BlockExporterController(blockLibStorage) {
// BlockLibrary.Storage object containing user's saved blocks.
this.blockLibStorage = blockLibStorage;
// Utils for generating code to export.
Expand Down Expand Up @@ -132,11 +122,11 @@ BlockExporterController.prototype.export = function() {
BlocklyDevTools.Analytics.onWarning(msg);
alert(msg);
} else {

// Get generator stub code in the selected language for the blocks.
var genStubs = this.tools.getGeneratorCode(blockXmlMap,
language);

// Download the file.
FactoryUtils.createAndDownloadFile(
genStubs, generatorStub_filename + '.js', 'javascript');
Expand Down
57 changes: 4 additions & 53 deletions demos/blockfactory/block_exporter_tools.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,25 +28,15 @@
*/
'use strict';

goog.provide('BlockExporterTools');

goog.require('FactoryUtils');
goog.require('BlockOption');
goog.require('goog.dom');
goog.require('goog.dom.xml');


/**
* Block Exporter Tools Class
* @constructor
*/
BlockExporterTools = function() {
function BlockExporterTools() {
// Create container for hidden workspace.
this.container = goog.dom.createDom('div', {
'id': 'blockExporterTools_hiddenWorkspace'
}, ''); // Empty quotes for empty div.
// Hide hidden workspace.
this.container.style.display = 'none';
this.container = document.createElement('div');
this.container.id = 'blockExporterTools_hiddenWorkspace';
this.container.style.display = 'none'; // Hide the hidden workspace.
document.body.appendChild(this.container);
/**
* Hidden workspace for the Block Exporter that holds pieces that make
Expand Down Expand Up @@ -167,45 +157,6 @@ BlockExporterTools.prototype.addBlockDefinitions = function(blockXmlMap) {
eval(blockDefs);
};

/**
* Pulls information about all blocks in the block library to generate XML
* for the selector workpace's toolbox.
* @param {!BlockLibraryStorage} blockLibStorage Block Library Storage object.
* @return {!Element} XML representation of the toolbox.
*/
BlockExporterTools.prototype.generateToolboxFromLibrary
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

was this unused?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes.

= function(blockLibStorage) {
// Create DOM for XML.
var xmlDom = goog.dom.createDom('xml', {
'id' : 'blockExporterTools_toolbox',
'style' : 'display:none'
});

var allBlockTypes = blockLibStorage.getBlockTypes();
// Object mapping block type to XML.
var blockXmlMap = blockLibStorage.getBlockXmlMap(allBlockTypes);

// Define the custom blocks in order to be able to create instances of
// them in the exporter workspace.
this.addBlockDefinitions(blockXmlMap);

for (var blockType in blockXmlMap) {
// Get block.
var block = FactoryUtils.getDefinedBlock(blockType, this.hiddenWorkspace);
var category = FactoryUtils.generateCategoryXml([block], blockType);
xmlDom.appendChild(category);
}

// If there are no blocks in library and the map is empty, append dummy
// category.
if (Object.keys(blockXmlMap).length == 0) {
var category = goog.dom.createDom('category');
category.setAttribute('name','Next Saved Block');
xmlDom.appendChild(category);
}
return xmlDom;
};

/**
* Generate XML for the workspace factory's category from imported block
* definitions.
Expand Down
9 changes: 1 addition & 8 deletions demos/blockfactory/block_exporter_view.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,19 +27,12 @@

'use strict';

goog.provide('BlockExporterView');

goog.require('BlockExporterTools');
goog.require('BlockOption');
goog.require('goog.dom');


/**
* BlockExporter View Class
* @param {!Object} blockOptions Map of block types to BlockOption objects.
* @constructor
*/
BlockExporterView = function(blockOptions) {
function BlockExporterView(blockOptions) {
// Map of block types to BlockOption objects to select from.
this.blockOptions = blockOptions;
};
Expand Down
12 changes: 2 additions & 10 deletions demos/blockfactory/block_library_controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,6 @@
*/
'use strict';

goog.provide('BlockLibraryController');

goog.require('BlocklyDevTools.Analytics');
goog.require('BlockLibraryStorage');
goog.require('BlockLibraryView');
goog.require('BlockFactory');


/**
* Block Library Controller Class
* @param {string} blockLibraryName Desired name of Block Library, also used
Expand All @@ -48,7 +40,7 @@ goog.require('BlockFactory');
* object that allows user to import a block library.
* @constructor
*/
BlockLibraryController = function(blockLibraryName, opt_blockLibraryStorage) {
function BlockLibraryController(blockLibraryName, opt_blockLibraryStorage) {
this.name = blockLibraryName;
// Create a new, empty Block Library Storage object, or load existing one.
this.storage = opt_blockLibraryStorage || new BlockLibraryStorage(this.name);
Expand Down Expand Up @@ -144,7 +136,7 @@ BlockLibraryController.prototype.saveToBlockLibrary = function() {
}

// Create block XML.
var xmlElement = goog.dom.createDom('xml');
var xmlElement = document.createElement('xml');
var block = FactoryUtils.getRootBlock(BlockFactory.mainWorkspace);
xmlElement.appendChild(Blockly.Xml.blockToDomWithXY(block));

Expand Down
11 changes: 3 additions & 8 deletions demos/blockfactory/block_library_storage.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,14 @@

'use strict';

goog.provide('BlockLibraryStorage');


/**
* Represents a block library's storage.
* @param {string} blockLibraryName Desired name of Block Library, also used
* to create the key for where it's stored in local storage.
* @param {Object} opt_blocks Object mapping block type to XML.
* @constructor
*/
BlockLibraryStorage = function(blockLibraryName, opt_blocks) {
function BlockLibraryStorage(blockLibraryName, opt_blocks) {
// Add prefix to this.name to avoid collisions in local storage.
this.name = 'BlockLibraryStorage.' + blockLibraryName;
if (!opt_blocks) {
Expand All @@ -60,17 +57,15 @@ BlockLibraryStorage = function(blockLibraryName, opt_blocks) {
* Reads the named block library from local storage and saves it in this.blocks.
*/
BlockLibraryStorage.prototype.loadFromLocalStorage = function() {
// goog.global is synonymous to window, and allows for flexibility
// between browsers.
var object = goog.global.localStorage[this.name];
var object = localStorage[this.name];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

none of the browsers require this to be window.?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

window is the global scope in a browser context: https://stackoverflow.com/a/12660102/152543

this.blocks = object ? JSON.parse(object) : null;
};

/**
* Writes the current block library (this.blocks) to local storage.
*/
BlockLibraryStorage.prototype.saveToLocalStorage = function() {
goog.global.localStorage[this.name] = JSON.stringify(this.blocks);
localStorage[this.name] = JSON.stringify(this.blocks);
};

/**
Expand Down
Loading