in core/options.js [36:214]
Blockly.Options = function(options) {
var readOnly = !!options['readOnly'];
if (readOnly) {
var toolboxJsonDef = null;
var hasCategories = false;
var hasTrashcan = false;
var hasCollapse = false;
var hasComments = false;
var hasDisable = false;
var hasSounds = false;
var debugMode = false;
} else {
var toolboxJsonDef = Blockly.utils.toolbox.convertToolboxDefToJson(options['toolbox']);
// pxt-blockly: hasCategories if present in options
var hasCategories = options['hasCategories'] != undefined
? options['hasCategories']
: Blockly.utils.toolbox.hasCategories(toolboxJsonDef);
var hasTrashcan = options['trashcan'];
if (hasTrashcan === undefined) {
hasTrashcan = hasCategories;
}
var maxTrashcanContents = options['maxTrashcanContents'];
if (hasTrashcan) {
if (maxTrashcanContents === undefined) {
maxTrashcanContents = 32;
}
} else {
maxTrashcanContents = 0;
}
var hasCollapse = options['collapse'];
if (hasCollapse === undefined) {
hasCollapse = hasCategories;
}
var hasComments = options['comments'];
if (hasComments === undefined) {
hasComments = hasCategories;
}
var hasDisable = options['disable'];
if (hasDisable === undefined) {
hasDisable = hasCategories;
}
var hasSounds = options['sounds'];
if (hasSounds === undefined) {
hasSounds = true;
}
var hasInline = options['inline'];
if (hasInline === undefined) {
hasInline = false;
}
}
var rtl = !!options['rtl'];
var horizontalLayout = options['horizontalLayout'];
if (horizontalLayout === undefined) {
horizontalLayout = false;
}
var toolboxAtStart = options['toolboxPosition'];
toolboxAtStart = toolboxAtStart !== 'end';
/** @type {!Blockly.utils.toolbox.Position} */
var toolboxPosition;
if (horizontalLayout) {
toolboxPosition = toolboxAtStart ?
Blockly.utils.toolbox.Position.TOP : Blockly.utils.toolbox.Position.BOTTOM;
} else {
toolboxPosition = (toolboxAtStart == rtl) ?
Blockly.utils.toolbox.Position.RIGHT : Blockly.utils.toolbox.Position.LEFT;
}
var hasCss = options['css'];
if (hasCss === undefined) {
hasCss = true;
}
var pathToMedia = 'https://blockly-demo.appspot.com/static/media/';
if (options['media']) {
pathToMedia = options['media'];
} else if (options['path']) {
// 'path' is a deprecated option which has been replaced by 'media'.
pathToMedia = options['path'] + 'media/';
}
if (options['oneBasedIndex'] === undefined) {
var oneBasedIndex = true;
} else {
var oneBasedIndex = !!options['oneBasedIndex'];
}
var renderer = options['renderer'] || 'geras';
// TODO shakao check if we still need this
// Colour overrides provided by the injection
var colours = options['colours'];
if (colours) {
for (var colourProperty in colours) {
if (colours.hasOwnProperty(colourProperty) &&
Blockly.Colours.hasOwnProperty(colourProperty)) {
// If a property is in both colours option and Blockly.Colours,
// set the Blockly.Colours value to the override.
Blockly.Colours[colourProperty] = colours[colourProperty];
}
}
}
var plugins = options['plugins'] || {};
/** @type {boolean} */
this.RTL = rtl;
/** @type {boolean} */
this.oneBasedIndex = oneBasedIndex;
/** @type {boolean} */
this.collapse = hasCollapse;
/** @type {boolean} */
this.comments = hasComments;
/** @type {boolean} */
this.debugMode = debugMode;
/** @type {boolean} */
this.disable = hasDisable;
/** @type {boolean} */
this.readOnly = readOnly;
/** @type {number} */
this.maxBlocks = options['maxBlocks'] || Infinity;
/** @type {?Object<string, number>} */
this.maxInstances = options['maxInstances'];
/** @type {boolean} */
this.inline = hasInline; // pxt-blockly
// pxt-blockly: consumers can specify whether to use old or new functions implementation
/** @type {boolean} */
this.newFunctions = options['newFunctions'] == true;
/** @type {string} */
this.pathToMedia = pathToMedia;
/** @type {boolean} */
this.hasCategories = hasCategories;
/** @type {!Blockly.Options.MoveOptions} */
this.moveOptions = Blockly.Options.parseMoveOptions_(options, hasCategories);
/** @deprecated January 2019 */
this.hasScrollbars = !!this.moveOptions.scrollbars;
/** @type {boolean} */
this.hasTrashcan = hasTrashcan;
/** @type {number} */
this.maxTrashcanContents = maxTrashcanContents;
/** @type {boolean} */
this.hasSounds = hasSounds;
/** @type {boolean} */
this.hasCss = hasCss;
/** @type {boolean} */
this.horizontalLayout = horizontalLayout;
/** @type {?Blockly.utils.toolbox.ToolboxInfo} */
this.languageTree = toolboxJsonDef;
/** @type {!Blockly.Options.GridOptions} */
this.gridOptions = Blockly.Options.parseGridOptions_(options);
/** @type {!Blockly.Options.ZoomOptions} */
this.zoomOptions = Blockly.Options.parseZoomOptions_(options);
/** @type {!Blockly.utils.toolbox.Position} */
this.toolboxPosition = toolboxPosition;
/** @type {!Blockly.Theme} */
this.theme = Blockly.Options.parseThemeOptions_(options);
/** @type {string} */
this.renderer = renderer;
/** @type {?Object} */
this.rendererOverrides = options['rendererOverrides'];
/**
* The SVG element for the grid pattern.
* Created during injection.
* @type {?SVGElement}
*/
this.gridPattern = null;
/**
* The parent of the current workspace, or null if there is no parent
* workspace. We can assert that this is of type WorkspaceSvg as opposed to
* Workspace as this is only used in a rendered workspace.
* @type {Blockly.WorkspaceSvg}
*/
this.parentWorkspace = options['parentWorkspace'];
/**
* Map of plugin type to name of registered plugin or plugin class.
* @type {!Object<string, (function(new:?, ...?)|string)>}
*/
this.plugins = plugins;
};