Skip to content

Commit

Permalink
Added .init() to API
Browse files Browse the repository at this point in the history
Added .init() to API
  • Loading branch information
lindell committed May 12, 2016
2 parents b39e9e8 + b7bc1be commit 91e00c7
Show file tree
Hide file tree
Showing 3 changed files with 169 additions and 39 deletions.
154 changes: 115 additions & 39 deletions src/JsBarcode.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ let renderers = {
import merge from './help/merge.js';
import linearizeEncodings from './help/linearizeEncodings.js';
import fixOptions from "./help/fixOptions.js";
import getOptionsFromElement from "./help/getOptionsFromElement.js";

// The protype of the object returned from the JsBarcode() call
let API = function(){};
Expand Down Expand Up @@ -65,35 +66,40 @@ function registerBarcode(barcodes, name){
API.prototype[name.toLowerCase()] =
function(text, options){
var newOptions = merge(this._options, options);

var Encoder = barcodes[name];
var encoder = new Encoder(text, newOptions);

// If the input is not valid for the encoder, throw error.
// If the valid callback option is set, call it instead of throwing error
if(!encoder.valid()){
if(this._options.valid === defaults.valid){
throw new Error('"' + text + '" is not a valid input for ' + name);
}
else{
this._options.valid(false);
}
}
var encoded = encode(text, Encoder, newOptions);
this._encodings.push(encoded);

var encoded = encoder.encode();
return this;
};
}

// Encodings can be nestled like [[1-1, 1-2], 2, [3-1, 3-2]
// Convert to [1-1, 1-2, 2, 3-1, 3-2]
encoded = linearizeEncodings(encoded);
function encode(text, Encoder, options){
var encoder = new Encoder(text, options);

for(let i = 0; i < encoded.length; i++){
encoded[i].options = merge(newOptions, encoded[i].options);
// If the input is not valid for the encoder, throw error.
// If the valid callback option is set, call it instead of throwing error
if(!encoder.valid()){
if(options.valid === defaults.valid){
throw new Error('"' + text + '" is not a valid input for ' + name);
}
else{
options.valid(false);
}
}

this._encodings.push(encoded);
var encoded = encoder.encode();

return this;
};
// Encodings can be nestled like [[1-1, 1-2], 2, [3-1, 3-2]
// Convert to [1-1, 1-2, 2, 3-1, 3-2]
encoded = linearizeEncodings(encoded);

// Merge
for(let i = 0; i < encoded.length; i++){
encoded[i].options = merge(options, encoded[i].options);
}

return encoded;
}

function autoSelectBarcode(){
Expand All @@ -120,31 +126,68 @@ API.prototype.blank = function(size){
return this;
}

// Prepares the encodings and calls the renderer
// Added to the api by the JsBarcode function
API.prototype.render = function(){
var renderer = renderers[this._renderProperties.renderer];
API.prototype.init = function(){
// this._renderProperties can be
if(!Array.isArray(this._renderProperties)){
this._renderProperties = [this._renderProperties];
}

var encodings = linearizeEncodings(this._encodings);
for(let renderProperty of this._renderProperties){
let element = renderProperty.element;

for(let i = 0; i < encodings.length; i++){
encodings[i].options = merge(this._options, encodings[i].options);
fixOptions(encodings[i].options);
}
var options = merge(this._options, renderProperty.options);

if(options.format == "auto"){
options.format = autoSelectBarcode();
}

var text = options.value;

var Encoder = barcodes[options.format.toUpperCase()];

fixOptions(this._options);
var encoded = encode(text, Encoder, options);

renderer(this._renderProperties.element, encodings, this._options);
render(renderProperty, encoded, options);
}
}

if(this._renderProperties.afterRender){
this._renderProperties.afterRender();

// The render API call. Calls the real render function.
API.prototype.render = function(){
if(Array.isArray(this._renderProperties)){
for(let renderProperty of this._renderProperties){
render(renderProperty, this._encodings, this._options);
}
}
else{
render(this._renderProperties, this._encodings, this._options);
}

this._options.valid(true);

return this;
}

// Prepares the encodings and calls the renderer
function render(renderProperties, encodings, options){
var renderer = renderers[renderProperties.renderer];

encodings = linearizeEncodings(encodings);

for(let i = 0; i < encodings.length; i++){
encodings[i].options = merge(options, encodings[i].options);
fixOptions(encodings[i].options);
}

fixOptions(options);

renderer(renderProperties.element, encodings, options);

if(renderProperties.afterRender){
renderProperties.afterRender();
}
}

// Export to browser
if(typeof window !== "undefined"){
window.JsBarcode = JsBarcode;
Expand All @@ -153,7 +196,11 @@ if(typeof window !== "undefined"){
// Export to jQuery
if (typeof jQuery !== 'undefined') {
jQuery.fn.JsBarcode = function(content, options){
return JsBarcode(this.get(0), content, options);
var elementArray = [];
$(this).each(function() {
elementArray.push(this);
});
return JsBarcode(elementArray, content, options);
};
}

Expand All @@ -162,23 +209,43 @@ module.exports = JsBarcode;

// Takes an element and returns an object with information about how
// it should be rendered
// This could also return an array with these objects
// {
// element: The element that the renderer should draw on
// renderer: The name of the renderer
// afterRender (optional): If something has to done after the renderer
// completed, calls afterRender (function)
// options (optional): Options that can be defined in the element
// }
function getRenderProperies(element){
// If the element is a string, query select call again
if(typeof element === "string"){
element = document.querySelector(element);
return getRenderProperies(element);
var selector = document.querySelectorAll(element);
if(selector.length === 0){
throw new Error("No element found");
}
else{
var returnArray = [];
for(var i = 0; i < selector.length; i++){
returnArray.push(getRenderProperies(selector[i]));
}
return returnArray;
}
}
// If element is array. Recursivly call with every object in the array
else if(Array.isArray(element)){
var returnArray = [];
for(var i = 0; i < element.length; i++){
returnArray.push(getRenderProperies(element[i]));
}
return returnArray;
}
// If element, render on canvas and set the uri as src
else if(typeof HTMLCanvasElement !== 'undefined' && element instanceof HTMLImageElement){
var canvas = document.createElement('canvas');
return {
element: canvas,
options: getOptionsFromElement(element, defaults),
renderer: "canvas",
afterRender: function(){
element.setAttribute("src", canvas.toDataURL());
Expand All @@ -189,10 +256,19 @@ function getRenderProperies(element){
else if(typeof SVGElement !== 'undefined' && element instanceof SVGElement){
return {
element: element,
options: getOptionsFromElement(element, defaults),
renderer: "svg"
};
}
// If canvas
// If canvas (in browser)
else if(typeof HTMLCanvasElement !== 'undefined' && element instanceof HTMLCanvasElement){
return {
element: element,
options: getOptionsFromElement(element, defaults),
renderer: "canvas"
};
}
// If canvas (in node)
else if(element.getContext){
return {
element: element,
Expand Down
25 changes: 25 additions & 0 deletions src/help/getOptionsFromElement.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import optionsFromStrings from "./optionsFromStrings.js";

function getOptionsFromElement(element, defaults){
var options = {};
for(var property in defaults){
// jsbarcode-*
if(element.hasAttribute("jsbarcode-" + property.toLowerCase())){
options[property] = element.getAttribute("jsbarcode-" + property.toLowerCase());
}

// data-*
if(element.hasAttribute("data-" + property.toLowerCase())){
options[property] = element.getAttribute("data-" + property.toLowerCase());
}
}

options["value"] = element.getAttribute("jsbarcode-value") || element.getAttribute("data-value");

// Since all atributes are string they need to be converted to integers
options = optionsFromStrings(options);

return options;
}

export default getOptionsFromElement;
29 changes: 29 additions & 0 deletions src/help/optionsFromStrings.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
export default optionsFromStrings;

// Convert string to integers/booleans where it should be
function optionsFromStrings(options){
var intOptions = [
"width",
"height",
"textMargin",
"fontSize",
"margin",
"marginLeft",
"marginBottom",
"marginLeft",
"marginRight"
];

for(var intOption in intOptions){
intOption = intOptions[intOption];
if(typeof options[intOption] === "string"){
options[intOption] = parseInt(options[intOption], 10);
}
}

if(typeof options["displayValue"] === "string"){
options["displayValue"] = (options["displayValue"] != "false");
}

return options;
}

0 comments on commit 91e00c7

Please sign in to comment.