diff --git a/.gitmodules b/.gitmodules index 52c6a5f..403abfe 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ [submodule "vendor/mailchimp-api-php"] path = vendor/mailchimp-api-php url = https://bitbucket.org/mailchimp/mailchimp-api-php.git -[submodule "wordpress-mailchimp-tools"] - path = wordpress-mailchimp-tools - url = https://github.com/INN/wordpress-mailchimp-tools.git diff --git a/.travis.yml b/.travis.yml index a1b234b..777b1c9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,17 +1,45 @@ # Travis CI Configuration File +# Use Travis CI container-based infrastructure +# See: http://docs.travis-ci.com/user/workers/container-based-infrastructure/ +sudo: false + # Tell Travis CI we're using PHP language: php # PHP version used in first build configuration. -php: - - "5.3" - -sudo: false +# https://secure.php.net/supported-versions.php +# php: +# # PHP pre-5.6 is EOL +# - "5.6" +# # PHP 7.0 is EOL +# - "7.1" +# - "7.2" +# - "7.3" # WordPress version used in first build configuration. -env: - - WP_VERSION=4.2.1 WP_TESTS_DIR=/tmp/wordpress/tests/phpunit WP_CORE_DIR=/tmp/wordpress +# env: +# - WP_VERSION=4.2.1 WP_TESTS_DIR=/tmp/wordpress/tests/phpunit WP_CORE_DIR=/tmp/wordpress + +# for a breakdown of why these versions were chosen, see https://github.com/INN/WP-DS-NPR-API/issues/12#issuecomment-374730094 +matrix: + include: + # PHPUnit 5 + - php: 5.6 + env: WP_VERSION=4.9 WP_TESTS_DIR=/tmp/wordpress/tests/phpunit WP_CORE_DIR=/tmp/wordpress + # PHPUnit 6 + - php: 7.1 + env: WP_VERSION=4.9 WP_TESTS_DIR=/tmp/wordpress/tests/phpunit WP_CORE_DIR=/tmp/wordpress + - php: 7.1 + env: WP_VERSION=5.0 WP_TESTS_DIR=/tmp/wordpress/tests/phpunit WP_CORE_DIR=/tmp/wordpress + - php: 7.1 + env: WP_VERSION=5.1 WP_TESTS_DIR=/tmp/wordpress/tests/phpunit WP_CORE_DIR=/tmp/wordpress + # PHPUnit 8, based on https://github.com/INN/link-roundups/issues/135#issuecomment-470357566 + #- php: 7.2 + # env: WP_VERSION=5.1 WP_TESTS_DIR=/tmp/wordpress/tests/phpunit WP_CORE_DIR=/tmp/wordpress + # PHPUnit 8, based on https://github.com/INN/link-roundups/issues/135#issuecomment-470357566 + #- php: 7.3 + # env: WP_VERSION=5.1 WP_TESTS_DIR=/tmp/wordpress/tests/phpunit WP_CORE_DIR=/tmp/wordpress # Only test the develop and master branches for now branches: @@ -34,10 +62,6 @@ before_script: - sed -i "s/yourpasswordhere//" wp-tests-config.php - mv wp-tests-config.php "$WP_TESTS_DIR/wp-tests-config.php" - cd "$WP_CORE_DIR/src/wp-content/plugins/$SLUG" + - phpunit --version script: phpunit - -notifications: - hipchat: - rooms: - secure: mrJDwl2LYmWGY6gKUEsSnbGp3mQ8UhVQkb9oBmRSDx9T/hCSDx4Q2KDLo0OqCFIwDB5BevP16vDDWVmsg8Ldwk+Hh0YAmdUqBAXe21+17ojqSIAdQg6LgLrEFEBNVBlPu89xonRMnsai34RDCoRt5c9OLuWgGVMAcTojpQvPiII= diff --git a/README.md b/README.md index d068709..74d0704 100644 --- a/README.md +++ b/README.md @@ -1,85 +1,20 @@ # Link Roundups -A WordPress plugin to make it easy to collect links from around the web, turn them into roundup posts and streamline the production of daily/weekly roundup newsletters using MailChimp. Built and maintained by [INN Nerds](http://nerds.inn.org). - -**Contributors:** The INN Nerds (David Ryan, Ryan Nagle, Ben Keith, Will Haynes, Adam Schweigert) and Project Argo (Corey Daley, Chris Amico, Wesley Lindamood) - -**Tags:** link, newsletter, widget, mailchimp - -**Requires at least:** 4.1 - -**Tested up to:** 4.2.3 - -**Stable tag:** 0.4.1 - -**License:** GPLv2 or later - -**License URI:** http://www.gnu.org/licenses/gpl-2.0.html +A WordPress plugin to make it easy to collect links from around the web, turn them into roundup posts and streamline the production of daily/weekly roundup newsletters using MailChimp. Built and maintained by [INN Labs](https://labs.inn.org). +**Requires at least:** 4.1 +**Tested up to:** 5.2 +**Stable tag:** See https://github.com/INN/link-roundups/releases +**License:** GPLv2 or later +**License URI:** https://www.gnu.org/licenses/gpl-2.0.html ## Overview -The Link Roundup plugin allows you to: - -- Curate links -- Create link roundup posts -- Optionally send the roundup posts to MailChimp to be distributed to your subscribers - -It also includes two widgets: - -- A widget to display your recently saved links -- A widget to display your recent link roundup posts (with the ability to limit by category) - -The plugin includes a browser bookmark that you can drag to your browser's bookmark bar, allowing you to save links directly to your WordPress site. This bookmark attempts to pre-fill fields like link title, source, URL and featured image and also allows you to add a description to each link viewable when published on your site. - -In its previous life, Link Roundups was called Argo Links. - +See the [overview on WordPress.org](https://wordpress.org/plugins/link-roundups/). ## Installation -Link Roundups can be installed like any other WordPress plugin. - -1. Download the contents of this repository. -2. Unzip the package and rename the folder to "link-roundups" (the folder will be called "link-roundups-master" but this may cause problems if you don't rename it before uploading to your site) -3. Upload the folder to your WordPress installation in the wp-content/plugins directory -4. Login to WordPress, click on Plugins in the left hand menu -5. Select the Link Roundups plugin and click "activate" -6. Review the plugin settings under the Settings > Link Roundups menu - -Installation directly from the WordPress.org plugin directory coming soon! - -## Features - -#### Saved Links -![New Saved Link](https://raw.githubusercontent.com/INN/link-roundups/master/docs/img/new-saved-link.png) - -Curate links from around the web and save them in WordPress using a handy browser bookmark. You can also add your own descriptions and organize saved links using tags. - -#### Saved Links Widget - -Display a feed of your recent Saved Links, optionally filtered by tags. - -#### Link Roundups -![Recent Saved Links Panel in Link Roundups Editor](https://raw.githubusercontent.com/INN/link-roundups/master/docs/img/link-roundups-passthru.png) - -Build Link Roundup posts using a panel that displays and filters your recent Saved Links. Select the links you want to include and send them to the editor to compose your roundup posts. - -#### Link Roundups Widget - -Display most recent Link Roundup posts by date. Optionally, limit the roundup posts displayed by category. - -#### MailChimp API Integration - -Simplify your workflow by sending Link Roundup posts directly to MailChimp. Create a template for your roundups using a number of special template tags and then create a new MailChimp campaign directly from WordPress. You can even include sponsored links. - -#### Rename Link Roundups - -If you would prefer to call your roundup posts something else (daily digest, for example) you can rename the singular (default: Link Roundup) and plural form (default: Link Roundups) as well as the slug for posts in the Link Roundups custom post type. - -#### Custom HTML for Displaying Links - -Link Roundup posts have some default styling for your saved links to make sure your posts look great out of the box. If you'd prefer to modify the HTML output for Save Links or styling for sponsored links, you can do that from the plugin settings. - +See the [installation instructions on WordPress.org](https://wordpress.org/plugins/link-roundups/#installation). ## [Documentation](docs/readme.md) @@ -89,9 +24,28 @@ Link Roundup posts have some default styling for your saved links to make sure y 4. [Using Saved Link and Link Roundup widgets](docs/widgets.md) 5. [__More →__](docs/readme.md) - ## Development For information on the development status of this plugin, check the [development milestones on github](https://github.com/INN/link-roundups/milestones). If you'd like to contribute to the project, please see our [contributing guidelines](contributing.md). + +This plugin depends on [INN/wordpress-mailchimp-tools](https://github.com/INN/wordpress-mailchimp-tools), as well as some components imported via composer. + +## Contributors: + +**The Institute for Nonprofit News:** + +- David Ryan +- Ryan Nagle +- Ben Keith +- Will Haynes +- Adam Schweigert +- RC Lations +- Josh Darby + +**Project Argo:** + +- Corey Daley +- Chris Amico +- Wesley Lindamood diff --git a/README.txt b/README.txt index 95da186..cf7b576 100644 --- a/README.txt +++ b/README.txt @@ -1,12 +1,15 @@ === Link Roundups === -Contributors: inn_nerds +Contributors: innlabs Donate link: https://inn.org/donate Tags: newsletters, mailchimp, links, curation, aggregation -Requires at least: 4.1 -Tested up to: 4.2.3 -Stable tag: 0.5 +Requires at least: 4.2 +Tested up to: 5.2 +Stable tag: 1.0 License: GPLv2 License URI: http://www.gnu.org/licenses/gpl-2.0.html +Requires PHP: 5.6 +Text Domain: link-roundups + Collect links from around the web, turn them into roundup posts and streamline the production of daily/weekly roundup newsletters using MailChimp. @@ -19,20 +22,39 @@ Collect links from around the web, turn them into roundup posts and streamline t * **Custom HTML for links** Customize the presentation of Saved Links in Link Roundups * **Link Roundups Widget** Display most recent Link Roundup posts by date * **Saved Links Widget** Display a feed of your recent Saved Links, optionally filtered by tags -* **Browser Bookmark** Create new Saved Links via a browser bookmarklet +* **Browser Bookmark** Create new Saved Links via a browser bookmarklet, on supported WordPress configurations * **MailChimp Integration** Create new MailChimp campaigns based on a Link Roundup == Installation == +Via WordPress.org: + 1. Install the Link Roundups plugin via the Wordpress.org plugin directory 2. Activate the plugin 3. Navigate to the Admin -> Link Roundups -> Options page to configure the plugin 4. Done! +For other installation methods, [see this plugin's installation methods on GitHub](https://github.com/INN/link-roundups/blob/master/docs/installation.md). + [Read more about installing plugins here](https://codex.wordpress.org/Managing_Plugins#Installing_Plugins). == Changelog == += 1.0 + +- Tested up to WordPress 5.2 and PHP 7.3 +- Reenables the "Save to Site" bookmarklet for saving links for Link Roundups, if the site admin is willing to use the [Press This](https://wordpress.org/plugins/press-this/) plugin to enable this feature. Pull request [#159](https://github.com/INN/link-roundups/pull/159) for issue [#130](https://github.com/INN/link-roundups/issues/130). +- Updates the [WordPress MailChimp Tools](https://github.com/INN/wordpress-mailchimp-tools) submodule to use version 3 of the MailChimp API, and gain various compatibility updates for modern PHP versions. Upgrading to the new MailChimp API means that users of the MailChimp campaign functionality in the Link Roundups plugin can now use MailChimp editable content areas in their templates, as described [in our documentation](https://github.com/INN/link-roundups/blob/master/docs/mailchimp.md). +- Updates installation documentation. Pull request [#139](https://github.com/INN/link-roundups/pull/139) for issue [#145](https://github.com/INN/link-roundups/issues/145). +- Applies the `'widget_title'` filter to the title of the Link Roundups widget. Pull request [#152](https://github.com/INN/link-roundups/pull/152) for issue [#104](https://github.com/INN/link-roundups/issues/104). +- Wraps the `Source:` label in the Saved Links List widget in a `span.source-label`. Pull request [#139](https://github.com/INN/link-roundups/pull/139) for issue [#144](https://github.com/INN/link-roundups/issues/144). +- Sets HTML5 input types on widget forms. Pull request [#139](https://github.com/INN/link-roundups/pull/139) for issue [#143](https://github.com/INN/link-roundups/issues/143). +- Fixes the saved_links_widget constructor for error-free PHP7 compatibility. Pull request [#137](https://github.com/INN/link-roundups/pull/137) for issue [#132](https://github.com/INN/link-roundups/issues/132). +- Updates the local clone of WP_List_Table, fixing compatibility, and updating docs for that process. Pull request [#139](https://github.com/INN/link-roundups/pull/139) for issues [#128](https://github.com/INN/link-roundups/issues/128) and [#118](https://github.com/INN/link-roundups/issues/118). +- Updates Travis automated testing to support PHP 5.6, 7.1, 7.2. Pull request [#138](https://github.com/INN/link-roundups/pull/138) for issue [#135](https://github.com/INN/link-roundups/issues/135). +- Improves maintainer docs. Pull request [#139](https://github.com/INN/link-roundups/pull/139) for issue [#140](https://github.com/INN/link-roundups/issues/140). + + = 0.4.1 = - The default query for Saved Links in the roundup editor is now for the last 30 days diff --git a/bower.json b/bower.json index c4c9c3e..99ccc61 100644 --- a/bower.json +++ b/bower.json @@ -3,7 +3,7 @@ "description": "A WordPress plugin that makes it easy to collect links, turn them into roundup posts and produce roundup newsletters using MailChimp.", "main": "link-roundups.php", "authors": [ - "INN Nerds " + "INN Labs " ], "license": "MIT", "homepage": "https://github.com/INN/link-roundups", @@ -14,6 +14,7 @@ "node_modules", "bower_components", "js/vendor", + "vendor", "test", "tests" ], diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..3874666 --- /dev/null +++ b/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "inn/wordpress-mailchimp-tools": "dev-master#4ef8919f2e214ad0493c12405e6c8a263ac7a1c6" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..c752a82 --- /dev/null +++ b/composer.lock @@ -0,0 +1,111 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "c2dff385ba98797520b22558f1a9b7f1", + "packages": [ + { + "name": "drewm/mailchimp-api", + "version": "v2.5.3", + "source": { + "type": "git", + "url": "https://github.com/drewm/mailchimp-api.git", + "reference": "a6519cafba509e754e748d93f3532ad7f3aa515a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/drewm/mailchimp-api/zipball/a6519cafba509e754e748d93f3532ad7f3aa515a", + "reference": "a6519cafba509e754e748d93f3532ad7f3aa515a", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "7.0.*", + "vlucas/phpdotenv": "^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "DrewM\\MailChimp\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Drew McLellan", + "email": "drew.mclellan@gmail.com", + "homepage": "http://allinthehead.com/" + } + ], + "description": "Super-simple, minimum abstraction MailChimp API v3 wrapper", + "homepage": "https://github.com/drewm/mailchimp-api", + "time": "2019-03-28T15:20:43+00:00" + }, + { + "name": "inn/wordpress-mailchimp-tools", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/INN/wordpress-mailchimp-tools.git", + "reference": "4ef8919f2e214ad0493c12405e6c8a263ac7a1c6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/INN/wordpress-mailchimp-tools/zipball/4ef8919f2e214ad0493c12405e6c8a263ac7a1c6", + "reference": "4ef8919f2e214ad0493c12405e6c8a263ac7a1c6", + "shasum": "" + }, + "require": { + "drewm/mailchimp-api": "^2.5", + "php": ">=5.2.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "inc/" + ], + "files": [ + "mailchimp-tools.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0" + ], + "authors": [ + { + "name": "INN Nerds", + "email": "nerds@inn.org", + "homepage": "http://nerds.inn.org", + "role": "Developer" + } + ], + "description": "Collection of tools for authoring MailChimp newsletters via the WordPress dashboard", + "homepage": "https://nerds.inn.org/", + "keywords": [ + "api", + "email" + ], + "time": "2019-05-16T20:35:15+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "inn/wordpress-mailchimp-tools": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [] +} diff --git a/contributing.md b/contributing.md index c297229..6971a2c 100644 --- a/contributing.md +++ b/contributing.md @@ -9,18 +9,15 @@ We welcome contributions and suggestions to help us improve this project. Please 3. Stage and commit your changes (git commit -am 'description of my changes') 4. Push the changes to your fork (git push origin my-branch) 5. [Submit a pull request to the parent repo](https://help.github.com/articles/creating-a-pull-request). Please read our [guide to submitting pull requests](https://github.com/inn/docs/blob/master/how-to-work-with-us/pull-requests.md) to see what we expect in a good pull request message. -6. Pull request should be assigned to: - - [@rnagle](http://github.com/rnagle) (primary) - - [@aschweigert](http://github.com/aschweigert)(secondary) We have [a helpful how-to](https://github.com/INN/docs/blob/master/how-to-work-with-us/via-github.md) that walks through this process in more detail if you're new to using Git. Additionally, you can [create issues](https://github.com/INN/link-roundups/issues) on this repo to suggest changes or improvements. -And of course you can always email us: [nerds@inn.org](mailto:nerds@inn.org). +And of course you can always email us: [support@inn.org](mailto:support@inn.org). ### Standards -- Follow all standards from the INN Nerds [coding style guide](https://github.com/INN/docs/tree/master/style-guides/code). -- Use [markdown syntax](http://daringfireball.net/projects/markdown/syntax) for all text documents. +- Follow all standards from the INN Labs [coding style guide](https://github.com/INN/docs/tree/master/style-guides/code). +- Use [Markdown syntax](https://guides.github.com/features/mastering-markdown/) for all text documents. - Pull requests for new functionality should be accompanied by tests wherever possible. diff --git a/css/lroundups-admin.css b/css/lroundups-admin.css index da8db91..823f08f 100644 --- a/css/lroundups-admin.css +++ b/css/lroundups-admin.css @@ -4,8 +4,6 @@ Create MailChimp Campaign Button #link-roundups-publish-actions { text-align: center; border-bottom: 1px solid #ccc; - margin-bottom: 10px; - padding-bottom: 10px; } #link-roundups-publish-actions input[type="submit"] { display: inline-block; @@ -20,9 +18,6 @@ New Saved Links dialog /* ========================================================================== Recent Roundups Editor Styles ========================================================================== */ -#link_roundups_roundup .inside { - min-height: 250px; -} #link_roundups_roundup .pagination { margin: 10px 0; } @@ -30,7 +25,13 @@ Recent Roundups Editor Styles padding-bottom: 15px; } #link_roundups_roundup #filter_links { - margin: 10px 0; + margin: 0 10px 0; +} +button.button.append-saved-links { + margin: 0 10px 0 0; +} +.tablenav .actions select[name="link_date"] { + float: none; } div.display-saved-links div.pagination { height: 30px; @@ -49,4 +50,4 @@ div.display-saved-links .none-found { font-style: italic; font-weight: bold; } -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxlc3MvbHJvdW5kdXBzLWFkbWluLmxlc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0E7RUFDRSxrQkFBQTtFQUNBLDZCQUFBO0VBQ0EsbUJBQUE7RUFDQSxvQkFBQTs7QUFKRiw4QkFLRSxNQUFLO0VBQ0gscUJBQUE7RUFDQSxpQkFBQTs7Ozs7QUFNSixTQUFTLGFBQWEsc0JBQXVCO0VBQzNDLGFBQUE7Ozs7O0FBTUYsc0JBQ0U7RUFDRSxpQkFBQTs7QUFGSixzQkFJRTtFQUNFLGNBQUE7O0FBQ0Esc0JBRkYsWUFFRztFQUNGLG9CQUFBOztBQVBILHNCQVVFO0VBQ0UsY0FBQTs7QUFJSixHQUFHLG9CQUNELElBQUc7RUFDRCxZQUFBOztBQUZKLEdBQUcsb0JBQ0QsSUFBRyxXQUVEO0FBSEosR0FBRyxvQkFDRCxJQUFHLFdBR0Q7RUFDRSxXQUFBO0VBQ0EscUJBQUE7O0FBTk4sR0FBRyxvQkFDRCxJQUFHLFdBT0Q7RUFDSSxjQUFBOztBQVRSLEdBQUcsb0JBWUQ7RUFDQSx1QkFBQTtFQUNBLGNBQUE7RUFDQSxrQkFBQTtFQUNBLGlCQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbkNyZWF0ZSBNYWlsQ2hpbXAgQ2FtcGFpZ24gQnV0dG9uXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuI2xpbmstcm91bmR1cHMtcHVibGlzaC1hY3Rpb25zIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NjYztcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgcGFkZGluZy1ib3R0b206IDEwcHg7XG4gIGlucHV0W3R5cGU9XCJzdWJtaXRcIl0ge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW46IDEwcHggYXV0bztcbiAgfVxufVxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbk5ldyBTYXZlZCBMaW5rcyBkaWFsb2dcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4ud3AtYWRtaW4ucG9zdC1uZXctcGhwLnBvc3QtdHlwZS1yb3VuZHVwbGluayAjbWlub3ItcHVibGlzaGluZy1hY3Rpb25ze1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmVjZW50IFJvdW5kdXBzIEVkaXRvciBTdHlsZXNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4jbGlua19yb3VuZHVwc19yb3VuZHVwIHtcbiAgLmluc2lkZSB7XG4gICAgbWluLWhlaWdodDogMjUwcHg7XG4gIH1cbiAgLnBhZ2luYXRpb24ge1xuICAgIG1hcmdpbjogMTBweCAwO1xuICAgICY6bGFzdC1jaGlsZCB7XG5cdCAgcGFkZGluZy1ib3R0b206IDE1cHg7XG4gICAgfVxuICB9XG4gICNmaWx0ZXJfbGlua3Mge1xuICAgIG1hcmdpbjogMTBweCAwO1xuICB9XG59XG5cbmRpdi5kaXNwbGF5LXNhdmVkLWxpbmtzIHtcbiAgZGl2LnBhZ2luYXRpb24ge1xuICAgIGhlaWdodDozMHB4O1xuICAgIHNwYW4sXG4gICAgYSB7XG4gICAgICBjb2xvcjogIzAwMDtcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICB9XG4gICAgLmN1cnJlbnQge1xuICAgICAgICBjb2xvcjogI0M3QzdDNztcbiAgICB9XG4gIH1cbiAgLm5vbmUtZm91bmQge1xuICBtYXJnaW46LjI1ZW0gMCAwLjVlbSAwO1xuICBkaXNwbGF5OmJsb2NrO1xuICBmb250LXN0eWxlOml0YWxpYztcbiAgZm9udC13ZWlnaHQ6Ym9sZDtcbiAgfVxufVxuIl19 */ \ No newline at end of file +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxlc3MvbHJvdW5kdXBzLWFkbWluLmxlc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0E7RUFDRSxrQkFBQTtFQUNBLDZCQUFBOztBQUZGLDhCQUdFLE1BQUs7RUFDSCxxQkFBQTtFQUNBLGlCQUFBOzs7OztBQU1KLFNBQVMsYUFBYSxzQkFBdUI7RUFDM0MsYUFBQTs7Ozs7QUFNRixzQkFHRTtFQUNFLGNBQUE7O0FBQ0Esc0JBRkYsWUFFRztFQUNDLG9CQUFBOztBQU5OLHNCQVNFO0VBQ0UsZ0JBQUE7O0FBR0osTUFBTSxPQUFPO0VBQ1gsa0JBQUE7O0FBRUYsU0FBVSxTQUFTLE9BQU07RUFDdkIsV0FBQTs7QUFHRixHQUFHLG9CQUNELElBQUc7RUFDRCxZQUFBOztBQUZKLEdBQUcsb0JBQ0QsSUFBRyxXQUVEO0FBSEosR0FBRyxvQkFDRCxJQUFHLFdBR0Q7RUFDRSxXQUFBO0VBQ0EscUJBQUE7O0FBTk4sR0FBRyxvQkFDRCxJQUFHLFdBT0Q7RUFDSSxjQUFBOztBQVRSLEdBQUcsb0JBWUQ7RUFDQSx1QkFBQTtFQUNBLGNBQUE7RUFDQSxrQkFBQTtFQUNBLGlCQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbkNyZWF0ZSBNYWlsQ2hpbXAgQ2FtcGFpZ24gQnV0dG9uXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuI2xpbmstcm91bmR1cHMtcHVibGlzaC1hY3Rpb25zIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NjYztcbiAgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbjogMTBweCBhdXRvO1xuICB9XG59XG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuTmV3IFNhdmVkIExpbmtzIGRpYWxvZ1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi53cC1hZG1pbi5wb3N0LW5ldy1waHAucG9zdC10eXBlLXJvdW5kdXBsaW5rICNtaW5vci1wdWJsaXNoaW5nLWFjdGlvbnN7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZWNlbnQgUm91bmR1cHMgRWRpdG9yIFN0eWxlc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbiNsaW5rX3JvdW5kdXBzX3JvdW5kdXAge1xuICAuaW5zaWRlIHtcbiAgfVxuICAucGFnaW5hdGlvbiB7XG4gICAgbWFyZ2luOiAxMHB4IDA7XG4gICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgIHBhZGRpbmctYm90dG9tOiAxNXB4O1xuICAgIH1cbiAgfVxuICAjZmlsdGVyX2xpbmtzIHtcbiAgICBtYXJnaW46IDAgMTBweCAwO1xuICB9XG59XG5idXR0b24uYnV0dG9uLmFwcGVuZC1zYXZlZC1saW5rcyB7XG4gIG1hcmdpbjogMCAxMHB4IDAgMDtcbn1cbi50YWJsZW5hdiAuYWN0aW9ucyBzZWxlY3RbbmFtZT1cImxpbmtfZGF0ZVwiXSB7XG4gIGZsb2F0OiBub25lO1xufVxuXG5kaXYuZGlzcGxheS1zYXZlZC1saW5rcyB7XG4gIGRpdi5wYWdpbmF0aW9uIHtcbiAgICBoZWlnaHQ6MzBweDtcbiAgICBzcGFuLFxuICAgIGEge1xuICAgICAgY29sb3I6ICMwMDA7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgfVxuICAgIC5jdXJyZW50IHtcbiAgICAgICAgY29sb3I6ICNDN0M3Qzc7XG4gICAgfVxuICB9XG4gIC5ub25lLWZvdW5kIHtcbiAgbWFyZ2luOi4yNWVtIDAgMC41ZW0gMDtcbiAgZGlzcGxheTpibG9jaztcbiAgZm9udC1zdHlsZTppdGFsaWM7XG4gIGZvbnQtd2VpZ2h0OmJvbGQ7XG4gIH1cbn1cbiJdfQ== */ \ No newline at end of file diff --git a/css/lroundups-admin.min.css b/css/lroundups-admin.min.css index 21bdf65..9775566 100644 --- a/css/lroundups-admin.min.css +++ b/css/lroundups-admin.min.css @@ -1 +1 @@ -#link_roundups_roundup #filter_links,#link_roundups_roundup .pagination{margin:10px 0}#link-roundups-publish-actions{text-align:center;border-bottom:1px solid #ccc;margin-bottom:10px;padding-bottom:10px}#link-roundups-publish-actions input[type=submit]{display:inline-block;margin:10px auto}.wp-admin.post-new-php.post-type-rounduplink #minor-publishing-actions{display:none}#link_roundups_roundup .inside{min-height:250px}#link_roundups_roundup .pagination:last-child{padding-bottom:15px}div.display-saved-links div.pagination{height:30px}div.display-saved-links div.pagination a,div.display-saved-links div.pagination span{color:#000;text-decoration:none}div.display-saved-links div.pagination .current{color:#C7C7C7}div.display-saved-links .none-found{margin:.25em 0 .5em;display:block;font-style:italic;font-weight:700} \ No newline at end of file +#link-roundups-publish-actions{text-align:center;border-bottom:1px solid #ccc}#link-roundups-publish-actions input[type=submit]{display:inline-block;margin:10px auto}.wp-admin.post-new-php.post-type-rounduplink #minor-publishing-actions{display:none}#link_roundups_roundup .pagination{margin:10px 0}#link_roundups_roundup .pagination:last-child{padding-bottom:15px}#link_roundups_roundup #filter_links{margin:0 10px}button.button.append-saved-links{margin:0 10px 0 0}.tablenav .actions select[name=link_date]{float:none}div.display-saved-links div.pagination{height:30px}div.display-saved-links div.pagination a,div.display-saved-links div.pagination span{color:#000;text-decoration:none}div.display-saved-links div.pagination .current{color:#C7C7C7}div.display-saved-links .none-found{margin:.25em 0 .5em;display:block;font-style:italic;font-weight:700} \ No newline at end of file diff --git a/css/lroundups.css b/css/lroundups.css index 25ad888..77d278a 100644 --- a/css/lroundups.css +++ b/css/lroundups.css @@ -72,10 +72,4 @@ Saved Links Widget .wp-list-table.lroundups-links tfoot td { border-top: 1px solid #e1e1e1; } -button.button.append-saved-links { - margin: 10px 10px 10px 0; -} -.tablenav .actions select[name="link_date"] { - float: none; -} -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxlc3MvbHJvdW5kdXBzLmxlc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsQ0FBQztFQUNDLFdBQUE7RUFDQSxjQUFBO0VBQ0EsbUJBQUE7RUFDQSxXQUFBOztBQUpGLENBQUMsY0FLQztFQUNFLGlCQUFBO0VBQ0EscUJBQUE7RUFDQSxtQkFBQTs7QUFSSixDQUFDLGNBVUM7RUFDRSxjQUFBOztBQVhKLENBQUMsY0FhQztFQUNFLFdBQUE7RUFDQSxtQkFBQTs7QUFFRixDQWpCRCxjQWlCRTtFQUNDLHlCQUFBO0VBQ0Esa0JBQUE7RUFDQSxjQUFBO0VBQ0EsZ0JBQUE7RUFDQSxtQkFBQTtFQUNBLGVBQUE7O0FBSUosVUFBVyxFQUFDO0VBQ1YsNEJBQUE7Ozs7O0FBT0YsT0FBTyxZQUNMO0VBQ0Usa0JBQUE7RUFDRCxnQkFBQTs7QUFISCxPQUFPLFlBS0w7RUFDRSxtQkFBQTs7QUFOSixPQUFPLFlBS0wsRUFFRTtFQUNFLGtCQUFBOztBQVJOLE9BQU8sWUFLTCxFQUtFLFFBQVE7RUFDTixrQkFBQTs7QUFFRixPQWJHLFlBS0wsRUFRRztFQUNGLFdBQUE7O0FBZEgsT0FBTyxZQWlCTCxJQUFHO0VBQ0QsV0FBQTs7QUFsQkosT0FBTyxZQWlCTCxJQUFHLFVBRUQ7RUFDRSxXQUFBO0VBQ0EsbUJBQUE7O0FBTU4sY0FBYyxnQkFDWixNQUFNO0FBRFIsY0FBYyxnQkFFWixNQUFNO0VBQ0osZ0JBQUE7RUFDQSxtQkFBQTtFQUNBLGlCQUFBOztBQUxKLGNBQWMsZ0JBQ1osTUFBTSxHQUtKO0FBTkosY0FBYyxnQkFFWixNQUFNLEdBSUo7RUFDRSxnQkFBQTs7QUFQTixjQUFjLGdCQVVaLE1BQU07RUFDSixnQ0FBQTs7QUFYSixjQUFjLGdCQWFaLE1BQU07RUFDSiw2QkFBQTs7QUFHSixNQUFNLE9BQU87RUFDWCx3QkFBQTs7QUFFRixTQUFVLFNBQVMsT0FBTTtFQUN2QixXQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbkxpbmsgUm91bmR1cHMgU2F2ZWQgTGluayBQYXJhZ3JhcGggV3JhcHBlciBTdHlsZVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbnAubHItc2F2ZWQtbGluayB7XG4gIGZsb2F0OiBsZWZ0O1xuICBkaXNwbGF5OiBibG9jaztcbiAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgd2lkdGg6IDEwMCU7XG4gIGEge1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICB9XG4gIGVtIHtcbiAgICBjb2xvcjogIzgwODA4MDtcbiAgfVxuICBpbWcge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIG1hcmdpbjogMCAxZW0gMWVtIDA7XG4gIH1cbiAgJi5zcG9uc29yZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNFREYxRjQ7XG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgIGNvbG9yOiAjODA4MDgwO1xuICAgIHBhZGRpbmctdG9wOiA1cHg7XG4gICAgcGFkZGluZy1ib3R0b206IDVweDtcbiAgICBtYXJnaW46IDAuMmVtIDA7XG4gIH1cbn1cblxuLndwLWVkaXRvciBwLmxyLXNhdmVkLWxpbmsge1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwcHggMXB4O1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5TYXZlZCBMaW5rcyBXaWRnZXRcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4ud2lkZ2V0LnNhdmVkLWxpbmtzIHtcbiAgaDUge1xuICAgIG1hcmdpbi1ib3R0b206IDJweDtcbiAgXHRmb250LXdlaWdodDo3MDA7XG4gIH1cbiAgcCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMTJweDtcbiAgICAuZGVzY3JpcHRpb24ge1xuICAgICAgbWFyZ2luLWJvdHRvbTogMnB4O1xuICAgIH1cbiAgICAuc291cmNlIHNwYW4ge1xuICAgICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgIH1cbiAgICAmLm1vcmVsaW5rIHtcblx0ICBjbGVhcjogYm90aDtcbiAgICB9XG4gIH1cbiAgZGl2LnBvc3QtbGVhZCB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgaW1nIHtcbiAgICAgIGZsb2F0OiBsZWZ0O1xuICAgICAgbWFyZ2luOiAwIDFlbSAxZW0gMDtcbiAgICB9XG4gIH1cbn1cblxuLy8gZml4IGZvciBkaXNwbGF5IG9mIGNoZWNrYm94IGluIGhlYWRlciBvZiBzYXZlZCBsaW5rcyBhZG1pbiBib3hcbi53cC1saXN0LXRhYmxlLmxyb3VuZHVwcy1saW5rcyB7XG4gIHRmb290IHRkLFxuICB0aGVhZCB0ZCB7XG4gICAgcGFkZGluZy10b3A6IDhweDtcbiAgICBwYWRkaW5nLWJvdHRvbTogOHB4O1xuICAgIHBhZGRpbmctbGVmdDogM3B4O1xuICAgIGlucHV0IHtcbiAgICAgIG1hcmdpbi1sZWZ0OiA4cHg7XG4gICAgfVxuICB9XG4gIHRoZWFkIHRkIHtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2UxZTFlMVxuICB9XG4gIHRmb290IHRkIHtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2UxZTFlMVxuICB9XG59XG5idXR0b24uYnV0dG9uLmFwcGVuZC1zYXZlZC1saW5rcyB7XG4gIG1hcmdpbjogMTBweCAxMHB4IDEwcHggMDtcbn1cbi50YWJsZW5hdiAuYWN0aW9ucyBzZWxlY3RbbmFtZT1cImxpbmtfZGF0ZVwiXSB7XG4gIGZsb2F0OiBub25lO1xufVxuIl19 */ \ No newline at end of file +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxlc3MvbHJvdW5kdXBzLmxlc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsQ0FBQztFQUNDLFdBQUE7RUFDQSxjQUFBO0VBQ0EsbUJBQUE7RUFDQSxXQUFBOztBQUpGLENBQUMsY0FLQztFQUNFLGlCQUFBO0VBQ0EscUJBQUE7RUFDQSxtQkFBQTs7QUFSSixDQUFDLGNBVUM7RUFDRSxjQUFBOztBQVhKLENBQUMsY0FhQztFQUNFLFdBQUE7RUFDQSxtQkFBQTs7QUFFRixDQWpCRCxjQWlCRTtFQUNDLHlCQUFBO0VBQ0Esa0JBQUE7RUFDQSxjQUFBO0VBQ0EsZ0JBQUE7RUFDQSxtQkFBQTtFQUNBLGVBQUE7O0FBSUosVUFBVyxFQUFDO0VBQ1YsNEJBQUE7Ozs7O0FBT0YsT0FBTyxZQUNMO0VBQ0Usa0JBQUE7RUFDRCxnQkFBQTs7QUFISCxPQUFPLFlBS0w7RUFDRSxtQkFBQTs7QUFOSixPQUFPLFlBS0wsRUFFRTtFQUNFLGtCQUFBOztBQVJOLE9BQU8sWUFLTCxFQUtFLFFBQVE7RUFDTixrQkFBQTs7QUFFRixPQWJHLFlBS0wsRUFRRztFQUNGLFdBQUE7O0FBZEgsT0FBTyxZQWlCTCxJQUFHO0VBQ0QsV0FBQTs7QUFsQkosT0FBTyxZQWlCTCxJQUFHLFVBRUQ7RUFDRSxXQUFBO0VBQ0EsbUJBQUE7O0FBTU4sY0FBYyxnQkFDWixNQUFNO0FBRFIsY0FBYyxnQkFFWixNQUFNO0VBQ0osZ0JBQUE7RUFDQSxtQkFBQTtFQUNBLGlCQUFBOztBQUxKLGNBQWMsZ0JBQ1osTUFBTSxHQUtKO0FBTkosY0FBYyxnQkFFWixNQUFNLEdBSUo7RUFDRSxnQkFBQTs7QUFQTixjQUFjLGdCQVVaLE1BQU07RUFDSixnQ0FBQTs7QUFYSixjQUFjLGdCQWFaLE1BQU07RUFDSiw2QkFBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5MaW5rIFJvdW5kdXBzIFNhdmVkIExpbmsgUGFyYWdyYXBoIFdyYXBwZXIgU3R5bGVcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5wLmxyLXNhdmVkLWxpbmsge1xuICBmbG9hdDogbGVmdDtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gIHdpZHRoOiAxMDAlO1xuICBhIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgfVxuICBlbSB7XG4gICAgY29sb3I6ICM4MDgwODA7XG4gIH1cbiAgaW1nIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBtYXJnaW46IDAgMWVtIDFlbSAwO1xuICB9XG4gICYuc3BvbnNvcmVkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRURGMUY0O1xuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgICBjb2xvcjogIzgwODA4MDtcbiAgICBwYWRkaW5nLXRvcDogNXB4O1xuICAgIHBhZGRpbmctYm90dG9tOiA1cHg7XG4gICAgbWFyZ2luOiAwLjJlbSAwO1xuICB9XG59XG5cbi53cC1lZGl0b3IgcC5sci1zYXZlZC1saW5rIHtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogMHB4IDFweDtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuU2F2ZWQgTGlua3MgV2lkZ2V0XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLndpZGdldC5zYXZlZC1saW5rcyB7XG4gIGg1IHtcbiAgICBtYXJnaW4tYm90dG9tOiAycHg7XG4gIFx0Zm9udC13ZWlnaHQ6NzAwO1xuICB9XG4gIHAge1xuICAgIG1hcmdpbi1ib3R0b206IDEycHg7XG4gICAgLmRlc2NyaXB0aW9uIHtcbiAgICAgIG1hcmdpbi1ib3R0b206IDJweDtcbiAgICB9XG4gICAgLnNvdXJjZSBzcGFuIHtcbiAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgICB9XG4gICAgJi5tb3JlbGluayB7XG5cdCAgY2xlYXI6IGJvdGg7XG4gICAgfVxuICB9XG4gIGRpdi5wb3N0LWxlYWQge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIGltZyB7XG4gICAgICBmbG9hdDogbGVmdDtcbiAgICAgIG1hcmdpbjogMCAxZW0gMWVtIDA7XG4gICAgfVxuICB9XG59XG5cbi8vIGZpeCBmb3IgZGlzcGxheSBvZiBjaGVja2JveCBpbiBoZWFkZXIgb2Ygc2F2ZWQgbGlua3MgYWRtaW4gYm94XG4ud3AtbGlzdC10YWJsZS5scm91bmR1cHMtbGlua3Mge1xuICB0Zm9vdCB0ZCxcbiAgdGhlYWQgdGQge1xuICAgIHBhZGRpbmctdG9wOiA4cHg7XG4gICAgcGFkZGluZy1ib3R0b206IDhweDtcbiAgICBwYWRkaW5nLWxlZnQ6IDNweDtcbiAgICBpbnB1dCB7XG4gICAgICBtYXJnaW4tbGVmdDogOHB4O1xuICAgIH1cbiAgfVxuICB0aGVhZCB0ZCB7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlMWUxZTFcbiAgfVxuICB0Zm9vdCB0ZCB7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlMWUxZTFcbiAgfVxufVxuIl19 */ \ No newline at end of file diff --git a/css/lroundups.min.css b/css/lroundups.min.css index 245720a..151a67f 100644 --- a/css/lroundups.min.css +++ b/css/lroundups.min.css @@ -1 +1 @@ -p.lr-saved-link{float:left;display:block;vertical-align:top;width:100%}p.lr-saved-link a{font-weight:700;text-decoration:none;vertical-align:top}p.lr-saved-link em{color:grey}p.lr-saved-link img{float:left;margin:0 1em 1em 0}p.lr-saved-link.sponsored{background-color:#EDF1F4;font-style:italic;color:grey;padding-top:5px;padding-bottom:5px;margin:.2em 0}.wp-editor p.lr-saved-link{background-position:0 1px}.widget.saved-links h5{margin-bottom:2px;font-weight:700}.widget.saved-links p{margin-bottom:12px}.widget.saved-links p .description{margin-bottom:2px}.widget.saved-links p .source span{font-style:italic}.widget.saved-links p.morelink{clear:both}.widget.saved-links div.post-lead{float:left}.widget.saved-links div.post-lead img{float:left;margin:0 1em 1em 0}.wp-list-table.lroundups-links tfoot td,.wp-list-table.lroundups-links thead td{padding-top:8px;padding-bottom:8px;padding-left:3px}.wp-list-table.lroundups-links tfoot td input,.wp-list-table.lroundups-links thead td input{margin-left:8px}.wp-list-table.lroundups-links thead td{border-bottom:1px solid #e1e1e1}.wp-list-table.lroundups-links tfoot td{border-top:1px solid #e1e1e1}button.button.append-saved-links{margin:10px 10px 10px 0}.tablenav .actions select[name=link_date]{float:none} \ No newline at end of file +p.lr-saved-link{float:left;display:block;vertical-align:top;width:100%}p.lr-saved-link a{font-weight:700;text-decoration:none;vertical-align:top}p.lr-saved-link em{color:grey}p.lr-saved-link img{float:left;margin:0 1em 1em 0}p.lr-saved-link.sponsored{background-color:#EDF1F4;font-style:italic;color:grey;padding-top:5px;padding-bottom:5px;margin:.2em 0}.wp-editor p.lr-saved-link{background-position:0 1px}.widget.saved-links h5{margin-bottom:2px;font-weight:700}.widget.saved-links p{margin-bottom:12px}.widget.saved-links p .description{margin-bottom:2px}.widget.saved-links p .source span{font-style:italic}.widget.saved-links p.morelink{clear:both}.widget.saved-links div.post-lead{float:left}.widget.saved-links div.post-lead img{float:left;margin:0 1em 1em 0}.wp-list-table.lroundups-links tfoot td,.wp-list-table.lroundups-links thead td{padding-top:8px;padding-bottom:8px;padding-left:3px}.wp-list-table.lroundups-links tfoot td input,.wp-list-table.lroundups-links thead td input{margin-left:8px}.wp-list-table.lroundups-links thead td{border-bottom:1px solid #e1e1e1}.wp-list-table.lroundups-links tfoot td{border-top:1px solid #e1e1e1} \ No newline at end of file diff --git a/docs/bookmarklet-dependencies.md b/docs/bookmarklet-dependencies.md new file mode 100644 index 0000000..361a4a5 --- /dev/null +++ b/docs/bookmarklet-dependencies.md @@ -0,0 +1,14 @@ +# Bookmarklet Dependencies + +The "Save to Site" bookmarklet code depends on WordPress' "Press this!" bookmarklet code. That code was [removed from WordPress version 4.9](https://make.wordpress.org/core/2017/11/02/press-this-in-4-9/), and has not been reintroduced. The WordPress maintainers put the removed code into a self-contained plugin called [Press This](https://wordpress.org/plugins/press-this/). + +Your site can use the "Save to Site" bookmarklet if either of these conditions are true: + +- You are running WordPress 4.8 (not recommended) +- You have the [Press This](https://wordpress.org/plugins/press-this/) plugin installed and active. + +If your site meets neither of those conditions, you will see the following prompt: + +![A screenshot of a page titled "Enable Save to Site bookmarklet for your site" and the text explaining why and how to install a dependency.](img/save-to-site-bookmarklet-dependency.png) + +The "Install now" button will take you to your site's plugins page for a search of the WordPress.org plugins directory that should include the Press This plugin. diff --git a/docs/img/link-roundup-mailchimp-button.png b/docs/img/link-roundup-mailchimp-button.png index 752708d..e50caa2 100644 Binary files a/docs/img/link-roundup-mailchimp-button.png and b/docs/img/link-roundup-mailchimp-button.png differ diff --git a/docs/img/link-roundups-mailchimp-integration.png b/docs/img/link-roundups-mailchimp-integration.png index 72d157d..0b6c9b1 100644 Binary files a/docs/img/link-roundups-mailchimp-integration.png and b/docs/img/link-roundups-mailchimp-integration.png differ diff --git a/docs/img/link-roundups-options-mailchimp-2.png b/docs/img/link-roundups-options-mailchimp-2.png deleted file mode 100644 index 03c5e29..0000000 Binary files a/docs/img/link-roundups-options-mailchimp-2.png and /dev/null differ diff --git a/docs/img/save-to-site-bookmarklet-dependency.png b/docs/img/save-to-site-bookmarklet-dependency.png new file mode 100644 index 0000000..3c93d30 Binary files /dev/null and b/docs/img/save-to-site-bookmarklet-dependency.png differ diff --git a/docs/installation.md b/docs/installation.md index f3ea7f2..e416945 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -1,15 +1,22 @@ # Installation -If you're an INN member making use of INN's [Largo Project](https://largoproject.org) hosting, the Link Roundups plugin is already installed. Just [contact us](http://jira.inn.org/servicedesk/customer/portal/4) through the Largo help desk to have it activated on your site. +If you would like to use the [Saved Links "Save to Site" bookmarklet](saved-links.md), you may need to [install additional dependencies not included in this plugin](bookmarklet-dependencies.md), regardless of the method you use to install this plugin. + +## WordPress Plugin Directory + +Install from https://wordpress.org/plugins/link-roundups/ ! + +## Your WordPress Dashboard + +From your site's dashboard, go to Plugins, then "Add New", and search for "Link Roundups" by INN Labs. ## Manual Install -1. Download the [.zip archive](https://github.com/INN/link-roundups/archive/master.zip) from GitHub. +1. Download the latest master [.zip archive](https://github.com/INN/link-roundups/archive/master.zip) from GitHub, or `git clone https://github.com/INN/link-roundups.git`. 2. Extract the .zip archive. 3. Rename the plugin directory to `link-roundups`. If the directory the plugin files reside in is named anything else, the plugin will not work. -4. Upload the plugin directory to you server's `wp-content/plugins` directory. -5. Activate the plugin through the [`Plugins` menu](https://codex.wordpress.org/Plugins_Screen) in WordPress. +4. Run `composer install` — this requires [composer](https://getcomposer.org/), the PHP dependency manager. +5. Upload the plugin directory to you server's `wp-content/plugins` directory. +6. Activate the plugin through the [`Plugins` menu](https://codex.wordpress.org/Plugins_Screen) in WordPress. -## WordPress Plugin Directory or Your WordPress Dashboard -Coming Soon. Yes, exciting. diff --git a/docs/mailchimp.md b/docs/mailchimp.md index c445ec2..aed4219 100644 --- a/docs/mailchimp.md +++ b/docs/mailchimp.md @@ -2,31 +2,29 @@ Using the Mailchimp API, Link Roundups can send Roundups as newsletters via a MailChimp account. -## Prerequisites: Setup a Template and List in MailChimp +## Prerequisites -You'll need to create a template and a list if you don't already have them in MailChimp. +First, you'll need: + +- A MailChimp account +- An [audience](https://mailchimp.com/help/create-audience/) created in MailChimp ## Getting an API key from MailChimp In order to use the MailChimp features of Link Roundups, you'll need to sign up for an API key from MailChimp. To do that: 1. Log in to MailChimp. -2. Click on your account in the upper-right corner. In the drop-down menu, click "Account". -3. Click on "Extras", then "API keys". -4. Click "Create A Key". A new key will appear in the list. -5. Click the "Label" field of your new API key. Name it after the site you're using Argo Links on. For example: "example.com argo links" -6. Copy the API key. This will be a long string of characters from 0-9 and a-f. -7. On your website, go to **Dashboard > Link Roundups > Options**. -8. Paste the MailChimp API Key into the appropriate field, then check "Enable MailChimp API Integration". -9. Press "Save Changes". +2. Follow [MailChimp's instructions for generating a new API key](https://mailchimp.com/help/about-api-keys/), and copy the API key. +3. On your website, go to **Dashboard > Settings > MailChimp Options**. +4. Paste the MailChimp API Key into the appropriate field +5. Press "Save Changes". +6. Go to **Settings > MailChimp Settings** to configure your MailChimp campaigns. ![Link Roundups MailChimp API settings](./img/link-roundups-mailchimp-integration.png) ## Creating a template in the MailChimp dashboard -You'll need a MailChimp template created and configured for use with Link Roundups. - -There are many options for creating MailChimp templates, but as a simple way of getting started: +You'll need a MailChimp template created and configured for use with Link Roundups. This requires the use of MailChimp's [Custom Templates](https://mailchimp.com/help/import-a-custom-html-template/) with [Editable Content Areas](https://mailchimp.com/help/create-editable-content-areas-with-mailchimps-template-language/). 1. Click on "Templates" in the MailChimp header. 2. Pick a single-column or column-and-sidebar template. @@ -34,44 +32,70 @@ There are many options for creating MailChimp templates, but as a simple way of 4. Click "Save and Exit". 5. Name your template, then save. -### Inserting template tags +### Inserting editable content areas -This plugin's MailChimp features depend on the presence of specific tags in your MailChimp template. +This plugin's MailChimp features depend on the presence of specific markup in your custom MailChimp template. You'll have to edit your template to add them, so that they can be replaced with your content when you go to send a campaign. 1. Click on "Templates" in the MailChimp header. 2. Click "Edit" on the template you want to edit. -Then, edit the template to insert the following tags where you want them to appear: +Then, edit the template to insert the content tags where you'd like them to appear. Here's an example of a fragment of an email's content: + +```html + +

This should be the roundup title:

+

This should be replaced with the roundup title

+ +

This should be the roundup author:

+
This should be replaced with the roundup author
+ +

This should be the roundup date:

+
This should be replaced with the roundup date
+ +

This should be the roundup links:

+
This should be replaced with the roundup links
+ +

This should be the roundup permalink:

+
This should be replaced with the roundup permalink
+ +``` #### Required Tags: -If these template tags are not present in your MailChimp template, you will be unable to create a new Argo Links Roundup Email Campaign. +If these template tags are not present in your MailChimp template, you will be unable to create a new Links Roundup Email Campaign. -- `*|ROUNDUPLINKS|*` - The actual list of links from the Argo Links Roundup post +- `mc:edit="rounduplink"` - The post content from a Link Roundup post #### Optional Tags: These template tags are not required, but you may wish to use them in your template. -- `*|ROUNDUPTITLE|*` - The Link Roundup post title -- `*|ROUNDUPAUTHOR|*` - The author of the Link Roundup post -- `*|ROUNDUPDATE|*` - The date the Links Roundu post was published -- `*|ROUNDUPPERMALINK|*` - A link back to the original Link Roundup post +- `mc:edit="rounduptitle"` - The Link Roundup post title +- `mc:edit="roundupauthor"` - The author of the Link Roundup post +- `mc:edit="roundupdate"` - The date the Links Roundup post was published +- `mc:edit="rounduppermalink"` - A link back to the original Link Roundup post -## Choosing the MailChimp Template and List to use +## Choosing the MailChimp Template and Audience to use -So now you have at least one template saved in MailChimp, and we're assuming you also have a list of subscribers for your newsletter. Go back to the Link Roundups Options page in **Link Roundups > Options**, and choose your template, and which MailChiimp List you want to use: +So now you have at least one template saved in MailChimp, and we're assuming you also have a list of subscribers for your newsletter. Go to **Link Roundups > MailChimp Campaign Settings**, and choose : -![Link Roundups MailChimp API settings](./img/link-roundups-options-mailchimp-2.png) +- Your defauult adience to send campaigns to +- Your default template for sending campaigns +- The defalt email address which test campaigns are sent to. # Creating a MailChimp Campaign Once you have [saved some links](saving-links.md) and [created a link roundup post](link-roundups.md), you can send the link roundup post to MailChimp as a draft campaign. -In the Link Roundups editor, above the standard WordPress "Publish" button you'll find a button to "Create a MailChimp Campaign." +In the Link Roundups editor, in a box near the bottom of the page you'll see an option to create a draft or send an email. If an email has already been sent, you'll see information about where to find the sent campaign in MailChimp's admin. ![Create MailChimp Campaign button in the post editor](./img/link-roundup-mailchimp-button.png) -When you click "Create a MailChimp Campaign" you will be asked to confirm the action. The Link Roundups plugin will contact MailChimp to create the campaign and, upon success, present you with a link to finish editing the campaign in the MailChimp dashboard. \ No newline at end of file +Buttons that may appear at the bottom of this box are as follows: + +- Send now: Sends the campaign. +- Create draft: Creates a draft camapign in MailChimp. You can update the draft using the Link Roundps editor or in MailChimp. +- Send Test: Lets you send a draft campaign. +- Update Draft: Refreshes the draft campaign in MailChimp with details from this editor. diff --git a/docs/maintainers.md b/docs/maintainers.md new file mode 100644 index 0000000..333b12c --- /dev/null +++ b/docs/maintainers.md @@ -0,0 +1,11 @@ +# Developer notes: + +## Class Saved_Links_List_Table + +See [the note in that class' directory](../inc/saved-links/README.md). + +## Releasing updates + +See https://github.com/INN/docs/blob/master/projects/wordpress-plugins/release.sh.md + +The best thing to do is to copy that checklist into [a new GitHub issue](https://github.com/INN/link-roundups/issues/new) for each release of the plugin. diff --git a/docs/readme.md b/docs/readme.md index ef7be07..7f722d4 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -18,4 +18,5 @@ Get the brief introduction to plugin features in [the main Readme.md file](https 3. [Link Roundup Posts](link-roundups.md) 4. [MailChimp Integration](mailchimp.md) 5. [WordPress Widgets](widgets.md) -6. [Troubleshooting](troubleshooting.md) \ No newline at end of file +6. [Troubleshooting](troubleshooting.md) +7. [Notes for this plugin's maintainers](maintainers.md) diff --git a/docs/saved-links.md b/docs/saved-links.md index 80da21b..7792f6c 100644 --- a/docs/saved-links.md +++ b/docs/saved-links.md @@ -2,6 +2,12 @@ Once you've [installed and activated the plugin](installation.md), you should see new Saved Links and Link Roundup menu items in your Dashboard. +## Preliminary prep work + +On the WordPress Dashboard, click on **Saved Links**", then "Add Browser Bookmark". If you are prompted with a screen like the following, you'll need to [follow the instructions to enable the bookmarklet on your site](./bookmarklet-dependencies.md). + +![A screenshot of a page titled "Enable Save to Site bookmarklet for your site" and the text explaining why and how to install a dependency.](img/save-to-site-bookmarklet-dependency.png) + ## Save Links via Browser Bookmark Tool (Recommended) 1. Under Saved Links, navigate to Add Browser Bookmark (Save to Site) @@ -42,4 +48,4 @@ Now that you have some Saved Links you can: - [Use them in Link Roundups posts](/docs/link-roundups.md) which display like other posts on your site. - If you have a MailChimp account for your email newsletter, you can also easily [publish Link Roundup posts as MailChimp campaigns](/docs/mailchimp.md) from your WordPress dashboard. -- You can also display Saved Links in the [Saved Links Widget](/docs/widgets.md). \ No newline at end of file +- You can also display Saved Links in the [Saved Links Widget](/docs/widgets.md). diff --git a/inc/link-roundups/class-link-roundups-editor.php b/inc/link-roundups/class-link-roundups-editor.php index 6605c23..5b8a23d 100644 --- a/inc/link-roundups/class-link-roundups-editor.php +++ b/inc/link-roundups/class-link-roundups-editor.php @@ -10,6 +10,7 @@ public static function init() { add_action( 'wp_ajax_roundup_block_posts', array( __CLASS__, 'roundup_block_posts' ) ); add_action( 'wp_ajax_roundup_update_post', array( __CLASS__, 'roundup_update_post' ) ); add_shortcode( 'roundup_block', array( __CLASS__, 'roundup_block_shortcode' ) ); + add_filter( 'mailchimp_tools_campaign_content', array( __CLASS__, 'mailchimp_tools_campaign_content' ), 10, 3 ); } /** @@ -293,27 +294,15 @@ public static function roundup_update_post() { } public static function roundup_block_posts_query() { - $month_ago = strtotime('-30 days'); - $now = strtotime('now'); - // Default arguments $args = apply_filters('link_roundups_roundup_block_post_query', array( 'post_type' => 'rounduplink', 'orderby' => 'date', 'order' => 'desc', - 'posts_per_page' => -1, + 'posts_per_page' => 10, 'date_query' => array( - 'after' => array( - 'year' => date( 'Y', $month_ago ), - 'month' => date( 'n', $month_ago ), - 'day' => date( 'j', $month_ago ) - ), - 'before' => array( - 'year' => date( 'Y', $now ), - 'month' => date( 'n', $now ), - 'day' => date( 'j', $now ) - ), - 'inclusive' => true + 'year' => date( 'Y' ), + 'monthnum' => date( 'm' ), ) )); $query = new WP_Query($args); @@ -368,7 +357,7 @@ public static function roundup_block_posts_query() { } /* - * Load posts for the roundupp block editor + * Load posts for the roundup block editor * * @since 0.3.2 */ @@ -378,4 +367,42 @@ public static function roundup_block_posts() { print json_encode($posts); wp_die(); } + + /** + * Apply information from a Link Roundup post to a WordPress MailChimp Tools email via the appropriate filter + * + * @param Array $campaign_params An array of request body parameters, as described in the "put" section of https://developer.mailchimp.com/documentation/mailchimp/reference/campaigns/content/#%20 + * @param WP_Post $post The post that is being turned into a MailChimp Campaign + * @param int $id The campaign ID + * @return Array $params + * + * @link the commit that implemented this filter: https://github.com/INN/wordpress-mailchimp-tools/commit/4e768f7661a2fe8fc2785140e8313280eb230c3f + * @link Why: https://github.com/INN/link-roundups/pull/139#issuecomment-488852947 + */ + public static function mailchimp_tools_campaign_content( $campaign_params, $post, $id ) { + // shortcut if post not set + if ( empty( $post ) ) { + return $campaign_params; + } + + if ( ! ( $post instanceof WP_Post ) ) { + $post = get_post( $post ); + } + + if ( ! isset( $campaign_params['template'] ) ) { + $campaign_params['template'] = array(); + } + if ( ! isset( $campaign_params['template']['sections'] ) ) { + $campaign_params['template']['sections'] = array(); + } + $campaign_params['template']['sections']['rounduplinks'] = apply_filters( 'the_content', $post->post_content ); + $campaign_params['template']['sections']['rounduptitle'] = $post->post_title; + $campaign_params['template']['sections']['roundupdate'] = get_the_date( '', $post->ID ); + $campaign_params['template']['sections']['rounduppermalink'] = get_post_permalink( $post->ID ); + + $author = get_user_by( 'id', $post->post_author ); + $campaign_params['template']['sections']['roundupauthor'] = $author->display_name; + + return $campaign_params; + } } diff --git a/inc/link-roundups/class-link-roundups-widget.php b/inc/link-roundups/class-link-roundups-widget.php index 3a188d0..063f969 100644 --- a/inc/link-roundups/class-link-roundups-widget.php +++ b/inc/link-roundups/class-link-roundups-widget.php @@ -14,58 +14,59 @@ function __construct() { } function widget( $args, $instance ) { - - extract( $args ); - // make it possible for the widget title to be a link $title = apply_filters('widget_title', empty( $instance['title'] ) ? __('Recent Link Roundups' , 'link-roundups') : $instance['title'], $instance, $this->id_base); - echo $before_widget; - - if ( $title ) - echo $before_title . $title . $after_title; - - $query_args = array ( - 'post__not_in' => get_option( 'sticky_posts' ), - 'showposts' => $instance['num_posts'], - 'post_type' => 'post', - 'post_status' => 'publish' - ); - if ( $instance['cat'] != '' ) $query_args['cat'] = $instance['cat']; - $my_query = new WP_Query( $query_args ); - if ( $my_query->have_posts() ) { - while ( $my_query->have_posts() ) : $my_query->the_post(); - $custom = get_post_custom( $post->ID ); ?> -
- ' . get_the_date( 'F d Y' ) . ''; - // the headline - $output .= '

' . get_the_title() . '

'; - // the excerpt - $output .= '

' . get_the_excerpt() . '

'; - echo $output; - ?> - -
- You don\'t have any recent links or the Link Roundups plugin is not active.

', 'link-roundups' ); - } // end recent links - - if ( $instance['linkurl'] !='' ) { ?> - - get_option( 'sticky_posts' ), + 'posts_per_page' => $instance['num_posts'], + 'post_type' => 'post', + 'post_status' => 'publish' + ); + + if ( $instance['cat'] != '' ) $query_args['cat'] = $instance['cat']; + + $my_query = new WP_Query( $query_args ); + if ( $my_query->have_posts() ) { + while ( $my_query->have_posts() ) : $my_query->the_post(); + $custom = get_post_custom( $post->ID ); ?> +
+ ' . get_the_date( 'F d Y' ) . ''; + // the headline + $output .= '

' . get_the_title() . '

'; + // the excerpt + $output .= '

' . get_the_excerpt() . '

'; + echo $output; + ?> + +
+ You don\'t have any recent links or the Link Roundups plugin is not active.

', 'link-roundups' ); + } // end recent links + + if ( $instance['linkurl'] !='' ) { ?> + + - +

- +

@@ -105,7 +106,7 @@ function form( $instance ) {

- +

-
- - + if they say you should make a copy of it you should probably make a copy of it So now there's a copy of it. + +It needs to be updated on occasion, because of messages like this: + +> Declaration of Saved_Links_List_Table::bulk_actions($which) should be compatible with clone_WP_List_Table::bulk_actions($which = '') diff --git a/inc/saved-links/class-saved-links-list-table.php b/inc/saved-links/class-saved-links-list-table.php index 2462f58..f79777b 100644 --- a/inc/saved-links/class-saved-links-list-table.php +++ b/inc/saved-links/class-saved-links-list-table.php @@ -42,38 +42,58 @@ function __construct() { /** * Additional decorations for the table: "Send to editor" button and "Date range" filter * + * Default presentation: date filter is set to "This Month", and changing that should also change $this->prepare_items. + * * @param string $which is either "top" or "bottom", and tells you which nav you're outputting. * @since 0.3.2 + * @see prepare_items */ - function bulk_actions( $which ) { + function bulk_actions( $which = '' ) { + $request = $_REQUEST; + if ( ! isset( $request['link_date'] ) ) { + $request['link_date'] = 'this_month'; + } + // this will display at top and bottom ?> - +
+
+ + + +
+ items with those posts. * * @since 0.3.2 + * @see bulk_actions */ function prepare_items() { @@ -127,25 +148,38 @@ function prepare_items() { */ // Define the default date query + // This should match the vale set as default in $this->bulk_actions() $default_date = array( 'year' => date( 'Y' ), 'monthnum' => date( 'm' ), - 'day' => date( 'd' ) ); + // Turn the filter date button's response into a meaningful WP_Query date argument if ( isset($_REQUEST['link_date'] ) ) { switch ($_REQUEST['link_date']) { case 'today': - $default_date = array( 'year' => date( 'Y' ), 'monthnum' => date( 'm' ), 'day' => date( 'd' ) ); + $default_date = array( + 'year' => date( 'Y' ), + 'monthnum' => date( 'm' ), + 'day' => date( 'd' ) + ); break; case 'this_week': - $default_date = array( 'year' => date( 'Y' ), 'w' => date( 'W' )); + $default_date = array( + 'year' => date( 'Y' ), + 'w' => date( 'W' ) + ); break; case 'this_month': - $default_date = array( 'year' => date( 'Y' ), 'monthnum' => date( 'm' ) ); + $default_date = array( + 'year' => date( 'Y' ), + 'monthnum' => date( 'm' ) + ); break; case 'this_year': - $default_date = array( 'year' => date( 'Y' ) ); + $default_date = array( + 'year' => date( 'Y' ) + ); break; case 'show_all': $default_date = array(); @@ -179,7 +213,9 @@ function prepare_items() { // Set the columns $columns = $this->get_columns(); - $_wp_column_headers[$screen->id] = $columns; + if ( isset( $screen ) ) { + $_wp_column_headers[$screen->id] = $columns; + } // Fetch the items $links_query = new WP_Query($args); diff --git a/inc/saved-links/class-saved-links-widget.php b/inc/saved-links/class-saved-links-widget.php index dbee447..bf3e563 100644 --- a/inc/saved-links/class-saved-links-widget.php +++ b/inc/saved-links/class-saved-links-widget.php @@ -6,7 +6,7 @@ */ class saved_links_widget extends WP_Widget { - function saved_links_widget() { + function __construct() { $widget_ops = array( 'classname' => 'saved-links', 'description' => __( 'Show your most recently saved links in a sidebar widget', 'link-roundups' ) @@ -23,7 +23,9 @@ function widget( $args, $instance ) { echo $before_widget; - if ( $title ) echo $before_title . $title . $after_title; + if ( $title ) { + echo $before_title . $title . $after_title; + } $query_args = array ( 'post__not_in' => get_option( 'sticky_posts' ), @@ -34,55 +36,70 @@ function widget( $args, $instance ) { $my_query = new WP_Query( $query_args ); if ( $my_query->have_posts() ) { - while ( $my_query->have_posts() ) : $my_query->the_post(); - $custom = get_post_custom( $post->ID ); - - // skip roundups - if ( get_post_type( $post ) === 'roundup' ) continue; ?> - -
- ID) && $instance['show_featured_image'] == 'on') { - echo get_the_post_thumbnail($post->ID); - } ?> - -
have_posts() ) { + $my_query->the_post(); + $custom = get_post_custom( $post->ID ); + + // skip roundups + if ( get_post_type( $post ) === 'roundup' ) { + continue; + } + + ?> + +
+ ID) && $instance['show_featured_image'] == 'on') { + echo get_the_post_thumbnail($post->ID); } - $output .= '>' . get_the_title() . ''; - } else { - $output = get_the_title(); - } - echo $output; - ?>
- - '; - echo ( function_exists( 'largo_trim_sentences' ) ) ? largo_trim_sentences($custom["lr_desc"][0], $instance['num_sentences']) : $custom["lr_desc"][0]; - echo '

'; - } - if ( isset($custom["lr_source"][0] ) ) { - $lr_source = '

' . __('Source: ', 'link-roundups') . ''; - if ( !empty( $custom["lr_url"][0] ) ) { - $lr_source .= ' + +

+ ' . get_the_title() . ''; + } else { + $output = get_the_title(); } - $lr_source .= '>' . $custom["lr_source"][0] . ''; - } else { - $lr_source .= $custom["lr_source"][0]; + echo $output; + ?> +
+ + '; + echo ( function_exists( 'largo_trim_sentences' ) ) ? largo_trim_sentences($custom["lr_desc"][0], $instance['num_sentences']) : $custom["lr_desc"][0]; + echo '

'; } - $lr_source .= '

'; - echo $lr_source; - } - ?> -
- - ' . __('Source: ', 'link-roundups') . ''; + if ( !empty( $custom["lr_url"][0] ) ) { + $lr_source .= sprintf( + ''; + } else { + $lr_source .= $custom["lr_source"][0]; + } + $lr_source .= '

'; + echo $lr_source; + } + ?> + + You don\'t have any recent links or the link roundups plugin is not active.

', 'link-roundups' ); } // end recent links @@ -120,12 +137,12 @@ function form( $instance ) {

- +

- +

@@ -136,7 +153,7 @@ function form( $instance ) {

- +

@@ -153,7 +170,7 @@ function form( $instance ) {

- +

+

+ +
+
+

+

+

Press This, which reimplements functionality that was removed from WordPress in version 4.9.', + 'https://wordpress.org/plugins/press-this/' + ); + ?>

+ + %2$s', + add_query_arg( + array( + 's' => htmlspecialchars('press-this'), + 'tab' => 'search', + 'type' => 'term', + ), + network_admin_url( 'plugin-install.php' ) + ), + 'Install now' + ); + } else { + printf( + '

%1$s

', + __( 'Please contact your site administrator to have this plugin installed.', 'link-roundups' ) + ); + } + ?> +
+
+ -

+

-
+

@@ -371,7 +436,7 @@ public static function build_lroundups_page() {

- +

diff --git a/inc/saved-links/class-wp-list-table-clone.php b/inc/saved-links/class-wp-list-table-clone.php index 47a0379..fde2808 100644 --- a/inc/saved-links/class-wp-list-table-clone.php +++ b/inc/saved-links/class-wp-list-table-clone.php @@ -1,36 +1,41 @@ get_column_info() + * Stores the value returned by ->get_column_info(). * + * @since 4.1.0 * @var array */ protected $_column_headers; + /** + * {@internal Missing Summary} + * + * @var array + */ protected $compat_fields = array( '_args', '_pagination_args', 'screen', '_actions', '_pagination' ); - protected $compat_methods = array( 'set_pagination_args', 'get_views', 'get_bulk_actions', 'bulk_actions', - 'row_actions', 'months_dropdown', 'view_switcher', 'comments_bubble', 'get_items_per_page', 'pagination', - 'get_sortable_columns', 'get_column_info', 'get_table_classes', 'display_tablenav', 'extra_tablenav', - 'single_row_columns' ); + /** + * {@internal Missing Summary} + * + * @var array + */ + protected $compat_methods = array( + 'set_pagination_args', + 'get_views', + 'get_bulk_actions', + 'bulk_actions', + 'row_actions', + 'months_dropdown', + 'view_switcher', + 'comments_bubble', + 'get_items_per_page', + 'pagination', + 'get_sortable_columns', + 'get_column_info', + 'get_table_classes', + 'display_tablenav', + 'extra_tablenav', + 'single_row_columns', + ); /** * Constructor. @@ -94,7 +120,6 @@ class clone_WP_List_Table { * the default $args. * * @since 3.1.0 - * @access public * * @param array|string $args { * Array or string of arguments. @@ -104,31 +129,35 @@ class clone_WP_List_Table { * in the list table, e.g. 'posts'. Default empty. * @type string $singular Singular label for an object being listed, e.g. 'post'. * Default empty - * @type bool $ajax Whether the list table supports AJAX. This includes loading + * @type bool $ajax Whether the list table supports Ajax. This includes loading * and sorting data, for example. If true, the class will call - * the {@see _js_vars()} method in the footer to provide variables - * to any scripts handling AJAX events. Default false. + * the _js_vars() method in the footer to provide variables + * to any scripts handling Ajax events. Default false. * @type string $screen String containing the hook name used to determine the current * screen. If left null, the current screen will be automatically set. * Default null. * } */ public function __construct( $args = array() ) { - $args = wp_parse_args( $args, array( - 'plural' => '', - 'singular' => '', - 'ajax' => false, - 'screen' => null, - ) ); + $args = wp_parse_args( + $args, + array( + 'plural' => '', + 'singular' => '', + 'ajax' => false, + 'screen' => null, + ) + ); $this->screen = convert_to_screen( $args['screen'] ); add_filter( "manage_{$this->screen->id}_columns", array( $this, 'get_columns' ), 0 ); - if ( !$args['plural'] ) + if ( ! $args['plural'] ) { $args['plural'] = $this->screen->base; + } - $args['plural'] = sanitize_key( $args['plural'] ); + $args['plural'] = sanitize_key( $args['plural'] ); $args['singular'] = sanitize_key( $args['singular'] ); $this->_args = $args; @@ -141,16 +170,15 @@ public function __construct( $args = array() ) { if ( empty( $this->modes ) ) { $this->modes = array( 'list' => __( 'List View' ), - 'excerpt' => __( 'Excerpt View' ) + 'excerpt' => __( 'Excerpt View' ), ); } } /** - * Make private properties readable for backwards compatibility. + * Make private properties readable for backward compatibility. * * @since 4.0.0 - * @access public * * @param string $name Property to get. * @return mixed Property. @@ -162,10 +190,9 @@ public function __get( $name ) { } /** - * Make private properties settable for backwards compatibility. + * Make private properties settable for backward compatibility. * * @since 4.0.0 - * @access public * * @param string $name Property to check if set. * @param mixed $value Property value. @@ -178,10 +205,9 @@ public function __set( $name, $value ) { } /** - * Make private properties checkable for backwards compatibility. + * Make private properties checkable for backward compatibility. * * @since 4.0.0 - * @access public * * @param string $name Property to check if set. * @return bool Whether the property is set. @@ -193,10 +219,9 @@ public function __isset( $name ) { } /** - * Make private properties un-settable for backwards compatibility. + * Make private properties un-settable for backward compatibility. * * @since 4.0.0 - * @access public * * @param string $name Property to unset. */ @@ -207,12 +232,11 @@ public function __unset( $name ) { } /** - * Make private/protected methods readable for backwards compatibility. + * Make private/protected methods readable for backward compatibility. * * @since 4.0.0 - * @access public * - * @param callable $name Method to call. + * @param string $name Method to call. * @param array $arguments Arguments to pass when calling. * @return mixed|bool Return value of the callback, false otherwise. */ @@ -227,45 +251,47 @@ public function __call( $name, $arguments ) { * Checks the current user's permissions * * @since 3.1.0 - * @access public * @abstract */ public function ajax_user_can() { - die( 'function WP_List_Table::ajax_user_can() must be over-ridden in a sub-class.' ); + die( 'function clone_WP_List_Table::ajax_user_can() must be over-ridden in a sub-class.' ); } /** * Prepares the list of items for displaying. - * @uses WP_List_Table::set_pagination_args() + * + * @uses clone_WP_List_Table::set_pagination_args() * * @since 3.1.0 - * @access public * @abstract */ public function prepare_items() { - die( 'function WP_List_Table::prepare_items() must be over-ridden in a sub-class.' ); + die( 'function clone_WP_List_Table::prepare_items() must be over-ridden in a sub-class.' ); } /** * An internal method that sets all the necessary pagination arguments * - * @param array $args An associative array with information about the pagination - * @access protected + * @since 3.1.0 * - * @param array|string $args + * @param array|string $args Array or string of arguments with information about the pagination. */ protected function set_pagination_args( $args ) { - $args = wp_parse_args( $args, array( - 'total_items' => 0, - 'total_pages' => 0, - 'per_page' => 0, - ) ); + $args = wp_parse_args( + $args, + array( + 'total_items' => 0, + 'total_pages' => 0, + 'per_page' => 0, + ) + ); - if ( !$args['total_pages'] && $args['per_page'] > 0 ) + if ( ! $args['total_pages'] && $args['per_page'] > 0 ) { $args['total_pages'] = ceil( $args['total_items'] / $args['per_page'] ); + } // Redirect if page number is invalid and headers are not already sent. - if ( ! headers_sent() && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) && $args['total_pages'] > 0 && $this->get_pagenum() > $args['total_pages'] ) { + if ( ! headers_sent() && ! wp_doing_ajax() && $args['total_pages'] > 0 && $this->get_pagenum() > $args['total_pages'] ) { wp_redirect( add_query_arg( 'paged', $args['total_pages'] ) ); exit; } @@ -277,72 +303,75 @@ protected function set_pagination_args( $args ) { * Access the pagination args. * * @since 3.1.0 - * @access public * * @param string $key Pagination argument to retrieve. Common values include 'total_items', * 'total_pages', 'per_page', or 'infinite_scroll'. * @return int Number of items that correspond to the given pagination argument. */ public function get_pagination_arg( $key ) { - if ( 'page' == $key ) + if ( 'page' === $key ) { return $this->get_pagenum(); + } - if ( isset( $this->_pagination_args[$key] ) ) - return $this->_pagination_args[$key]; + if ( isset( $this->_pagination_args[ $key ] ) ) { + return $this->_pagination_args[ $key ]; + } } /** * Whether the table has items to display or not * * @since 3.1.0 - * @access public * * @return bool */ public function has_items() { - return !empty( $this->items ); + return ! empty( $this->items ); } /** * Message to be displayed when there are no items * * @since 3.1.0 - * @access public */ public function no_items() { _e( 'No items found.' ); } /** - * Display the search box. + * Displays the search box. * * @since 3.1.0 - * @access public * - * @param string $text The search button text - * @param string $input_id The search input id + * @param string $text The 'submit' button label. + * @param string $input_id ID attribute value for the search input field. */ public function search_box( $text, $input_id ) { - if ( empty( $_REQUEST['s'] ) && !$this->has_items() ) + if ( empty( $_REQUEST['s'] ) && ! $this->has_items() ) { return; + } $input_id = $input_id . '-search-input'; - if ( ! empty( $_REQUEST['orderby'] ) ) + if ( ! empty( $_REQUEST['orderby'] ) ) { echo ''; - if ( ! empty( $_REQUEST['order'] ) ) + } + if ( ! empty( $_REQUEST['order'] ) ) { echo ''; - if ( ! empty( $_REQUEST['post_mime_type'] ) ) + } + if ( ! empty( $_REQUEST['post_mime_type'] ) ) { echo ''; - if ( ! empty( $_REQUEST['detached'] ) ) + } + if ( ! empty( $_REQUEST['detached'] ) ) { echo ''; -?> + } + ?> -get_views(); /** - * Filter the list of available list table views. + * Filters the list of available list table views. * * The dynamic portion of the hook name, `$this->screen->id`, refers * to the ID of the current screen, usually a string. * * @since 3.5.0 * - * @param array $views An array of available list table views. + * @param string[] $views An array of available list table views. */ $views = apply_filters( "views_{$this->screen->id}", $views ); - if ( empty( $views ) ) + if ( empty( $views ) ) { return; + } + + $this->screen->render_screen_reader_content( 'heading_views' ); echo "
    \n"; foreach ( $views as $class => $view ) { $views[ $class ] = "\t
  • $view"; } echo implode( " |
  • \n", $views ) . "\n"; - echo "
"; + echo ''; } /** @@ -394,7 +424,6 @@ public function views() { * of bulk actions available on this table. * * @since 3.1.0 - * @access protected * * @return array */ @@ -406,16 +435,15 @@ protected function get_bulk_actions() { * Display the bulk actions dropdown. * * @since 3.1.0 - * @access protected * * @param string $which The location of the bulk actions: 'top' or 'bottom'. - * This is designated as optional for backwards-compatibility. + * This is designated as optional for backward compatibility. */ protected function bulk_actions( $which = '' ) { if ( is_null( $this->_actions ) ) { - $no_new_actions = $this->_actions = $this->get_bulk_actions(); + $this->_actions = $this->get_bulk_actions(); /** - * Filter the list table Bulk Actions drop-down. + * Filters the list table Bulk Actions drop-down. * * The dynamic portion of the hook name, `$this->screen->id`, refers * to the ID of the current screen, usually a string. @@ -424,26 +452,26 @@ protected function bulk_actions( $which = '' ) { * * @since 3.5.0 * - * @param array $actions An array of the available bulk actions. + * @param string[] $actions An array of the available bulk actions. */ $this->_actions = apply_filters( "bulk_actions-{$this->screen->id}", $this->_actions ); - $this->_actions = array_intersect_assoc( $this->_actions, $no_new_actions ); - $two = ''; + $two = ''; } else { $two = '2'; } - if ( empty( $this->_actions ) ) + if ( empty( $this->_actions ) ) { return; + } - echo ""; - echo "\n"; + echo '\n"; foreach ( $this->_actions as $name => $title ) { - $class = 'edit' == $name ? ' class="hide-if-no-js"' : ''; + $class = 'edit' === $name ? ' class="hide-if-no-js"' : ''; - echo "\t\n"; + echo "\t" . '\n"; } echo "\n"; @@ -456,19 +484,21 @@ protected function bulk_actions( $which = '' ) { * Get the current action selected from the bulk actions dropdown. * * @since 3.1.0 - * @access public * * @return string|false The action name or False if no action was selected */ public function current_action() { - if ( isset( $_REQUEST['filter_action'] ) && ! empty( $_REQUEST['filter_action'] ) ) + if ( isset( $_REQUEST['filter_action'] ) && ! empty( $_REQUEST['filter_action'] ) ) { return false; + } - if ( isset( $_REQUEST['action'] ) && -1 != $_REQUEST['action'] ) + if ( isset( $_REQUEST['action'] ) && -1 != $_REQUEST['action'] ) { return $_REQUEST['action']; + } - if ( isset( $_REQUEST['action2'] ) && -1 != $_REQUEST['action2'] ) + if ( isset( $_REQUEST['action2'] ) && -1 != $_REQUEST['action2'] ) { return $_REQUEST['action2']; + } return false; } @@ -477,24 +507,24 @@ public function current_action() { * Generate row actions div * * @since 3.1.0 - * @access protected * - * @param array $actions The list of actions - * @param bool $always_visible Whether the actions should be always visible + * @param string[] $actions An array of action links. + * @param bool $always_visible Whether the actions should be always visible. * @return string */ protected function row_actions( $actions, $always_visible = false ) { $action_count = count( $actions ); - $i = 0; + $i = 0; - if ( !$action_count ) + if ( ! $action_count ) { return ''; + } $out = '
'; foreach ( $actions as $action => $link ) { ++$i; ( $i == $action_count ) ? $sep = '' : $sep = ' | '; - $out .= "$link$sep"; + $out .= "$link$sep"; } $out .= '
'; @@ -507,7 +537,6 @@ protected function row_actions( $actions, $always_visible = false ) { * Display a monthly dropdown for filtering items * * @since 3.1.0 - * @access protected * * @global wpdb $wpdb * @global WP_Locale $wp_locale @@ -518,7 +547,7 @@ protected function months_dropdown( $post_type ) { global $wpdb, $wp_locale; /** - * Filter whether to remove the 'Months' drop-down from the post list table. + * Filters whether to remove the 'Months' drop-down from the post list table. * * @since 4.2.0 * @@ -529,15 +558,28 @@ protected function months_dropdown( $post_type ) { return; } - $months = $wpdb->get_results( $wpdb->prepare( " + $extra_checks = "AND post_status != 'auto-draft'"; + if ( ! isset( $_GET['post_status'] ) || 'trash' !== $_GET['post_status'] ) { + $extra_checks .= " AND post_status != 'trash'"; + } elseif ( isset( $_GET['post_status'] ) ) { + $extra_checks = $wpdb->prepare( ' AND post_status = %s', $_GET['post_status'] ); + } + + $months = $wpdb->get_results( + $wpdb->prepare( + " SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month FROM $wpdb->posts WHERE post_type = %s + $extra_checks ORDER BY post_date DESC - ", $post_type ) ); + ", + $post_type + ) + ); /** - * Filter the 'Months' drop-down results. + * Filters the 'Months' drop-down results. * * @since 3.7.0 * @@ -548,68 +590,70 @@ protected function months_dropdown( $post_type ) { $month_count = count( $months ); - if ( !$month_count || ( 1 == $month_count && 0 == $months[0]->month ) ) + if ( ! $month_count || ( 1 == $month_count && 0 == $months[0]->month ) ) { return; + } $m = isset( $_GET['m'] ) ? (int) $_GET['m'] : 0; -?> + ?> - + ?>
-modes as $mode => $title ) { - $classes = array( 'view-' . $mode ); - if ( $current_mode == $mode ) - $classes[] = 'current'; - printf( - "%s\n", - esc_url( add_query_arg( 'mode', $mode ) ), - implode( ' ', $classes ), - $title - ); + modes as $mode => $title ) { + $classes = array( 'view-' . $mode ); + if ( $current_mode === $mode ) { + $classes[] = 'current'; } + printf( + "%s\n", + esc_url( add_query_arg( 'mode', $mode ) ), + implode( ' ', $classes ), + $title + ); + } ?>
-%s', + printf( + '%s', __( 'No comments' ) ); - // Approved comments have different display depending on some conditions. + // Approved comments have different display depending on some conditions. } elseif ( $approved_comments ) { - printf( '%s', - esc_url( add_query_arg( array( 'p' => $post_id, 'comment_status' => 'approved' ), admin_url( 'edit-comments.php' ) ) ), + printf( + '%s', + esc_url( + add_query_arg( + array( + 'p' => $post_id, + 'comment_status' => 'approved', + ), + admin_url( 'edit-comments.php' ) + ) + ), $approved_comments_number, $pending_comments ? $approved_phrase : $approved_only_phrase ); } else { - printf( '%s', + printf( + '%s', $approved_comments_number, $pending_comments ? __( 'No approved comments' ) : __( 'No comments' ) ); } if ( $pending_comments ) { - printf( '%s', - esc_url( add_query_arg( array( 'p' => $post_id, 'comment_status' => 'moderated' ), admin_url( 'edit-comments.php' ) ) ), + printf( + '%s', + esc_url( + add_query_arg( + array( + 'p' => $post_id, + 'comment_status' => 'moderated', + ), + admin_url( 'edit-comments.php' ) + ) + ), $pending_comments_number, $pending_phrase ); + } else { + printf( + '%s', + $pending_comments_number, + $approved_comments ? __( 'No pending comments' ) : __( 'No comments' ) + ); } } @@ -656,15 +726,15 @@ protected function comments_bubble( $post_id, $pending_comments ) { * Get the current page number * * @since 3.1.0 - * @access public * * @return int */ public function get_pagenum() { $pagenum = isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 0; - if ( isset( $this->_pagination_args['total_pages'] ) && $pagenum > $this->_pagination_args['total_pages'] ) + if ( isset( $this->_pagination_args['total_pages'] ) && $pagenum > $this->_pagination_args['total_pages'] ) { $pagenum = $this->_pagination_args['total_pages']; + } return max( 1, $pagenum ); } @@ -673,7 +743,6 @@ public function get_pagenum() { * Get number of items to display on a single page * * @since 3.1.0 - * @access protected * * @param string $option * @param int $default @@ -681,11 +750,12 @@ public function get_pagenum() { */ protected function get_items_per_page( $option, $default = 20 ) { $per_page = (int) get_user_option( $option ); - if ( empty( $per_page ) || $per_page < 1 ) + if ( empty( $per_page ) || $per_page < 1 ) { $per_page = $default; + } /** - * Filter the number of items to be displayed on each page of the list table. + * Filters the number of items to be displayed on each page of the list table. * * The dynamic hook name, $option, refers to the `per_page` option depending * on the type of list table in use. Possible values include: 'edit_comments_per_page', @@ -697,14 +767,13 @@ protected function get_items_per_page( $option, $default = 20 ) { * * @param int $per_page Number of items to be displayed. Default 20. */ - return (int) apply_filters( $option, $per_page ); + return (int) apply_filters( "{$option}", $per_page ); } /** * Display the pagination. * * @since 3.1.0 - * @access protected * * @param string $which */ @@ -713,47 +782,53 @@ protected function pagination( $which ) { return; } - $total_items = $this->_pagination_args['total_items']; - $total_pages = $this->_pagination_args['total_pages']; + $total_items = $this->_pagination_args['total_items']; + $total_pages = $this->_pagination_args['total_pages']; $infinite_scroll = false; if ( isset( $this->_pagination_args['infinite_scroll'] ) ) { $infinite_scroll = $this->_pagination_args['infinite_scroll']; } + if ( 'top' === $which && $total_pages > 1 ) { + $this->screen->render_screen_reader_content( 'heading_pagination' ); + } + $output = '' . sprintf( _n( '%s item', '%s items', $total_items ), number_format_i18n( $total_items ) ) . ''; - $current = $this->get_pagenum(); + $current = $this->get_pagenum(); + $removable_query_args = wp_removable_query_args(); $current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ); - $current_url = remove_query_arg( array( 'hotkeys_highlight_last', 'hotkeys_highlight_first' ), $current_url ); + $current_url = remove_query_arg( $removable_query_args, $current_url ); $page_links = array(); $total_pages_before = ''; - $total_pages_after = ''; + $total_pages_after = ''; $disable_first = $disable_last = $disable_prev = $disable_next = false; - if ( $current == 1 ) { + if ( $current == 1 ) { $disable_first = true; - $disable_prev = true; - } + $disable_prev = true; + } if ( $current == 2 ) { $disable_first = true; } - if ( $current == $total_pages ) { + if ( $current == $total_pages ) { $disable_last = true; $disable_next = true; - } + } if ( $current == $total_pages - 1 ) { $disable_last = true; } if ( $disable_first ) { - $page_links[] = ''; + $page_links[] = ''; } else { - $page_links[] = sprintf( "%s", + $page_links[] = sprintf( + "%s", esc_url( remove_query_arg( 'paged', $current_url ) ), __( 'First page' ), '«' @@ -761,42 +836,46 @@ protected function pagination( $which ) { } if ( $disable_prev ) { - $page_links[] = ''; + $page_links[] = ''; } else { - $page_links[] = sprintf( "%s", - esc_url( add_query_arg( 'paged', max( 1, $current-1 ), $current_url ) ), + $page_links[] = sprintf( + "%s", + esc_url( add_query_arg( 'paged', max( 1, $current - 1 ), $current_url ) ), __( 'Previous page' ), '‹' ); } - if ( 'bottom' == $which ) { + if ( 'bottom' === $which ) { $html_current_page = $current; - $total_pages_before = '' . __( 'Current Page' ) . ''; + $total_pages_before = '' . __( 'Current Page' ) . ''; } else { - $html_current_page = sprintf( "%s", + $html_current_page = sprintf( + "%s", '', $current, strlen( $total_pages ) ); } $html_total_pages = sprintf( "%s", number_format_i18n( $total_pages ) ); - $page_links[] = $total_pages_before . sprintf( _x( '%1$s of %2$s', 'paging' ), $html_current_page, $html_total_pages ) . $total_pages_after; + $page_links[] = $total_pages_before . sprintf( _x( '%1$s of %2$s', 'paging' ), $html_current_page, $html_total_pages ) . $total_pages_after; if ( $disable_next ) { - $page_links[] = ''; + $page_links[] = ''; } else { - $page_links[] = sprintf( "%s", - esc_url( add_query_arg( 'paged', min( $total_pages, $current+1 ), $current_url ) ), + $page_links[] = sprintf( + "%s", + esc_url( add_query_arg( 'paged', min( $total_pages, $current + 1 ), $current_url ) ), __( 'Next page' ), '›' ); } if ( $disable_last ) { - $page_links[] = ''; + $page_links[] = ''; } else { - $page_links[] = sprintf( "%s", + $page_links[] = sprintf( + "%s", esc_url( add_query_arg( 'paged', $total_pages, $current_url ) ), __( 'Last page' ), '»' @@ -805,7 +884,7 @@ protected function pagination( $which ) { $pagination_links_class = 'pagination-links'; if ( ! empty( $infinite_scroll ) ) { - $pagination_links_class = ' hide-if-js'; + $pagination_links_class .= ' hide-if-js'; } $output .= "\n" . join( "\n", $page_links ) . ''; @@ -824,13 +903,12 @@ protected function pagination( $which ) { * 'internal-name' => 'Title' * * @since 3.1.0 - * @access public * @abstract * * @return array */ public function get_columns() { - die( 'function WP_List_Table::get_columns() must be over-ridden in a sub-class.' ); + die( 'function clone_WP_List_Table::get_columns() must be over-ridden in a sub-class.' ); } /** @@ -842,7 +920,6 @@ public function get_columns() { * The second format will make the initial sorting order be descending * * @since 3.1.0 - * @access protected * * @return array */ @@ -854,17 +931,20 @@ protected function get_sortable_columns() { * Gets the name of the default primary column. * * @since 4.3.0 - * @access protected * * @return string Name of the default primary column, in this case, an empty string. */ protected function get_default_primary_column_name() { $columns = $this->get_columns(); - $column = ''; + $column = ''; + + if ( empty( $columns ) ) { + return $column; + } // We need a primary defined so responsive views show something, // so let's fall back to the first non-checkbox column. - foreach( $columns as $col => $column_name ) { + foreach ( $columns as $col => $column_name ) { if ( 'cb' === $col ) { continue; } @@ -876,33 +956,43 @@ protected function get_default_primary_column_name() { return $column; } + /** + * Public wrapper for clone_WP_List_Table::get_default_primary_column_name(). + * + * @since 4.4.0 + * + * @return string Name of the default primary column. + */ + public function get_primary_column() { + return $this->get_primary_column_name(); + } + /** * Gets the name of the primary column. * * @since 4.3.0 - * @access protected * * @return string The name of the primary column. */ protected function get_primary_column_name() { - $columns = $this->get_columns(); + $columns = get_column_headers( $this->screen ); $default = $this->get_default_primary_column_name(); // If the primary column doesn't exist fall back to the // first non-checkbox column. if ( ! isset( $columns[ $default ] ) ) { - $default = WP_List_Table::get_default_primary_column_name(); + $default = clone_WP_List_Table::get_default_primary_column_name(); } /** - * Filter the name of the primary column for the current list table. + * Filters the name of the primary column for the current list table. * * @since 4.3.0 * * @param string $default Column name default for the specific list table, e.g. 'name'. * @param string $context Screen ID for specific list table, e.g. 'plugins'. */ - $column = apply_filters( 'list_table_primary_column', $default, $this->screen->id ); + $column = apply_filters( 'list_table_primary_column', $default, $this->screen->id ); if ( empty( $column ) || ! isset( $columns[ $column ] ) ) { $column = $default; @@ -915,7 +1005,6 @@ protected function get_primary_column_name() { * Get a list of all, hidden and sortable columns, with filter applied * * @since 3.1.0 - * @access protected * * @return array */ @@ -933,11 +1022,11 @@ protected function get_column_info() { } $columns = get_column_headers( $this->screen ); - $hidden = get_hidden_columns( $this->screen ); + $hidden = get_hidden_columns( $this->screen ); $sortable_columns = $this->get_sortable_columns(); /** - * Filter the list table sortable columns for a specific screen. + * Filters the list table sortable columns for a specific screen. * * The dynamic portion of the hook name, `$this->screen->id`, refers * to the ID of the current screen, usually a string. @@ -950,17 +1039,19 @@ protected function get_column_info() { $sortable = array(); foreach ( $_sortable as $id => $data ) { - if ( empty( $data ) ) + if ( empty( $data ) ) { continue; + } $data = (array) $data; - if ( !isset( $data[1] ) ) + if ( ! isset( $data[1] ) ) { $data[1] = false; + } - $sortable[$id] = $data; + $sortable[ $id ] = $data; } - $primary = $this->get_primary_column_name(); + $primary = $this->get_primary_column_name(); $this->_column_headers = array( $columns, $hidden, $sortable, $primary ); return $this->_column_headers; @@ -970,13 +1061,12 @@ protected function get_column_info() { * Return number of visible columns * * @since 3.1.0 - * @access public * * @return int */ public function get_column_count() { list ( $columns, $hidden ) = $this->get_column_info(); - $hidden = array_intersect( array_keys( $columns ), array_filter( $hidden ) ); + $hidden = array_intersect( array_keys( $columns ), array_filter( $hidden ) ); return count( $columns ) - count( $hidden ); } @@ -984,7 +1074,6 @@ public function get_column_count() { * Print column headers, accounting for hidden and sortable columns. * * @since 3.1.0 - * @access public * * @staticvar int $cb_counter * @@ -996,19 +1085,21 @@ public function print_column_headers( $with_id = true ) { $current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ); $current_url = remove_query_arg( 'paged', $current_url ); - if ( isset( $_GET['orderby'] ) ) + if ( isset( $_GET['orderby'] ) ) { $current_orderby = $_GET['orderby']; - else + } else { $current_orderby = ''; + } - if ( isset( $_GET['order'] ) && 'desc' == $_GET['order'] ) + if ( isset( $_GET['order'] ) && 'desc' === $_GET['order'] ) { $current_order = 'desc'; - else + } else { $current_order = 'asc'; + } if ( ! empty( $columns['cb'] ) ) { static $cb_counter = 1; - $columns['cb'] = '' + $columns['cb'] = '' . ''; $cb_counter++; } @@ -1020,24 +1111,25 @@ public function print_column_headers( $with_id = true ) { $class[] = 'hidden'; } - if ( 'cb' == $column_key ) + if ( 'cb' === $column_key ) { $class[] = 'check-column'; - elseif ( in_array( $column_key, array( 'posts', 'comments', 'links' ) ) ) + } elseif ( in_array( $column_key, array( 'posts', 'comments', 'links' ) ) ) { $class[] = 'num'; + } if ( $column_key === $primary ) { $class[] = 'column-primary'; } - if ( isset( $sortable[$column_key] ) ) { - list( $orderby, $desc_first ) = $sortable[$column_key]; + if ( isset( $sortable[ $column_key ] ) ) { + list( $orderby, $desc_first ) = $sortable[ $column_key ]; - if ( $current_orderby == $orderby ) { - $order = 'asc' == $current_order ? 'desc' : 'asc'; + if ( $current_orderby === $orderby ) { + $order = 'asc' === $current_order ? 'desc' : 'asc'; $class[] = 'sorted'; $class[] = $current_order; } else { - $order = $desc_first ? 'desc' : 'asc'; + $order = $desc_first ? 'desc' : 'asc'; $class[] = 'sortable'; $class[] = $desc_first ? 'asc' : 'desc'; } @@ -1045,12 +1137,13 @@ public function print_column_headers( $with_id = true ) { $column_display_name = '' . $column_display_name . ''; } - $tag = ( 'cb' === $column_key ) ? 'td' : 'th'; + $tag = ( 'cb' === $column_key ) ? 'td' : 'th'; $scope = ( 'th' === $tag ) ? 'scope="col"' : ''; - $id = $with_id ? "id='$column_key'" : ''; + $id = $with_id ? "id='$column_key'" : ''; - if ( !empty( $class ) ) + if ( ! empty( $class ) ) { $class = "class='" . join( ' ', $class ) . "'"; + } echo "<$tag $scope $id $class>$column_display_name"; } @@ -1060,13 +1153,14 @@ public function print_column_headers( $with_id = true ) { * Display the table * * @since 3.1.0 - * @access public */ public function display() { $singular = $this->_args['singular']; $this->display_tablenav( 'top' ); -?> + + $this->screen->render_screen_reader_content( 'heading_list' ); + ?> @@ -1074,10 +1168,13 @@ public function display() { - > + } + ?> + > display_rows_or_placeholder(); ?> @@ -1088,15 +1185,14 @@ public function display() {
-display_tablenav( 'bottom' ); } /** - * Get a list of CSS classes for the list table table tag. + * Get a list of CSS classes for the clone_WP_List_Table table tag. * * @since 3.1.0 - * @access protected * * @return array List of CSS classes for the table tag. */ @@ -1108,33 +1204,34 @@ protected function get_table_classes() { * Generate the table navigation above or below the table * * @since 3.1.0 - * @access protected * @param string $which */ protected function display_tablenav( $which ) { - if ( 'top' == $which ) + if ( 'top' === $which ) { wp_nonce_field( 'bulk-' . $this->_args['plural'] ); -?> + } + ?>
+ has_items() ) : ?>
bulk_actions( $which ); ?>
-extra_tablenav( $which ); $this->pagination( $which ); -?> + ?>
-has_items() ) { @@ -1160,18 +1256,17 @@ public function display_rows_or_placeholder() { * Generate the table rows * * @since 3.1.0 - * @access public */ public function display_rows() { - foreach ( $this->items as $item ) + foreach ( $this->items as $item ) { $this->single_row( $item ); + } } /** * Generates content for a single row of the table * * @since 3.1.0 - * @access public * * @param object $item The current item */ @@ -1182,14 +1277,12 @@ public function single_row( $item ) { } /** - * * @param object $item * @param string $column_name */ protected function column_default( $item, $column_name ) {} /** - * * @param object $item */ protected function column_cb( $item ) {} @@ -1198,7 +1291,6 @@ protected function column_cb( $item ) {} * Generates the columns for a single row of the table * * @since 3.1.0 - * @access protected * * @param object $item The current item */ @@ -1221,7 +1313,7 @@ protected function single_row_columns( $item ) { $attributes = "class='$classes' $data"; - if ( 'cb' == $column_name ) { + if ( 'cb' === $column_name ) { echo ''; echo $this->column_cb( $item ); echo ''; @@ -1237,12 +1329,12 @@ protected function single_row_columns( $item ) { echo ""; echo call_user_func( array( $this, 'column_' . $column_name ), $item ); echo $this->handle_row_actions( $item, $column_name, $primary ); - echo ""; + echo ''; } else { echo ""; echo $this->column_default( $item, $column_name ); echo $this->handle_row_actions( $item, $column_name, $primary ); - echo ""; + echo ''; } } } @@ -1251,22 +1343,20 @@ protected function single_row_columns( $item ) { * Generates and display row actions links for the list table. * * @since 4.3.0 - * @access protected * * @param object $item The item being acted upon. * @param string $column_name Current column name. * @param string $primary Primary column name. - * @return string The row actions output. In this case, an empty string. + * @return string The row actions HTML, or an empty string if the current column is the primary column. */ protected function handle_row_actions( $item, $column_name, $primary ) { - return ''; - } + return $column_name === $primary ? '' : ''; + } /** * Handle an incoming ajax request (called from admin-ajax.php) * * @since 3.1.0 - * @access public */ public function ajax_response() { $this->prepare_items(); @@ -1289,7 +1379,7 @@ public function ajax_response() { ); } if ( isset( $this->_pagination_args['total_pages'] ) ) { - $response['total_pages'] = $this->_pagination_args['total_pages']; + $response['total_pages'] = $this->_pagination_args['total_pages']; $response['total_pages_i18n'] = number_format_i18n( $this->_pagination_args['total_pages'] ); } @@ -1298,8 +1388,6 @@ public function ajax_response() { /** * Send required variables to JavaScript land - * - * @access public */ public function _js_vars() { $args = array( @@ -1307,7 +1395,7 @@ public function _js_vars() { 'screen' => array( 'id' => $this->screen->id, 'base' => $this->screen->base, - ) + ), ); printf( "\n", wp_json_encode( $args ) ); diff --git a/less/lroundups-admin.less b/less/lroundups-admin.less index 7633c35..abb13d9 100644 --- a/less/lroundups-admin.less +++ b/less/lroundups-admin.less @@ -4,8 +4,6 @@ Create MailChimp Campaign Button #link-roundups-publish-actions { text-align: center; border-bottom: 1px solid #ccc; - margin-bottom: 10px; - padding-bottom: 10px; input[type="submit"] { display: inline-block; margin: 10px auto; @@ -23,18 +21,23 @@ Recent Roundups Editor Styles ========================================================================== */ #link_roundups_roundup { .inside { - min-height: 250px; } .pagination { margin: 10px 0; &:last-child { - padding-bottom: 15px; + padding-bottom: 15px; } } #filter_links { - margin: 10px 0; + margin: 0 10px 0; } } +button.button.append-saved-links { + margin: 0 10px 0 0; +} +.tablenav .actions select[name="link_date"] { + float: none; +} div.display-saved-links { div.pagination { diff --git a/less/lroundups.less b/less/lroundups.less index 6bc7ecb..8c389b6 100644 --- a/less/lroundups.less +++ b/less/lroundups.less @@ -80,9 +80,3 @@ Saved Links Widget border-top: 1px solid #e1e1e1 } } -button.button.append-saved-links { - margin: 10px 10px 10px 0; -} -.tablenav .actions select[name="link_date"] { - float: none; -} diff --git a/link-roundups.php b/link-roundups.php index bbf4387..790d541 100644 --- a/link-roundups.php +++ b/link-roundups.php @@ -3,10 +3,11 @@ Plugin Name: Link Roundups Plugin URI: https://github.com/INN/link-roundups Description: Use Link Roundups to aggregate links and create roundup posts. Mailchimp API integration and browser bookmark tool. Formerly argo-links from NPR's Project Argo. -Author: INN, Project Argo, Mission Data -Version: 0.5 -Author URI: http://nerds.inn.org/ +Author: INN Labs +Author URI: http://labs.inn.org/ +Version: 1.0 License: GPLv2 +Text Domain: link-roundups Seeking Link Roundups Post Type functions? They use lroundups instead of link-roundups. */ @@ -23,8 +24,16 @@ function activate_link_roundups() { /** * Mailchimp API and Modal Functions */ -if ( ! class_exists( 'MailChimp' ) && file_exists( __DIR__ . '/wordpress-mailchimp-tools/vendor/autoload.php' ) ) { - require_once __DIR__ . '/wordpress-mailchimp-tools/vendor/autoload.php'; +if ( ! class_exists( 'MailChimp' ) && file_exists( __DIR__ . '/vendor/autoload.php' ) ) { + require_once __DIR__ . '/vendor/autoload.php'; +} else { + error_log( + sprintf( + // translators: %1$s is a URL. + __('Your installation of the Link Roundups Plugin is missing its vendor dependencies. Please visit %1$s for more information.', 'link-roundups'), + 'https://github.com/INN/link-roundups/blob/136-update-wordpress-mailchimp-tools/docs/installation.md' + ) + ); } /** diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..81e717a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1669 @@ +{ + "name": "link-roundups", + "version": "1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=" + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=" + }, + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=" + }, + "argparse": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", + "requires": { + "underscore": "~1.7.0", + "underscore.string": "~2.4.0" + }, + "dependencies": { + "underscore.string": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=" + } + } + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "asn1": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=" + }, + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=" + }, + "async": { + "version": "0.1.22", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", + "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=" + }, + "aws-sign2": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", + "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=" + }, + "boom": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", + "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=", + "requires": { + "hoek": "0.9.x" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "requires": { + "pako": "~0.2.0" + } + }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha1-TLiDLSNhJYmwQG6eKVbBfwb99TE=" + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "requires": { + "ansi-styles": "^1.1.0", + "escape-string-regexp": "^1.0.0", + "has-ansi": "^0.1.0", + "strip-ansi": "^0.3.0", + "supports-color": "^0.2.0" + } + }, + "clean-css": { + "version": "3.4.28", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", + "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", + "requires": { + "commander": "2.8.x", + "source-map": "0.4.x" + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "coffee-script": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", + "integrity": "sha1-FQ1rTLUiiUNp7+1qIQHCC8f0pPQ=" + }, + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=" + }, + "combined-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", + "requires": { + "delayed-stream": "0.0.5" + } + }, + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cryptiles": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", + "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", + "requires": { + "boom": "0.4.x" + } + }, + "ctype": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", + "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, + "dateformat": { + "version": "1.0.2-1.2.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", + "integrity": "sha1-sCIMAt6YYXQztyhRz0fePfLNvuk=" + }, + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=" + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "deep-equal": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.0.0.tgz", + "integrity": "sha1-mWedO70EcVb81FDT0B7rkGhpHoM=" + }, + "defined": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", + "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=" + }, + "delayed-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=" + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" + }, + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=" + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "faye-websocket": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.4.4.tgz", + "integrity": "sha1-wUxbO/FNdBf/v9mQwKdJXNnzN7w=" + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "findup-sync": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", + "integrity": "sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=", + "requires": { + "glob": "~3.2.9", + "lodash": "~2.4.1" + }, + "dependencies": { + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "requires": { + "inherits": "2", + "minimatch": "0.3" + } + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "forever-agent": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=" + }, + "form-data": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", + "integrity": "sha1-kavXiKupcCsaq/qLwBAxoqyeOxI=", + "requires": { + "async": "~0.9.0", + "combined-stream": "~0.0.4", + "mime": "~1.2.11" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + } + } + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "requires": { + "globule": "~0.1.0" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "getobject": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=" + }, + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "requires": { + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" + }, + "dependencies": { + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=" + } + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "requires": { + "glob": "~3.1.21", + "lodash": "~1.0.1", + "minimatch": "~0.2.11" + }, + "dependencies": { + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=" + } + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "grunt": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", + "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=", + "dev": true, + "requires": { + "async": "~0.1.22", + "coffee-script": "~1.3.3", + "colors": "~0.6.2", + "dateformat": "1.0.2-1.2.3", + "eventemitter2": "~0.4.13", + "exit": "~0.1.1", + "findup-sync": "~0.1.2", + "getobject": "~0.1.0", + "glob": "~3.1.21", + "grunt-legacy-log": "~0.1.0", + "grunt-legacy-util": "~0.2.0", + "hooker": "~0.2.3", + "iconv-lite": "~0.2.11", + "js-yaml": "~2.0.5", + "lodash": "~0.9.2", + "minimatch": "~0.2.12", + "nopt": "~1.0.10", + "rimraf": "~2.2.8", + "underscore.string": "~2.2.1", + "which": "~1.0.5" + } + }, + "grunt-contrib-cssmin": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-0.11.0.tgz", + "integrity": "sha1-CwiI3p2FScPYRKf8eaJ5tCdqe8c=", + "dev": true, + "requires": { + "chalk": "^0.5.1", + "clean-css": "^3.0.1", + "maxmin": "^1.0.0" + } + }, + "grunt-contrib-less": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-less/-/grunt-contrib-less-0.12.0.tgz", + "integrity": "sha1-7mpBtflLvpa18NhrFuBhwRS5VL4=", + "dev": true, + "requires": { + "async": "^0.2.10", + "chalk": "^0.5.1", + "less": "^1.7.2", + "lodash": "^2.4.1", + "maxmin": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true + }, + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + }, + "gzip-size": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-0.1.1.tgz", + "integrity": "sha1-rjNIO2/IIk6DQilt4Qjvk3V/duA=", + "dev": true, + "requires": { + "concat-stream": "^1.4.1", + "zlib-browserify": "^0.0.3" + } + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + }, + "maxmin": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-0.1.0.tgz", + "integrity": "sha1-ldgcUonjqdMPf8fcVZwCTlAwydA=", + "dev": true, + "requires": { + "chalk": "^0.4.0", + "gzip-size": "^0.1.0", + "pretty-bytes": "^0.1.0" + }, + "dependencies": { + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", + "dev": true, + "requires": { + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" + } + } + } + }, + "pretty-bytes": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-0.1.2.tgz", + "integrity": "sha1-zZApTVihyk6KXQ+5yCJZmIgazwA=", + "dev": true + }, + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true + } + } + }, + "grunt-contrib-uglify": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-0.9.2.tgz", + "integrity": "sha1-GmHG8hJBDkq7T3yJFTcXsQFWAmA=", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "lodash": "^3.2.0", + "maxmin": "^1.0.0", + "uglify-js": "^2.4.24", + "uri-path": "0.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "grunt-contrib-watch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-0.6.1.tgz", + "integrity": "sha1-ZP3LolpjX1tNobbOb5DaCutuPxU=", + "dev": true, + "requires": { + "async": "~0.2.9", + "gaze": "~0.5.1", + "lodash": "~2.4.1", + "tiny-lr-fork": "0.0.5" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + } + } + }, + "grunt-legacy-log": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", + "integrity": "sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE=", + "requires": { + "colors": "~0.6.2", + "grunt-legacy-log-utils": "~0.1.1", + "hooker": "~0.2.3", + "lodash": "~2.4.1", + "underscore.string": "~2.3.3" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" + }, + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=" + } + } + }, + "grunt-legacy-log-utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", + "integrity": "sha1-wHBrndkGThFvNvI/5OawSGcsD34=", + "requires": { + "colors": "~0.6.2", + "lodash": "~2.4.1", + "underscore.string": "~2.3.3" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" + }, + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=" + } + } + }, + "grunt-legacy-util": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", + "integrity": "sha1-kzJIhNv343qf98Am3/RR2UqeVUs=", + "requires": { + "async": "~0.1.22", + "exit": "~0.1.1", + "getobject": "~0.1.0", + "hooker": "~0.2.3", + "lodash": "~0.9.2", + "underscore.string": "~2.2.1", + "which": "~1.0.5" + } + }, + "grunt-po2mo": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/grunt-po2mo/-/grunt-po2mo-0.1.2.tgz", + "integrity": "sha1-kI9zwcAAhjhazIPAdA7jYO9SdBs=", + "dev": true, + "requires": { + "sync-exec": "^0.4.0" + } + }, + "grunt-pot": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/grunt-pot/-/grunt-pot-0.2.1.tgz", + "integrity": "sha1-eCFIGpkTxY11K22N9XV7ZRz6Ous=", + "dev": true + }, + "grunt-shell": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-shell/-/grunt-shell-2.1.0.tgz", + "integrity": "sha1-Q595FZ7RHmSmUaacyKPQK+v17MI=", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "npm-run-path": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "gzip-size": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz", + "integrity": "sha1-Zs+LEBBHInuVus5uodoMF37Vwi8=", + "requires": { + "browserify-zlib": "^0.1.4", + "concat-stream": "^1.4.1" + } + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "requires": { + "ansi-regex": "^0.2.0" + } + }, + "has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=" + }, + "hawk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", + "integrity": "sha1-h81JH5tG5OKurKM1QWdmiF0tHtk=", + "requires": { + "boom": "0.4.x", + "cryptiles": "0.2.x", + "hoek": "0.9.x", + "sntp": "0.2.x" + } + }, + "hoek": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=" + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=" + }, + "hosted-git-info": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha1-IyNbKasjDFdqqw1PE/wEawsDgiI=" + }, + "http-signature": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", + "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", + "requires": { + "asn1": "0.1.11", + "assert-plus": "^0.1.5", + "ctype": "0.5.3" + } + }, + "iconv-lite": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", + "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "^2.0.0" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "js-yaml": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", + "integrity": "sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g=", + "requires": { + "argparse": "~ 0.1.11", + "esprima": "~ 1.0.2" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "less": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/less/-/less-1.7.5.tgz", + "integrity": "sha1-TyIM9yiKJ+rKc5325ICKLUwNV1Y=", + "requires": { + "clean-css": "2.2.x", + "graceful-fs": "~3.0.2", + "mime": "~1.2.11", + "mkdirp": "~0.5.0", + "request": "~2.40.0", + "source-map": "0.1.x" + }, + "dependencies": { + "clean-css": { + "version": "2.2.23", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-2.2.23.tgz", + "integrity": "sha1-BZC1R4tRbEkD7cLYm9P9vdKGMow=", + "optional": true, + "requires": { + "commander": "2.2.x" + } + }, + "commander": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.2.0.tgz", + "integrity": "sha1-F1rUuTF/P/YV8gHB5XIk9Vo+kd8=", + "optional": true + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "optional": true, + "requires": { + "natives": "^1.1.0" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "load-grunt-tasks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-1.0.0.tgz", + "integrity": "sha1-NKxnBIWb1q4by9fjwh96D8bqx9c=", + "dev": true, + "requires": { + "findup-sync": "^0.1.2", + "multimatch": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + } + } + }, + "lodash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", + "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=" + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "maxmin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz", + "integrity": "sha1-cTZehKmd2Piz99X94vANHn9zvmE=", + "requires": { + "chalk": "^1.0.0", + "figures": "^1.0.1", + "gzip-size": "^1.0.0", + "pretty-bytes": "^1.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=" + }, + "mime-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", + "integrity": "sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4=" + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "multimatch": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-1.0.1.tgz", + "integrity": "sha1-GFR8/iWNAf0zJDWVONv68QRqfI8=", + "requires": { + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "minimatch": "^1.0.0" + }, + "dependencies": { + "minimatch": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", + "integrity": "sha1-4N0hILSeG3JM6NcUxSCCKpQ4V20=", + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "natives": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.4.tgz", + "integrity": "sha1-Lw8iT8mn3VNAfHZnyEz42+dz3lg=" + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "requires": { + "abbrev": "1" + } + }, + "noptify": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/noptify/-/noptify-0.0.3.tgz", + "integrity": "sha1-WPZUpz2XU98MUdlobckhBKZ/S7s=", + "requires": { + "nopt": "~2.0.0" + }, + "dependencies": { + "nopt": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.0.0.tgz", + "integrity": "sha1-ynQW8gpeP5w7hhgPlilfo9C1Lg0=", + "requires": { + "abbrev": "1" + } + } + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", + "integrity": "sha1-y1QPk7srIqfVlBaRoojWDo6pOG4=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + } + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pretty-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.1.0" + } + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-1.0.2.tgz", + "integrity": "sha1-UKk+K1r2aRwxvOpdrnjubqGQN2g=" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.40.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.40.0.tgz", + "integrity": "sha1-TdZw9pbx5uhC5mtLXoOTAaub62c=", + "requires": { + "aws-sign2": "~0.5.0", + "forever-agent": "~0.5.0", + "form-data": "~0.1.0", + "hawk": "1.1.1", + "http-signature": "~0.10.0", + "json-stringify-safe": "~5.0.0", + "mime-types": "~1.0.1", + "node-uuid": "~1.4.0", + "oauth-sign": "~0.3.0", + "qs": "~1.0.0", + "stringstream": "~0.0.4", + "tough-cookie": ">=0.12.0", + "tunnel-agent": "~0.4.0" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha1-3Eu8emyp2Rbe5dQ1FvAJK1j3uKs=" + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "sntp": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", + "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", + "requires": { + "hoek": "0.9.x" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha1-BaW01xU6GVvJLDxCW2nzsqlSTII=", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha1-LHrmEFbHFKW5ubKyr30xHvXHj+k=" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha1-enzShHDMbToc/m1miG9rxDDTrIc=" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringstream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha1-eIAiWw1K0Q4wkn0Weh1vL9OzOnI=" + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "requires": { + "ansi-regex": "^0.2.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + } + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=" + }, + "sync-exec": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/sync-exec/-/sync-exec-0.4.0.tgz", + "integrity": "sha1-N1guegT684zW5T6iBEW5n5kvaTM=" + }, + "tape": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/tape/-/tape-0.2.2.tgz", + "integrity": "sha1-ZMz6S37PSgBgAH5hcW1CR4FnFjc=", + "requires": { + "deep-equal": "~0.0.0", + "defined": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "tiny-lr-fork": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/tiny-lr-fork/-/tiny-lr-fork-0.0.5.tgz", + "integrity": "sha1-Hpnh4qhGm3NquX2X7vqYxx927Qo=", + "requires": { + "debug": "~0.7.0", + "faye-websocket": "~0.4.3", + "noptify": "~0.0.3", + "qs": "~0.5.2" + }, + "dependencies": { + "qs": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz", + "integrity": "sha1-MbGtBYVnZRxSaSFQa5qHk5EaA4Q=" + } + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha1-7GDO44rGdQY//JelwYlwV47oNlU=", + "requires": { + "punycode": "^1.4.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + }, + "underscore.string": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", + "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=" + }, + "uri-path": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-0.0.2.tgz", + "integrity": "sha1-gD6wHy/rF5J9zOD2GH5yt19T9VQ=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha1-gWQ7y+8b3+zUYjeT3EZIlIupgzg=", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", + "integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=" + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + } + } + }, + "zlib-browserify": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/zlib-browserify/-/zlib-browserify-0.0.3.tgz", + "integrity": "sha1-JAzNv9AgP6hCsTDe77FBQSLIzFA=", + "requires": { + "tape": "~0.2.2" + } + } + } +} diff --git a/package.json b/package.json index d88dbc1..eeee60f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,11 @@ { "name": "link-roundups", - "version": "0.5", + "description": "A WordPress plugin for managing saved links.", + "repository": { + "type": "git", + "url": "https://github.com/INN/link-roundups/" + }, + "version": "1.0", "devDependencies": { "grunt": "~0.4.5", "grunt-contrib-less": "~0.12.0", diff --git a/release.sh b/release.sh index f1f618e..589934f 100755 --- a/release.sh +++ b/release.sh @@ -1,4 +1,9 @@ #!/usr/bin/env bash +# +# This file is a WordPress.org plugin release script. +# For more about how it works, see the documentation at +# https://github.com/INN/docs/blob/master/projects/wordpress-plugins/release.sh.md +# RELEASE_DIR=release; SVN_PATH=$RELEASE_DIR/svn; SVN_REPO="https://plugins.svn.wordpress.org/link-roundups/"; @@ -16,6 +21,7 @@ Gruntfile.js release/\* tests/\* node_modules/\* +./\*\*/.\* ); function ensure_release_dir() { @@ -278,6 +284,9 @@ function help_text() { echo ""; echo "--help: Display this help screen and exit."; echo ""; + echo "For more information about this script, see: + https://github.com/INN/docs/blob/master/projects/wordpress-plugins/release.sh.md"; + echo ""; exit 0; } diff --git a/vendor/.gitkeep b/vendor/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/wordpress-mailchimp-tools b/wordpress-mailchimp-tools deleted file mode 160000 index 12225e5..0000000 --- a/wordpress-mailchimp-tools +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 12225e55f2bbe7fff3baf2d93d4c1b5b83c0f316