From 2b7638700447d0ad46f490a7a5932d63065bbc93 Mon Sep 17 00:00:00 2001 From: Benjamin Intal Date: Wed, 25 Feb 2015 17:25:47 +0800 Subject: [PATCH 1/4] Numeric attribute fix (revised) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since the code has changed a lot since #180, I’m redoing the changes with the new file structure --- js/build/shortcode-ui.js | 57 ++++++++++++++++++++------ js/models/shortcode.js | 10 ++++- js/utils/shortcode-view-constructor.js | 47 ++++++++++++++++----- 3 files changed, 90 insertions(+), 24 deletions(-) diff --git a/js/build/shortcode-ui.js b/js/build/shortcode-ui.js index 732890e1..d7f26ead 100644 --- a/js/build/shortcode-ui.js +++ b/js/build/shortcode-ui.js @@ -167,7 +167,15 @@ var Shortcode = Backbone.Model.extend({ if ( attr.get( 'attr' ) === 'content' ) { content = attr.get( 'value' ); } else { - attrs.push( attr.get( 'attr' ) + '="' + attr.get( 'value' ) + '"' ); + + // Numeric attribute names + if ( ! isNaN( attr.get( 'attr' ) ) ) { + attrs.push( '"' + attr.get( 'value' ) + '"' ); + + // String attribute names + } else { + attrs.push( attr.get( 'attr' ) + '="' + attr.get( 'value' ) + '"' ); + } } } ); @@ -356,6 +364,13 @@ var shortcodeViewConstructor = { options.shortcode.attrs.named[ attr.get( 'attr') ] ); } + + if ( attr.get( 'attr') in options.shortcode.attrs.numeric ) { + attr.set( + 'value', + options.shortcode.attrs.numeric[ attr.get( 'attr') ] + ); + } if ( attr.get( 'attr' ) === 'content' && ( 'content' in options.shortcode ) ) { attr.set( 'value', options.shortcode.content ); @@ -430,19 +445,37 @@ var shortcodeViewConstructor = { if (matches[2]) { - attributeMatches = matches[2].match(/(\S+?=".*?")/g) || []; + // Get all the attributes + attributeMatches = matches[2].match(/([^\s]+)/g) || []; - // convert attribute strings to object. - for (var i = 0; i < attributeMatches.length; i++) { + // Keep track of all the unnamed attributes + var unnamedIndex = 0; - var bitsRegEx = /(\S+?)="(.*?)"/g; - var bits = bitsRegEx.exec(attributeMatches[i]); - - attr = currentShortcode.get('attrs').findWhere({ - attr : bits[1] - }); - if (attr) { - attr.set('value', bits[2]); + // convert attribute strings to object. + for (var i = 0; i < attributeMatches.length; i++) { + + // Handler for named attributes + if (attributeMatches[i].match(/\S+?="(.*?)"/) !== null ) { + + var bitsRegEx = /(\S+?)="(.*?)"/g; + var bits = bitsRegEx.exec(attributeMatches[i]); + + attr = currentShortcode.get('attrs').findWhere({ + attr : bits[1] + }); + if (attr) { + attr.set('value', bits[2]); + } + + // Handler for numeric/unnamed attributes + } else { + + attr = currentShortcode.get('attrs').findWhere({ + attr : (unnamedIndex++).toString() + }); + if (attr) { + attr.set('value', attributeMatches[i].replace(/^"(.*)"$/, '$1')); + } } } diff --git a/js/models/shortcode.js b/js/models/shortcode.js index daeb48e7..b0dcac72 100644 --- a/js/models/shortcode.js +++ b/js/models/shortcode.js @@ -65,7 +65,15 @@ var Shortcode = Backbone.Model.extend({ if ( attr.get( 'attr' ) === 'content' ) { content = attr.get( 'value' ); } else { - attrs.push( attr.get( 'attr' ) + '="' + attr.get( 'value' ) + '"' ); + + // Numeric attribute names + if ( ! isNaN( attr.get( 'attr' ) ) ) { + attrs.push( '"' + attr.get( 'value' ) + '"' ); + + // String attribute names + } else { + attrs.push( attr.get( 'attr' ) + '="' + attr.get( 'value' ) + '"' ); + } } } ); diff --git a/js/utils/shortcode-view-constructor.js b/js/utils/shortcode-view-constructor.js index 84c0eb78..280f004f 100644 --- a/js/utils/shortcode-view-constructor.js +++ b/js/utils/shortcode-view-constructor.js @@ -26,6 +26,13 @@ var shortcodeViewConstructor = { options.shortcode.attrs.named[ attr.get( 'attr') ] ); } + + if ( attr.get( 'attr') in options.shortcode.attrs.numeric ) { + attr.set( + 'value', + options.shortcode.attrs.numeric[ attr.get( 'attr') ] + ); + } if ( attr.get( 'attr' ) === 'content' && ( 'content' in options.shortcode ) ) { attr.set( 'value', options.shortcode.content ); @@ -100,19 +107,37 @@ var shortcodeViewConstructor = { if (matches[2]) { - attributeMatches = matches[2].match(/(\S+?=".*?")/g) || []; + // Get all the attributes + attributeMatches = matches[2].match(/([^\s]+)/g) || []; - // convert attribute strings to object. - for (var i = 0; i < attributeMatches.length; i++) { - - var bitsRegEx = /(\S+?)="(.*?)"/g; - var bits = bitsRegEx.exec(attributeMatches[i]); + // Keep track of all the unnamed attributes + var unnamedIndex = 0; - attr = currentShortcode.get('attrs').findWhere({ - attr : bits[1] - }); - if (attr) { - attr.set('value', bits[2]); + // convert attribute strings to object. + for (var i = 0; i < attributeMatches.length; i++) { + + // Handler for named attributes + if (attributeMatches[i].match(/\S+?="(.*?)"/) !== null ) { + + var bitsRegEx = /(\S+?)="(.*?)"/g; + var bits = bitsRegEx.exec(attributeMatches[i]); + + attr = currentShortcode.get('attrs').findWhere({ + attr : bits[1] + }); + if (attr) { + attr.set('value', bits[2]); + } + + // Handler for numeric/unnamed attributes + } else { + + attr = currentShortcode.get('attrs').findWhere({ + attr : (unnamedIndex++).toString() + }); + if (attr) { + attr.set('value', attributeMatches[i].replace(/^"(.*)"$/, '$1')); + } } } From 75c619266a2bfaa53be5fac07ec3ceb335d06f78 Mon Sep 17 00:00:00 2001 From: Benjamin Intal Date: Fri, 27 Feb 2015 04:51:01 +0800 Subject: [PATCH 2/4] Removed quotes on unnamed attributes --- js/build/shortcode-ui.js | 2 +- js/models/shortcode.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/build/shortcode-ui.js b/js/build/shortcode-ui.js index d7f26ead..7dcd2577 100644 --- a/js/build/shortcode-ui.js +++ b/js/build/shortcode-ui.js @@ -170,7 +170,7 @@ var Shortcode = Backbone.Model.extend({ // Numeric attribute names if ( ! isNaN( attr.get( 'attr' ) ) ) { - attrs.push( '"' + attr.get( 'value' ) + '"' ); + attrs.push( attr.get( 'value' ) ); // String attribute names } else { diff --git a/js/models/shortcode.js b/js/models/shortcode.js index b0dcac72..a1199b2a 100644 --- a/js/models/shortcode.js +++ b/js/models/shortcode.js @@ -68,7 +68,7 @@ var Shortcode = Backbone.Model.extend({ // Numeric attribute names if ( ! isNaN( attr.get( 'attr' ) ) ) { - attrs.push( '"' + attr.get( 'value' ) + '"' ); + attrs.push( attr.get( 'value' ) ); // String attribute names } else { From 5cf76c54cbcf3cb9414da2eb25568c176b1c9e55 Mon Sep 17 00:00:00 2001 From: Benjamin Intal Date: Sat, 28 Feb 2015 16:13:36 +0800 Subject: [PATCH 3/4] Preserve empty unnamed attributes --- js/build/shortcode-ui.js | 17 ++++++++++------- js/models/shortcode.js | 17 ++++++++++------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/js/build/shortcode-ui.js b/js/build/shortcode-ui.js index 7dcd2577..77e4b68b 100644 --- a/js/build/shortcode-ui.js +++ b/js/build/shortcode-ui.js @@ -158,22 +158,25 @@ var Shortcode = Backbone.Model.extend({ this.get( 'attrs' ).each( function( attr ) { - // Skip empty attributes. - if ( ! attr.get( 'value' ) || attr.get( 'value' ).length < 1 ) { - return; - } - // Handle content attribute as a special case. if ( attr.get( 'attr' ) === 'content' ) { content = attr.get( 'value' ); } else { - // Numeric attribute names + // Numeric/unnamed attributes if ( ! isNaN( attr.get( 'attr' ) ) ) { - attrs.push( attr.get( 'value' ) ); + + // Empty attributes are false to preserve attribute keys + attrs.push( attr.get( 'value' ).trim() === '' ? 'false' : attr.get( 'value' ) ); // String attribute names } else { + + // Skip empty attributes. + if ( ! attr.get( 'value' ) || attr.get( 'value' ).length < 1 ) { + return; + } + attrs.push( attr.get( 'attr' ) + '="' + attr.get( 'value' ) + '"' ); } } diff --git a/js/models/shortcode.js b/js/models/shortcode.js index a1199b2a..5ef35d81 100644 --- a/js/models/shortcode.js +++ b/js/models/shortcode.js @@ -56,22 +56,25 @@ var Shortcode = Backbone.Model.extend({ this.get( 'attrs' ).each( function( attr ) { - // Skip empty attributes. - if ( ! attr.get( 'value' ) || attr.get( 'value' ).length < 1 ) { - return; - } - // Handle content attribute as a special case. if ( attr.get( 'attr' ) === 'content' ) { content = attr.get( 'value' ); } else { - // Numeric attribute names + // Numeric/unnamed attributes if ( ! isNaN( attr.get( 'attr' ) ) ) { - attrs.push( attr.get( 'value' ) ); + + // Empty attributes are false to preserve attribute keys + attrs.push( attr.get( 'value' ).trim() === '' ? 'false' : attr.get( 'value' ) ); // String attribute names } else { + + // Skip empty attributes. + if ( ! attr.get( 'value' ) || attr.get( 'value' ).length < 1 ) { + return; + } + attrs.push( attr.get( 'attr' ) + '="' + attr.get( 'value' ) + '"' ); } } From e32b2593a8fe5a337fdb996d89dd3ab7e2930c17 Mon Sep 17 00:00:00 2001 From: Benjamin Intal Date: Mon, 6 Apr 2015 05:29:59 +0800 Subject: [PATCH 4/4] Synced to master, but now not working --- .gitignore | 1 + .travis.yml | 8 +- js-tests/build/helpers.js | 29 + js-tests/build/specs.js | 856 +++++++++++++++++++ js-tests/src/helpers/globalHelper.js | 26 + js-tests/src/innerContentModelSpec.js | 27 + js-tests/src/shortcodeAttributeModelSpec.js | 20 + js-tests/src/shortcodeModelSpec.js | 68 ++ js-tests/src/utils/mceViewConstructorSpec.js | 161 ++++ js-tests/src/utils/suiSpec.js | 15 + js/build/field-attachment.js | 408 +++++++++ js/build/field-color.js | 279 ++++++ js/build/shortcode-ui.js | 216 ++++- js/models/shortcode.js | 2 +- js/utils/shortcode-view-constructor.js | 11 +- js/views/media-frame.js | 109 +++ js/views/media-toolbar.js | 28 + js/views/search-shortcode.js | 44 + readme.txt | 57 ++ screenshot-1.png | Bin 0 -> 30633 bytes screenshot-2.png | Bin 0 -> 39995 bytes screenshot-3.png | Bin 0 -> 18215 bytes screenshot-4.png | Bin 0 -> 38379 bytes 23 files changed, 2352 insertions(+), 13 deletions(-) create mode 100644 js-tests/build/helpers.js create mode 100644 js-tests/build/specs.js create mode 100644 js-tests/src/helpers/globalHelper.js create mode 100644 js-tests/src/innerContentModelSpec.js create mode 100644 js-tests/src/shortcodeAttributeModelSpec.js create mode 100644 js-tests/src/shortcodeModelSpec.js create mode 100644 js-tests/src/utils/mceViewConstructorSpec.js create mode 100644 js-tests/src/utils/suiSpec.js create mode 100644 js/build/field-attachment.js create mode 100644 js/build/field-color.js create mode 100644 js/views/media-frame.js create mode 100644 js/views/media-toolbar.js create mode 100644 js/views/search-shortcode.js create mode 100644 readme.txt create mode 100644 screenshot-1.png create mode 100644 screenshot-2.png create mode 100644 screenshot-3.png create mode 100644 screenshot-4.png diff --git a/.gitignore b/.gitignore index fd4f2b06..825fc67c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules .DS_Store +npm-debug.log diff --git a/.travis.yml b/.travis.yml index 5cd87fb5..f86ca923 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,9 +8,13 @@ env: - WP_VERSION=latest WP_MULTISITE=0 before_script: - - bash bin/install-wp-tests.sh wordpress_test root '' localhost $WP_VERSION + - bash bin/install-wp-tests.sh wordpress_test root '' localhost $WP_VERSION + - npm install -g grunt-cli + - npm install -script: phpunit +script: + - phpunit + - grunt jasmine; notifications: email: diff --git a/js-tests/build/helpers.js b/js-tests/build/helpers.js new file mode 100644 index 00000000..a88f35ff --- /dev/null +++ b/js-tests/build/helpers.js @@ -0,0 +1,29 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;otest content' ); + expect( constructor.fetch ).not.toHaveBeenCalled(); + + // If content is empty - just null and fetch should be called. + constructor.content = null; + expect( constructor.getContent() ).toEqual( null ); + expect( constructor.fetch ).toHaveBeenCalled(); + + } ); + + describe( "Fetch preview HTML", function() { + + beforeEach(function() { + jasmine.Ajax.install(); + }); + + afterEach(function() { + jasmine.Ajax.uninstall(); + }); + + var constructor = jQuery.extend( true, { + render: function( force ) {}, + }, MceViewConstructor ); + + // Mock shortcode model data. + constructor.shortcodeModel = jQuery.extend( true, {}, sui.shortcodes.first() ); + + it( 'Fetches data success', function(){ + + spyOn( wp.ajax, "post" ).and.callThrough(); + spyOn( constructor, "render" ); + + constructor.fetch(); + + expect( constructor.fetching ).toEqual( true ); + expect( constructor.content ).toEqual( undefined ); + expect( wp.ajax.post ).toHaveBeenCalled(); + expect( constructor.render ).not.toHaveBeenCalled(); + + jasmine.Ajax.requests.mostRecent().respondWith( { + 'status': 200, + 'responseText': '{"success":true,"data":"test preview response body"}' + } ); + + expect( constructor.fetching ).toEqual( undefined ); + expect( constructor.content ).toEqual( 'test preview response body' ); + expect( constructor.render ).toHaveBeenCalled(); + + }); + + it( 'Handles errors when fetching data', function() { + + spyOn( constructor, "render" ); + + constructor.fetch(); + + jasmine.Ajax.requests.mostRecent().respondWith( { + 'status': 500, + 'responseText': '{"success":false}' + }); + + expect( constructor.fetching ).toEqual( undefined ); + expect( constructor.content ).toContain( 'shortcake-error' ); + expect( constructor.render ).toHaveBeenCalled(); + + } ); + + } ); + + it( 'parses simple shortcode', function() { + var shortcode = MceViewConstructor.parseShortcodeString( '[test_shortcode attr="test value"]') + expect( shortcode instanceof Shortcode ).toEqual( true ); + expect( shortcode.get( 'attrs' ).findWhere( { attr: 'attr' }).get('value') ).toEqual( 'test value' ); + }); + + it( 'parses shortcode with content', function() { + var shortcode = MceViewConstructor.parseShortcodeString( '[test_shortcode attr="test value 1"]test content [/test_shortcode]') + expect( shortcode instanceof Shortcode ).toEqual( true ); + expect( shortcode.get( 'attrs' ).findWhere( { attr: 'attr' }).get('value') ).toEqual( 'test value 1' ); + expect( shortcode.get( 'inner_content' ).get('value') ).toEqual( 'test content ' ); + }); + + it( 'parses shortcode with dashes in name and attribute', function() { + var shortcode = MceViewConstructor.parseShortcodeString( '[test-shortcode test-attr="test value 2"]') + expect( shortcode instanceof Shortcode ).toEqual( true ); + expect( shortcode.get( 'attrs' ).findWhere( { attr: 'test-attr' }).get('value') ).toEqual( 'test value 2' ); + }); + + // https://github.com/fusioneng/Shortcake/issues/171 + xit( 'parses shortcode with line breaks in inner content', function() { + var shortcode = MceViewConstructor.parseShortcodeString( "[test_shortcode]test \ncontent \r2 [/test_shortcode]") + expect( shortcode instanceof Shortcode ).toEqual( true ); + expect( shortcode.get( 'inner_content' ).get('value') ).toEqual( "test \ncontent \r2 " ); + } ); + +} ); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./../../../js/models/shortcode.js":10,"./../../../js/utils/shortcode-view-constructor.js":11,"./../../../js/utils/sui.js":12}],5:[function(require,module,exports){ +var Shortcodes = require('./../../../js/collections/shortcodes.js'); +var sui = require('./../../../js/utils/sui.js'); + +describe( "SUI Util", function() { + + it( 'sets global variable', function() { + expect( window.Shortcode_UI ).toEqual( sui ); + }); + + it( 'expected properties', function() { + expect( sui.shortcodes instanceof Shortcodes ).toEqual( true ); + expect( sui.views ).toEqual( {} ); + }); + +} ); + +},{"./../../../js/collections/shortcodes.js":7,"./../../../js/utils/sui.js":12}],6:[function(require,module,exports){ +(function (global){ +var Backbone = (typeof window !== "undefined" ? window.Backbone : typeof global !== "undefined" ? global.Backbone : null); +var ShortcodeAttribute = require('./../models/shortcode-attribute.js'); + +/** + * Shortcode Attributes collection. + */ +var ShortcodeAttributes = Backbone.Collection.extend({ + model : ShortcodeAttribute, + // Deep Clone. + clone : function() { + return new this.constructor(_.map(this.models, function(m) { + return m.clone(); + })); + } +}); + +module.exports = ShortcodeAttributes; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./../models/shortcode-attribute.js":9}],7:[function(require,module,exports){ +(function (global){ +var Backbone = (typeof window !== "undefined" ? window.Backbone : typeof global !== "undefined" ? global.Backbone : null); +var Shortcode = require('./../models/shortcode.js'); + +// Shortcode Collection +var Shortcodes = Backbone.Collection.extend({ + model : Shortcode +}); + +module.exports = Shortcodes; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./../models/shortcode.js":10}],8:[function(require,module,exports){ +(function (global){ +var Backbone = (typeof window !== "undefined" ? window.Backbone : typeof global !== "undefined" ? global.Backbone : null); + +/** + * Shortcode Attribute Model. + */ +var InnerContent = Backbone.Model.extend({ + defaults : { + label: shortcodeUIData.strings.insert_content_label, + type: 'textarea', + value: '', + placeholder: '', + }, +}); + +module.exports = InnerContent; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],9:[function(require,module,exports){ +(function (global){ +var Backbone = (typeof window !== "undefined" ? window.Backbone : typeof global !== "undefined" ? global.Backbone : null); + +var ShortcodeAttribute = Backbone.Model.extend({ + defaults: { + attr: '', + label: '', + type: '', + value: '', + placeholder: '', + }, +}); + +module.exports = ShortcodeAttribute; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],10:[function(require,module,exports){ +(function (global){ +var Backbone = (typeof window !== "undefined" ? window.Backbone : typeof global !== "undefined" ? global.Backbone : null); +var ShortcodeAttributes = require('./../collections/shortcode-attributes.js'); +var InnerContent = require('./inner-content.js'); + +Shortcode = Backbone.Model.extend({ + + defaults: { + label: '', + shortcode_tag: '', + attrs: new ShortcodeAttributes, + }, + + /** + * Custom set method. + * Handles setting the attribute collection. + */ + set: function( attributes, options ) { + + if ( attributes.attrs !== undefined && ! ( attributes.attrs instanceof ShortcodeAttributes ) ) { + attributes.attrs = new ShortcodeAttributes( attributes.attrs ); + } + + if ( attributes.inner_content && ! ( attributes.inner_content instanceof InnerContent ) ) { + attributes.inner_content = new InnerContent( attributes.inner_content ); + } + + return Backbone.Model.prototype.set.call(this, attributes, options); + }, + + /** + * Custom toJSON. + * Handles converting the attribute collection to JSON. + */ + toJSON: function( options ) { + options = Backbone.Model.prototype.toJSON.call(this, options); + if ( options.attrs && ( options.attrs instanceof ShortcodeAttributes ) ) { + options.attrs = options.attrs.toJSON(); + } + if ( options.inner_content && ( options.inner_content instanceof InnerContent ) ) { + options.inner_content = options.inner_content.toJSON(); + } + return options; + }, + + /** + * Custom clone + * Make sure we don't clone a reference to attributes. + */ + clone: function() { + var clone = Backbone.Model.prototype.clone.call( this ); + clone.set( 'attrs', clone.get( 'attrs' ).clone() ); + if ( clone.get( 'inner_content' ) ) { + clone.set( 'inner_content', clone.get( 'inner_content' ).clone() ); + } + return clone; + }, + + /** + * Get the shortcode as... a shortcode! + * + * @return string eg [shortcode attr1=value] + */ + formatShortcode: function() { + + var template, shortcodeAttributes, attrs = [], content, self = this; + + this.get( 'attrs' ).each( function( attr ) { + + // Handle content attribute as a special case. + if ( attr.get( 'attr' ) === 'content' ) { + content = attr.get( 'value' ); + } else { + + // Numeric/unnamed attributes + if ( ! isNaN( attr.get( 'attr' ) ) ) { + + // Empty attributes are false to preserve attribute keys + // console.log(attr, attr.get( 'value' )); + attrs.push( typeof attr.get( 'value' ) === 'undefined' || attr.get( 'value' ).trim() === '' ? 'false' : attr.get( 'value' ) ); + + // String attribute names + } else { + + // Skip empty attributes. + if ( ! attr.get( 'value' ) || attr.get( 'value' ).length < 1 ) { + return; + } + + attrs.push( attr.get( 'attr' ) + '="' + attr.get( 'value' ) + '"' ); + } + } + + } ); + + if ( this.get( 'inner_content' ) ) { + content = this.get( 'inner_content' ).get( 'value' ); + } + + template = "[{{ shortcode }} {{ attributes }}]" + + if ( content && content.length > 0 ) { + template += "{{ content }}[/{{ shortcode }}]" + } + + template = template.replace( /{{ shortcode }}/g, this.get('shortcode_tag') ); + template = template.replace( /{{ attributes }}/g, attrs.join( ' ' ) ); + template = template.replace( /{{ content }}/g, content ); + + return template; + + } + +}); + +module.exports = Shortcode; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./../collections/shortcode-attributes.js":6,"./inner-content.js":8}],11:[function(require,module,exports){ +(function (global){ +sui = require('./sui.js'); +wp = (typeof window !== "undefined" ? window.wp : typeof global !== "undefined" ? global.wp : null); +jQuery = (typeof window !== "undefined" ? window.jQuery : typeof global !== "undefined" ? global.jQuery : null); + +/** + * Generic shortcode mce view constructor. + * This is cloned and used by each shortcode when registering a view. + */ +var shortcodeViewConstructor = { + + initialize: function( options ) { + this.shortcodeModel = this.getShortcodeModel( this.shortcode ); + }, + + /** + * Get the shortcode model given the view shortcode options. + * Must be a registered shortcode (see sui.shortcodes) + */ + getShortcodeModel: function( options ) { + + var shortcodeModel; + + shortcodeModel = sui.shortcodes.findWhere( { shortcode_tag: options.tag } ); + + if ( ! shortcodeModel ) { + return; + } + + shortcodeModel = shortcodeModel.clone(); + + shortcodeModel.get('attrs').each( + function( attr ) { + // console.log('in getShortcodeModel first', attr); + if ( attr.get('attr') in options.attrs.named ) { + attr.set( + 'value', + options.attrs.named[ attr.get('attr') ] + ); + } + + // console.log('in getShortcodeModel', options.shortcode.attrs.numeric); + // if ( typeof options.shortcode.attrs.numeric !== 'undefined' ) { + if ( attr.get( 'attr') in options.shortcode.attrs.numeric ) { + attr.set( + 'value', + options.shortcode.attrs.numeric[ attr.get( 'attr') ] + ); + } + // } + + } + ); + + if ( 'content' in options ) { + var innerContent = shortcodeModel.get('inner_content'); + if ( innerContent ) { + innerContent.set('value', options.content) + } + } + + return shortcodeModel; + + }, + + /** + * Return the preview HTML. + * If empty, fetches data. + * + * @return string + */ + getContent : function() { + if ( ! this.content ) { + this.fetch(); + } + return this.content; + }, + + /** + * Fetch preview. + * Async. Sets this.content and calls this.render. + * + * @return undefined + */ + fetch : function() { + + var self = this; + + if ( ! this.fetching ) { + + this.fetching = true; + + wp.ajax.post( 'do_shortcode', { + post_id: jQuery( '#post_ID' ).val(), + shortcode: this.shortcodeModel.formatShortcode(), + nonce: shortcodeUIData.nonces.preview, + }).done( function( response ) { + self.content = response; + }).fail( function() { + self.content = '' + shortcodeUIData.strings.mce_view_error + ''; + } ).always( function() { + delete self.fetching; + self.render( true ); + } ); + + } + + }, + + /** + * Edit shortcode. + * Get shortcode model and open edit modal. + * + */ + edit : function( shortcodeString ) { + + var currentShortcode; + + // Backwards compatability for WP pre-4.2 + if ( 'object' === typeof( shortcodeString ) ) { + shortcodeString = decodeURIComponent( jQuery(shortcodeString).attr('data-wpview-text') ); + } + + currentShortcode = this.parseShortcodeString( shortcodeString ); + + if ( currentShortcode ) { + + var wp_media_frame = wp.media.frames.wp_media_frame = wp.media({ + frame : "post", + state : 'shortcode-ui', + currentShortcode : currentShortcode, + }); + + wp_media_frame.open(); + + } + + }, + + /** + * Parse a shortcode string and return shortcode model. + * Must be a registered shortcode - see window.Shortcode_UI.shortcodes. + * + * @todo - I think there must be a cleaner way to get the + * shortcode & args here that doesn't use regex. + * + * @param string shortcodeString + * @return Shortcode + */ + parseShortcodeString: function( shortcodeString ) { + + var model, attr; + + var megaRegex = /\[([^\s\]]+)([^\]]+)?\]([^\[]*)?(\[\/(\S+?)\])?/; + var matches = shortcodeString.match( megaRegex ); + // console.log(shortcodeString); + + if ( ! matches ) { + return; + } + + defaultShortcode = sui.shortcodes.findWhere({ + shortcode_tag : matches[1] + }); + + if ( ! defaultShortcode ) { + return; + } + + currentShortcode = defaultShortcode.clone(); + + if ( matches[2] ) { + + // Get all the attributes + attributeMatches = matches[2].match(/([^\s]+)/g) || []; + + // Keep track of all the unnamed attributes + var unnamedIndex = 0; + + // convert attribute strings to object. + // console.log('before find match', attributeMatches.length); + for (var i = 0; i < attributeMatches.length; i++) { + + // Handler for named attributes + if (attributeMatches[i].match(/\S+?="(.*?)"/) !== null ) { + + var bitsRegEx = /(\S+?)="(.*?)"/g; + var bits = bitsRegEx.exec(attributeMatches[i]); + + attr = currentShortcode.get('attrs').findWhere({ + attr : bits[1] + }); + if (attr) { + attr.set('value', bits[2]); + } + + // Handler for numeric/unnamed attributes + } else { + + attr = currentShortcode.get('attrs').findWhere({ + attr : (unnamedIndex++).toString() + }); + // console.log('finding', attr); + if (attr) { + attr.set('value', attributeMatches[i].replace(/^"(.*)"$/, '$1')); + } + + } + + } + + } + + if ( matches[3] ) { + var inner_content = currentShortcode.get( 'inner_content' ); + inner_content.set( 'value', matches[3] ); + } + + return currentShortcode; + + }, + + // Backwards compatability for Pre WP 4.2. + View: { + + overlay: true, + + initialize: function( options ) { + this.shortcode = this.getShortcode( options ); + }, + + getShortcode: function( options ) { + + var shortcodeModel, shortcode; + + shortcodeModel = sui.shortcodes.findWhere( { shortcode_tag: options.shortcode.tag } ); + + if (!shortcodeModel) { + return; + } + + shortcode = shortcodeModel.clone(); + + shortcode.get('attrs').each( + function(attr) { + + if (attr.get('attr') in options.shortcode.attrs.named) { + attr.set('value', + options.shortcode.attrs.named[attr + .get('attr')]); + } + + if ( attr.get( 'attr') in options.shortcode.attrs.numeric ) { + attr.set( + 'value', + options.shortcode.attrs.numeric[ attr.get( 'attr') ] + ); + } + + }); + + if ('content' in options.shortcode) { + var inner_content = shortcode.get('inner_content'); + if ( inner_content ) { + inner_content.set('value', options.shortcode.content) + } + } + + return shortcode; + + }, + + fetch : function() { + + var self = this; + + if ( ! this.parsed ) { + + wp.ajax.post( 'do_shortcode', { + post_id: jQuery( '#post_ID' ).val(), + shortcode: this.shortcode.formatShortcode(), + nonce: shortcodeUIData.nonces.preview, + }).done( function( response ) { + if ( response.indexOf( ''; + self.render( true ); + } ); + + } + + }, + + /** + * Render the shortcode + * + * To ensure consistent rendering - this makes an ajax request to the + * admin and displays. + * + * @return string html + */ + getHtml : function() { + + if ( ! this.parsed ) { + this.fetch(); + } + + return this.parsed; + }, + + /** + * Returns an array of tags for stylesheets applied to the TinyMCE editor. + * + * @method getEditorStyles + * @returns {Array} + */ + getEditorStyles: function() { + + var styles = ''; + + this.getNodes( function ( editor, node, content ) { + var dom = editor.dom, + bodyClasses = editor.getBody().className || '', + iframe, iframeDoc, i, resize; + + tinymce.each( dom.$( 'link[rel="stylesheet"]', editor.getDoc().head ), function( link ) { + if ( link.href && link.href.indexOf( 'skins/lightgray/content.min.css' ) === -1 && + link.href.indexOf( 'skins/wordpress/wp-content.css' ) === -1 ) { + + styles += dom.getOuterHTML( link ) + '\n'; + } + + }); + + } ); + + return styles; + }, + + }, + +}; + +module.exports = shortcodeViewConstructor; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./sui.js":12}],12:[function(require,module,exports){ +var Shortcodes = require('./../collections/shortcodes.js'); + +window.Shortcode_UI = window.Shortcode_UI || { + shortcodes: new Shortcodes, + views: {}, + controllers: {}, +}; + +module.exports = window.Shortcode_UI; + +},{"./../collections/shortcodes.js":7}]},{},[1,2,3,4,5]); diff --git a/js-tests/src/helpers/globalHelper.js b/js-tests/src/helpers/globalHelper.js new file mode 100644 index 00000000..f742ed1b --- /dev/null +++ b/js-tests/src/helpers/globalHelper.js @@ -0,0 +1,26 @@ +// Mock localization data. +window.shortcodeUIData = { + + "shortcodes": [], + + "strings": { + "media_frame_title":"Insert Post Element", + "media_frame_menu_insert_label":"Insert Post Element", + "media_frame_menu_update_label":"Post Element Details", + "media_frame_toolbar_insert_label":"Insert Element", + "media_frame_toolbar_update_label":"Update", + "edit_tab_label":"Edit", + "preview_tab_label":"Preview", + "mce_view_error":"Failed to load preview", + "search_placeholder":"Search", + "insert_content_label":"Inner Content" + }, + + "nonces":{ + "preview": "123", + "thumbnailImage": "123" + } + +}; + +window.shortcodeUIFieldData = {} diff --git a/js-tests/src/innerContentModelSpec.js b/js-tests/src/innerContentModelSpec.js new file mode 100644 index 00000000..3603fe0f --- /dev/null +++ b/js-tests/src/innerContentModelSpec.js @@ -0,0 +1,27 @@ +var InnerContent = require('../../js/models/inner-content'); + +describe( "Shortcode Inner Content Model", function() { + + var data = { + label: 'Inner Content', + type: 'textarea', + value: 'test content', + placeholder: 'test placeholder', + }; + + it( 'sets defaults correctly.', function() { + var content = new InnerContent(); + expect( content.toJSON() ).toEqual( { + label: 'Inner Content', + type: 'textarea', + value: '', + placeholder: '', + } ); + }); + + it( 'sets data correctly.', function() { + var content = new InnerContent( data ); + expect( content.toJSON() ).toEqual( data ); + }); + +} ); diff --git a/js-tests/src/shortcodeAttributeModelSpec.js b/js-tests/src/shortcodeAttributeModelSpec.js new file mode 100644 index 00000000..6161fc07 --- /dev/null +++ b/js-tests/src/shortcodeAttributeModelSpec.js @@ -0,0 +1,20 @@ +var ShortcodeAttribute = require('../../js/models/shortcode-attribute'); + +describe( "Shortcode Attribute Model", function() { + + var attrData = { + attr: 'attr', + label: 'Attribute', + type: 'text', + value: 'test value', + placeholder: 'test placeholder', + }; + + var attr = new ShortcodeAttribute( attrData ); + + it( 'should correctly set data.', function() { + expect( attr.toJSON() ).toEqual( attrData ); + }); + + +} ); diff --git a/js-tests/src/shortcodeModelSpec.js b/js-tests/src/shortcodeModelSpec.js new file mode 100644 index 00000000..e4f27850 --- /dev/null +++ b/js-tests/src/shortcodeModelSpec.js @@ -0,0 +1,68 @@ +var Shortcode = require('../../js/models/shortcode'); +var InnerContent = require('../../js/models/inner-content'); +var ShortcodeAttribute = require('../../js/models/shortcode-attribute'); +var ShortcodeAttributes = require('../../js/collections/shortcode-attributes'); + +describe( "Shortcode Model", function() { + + var defaultShortcode, shortcode, data; + + data = { + label: 'Test Label', + shortcode_tag: 'test_shortcode', + attrs: [ + { + attr: 'attr', + label: 'Attribute', + type: 'text', + value: 'test value', + placeholder: 'test placeholder', + } + ], + inner_content: { + value: 'test content', + }, + }; + + var defaultShortcode = new Shortcode(); + var shortcode = new Shortcode( data ); + + it( 'Defaults set correctly.', function() { + expect( defaultShortcode.get( 'label' ) ).toEqual( '' ); + expect( defaultShortcode.get( 'shortcode_tag' ) ).toEqual( '' ); + expect( defaultShortcode.get( 'attrs' ) instanceof ShortcodeAttributes ).toEqual( true ); + expect( defaultShortcode.get( 'attrs' ).length ).toEqual( 0 ); + expect( defaultShortcode.get( 'inner_content' ) ).toEqual( undefined ); + }); + + it( 'Attribute data set correctly..', function() { + expect( shortcode.get( 'attrs' ) instanceof ShortcodeAttributes ).toEqual( true ); + expect( shortcode.get( 'attrs' ).length ).toEqual( 1 ); + expect( shortcode.get( 'attrs' ).first().get('type') ).toEqual( data.attrs[0].type ); + }); + + it( 'Inner content set correctly..', function() { + expect( shortcode.get( 'inner_content' ) instanceof InnerContent ).toEqual( true ); + expect( shortcode.get( 'inner_content' ).get('value') ).toEqual( data.inner_content.value ); + }); + + it( 'Converted to JSON correctly.', function() { + var json = shortcode.toJSON(); + expect( json.label ).toEqual( data.label ); + expect( json.attrs[0].label ).toEqual( data.attrs[0].label ); + }); + + it( 'Format shortcode.', function() { + + var _shortcode = jQuery.extend( true, {}, shortcode ); + + // Test with attribute and with content. + expect( _shortcode.formatShortcode() ).toEqual( '[test_shortcode attr="test value"]test content[/test_shortcode]' ); + + // Test without content. + _shortcode.get('inner_content').unset( 'value' ); + expect( _shortcode.formatShortcode() ).toEqual( '[test_shortcode attr="test value"]' ); + + }); + +}); diff --git a/js-tests/src/utils/mceViewConstructorSpec.js b/js-tests/src/utils/mceViewConstructorSpec.js new file mode 100644 index 00000000..04a94213 --- /dev/null +++ b/js-tests/src/utils/mceViewConstructorSpec.js @@ -0,0 +1,161 @@ +var Shortcode = require('sui-models/shortcode'); +var MceViewConstructor = require('sui-utils/shortcode-view-constructor'); +var sui = require('sui-utils/sui'); +var jQuery = require('jquery'); +var wp = require('wp'); + +describe( "MCE View Constructor", function() { + + sui.shortcodes.push( new Shortcode( { + label: 'Test Label', + shortcode_tag: 'test_shortcode', + attrs: [ + { + attr: 'attr', + label: 'Attribute', + } + ], + inner_content: { + value: 'test content', + }, + } ) ); + + sui.shortcodes.push( new Shortcode( { + label: 'Test shortcode with dash', + shortcode_tag: 'test-shortcode', + attrs: [ + { + attr: 'test-attr', + label: 'Test attribute with dash', + } + ], + inner_content: { + value: 'test content', + }, + } ) ); + + it ( 'test get shortcode model', function() { + + var constructor = jQuery.extend( true, {}, MceViewConstructor ); + + constructor.shortcode = { + tag: "test_shortcode", + attrs: { + named: { + attr: "Vestibulum ante ipsum primis" + }, + }, + content: "Mauris iaculis porttitor posuere." + }; + + constructor.shortcodeModel = constructor.getShortcodeModel( constructor.shortcode ); + expect( constructor.shortcodeModel instanceof Shortcode ).toEqual( true ); + expect( constructor.shortcodeModel.get( 'attrs' ).first().get( 'value' ) ).toEqual( 'Vestibulum ante ipsum primis' ); + expect( constructor.shortcodeModel.get( 'inner_content' ).get( 'value' ) ).toEqual( 'Mauris iaculis porttitor posuere.' ); + + } ); + + it ( 'test getContent.', function() { + + var constructor = jQuery.extend( true, {}, MceViewConstructor ); + + spyOn( constructor, 'fetch' ); + + // If content is set - just return and don't fetch data. + constructor.content = '

test content

'; + expect( constructor.getContent() ).toEqual( '

test content

' ); + expect( constructor.fetch ).not.toHaveBeenCalled(); + + // If content is empty - just null and fetch should be called. + constructor.content = null; + expect( constructor.getContent() ).toEqual( null ); + expect( constructor.fetch ).toHaveBeenCalled(); + + } ); + + describe( "Fetch preview HTML", function() { + + beforeEach(function() { + jasmine.Ajax.install(); + }); + + afterEach(function() { + jasmine.Ajax.uninstall(); + }); + + var constructor = jQuery.extend( true, { + render: function( force ) {}, + }, MceViewConstructor ); + + // Mock shortcode model data. + constructor.shortcodeModel = jQuery.extend( true, {}, sui.shortcodes.first() ); + + it( 'Fetches data success', function(){ + + spyOn( wp.ajax, "post" ).and.callThrough(); + spyOn( constructor, "render" ); + + constructor.fetch(); + + expect( constructor.fetching ).toEqual( true ); + expect( constructor.content ).toEqual( undefined ); + expect( wp.ajax.post ).toHaveBeenCalled(); + expect( constructor.render ).not.toHaveBeenCalled(); + + jasmine.Ajax.requests.mostRecent().respondWith( { + 'status': 200, + 'responseText': '{"success":true,"data":"test preview response body"}' + } ); + + expect( constructor.fetching ).toEqual( undefined ); + expect( constructor.content ).toEqual( 'test preview response body' ); + expect( constructor.render ).toHaveBeenCalled(); + + }); + + it( 'Handles errors when fetching data', function() { + + spyOn( constructor, "render" ); + + constructor.fetch(); + + jasmine.Ajax.requests.mostRecent().respondWith( { + 'status': 500, + 'responseText': '{"success":false}' + }); + + expect( constructor.fetching ).toEqual( undefined ); + expect( constructor.content ).toContain( 'shortcake-error' ); + expect( constructor.render ).toHaveBeenCalled(); + + } ); + + } ); + + it( 'parses simple shortcode', function() { + var shortcode = MceViewConstructor.parseShortcodeString( '[test_shortcode attr="test value"]') + expect( shortcode instanceof Shortcode ).toEqual( true ); + expect( shortcode.get( 'attrs' ).findWhere( { attr: 'attr' }).get('value') ).toEqual( 'test value' ); + }); + + it( 'parses shortcode with content', function() { + var shortcode = MceViewConstructor.parseShortcodeString( '[test_shortcode attr="test value 1"]test content [/test_shortcode]') + expect( shortcode instanceof Shortcode ).toEqual( true ); + expect( shortcode.get( 'attrs' ).findWhere( { attr: 'attr' }).get('value') ).toEqual( 'test value 1' ); + expect( shortcode.get( 'inner_content' ).get('value') ).toEqual( 'test content ' ); + }); + + it( 'parses shortcode with dashes in name and attribute', function() { + var shortcode = MceViewConstructor.parseShortcodeString( '[test-shortcode test-attr="test value 2"]') + expect( shortcode instanceof Shortcode ).toEqual( true ); + expect( shortcode.get( 'attrs' ).findWhere( { attr: 'test-attr' }).get('value') ).toEqual( 'test value 2' ); + }); + + // https://github.com/fusioneng/Shortcake/issues/171 + xit( 'parses shortcode with line breaks in inner content', function() { + var shortcode = MceViewConstructor.parseShortcodeString( "[test_shortcode]test \ncontent \r2 [/test_shortcode]") + expect( shortcode instanceof Shortcode ).toEqual( true ); + expect( shortcode.get( 'inner_content' ).get('value') ).toEqual( "test \ncontent \r2 " ); + } ); + +} ); diff --git a/js-tests/src/utils/suiSpec.js b/js-tests/src/utils/suiSpec.js new file mode 100644 index 00000000..eba37962 --- /dev/null +++ b/js-tests/src/utils/suiSpec.js @@ -0,0 +1,15 @@ +var Shortcodes = require('sui-collections/shortcodes'); +var sui = require('sui-utils/sui'); + +describe( "SUI Util", function() { + + it( 'sets global variable', function() { + expect( window.Shortcode_UI ).toEqual( sui ); + }); + + it( 'expected properties', function() { + expect( sui.shortcodes instanceof Shortcodes ).toEqual( true ); + expect( sui.views ).toEqual( {} ); + }); + +} ); diff --git a/js/build/field-attachment.js b/js/build/field-attachment.js new file mode 100644 index 00000000..8e9bb606 --- /dev/null +++ b/js/build/field-attachment.js @@ -0,0 +1,408 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o'); + + if ( 'image' !== attachment.type ) { + + jQuery( '', { + src: attachment.icon, + alt: attachment.title, + } ).appendTo( $thumbnail ); + + jQuery( '
', { + class: 'filename', + html: '
' + attachment.title + '
', + } ).appendTo( $thumbnail ); + + } else { + + jQuery( '', { + src: attachment.sizes.thumbnail.url, + width: attachment.sizes.thumbnail.width, + height: attachment.sizes.thumbnail.height, + alt: attachment.alt, + } ) .appendTo( $thumbnail ) + + } + + $thumbnail.find( 'img' ).wrap( '
' ); + $container.append( $thumbnail ); + $container.toggleClass( 'has-attachment', true ); + + } + + /** + * Remove the attachment. + * Render preview & Update the model. + */ + var removeAttachment = function() { + + model.set( 'value', null ); + + $container.toggleClass( 'has-attachment', false ); + $container.toggleClass( 'has-attachment', false ); + $container.find( '.thumbnail' ).remove(); + } + + // Add initial Attachment if available. + updateAttachment( model.get( 'value' ) ); + + // Remove file when the button is clicked. + $removeButton.click( function(e) { + e.preventDefault(); + removeAttachment(); + }); + + // Open media frame when add button is clicked + $addButton.click( function(e) { + e.preventDefault(); + frame.open(); + } ); + + // Update the attachment when an item is selected. + frame.on( 'select', function() { + + var selection = frame.state().get('selection'); + attachment = selection.first(); + + updateAttachment( attachment.id ); + + frame.close(); + + }); + + } + +} ); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./utils/sui.js":7,"./views/edit-attribute-field.js":8}],4:[function(require,module,exports){ +(function (global){ +var Backbone = (typeof window !== "undefined" ? window.Backbone : typeof global !== "undefined" ? global.Backbone : null); + +/** + * Shortcode Attribute Model. + */ +var InnerContent = Backbone.Model.extend({ + defaults : { + label: shortcodeUIData.strings.insert_content_label, + type: 'textarea', + value: '', + placeholder: '', + }, +}); + +module.exports = InnerContent; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],5:[function(require,module,exports){ +(function (global){ +var Backbone = (typeof window !== "undefined" ? window.Backbone : typeof global !== "undefined" ? global.Backbone : null); + +var ShortcodeAttribute = Backbone.Model.extend({ + defaults: { + attr: '', + label: '', + type: '', + value: '', + placeholder: '', + }, +}); + +module.exports = ShortcodeAttribute; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],6:[function(require,module,exports){ +(function (global){ +var Backbone = (typeof window !== "undefined" ? window.Backbone : typeof global !== "undefined" ? global.Backbone : null); +var ShortcodeAttributes = require('./../collections/shortcode-attributes.js'); +var InnerContent = require('./inner-content.js'); + +Shortcode = Backbone.Model.extend({ + + defaults: { + label: '', + shortcode_tag: '', + attrs: new ShortcodeAttributes, + }, + + /** + * Custom set method. + * Handles setting the attribute collection. + */ + set: function( attributes, options ) { + + if ( attributes.attrs !== undefined && ! ( attributes.attrs instanceof ShortcodeAttributes ) ) { + attributes.attrs = new ShortcodeAttributes( attributes.attrs ); + } + + if ( attributes.inner_content && ! ( attributes.inner_content instanceof InnerContent ) ) { + attributes.inner_content = new InnerContent( attributes.inner_content ); + } + + return Backbone.Model.prototype.set.call(this, attributes, options); + }, + + /** + * Custom toJSON. + * Handles converting the attribute collection to JSON. + */ + toJSON: function( options ) { + options = Backbone.Model.prototype.toJSON.call(this, options); + if ( options.attrs && ( options.attrs instanceof ShortcodeAttributes ) ) { + options.attrs = options.attrs.toJSON(); + } + if ( options.inner_content && ( options.inner_content instanceof InnerContent ) ) { + options.inner_content = options.inner_content.toJSON(); + } + return options; + }, + + /** + * Custom clone + * Make sure we don't clone a reference to attributes. + */ + clone: function() { + var clone = Backbone.Model.prototype.clone.call( this ); + clone.set( 'attrs', clone.get( 'attrs' ).clone() ); + if ( clone.get( 'inner_content' ) ) { + clone.set( 'inner_content', clone.get( 'inner_content' ).clone() ); + } + return clone; + }, + + /** + * Get the shortcode as... a shortcode! + * + * @return string eg [shortcode attr1=value] + */ + formatShortcode: function() { + + var template, shortcodeAttributes, attrs = [], content, self = this; + + this.get( 'attrs' ).each( function( attr ) { + + // Handle content attribute as a special case. + if ( attr.get( 'attr' ) === 'content' ) { + content = attr.get( 'value' ); + } else { + + // Numeric/unnamed attributes + if ( ! isNaN( attr.get( 'attr' ) ) ) { + + // Empty attributes are false to preserve attribute keys + // console.log(attr, attr.get( 'value' )); + attrs.push( typeof attr.get( 'value' ) === 'undefined' || attr.get( 'value' ).trim() === '' ? 'false' : attr.get( 'value' ) ); + + // String attribute names + } else { + + // Skip empty attributes. + if ( ! attr.get( 'value' ) || attr.get( 'value' ).length < 1 ) { + return; + } + + attrs.push( attr.get( 'attr' ) + '="' + attr.get( 'value' ) + '"' ); + } + } + + } ); + + if ( this.get( 'inner_content' ) ) { + content = this.get( 'inner_content' ).get( 'value' ); + } + + template = "[{{ shortcode }} {{ attributes }}]" + + if ( content && content.length > 0 ) { + template += "{{ content }}[/{{ shortcode }}]" + } + + template = template.replace( /{{ shortcode }}/g, this.get('shortcode_tag') ); + template = template.replace( /{{ attributes }}/g, attrs.join( ' ' ) ); + template = template.replace( /{{ content }}/g, content ); + + return template; + + } + +}); + +module.exports = Shortcode; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./../collections/shortcode-attributes.js":1,"./inner-content.js":4}],7:[function(require,module,exports){ +var Shortcodes = require('./../collections/shortcodes.js'); + +window.Shortcode_UI = window.Shortcode_UI || { + shortcodes: new Shortcodes, + views: {}, + controllers: {}, +}; + +module.exports = window.Shortcode_UI; + +},{"./../collections/shortcodes.js":2}],8:[function(require,module,exports){ +(function (global){ +var Backbone = (typeof window !== "undefined" ? window.Backbone : typeof global !== "undefined" ? global.Backbone : null); +sui = require('./../utils/sui.js'); + +var editAttributeField = Backbone.View.extend( { + + tagName: "div", + + events: { + 'keyup input[type="text"]': 'updateValue', + 'keyup textarea': 'updateValue', + 'change select': 'updateValue', + 'change input[type=checkbox]': 'updateValue', + 'change input[type=radio]': 'updateValue', + 'change input[type=email]': 'updateValue', + 'change input[type=number]': 'updateValue', + 'change input[type=date]': 'updateValue', + 'change input[type=url]': 'updateValue', + }, + + render: function() { + this.$el.html( this.template( this.model.toJSON() ) ); + return this + }, + + /** + * Input Changed Update Callback. + * + * If the input field that has changed is for content or a valid attribute, + * then it should update the model. + */ + updateValue: function( e ) { + + if ( this.model.get( 'attr' ) ) { + var $el = jQuery( this.el ).find( '[name=' + this.model.get( 'attr' ) + ']' ); + } else { + var $el = jQuery( this.el ).find( '[name="inner_content"]' ); + } + + if ( 'radio' === this.model.attributes.type ) { + this.model.set( 'value', $el.filter(':checked').first().val() ); + } else if ( 'checkbox' === this.model.attributes.type ) { + this.model.set( 'value', $el.is( ':checked' ) ); + } else { + this.model.set( 'value', $el.val() ); + } + }, + +} ); + +sui.views.editAttributeField = editAttributeField; +module.exports = editAttributeField; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./../utils/sui.js":7}]},{},[3]); diff --git a/js/build/field-color.js b/js/build/field-color.js new file mode 100644 index 00000000..0295b42f --- /dev/null +++ b/js/build/field-color.js @@ -0,0 +1,279 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0 ) { + template += "{{ content }}[/{{ shortcode }}]" + } + + template = template.replace( /{{ shortcode }}/g, this.get('shortcode_tag') ); + template = template.replace( /{{ attributes }}/g, attrs.join( ' ' ) ); + template = template.replace( /{{ content }}/g, content ); + + return template; + + } + +}); + +module.exports = Shortcode; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./../collections/shortcode-attributes.js":1,"./inner-content.js":4}],7:[function(require,module,exports){ +var Shortcodes = require('./../collections/shortcodes.js'); + +window.Shortcode_UI = window.Shortcode_UI || { + shortcodes: new Shortcodes, + views: {}, + controllers: {}, +}; + +module.exports = window.Shortcode_UI; + +},{"./../collections/shortcodes.js":2}],8:[function(require,module,exports){ +(function (global){ +var Backbone = (typeof window !== "undefined" ? window.Backbone : typeof global !== "undefined" ? global.Backbone : null); +sui = require('./../utils/sui.js'); + +var editAttributeField = Backbone.View.extend( { + + tagName: "div", + + events: { + 'keyup input[type="text"]': 'updateValue', + 'keyup textarea': 'updateValue', + 'change select': 'updateValue', + 'change input[type=checkbox]': 'updateValue', + 'change input[type=radio]': 'updateValue', + 'change input[type=email]': 'updateValue', + 'change input[type=number]': 'updateValue', + 'change input[type=date]': 'updateValue', + 'change input[type=url]': 'updateValue', + }, + + render: function() { + this.$el.html( this.template( this.model.toJSON() ) ); + return this + }, + + /** + * Input Changed Update Callback. + * + * If the input field that has changed is for content or a valid attribute, + * then it should update the model. + */ + updateValue: function( e ) { + + if ( this.model.get( 'attr' ) ) { + var $el = jQuery( this.el ).find( '[name=' + this.model.get( 'attr' ) + ']' ); + } else { + var $el = jQuery( this.el ).find( '[name="inner_content"]' ); + } + + if ( 'radio' === this.model.attributes.type ) { + this.model.set( 'value', $el.filter(':checked').first().val() ); + } else if ( 'checkbox' === this.model.attributes.type ) { + this.model.set( 'value', $el.is( ':checked' ) ); + } else { + this.model.set( 'value', $el.val() ); + } + }, + +} ); + +sui.views.editAttributeField = editAttributeField; +module.exports = editAttributeField; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./../utils/sui.js":7}]},{},[3]); diff --git a/js/build/shortcode-ui.js b/js/build/shortcode-ui.js index 117374b3..2bfe1613 100644 --- a/js/build/shortcode-ui.js +++ b/js/build/shortcode-ui.js @@ -195,7 +195,7 @@ Shortcode = Backbone.Model.extend({ if ( ! isNaN( attr.get( 'attr' ) ) ) { // Empty attributes are false to preserve attribute keys - attrs.push( attr.get( 'value' ).trim() === '' ? 'false' : attr.get( 'value' ) ); + attrs.push( typeof attr.get( 'value' ) === 'undefined' || attr.get( 'value' ).trim() === '' ? 'false' : attr.get( 'value' ) ); // String attribute names } else { @@ -488,13 +488,14 @@ var shortcodeViewConstructor = { if (matches[2]) { // Get all the attributes - attributeMatches = matches[2].match(/([^\s]+)/g) || []; + // attributeMatches = matches[2].match(/([^\s]+)/g) || []; + attributeMatches = matches[2].match(/(\S+?="(.*?)"|([^\s\]]+))/g) || []; // Keep track of all the unnamed attributes var unnamedIndex = 0; // convert attribute strings to object. - for (var i = 0; i < attributeMatches.length; i++) { + for (var i = 1; i < attributeMatches.length; i++) { // Handler for named attributes if (attributeMatches[i].match(/\S+?="(.*?)"/) !== null ) { @@ -568,6 +569,13 @@ var shortcodeViewConstructor = { options.shortcode.attrs.named[attr .get('attr')]); } + + if ( attr.get( 'attr') in options.shortcode.attrs.numeric ) { + attr.set( + 'value', + options.shortcode.attrs.numeric[ attr.get( 'attr') ] + ); + } }); @@ -848,6 +856,198 @@ module.exports = insertShortcodeList; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"./../utils/sui.js":10,"./insert-shortcode-list-item.js":13}],15:[function(require,module,exports){ (function (global){ +var wp = (typeof window !== "undefined" ? window.wp : typeof global !== "undefined" ? global.wp : null), + MediaController = require('./../controllers/media-controller.js'), + Shortcode_UI = require('./shortcode-ui'), + Toolbar = require('./media-toolbar'); + +var postMediaFrame = wp.media.view.MediaFrame.Post; +var mediaFrame = postMediaFrame.extend( { + + initialize: function() { + + postMediaFrame.prototype.initialize.apply( this, arguments ); + + var id = 'shortcode-ui'; + + var opts = { + id : id, + search : true, + router : false, + toolbar : id + '-toolbar', + menu : 'default', + title : shortcodeUIData.strings.media_frame_menu_insert_label, + tabs : [ 'insert' ], + priority: 66, + content : id + '-content-insert', + }; + + if ( 'currentShortcode' in this.options ) { + opts.title = shortcodeUIData.strings.media_frame_menu_update_label; + } + + var controller = new MediaController( opts ); + + if ( 'currentShortcode' in this.options ) { + controller.props.set( 'currentShortcode', arguments[0].currentShortcode ); + controller.props.set( 'action', 'update' ); + } + + this.states.add([ controller]); + + this.on( 'content:render:' + id + '-content-insert', _.bind( this.contentRender, this, 'shortcode-ui', 'insert' ) ); + this.on( 'toolbar:create:' + id + '-toolbar', this.toolbarCreate, this ); + this.on( 'toolbar:render:' + id + '-toolbar', this.toolbarRender, this ); + this.on( 'menu:render:default', this.renderShortcodeUIMenu ); + + }, + + contentRender : function( id, tab ) { + this.content.set( + new Shortcode_UI( { + controller: this, + className: 'clearfix ' + id + '-content ' + id + '-content-' + tab + } ) + ); + }, + + toolbarRender: function( toolbar ) {}, + + toolbarCreate : function( toolbar ) { + var text = shortcodeUIData.strings.media_frame_toolbar_insert_label; + if ( 'currentShortcode' in this.options ) { + text = shortcodeUIData.strings.media_frame_toolbar_update_label; + } + + toolbar.view = new Toolbar( { + controller : this, + items: { + insert: { + text: text, + style: 'primary', + priority: 80, + requires: false, + click: this.insertAction, + } + } + } ); + }, + + renderShortcodeUIMenu: function( view ) { + + // Add a menu separator link. + view.set({ + 'shortcode-ui-separator': new wp.media.View({ + className: 'separator', + priority: 65 + }) + }); + + // Hide menu if editing. + // @todo - fix this. + // This is a hack. + // I just can't work out how to do it properly... + if ( + view.controller.state().props + && view.controller.state().props.get( 'currentShortcode' ) + ) { + window.setTimeout( function() { + view.controller.$el.addClass( 'hide-menu' ); + } ); + } + + }, + + insertAction: function() { + this.controller.state().insert(); + }, + +} ); + +module.exports = mediaFrame; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./../controllers/media-controller.js":3,"./media-toolbar":16,"./shortcode-ui":20}],16:[function(require,module,exports){ +(function (global){ +var wp = (typeof window !== "undefined" ? window.wp : typeof global !== "undefined" ? global.wp : null); + +/** + * Toolbar view that extends wp.media.view.Toolbar + * to define cusotm refresh method + */ +var Toolbar = wp.media.view.Toolbar.extend({ + initialize : function() { + _.defaults(this.options, { + requires : false + }); + // Call 'initialize' directly on the parent class. + wp.media.view.Toolbar.prototype.initialize.apply(this, arguments); + }, + + refresh : function() { + var action = this.controller.state().props.get('action'); + if( this.get('insert') ) { + this.get('insert').model.set('disabled', action == 'select'); + } + /** + * call 'refresh' directly on the parent class + */ + wp.media.view.Toolbar.prototype.refresh.apply(this, arguments); + } +}); + +module.exports = Toolbar; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],17:[function(require,module,exports){ +(function (global){ +var wp = (typeof window !== "undefined" ? window.wp : typeof global !== "undefined" ? global.wp : null); +sui = require('./../utils/sui.js'); + +var SearchShortcode = wp.media.view.Search.extend({ + tagName: 'input', + className: 'search', + id: 'media-search-input', + + initialize: function( options ) { + this.shortcodeList = options.shortcodeList; + }, + + attributes: { + type: 'search', + placeholder: shortcodeUIData.strings.search_placeholder + }, + + events: { + 'keyup': 'search', + }, + + /** + * @returns {wp.media.view.Search} Returns itself to allow chaining + */ + render: function() { + this.el.value = this.model.escape('search'); + return this; + }, + + refreshShortcodes: function( shortcodeData ) { + this.shortcodeList.refresh( shortcodeData ); + }, + + search: function( event ) { + if ( event.target.value == '' ) { + this.refreshShortcodes( sui.shortcodes ); + } else { + this.refreshShortcodes( this.controller.search( event.target.value ) ); + } + } +}); + +sui.views.SearchShortcode = SearchShortcode; +module.exports = SearchShortcode; +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./../utils/sui.js":10}],18:[function(require,module,exports){ +(function (global){ var wp = (typeof window !== "undefined" ? window.wp : typeof global !== "undefined" ? global.wp : null), MediaController = require('./../controllers/media-controller.js'), Shortcode_UI = require('./shortcode-ui'), @@ -958,7 +1158,7 @@ wp.media.view.MediaFrame.Post = shortcodeFrame.extend({ }); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./../controllers/media-controller.js":3,"./../utils/sui.js":10,"./shortcode-ui":17,"./toolbar":19}],16:[function(require,module,exports){ +},{"./../controllers/media-controller.js":3,"./../utils/sui.js":10,"./shortcode-ui":20,"./toolbar":22}],19:[function(require,module,exports){ (function (global){ var Backbone = (typeof window !== "undefined" ? window.Backbone : typeof global !== "undefined" ? global.Backbone : null); @@ -1145,7 +1345,7 @@ sui.views.ShortcodePreview = ShortcodePreview; module.exports = ShortcodePreview; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./../utils/sui.js":10}],17:[function(require,module,exports){ +},{"./../utils/sui.js":10}],20:[function(require,module,exports){ (function (global){ var Backbone = (typeof window !== "undefined" ? window.Backbone : typeof global !== "undefined" ? global.Backbone : null), insertShortcodeList = require('./insert-shortcode-list.js'), @@ -1253,7 +1453,7 @@ sui.views.Shortcode_UI = Shortcode_UI; module.exports = Shortcode_UI; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./../utils/sui.js":10,"./edit-shortcode-form.js":12,"./insert-shortcode-list.js":14,"./shortcode-preview.js":16,"./tabbed-view.js":18}],18:[function(require,module,exports){ +},{"./../utils/sui.js":10,"./edit-shortcode-form.js":12,"./insert-shortcode-list.js":14,"./shortcode-preview.js":19,"./tabbed-view.js":21}],21:[function(require,module,exports){ (function (global){ var Backbone = (typeof window !== "undefined" ? window.Backbone : typeof global !== "undefined" ? global.Backbone : null); @@ -1378,7 +1578,7 @@ var TabbedView = Backbone.View.extend({ sui.views.TabbedView = TabbedView; module.exports = TabbedView; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./../utils/sui.js":10}],19:[function(require,module,exports){ +},{"./../utils/sui.js":10}],22:[function(require,module,exports){ (function (global){ var wp = (typeof window !== "undefined" ? window.wp : typeof global !== "undefined" ? global.wp : null); @@ -1410,4 +1610,4 @@ var Toolbar = wp.media.view.Toolbar.extend({ sui.views.Toolbar = Toolbar; module.exports = Toolbar; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./../utils/sui.js":10}]},{},[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]); +},{"./../utils/sui.js":10}]},{},[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]); diff --git a/js/models/shortcode.js b/js/models/shortcode.js index d46741b4..53a83f5a 100644 --- a/js/models/shortcode.js +++ b/js/models/shortcode.js @@ -75,7 +75,7 @@ Shortcode = Backbone.Model.extend({ if ( ! isNaN( attr.get( 'attr' ) ) ) { // Empty attributes are false to preserve attribute keys - attrs.push( attr.get( 'value' ).trim() === '' ? 'false' : attr.get( 'value' ) ); + attrs.push( typeof attr.get( 'value' ) === 'undefined' || attr.get( 'value' ).trim() === '' ? 'false' : attr.get( 'value' ) ); // String attribute names } else { diff --git a/js/utils/shortcode-view-constructor.js b/js/utils/shortcode-view-constructor.js index 84fbec2c..08ad4d8f 100644 --- a/js/utils/shortcode-view-constructor.js +++ b/js/utils/shortcode-view-constructor.js @@ -114,13 +114,13 @@ var shortcodeViewConstructor = { if (matches[2]) { // Get all the attributes - attributeMatches = matches[2].match(/([^\s]+)/g) || []; + attributeMatches = matches[2].match(/(\S+?="(.*?)"|([^\s\]]+))/g) || []; // Keep track of all the unnamed attributes var unnamedIndex = 0; // convert attribute strings to object. - for (var i = 0; i < attributeMatches.length; i++) { + for (var i = 1; i < attributeMatches.length; i++) { // Handler for named attributes if (attributeMatches[i].match(/\S+?="(.*?)"/) !== null ) { @@ -194,6 +194,13 @@ var shortcodeViewConstructor = { options.shortcode.attrs.named[attr .get('attr')]); } + + if ( attr.get( 'attr') in options.shortcode.attrs.numeric ) { + attr.set( + 'value', + options.shortcode.attrs.numeric[ attr.get( 'attr') ] + ); + } }); diff --git a/js/views/media-frame.js b/js/views/media-frame.js new file mode 100644 index 00000000..777a5dea --- /dev/null +++ b/js/views/media-frame.js @@ -0,0 +1,109 @@ +var wp = require('wp'), + MediaController = require('sui-controllers/media-controller'), + Shortcode_UI = require('./shortcode-ui'), + Toolbar = require('./media-toolbar'); + +var postMediaFrame = wp.media.view.MediaFrame.Post; +var mediaFrame = postMediaFrame.extend( { + + initialize: function() { + + postMediaFrame.prototype.initialize.apply( this, arguments ); + + var id = 'shortcode-ui'; + + var opts = { + id : id, + search : true, + router : false, + toolbar : id + '-toolbar', + menu : 'default', + title : shortcodeUIData.strings.media_frame_menu_insert_label, + tabs : [ 'insert' ], + priority: 66, + content : id + '-content-insert', + }; + + if ( 'currentShortcode' in this.options ) { + opts.title = shortcodeUIData.strings.media_frame_menu_update_label; + } + + var controller = new MediaController( opts ); + + if ( 'currentShortcode' in this.options ) { + controller.props.set( 'currentShortcode', arguments[0].currentShortcode ); + controller.props.set( 'action', 'update' ); + } + + this.states.add([ controller]); + + this.on( 'content:render:' + id + '-content-insert', _.bind( this.contentRender, this, 'shortcode-ui', 'insert' ) ); + this.on( 'toolbar:create:' + id + '-toolbar', this.toolbarCreate, this ); + this.on( 'toolbar:render:' + id + '-toolbar', this.toolbarRender, this ); + this.on( 'menu:render:default', this.renderShortcodeUIMenu ); + + }, + + contentRender : function( id, tab ) { + this.content.set( + new Shortcode_UI( { + controller: this, + className: 'clearfix ' + id + '-content ' + id + '-content-' + tab + } ) + ); + }, + + toolbarRender: function( toolbar ) {}, + + toolbarCreate : function( toolbar ) { + var text = shortcodeUIData.strings.media_frame_toolbar_insert_label; + if ( 'currentShortcode' in this.options ) { + text = shortcodeUIData.strings.media_frame_toolbar_update_label; + } + + toolbar.view = new Toolbar( { + controller : this, + items: { + insert: { + text: text, + style: 'primary', + priority: 80, + requires: false, + click: this.insertAction, + } + } + } ); + }, + + renderShortcodeUIMenu: function( view ) { + + // Add a menu separator link. + view.set({ + 'shortcode-ui-separator': new wp.media.View({ + className: 'separator', + priority: 65 + }) + }); + + // Hide menu if editing. + // @todo - fix this. + // This is a hack. + // I just can't work out how to do it properly... + if ( + view.controller.state().props + && view.controller.state().props.get( 'currentShortcode' ) + ) { + window.setTimeout( function() { + view.controller.$el.addClass( 'hide-menu' ); + } ); + } + + }, + + insertAction: function() { + this.controller.state().insert(); + }, + +} ); + +module.exports = mediaFrame; diff --git a/js/views/media-toolbar.js b/js/views/media-toolbar.js new file mode 100644 index 00000000..480b2773 --- /dev/null +++ b/js/views/media-toolbar.js @@ -0,0 +1,28 @@ +var wp = require('wp'); + +/** + * Toolbar view that extends wp.media.view.Toolbar + * to define cusotm refresh method + */ +var Toolbar = wp.media.view.Toolbar.extend({ + initialize : function() { + _.defaults(this.options, { + requires : false + }); + // Call 'initialize' directly on the parent class. + wp.media.view.Toolbar.prototype.initialize.apply(this, arguments); + }, + + refresh : function() { + var action = this.controller.state().props.get('action'); + if( this.get('insert') ) { + this.get('insert').model.set('disabled', action == 'select'); + } + /** + * call 'refresh' directly on the parent class + */ + wp.media.view.Toolbar.prototype.refresh.apply(this, arguments); + } +}); + +module.exports = Toolbar; diff --git a/js/views/search-shortcode.js b/js/views/search-shortcode.js new file mode 100644 index 00000000..15a8f1f7 --- /dev/null +++ b/js/views/search-shortcode.js @@ -0,0 +1,44 @@ +var wp = require('wp'); +sui = require('sui-utils/sui'); + +var SearchShortcode = wp.media.view.Search.extend({ + tagName: 'input', + className: 'search', + id: 'media-search-input', + + initialize: function( options ) { + this.shortcodeList = options.shortcodeList; + }, + + attributes: { + type: 'search', + placeholder: shortcodeUIData.strings.search_placeholder + }, + + events: { + 'keyup': 'search', + }, + + /** + * @returns {wp.media.view.Search} Returns itself to allow chaining + */ + render: function() { + this.el.value = this.model.escape('search'); + return this; + }, + + refreshShortcodes: function( shortcodeData ) { + this.shortcodeList.refresh( shortcodeData ); + }, + + search: function( event ) { + if ( event.target.value == '' ) { + this.refreshShortcodes( sui.shortcodes ); + } else { + this.refreshShortcodes( this.controller.search( event.target.value ) ); + } + } +}); + +sui.views.SearchShortcode = SearchShortcode; +module.exports = SearchShortcode; \ No newline at end of file diff --git a/readme.txt b/readme.txt new file mode 100644 index 00000000..a272d520 --- /dev/null +++ b/readme.txt @@ -0,0 +1,57 @@ +=== Shortcake (Shortcode UI) === +Contributors: mattheu, danielbachhuber, zebulonj, jitendraharpalani, sanchothefat, bfintal, davisshaver +Tags: shortcodes +Requires at least: 4.1 +Tested up to: 4.2 +Stable tag: 0.2.1 +License: GPLv2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html + +Shortcake makes using WordPress shortcodes a piece of cake. + +== Description == + +Used alongside `add_shortcode`, Shortcake supplies a user-friendly interface for adding a shortcode to a post, and viewing and editing it from within the content editor. + +Once you've installed the plugin, you'll need to [register UI for your shortcodes](https://github.com/fusioneng/Shortcake/wiki/Registering-Shortcode-UI). For inspiration, check out [examples of Shortcake in the wild](https://github.com/fusioneng/Shortcake/wiki/Shortcode-UI-Examples). + +To report bugs or feature requests, [please use Github issues](https://github.com/fusioneng/Shortcake/issues). + +== Installation == + +Shortcake can be installed like any other WordPress plugin. + +Once you've done so, you'll need to [register the UI for your code](https://github.com/fusioneng/Shortcake/wiki/Registering-Shortcode-UI). + +== Screenshots == + +1. Without Shortcake, shortcodes have a minimal UI. +2. But with Shortcake, TinyMCE will render the shortcode in a TinyMCE view. +3. And add a user-friendly UI to edit shortcode content and attributes. +4. Add new shortcodes to your post through "Add Media". + +== Changelog == + += 0.2.1 (March 18, 2015) = + +* Ensure use of jQuery respects jQuery.noConflict() mode in WP. + += 0.2.0 (March 18, 2015) = + +* JS abstracted using Browserify. +* Enhancements to "Add Post Element" UI: shortcodes sorted alphabetically; search based on label. +* Much easier to select shortcode previews that include iframes. +* WordPress 4.2 compatibility. +* Added color picker to list of potential fields. +* Bug fix: IE11 compatibility. +* Bug fix: Checkbox field can now be unchecked. +* [Full release notes](http://fusion.net/story/105889/shortcake-v0-2-0-js-abstraction-add-post-element-enhancements-inner-content-field/). + += 0.1.0 (December 23, 2014) = + +* Supports all HTML5 input types for form fields. +* Shortcode preview tab within the editing experience. +* Re-labeled the UI around “Post Elements”, which is more descriptive than “Content Items.” +* Many bug fixes. +* [Full release notes](http://next.fusion.net/2014/12/23/shortcake-v0-1-0-live-previews-fieldmanager-integration/). + diff --git a/screenshot-1.png b/screenshot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..fc23a2b59f95bdbac63821e5dec6c9ae978ccdfd GIT binary patch literal 30633 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 FV1j7w3GV;^ literal 0 HcmV?d00001