Restructure theme, use autoloader
This commit is contained in:
15
app/admin.php
Normal file
15
app/admin.php
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?php namespace App;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add postMessage support
|
||||||
|
*/
|
||||||
|
add_action('customize_register', function (\WP_Customize_Manager $wp_customize) {
|
||||||
|
$wp_customize->get_setting('blogname')->transport = 'postMessage';
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Customizer JS
|
||||||
|
*/
|
||||||
|
add_action('customize_preview_init', function () {
|
||||||
|
wp_enqueue_script('sage/customizer', asset_path('scripts/customizer.js'), ['customize-preview'], null, true);
|
||||||
|
});
|
||||||
55
app/filters.php
Normal file
55
app/filters.php
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
<?php namespace App;
|
||||||
|
|
||||||
|
use Roots\Sage\Template;
|
||||||
|
use Roots\Sage\Template\Wrapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine which pages should NOT display the sidebar
|
||||||
|
* @link https://codex.wordpress.org/Conditional_Tags
|
||||||
|
*/
|
||||||
|
add_filter('sage/display_sidebar', function ($display) {
|
||||||
|
/** The sidebar will NOT be displayed if ANY of the following return true. */
|
||||||
|
return $display ? !in_array(true, [
|
||||||
|
is_404(),
|
||||||
|
is_front_page(),
|
||||||
|
is_page_template('template-custom.php'),
|
||||||
|
]) : $display;
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add <body> classes
|
||||||
|
*/
|
||||||
|
add_filter('body_class', function (array $classes) {
|
||||||
|
// Add page slug if it doesn't exist
|
||||||
|
if (is_single() || is_page() && !is_front_page()) {
|
||||||
|
if (!in_array(basename(get_permalink()), $classes)) {
|
||||||
|
$classes[] = basename(get_permalink());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add class if sidebar is active
|
||||||
|
if (display_sidebar()) {
|
||||||
|
$classes[] = 'sidebar-primary';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $classes;
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clean up the_excerpt()
|
||||||
|
*/
|
||||||
|
add_filter('excerpt_more', function () {
|
||||||
|
return ' … <a href="' . get_permalink() . '">' . __('Continued', 'sage') . '</a>';
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use Wrapper by default
|
||||||
|
*/
|
||||||
|
add_filter('template_include', function ($main) {
|
||||||
|
if (!is_string($main) || !(string) $main) {
|
||||||
|
return $main;
|
||||||
|
}
|
||||||
|
$main = basename($main, '.php');
|
||||||
|
return Template::wrap(new Wrapper($main, 'layouts/base.php'))->locate();
|
||||||
|
}, 109);
|
||||||
77
app/helpers.php
Normal file
77
app/helpers.php
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
<?php namespace App;
|
||||||
|
|
||||||
|
use Roots\Sage\Asset;
|
||||||
|
use Roots\Sage\Assets\JsonManifest;
|
||||||
|
use Roots\Sage\Template;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $slug
|
||||||
|
* @param array $context
|
||||||
|
*/
|
||||||
|
function template_unwrap($slug = '', $context = []) {
|
||||||
|
if ($file = Template::unwrap($slug, $context)->locate()) {
|
||||||
|
/** @noinspection PhpIncludeInspection */
|
||||||
|
include $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $context
|
||||||
|
*/
|
||||||
|
function template_sidebar($context = []) {
|
||||||
|
template_part('sidebar', $context);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $template
|
||||||
|
* @param array $context
|
||||||
|
*/
|
||||||
|
function template_part($template, $context = []) {
|
||||||
|
if ($file = (new Template($template, $context))->locate()) {
|
||||||
|
/** @noinspection PhpIncludeInspection */
|
||||||
|
include $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $filename
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function asset_path($filename) {
|
||||||
|
static $manifest;
|
||||||
|
isset($manifest) || $manifest = new JsonManifest(get_template_directory() . '/' . Asset::$dist . '/assets.json');
|
||||||
|
return (string) new Asset($filename, $manifest);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether to show the sidebar
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function display_sidebar() {
|
||||||
|
static $display;
|
||||||
|
isset($display) || $display = apply_filters('sage/display_sidebar', true);
|
||||||
|
return $display;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Page titles
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function title() {
|
||||||
|
if (is_home()) {
|
||||||
|
if ($home = get_option('page_for_posts', true)) {
|
||||||
|
return get_the_title($home);
|
||||||
|
}
|
||||||
|
return __('Latest Posts', 'sage');
|
||||||
|
}
|
||||||
|
if (is_archive()) {
|
||||||
|
return get_the_archive_title();
|
||||||
|
}
|
||||||
|
if (is_search()) {
|
||||||
|
return sprintf(__('Search Results for %s', 'sage'), get_search_query());
|
||||||
|
}
|
||||||
|
if (is_404()) {
|
||||||
|
return __('Not Found', 'sage');
|
||||||
|
}
|
||||||
|
return get_the_title();
|
||||||
|
}
|
||||||
35
app/lib/Sage/Asset.php
Normal file
35
app/lib/Sage/Asset.php
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<?php namespace Roots\Sage;
|
||||||
|
|
||||||
|
use Roots\Sage\Assets\IManifest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Template
|
||||||
|
* @package Roots\Sage
|
||||||
|
* @author QWp6t
|
||||||
|
*/
|
||||||
|
class Asset {
|
||||||
|
|
||||||
|
public static $dist = '/dist';
|
||||||
|
|
||||||
|
/** @var IManifest Currently used manifest */
|
||||||
|
protected $manifest;
|
||||||
|
|
||||||
|
protected $asset;
|
||||||
|
|
||||||
|
protected $dir;
|
||||||
|
|
||||||
|
public function __construct($file, IManifest $manifest = null) {
|
||||||
|
$this->manifest = $manifest;
|
||||||
|
$this->asset = basename($file);
|
||||||
|
$this->dir = dirname($file) != '.' ? dirname($file) : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __toString() {
|
||||||
|
return $this->getUri();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUri() {
|
||||||
|
$file = self::$dist . '/' . $this->dir . '/' . ($this->manifest ? $this->manifest->get($this->asset) : $this->asset);
|
||||||
|
return get_template_directory_uri() . $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
26
app/lib/Sage/Assets/IManifest.php
Normal file
26
app/lib/Sage/Assets/IManifest.php
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?php namespace Roots\Sage\Assets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface IManifest
|
||||||
|
* @package Roots\Sage
|
||||||
|
* @author QWp6t
|
||||||
|
*/
|
||||||
|
interface IManifest {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the cache-busted filename
|
||||||
|
*
|
||||||
|
* If the manifest does not have an entry for $file, then return $file
|
||||||
|
*
|
||||||
|
* @param string $file The original name of the file before cache-busting
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function get($file);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the asset manifest
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getAll();
|
||||||
|
}
|
||||||
29
app/lib/Sage/Assets/JsonManifest.php
Normal file
29
app/lib/Sage/Assets/JsonManifest.php
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<?php namespace Roots\Sage\Assets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class JsonManifest
|
||||||
|
* @package Roots\Sage
|
||||||
|
* @author QWp6t
|
||||||
|
*/
|
||||||
|
class JsonManifest implements IManifest {
|
||||||
|
/** @var array */
|
||||||
|
protected $manifest = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JsonManifest constructor
|
||||||
|
* @param string $manifestPath Local filesystem path to JSON-encoded manifest
|
||||||
|
*/
|
||||||
|
public function __construct($manifestPath) {
|
||||||
|
$this->manifest = file_exists($manifestPath) ? json_decode(file_get_contents($manifestPath), true) : [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @inheritdoc */
|
||||||
|
public function get($file) {
|
||||||
|
return isset($this->manifest[$file]) ? $this->manifest[$file] : $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @inheritdoc */
|
||||||
|
public function getAll() {
|
||||||
|
return $this->manifest;
|
||||||
|
}
|
||||||
|
}
|
||||||
151
app/lib/Sage/Template.php
Normal file
151
app/lib/Sage/Template.php
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
<?php namespace Roots\Sage;
|
||||||
|
|
||||||
|
use Roots\Sage\Template\IWrapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Template
|
||||||
|
* @package Roots\Sage
|
||||||
|
* @author QWp6t
|
||||||
|
*/
|
||||||
|
class Template {
|
||||||
|
protected static $root = 'templates/';
|
||||||
|
|
||||||
|
/** @var IWrapper[] */
|
||||||
|
protected static $wrappers = [];
|
||||||
|
|
||||||
|
protected $templates = [];
|
||||||
|
|
||||||
|
protected $context = [];
|
||||||
|
|
||||||
|
protected $html = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param IWrapper $wrapper
|
||||||
|
* @param array $context Variables to pass to wrapper
|
||||||
|
* @return static Template instance of wrapper
|
||||||
|
*/
|
||||||
|
public static function wrap(IWrapper $wrapper, $context = []) {
|
||||||
|
self::$wrappers[$wrapper->getSlug()] = $wrapper;
|
||||||
|
return new static($wrapper->getWrappers(), $context);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $slug
|
||||||
|
* @param array $context
|
||||||
|
* @return static
|
||||||
|
*/
|
||||||
|
public static function unwrap($slug = '', $context = []) {
|
||||||
|
if (!$slug) {
|
||||||
|
// If no slug is specified, we grab the most recently wrapped item
|
||||||
|
end(self::$wrappers);
|
||||||
|
$slug = key(self::$wrappers);
|
||||||
|
}
|
||||||
|
return new static(self::$wrappers[$slug]->getTemplate(), $context);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a delimeted template file into an array of parts
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* Template::getConvertedTemplateParts('content-single-audio.php');
|
||||||
|
* => ['content-single-audio.php', 'content-single.php', 'content.php']
|
||||||
|
*
|
||||||
|
* The returned value can then be passed to WordPress's locate_template.
|
||||||
|
*
|
||||||
|
* @param string $template
|
||||||
|
* @param string $delimeter
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function convertParts($template, $delimeter = '-') {
|
||||||
|
$templateParts = explode($delimeter, str_replace('.php', '', (string) $template));
|
||||||
|
$templates[] = array_shift($templateParts);
|
||||||
|
foreach ($templateParts as $i => $templatePart) {
|
||||||
|
$templates[] = $templates[$i] . $delimeter . $templatePart;
|
||||||
|
}
|
||||||
|
return array_reverse($templates);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Template constructor
|
||||||
|
* @param string|string[] $template
|
||||||
|
* @param array $context
|
||||||
|
*/
|
||||||
|
public function __construct($template, array $context = []) {
|
||||||
|
$this->set($template);
|
||||||
|
$this->context = $context;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string HTML
|
||||||
|
* @see get
|
||||||
|
*/
|
||||||
|
public function __toString() {
|
||||||
|
return $this->get();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Echoes the output HTML
|
||||||
|
* @see get
|
||||||
|
*/
|
||||||
|
public function render() {
|
||||||
|
echo $this->get();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string HTML
|
||||||
|
* @SuppressWarnings(PHPMD.UnusedLocalVariable)
|
||||||
|
*/
|
||||||
|
public function get() {
|
||||||
|
/** @noinspection PhpUnusedLocalVariableInspection $context is passed to the included template */
|
||||||
|
$context = $this->context;
|
||||||
|
extract($this->context);
|
||||||
|
ob_start();
|
||||||
|
if ($template = $this->locate()) {
|
||||||
|
/** @noinspection PhpIncludeInspection */
|
||||||
|
include $template;
|
||||||
|
}
|
||||||
|
$this->html = ob_get_clean() ?: '';
|
||||||
|
return $this->html;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string[]|string $template
|
||||||
|
*/
|
||||||
|
public function set($template) {
|
||||||
|
if (is_array($template)) {
|
||||||
|
$this->templates = self::format($template);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!is_string($template) || !(string) $template) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// At this point, we assume it's something like `content-single.php` or `content-single-audio.php`
|
||||||
|
$this->templates = self::format(self::convertParts($template));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensures that each template in $this->templates is appended with `.php`
|
||||||
|
* @param $templates
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected static function format($templates) {
|
||||||
|
return array_map(function ($template) {
|
||||||
|
if (substr($template, -4, 4) === '.php') {
|
||||||
|
return $template;
|
||||||
|
}
|
||||||
|
return $template . '.php';
|
||||||
|
}, $templates);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $templateDir Specify a template directory relative to your theme directory; e.g., `templates/`, `templates/partials/`, `woocommerce/`
|
||||||
|
* @return string Filename
|
||||||
|
*/
|
||||||
|
public function locate($templateDir = '') {
|
||||||
|
$templates = array_map(function ($template) use ($templateDir) {
|
||||||
|
return ($templateDir ?: self::$root) . $template;
|
||||||
|
}, $this->templates);
|
||||||
|
$template = locate_template($templates);
|
||||||
|
return apply_filters('sage/locate_template', $template, $templates) ?: $template;
|
||||||
|
}
|
||||||
|
}
|
||||||
27
app/lib/Sage/Template/IWrapper.php
Normal file
27
app/lib/Sage/Template/IWrapper.php
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<?php namespace Roots\Sage\Template;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface IWrapper
|
||||||
|
* @package Roots\Sage
|
||||||
|
* @author QWp6t
|
||||||
|
*/
|
||||||
|
interface IWrapper {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of potential wrappers
|
||||||
|
* Useful for passing to WordPress's locate_template()
|
||||||
|
*
|
||||||
|
* @return string[] List of wrappers; e.g., `base-page.php`, `base.php`
|
||||||
|
*/
|
||||||
|
public function getWrappers();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string Template file that is being wrapped; e.g., `page.php`, `single.php`, `singular.php`
|
||||||
|
*/
|
||||||
|
public function getTemplate();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string Slug of the Wrapper; e.g., `base`
|
||||||
|
*/
|
||||||
|
public function getSlug();
|
||||||
|
}
|
||||||
48
app/lib/Sage/Template/Wrapper.php
Normal file
48
app/lib/Sage/Template/Wrapper.php
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
<?php namespace Roots\Sage\Template;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface Wrapper
|
||||||
|
* @package Roots\Sage
|
||||||
|
* @author QWp6t
|
||||||
|
*/
|
||||||
|
class Wrapper implements IWrapper {
|
||||||
|
/** @var string Wrapper slug */
|
||||||
|
protected $slug;
|
||||||
|
|
||||||
|
/** @var string Template file that is being wrapped */
|
||||||
|
protected $template = '';
|
||||||
|
|
||||||
|
/** @var string[] Array of template wrappers; e.g., `base-singular.php`, `base-page.php`, `base.php` */
|
||||||
|
protected $wrappers = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper constructor
|
||||||
|
*
|
||||||
|
* @param string $templateSlug Template slug, typically from Template Heirarchy; e.g., `page`, `single`, `singular`
|
||||||
|
* @param string $base Wrapper's base template, this is what will wrap around $template
|
||||||
|
*/
|
||||||
|
public function __construct($templateSlug, $base = 'layouts/base.php') {
|
||||||
|
$this->slug = sanitize_title(basename($base, '.php'));
|
||||||
|
$this->wrappers = [$base];
|
||||||
|
$this->template = $templateSlug;
|
||||||
|
$str = substr($base, 0, -4);
|
||||||
|
array_unshift($this->wrappers, sprintf($str . '-%s.php', $templateSlug));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** {@inheritdoc} */
|
||||||
|
public function getWrappers() {
|
||||||
|
$this->wrappers = apply_filters('sage/wrap_' . $this->slug, $this->wrappers) ?: $this->wrappers;
|
||||||
|
return $this->wrappers;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** {@inheritdoc} */
|
||||||
|
public function getSlug() {
|
||||||
|
return $this->slug;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** {@inheritdoc} */
|
||||||
|
public function getTemplate()
|
||||||
|
{
|
||||||
|
return $this->template;
|
||||||
|
}
|
||||||
|
}
|
||||||
96
app/setup.php
Normal file
96
app/setup.php
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
<?php namespace App;
|
||||||
|
|
||||||
|
use Roots\Sage\Template;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Theme setup
|
||||||
|
*/
|
||||||
|
add_action('after_setup_theme', function () {
|
||||||
|
/**
|
||||||
|
* Enable features from Soil when plugin is activated
|
||||||
|
* @link https://roots.io/plugins/soil/
|
||||||
|
*/
|
||||||
|
add_theme_support('soil-clean-up');
|
||||||
|
add_theme_support('soil-jquery-cdn');
|
||||||
|
add_theme_support('soil-nav-walker');
|
||||||
|
add_theme_support('soil-nice-search');
|
||||||
|
add_theme_support('soil-relative-urls');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make theme available for translation
|
||||||
|
* @link https://github.com/roots/sage-translations Community translations
|
||||||
|
*/
|
||||||
|
load_theme_textdomain('sage', get_template_directory() . '/lang');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable plugins to manage the document title
|
||||||
|
* @link http://codex.wordpress.org/Function_Reference/add_theme_support#Title_Tag
|
||||||
|
*/
|
||||||
|
add_theme_support('title-tag');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register wp_nav_menu() menus
|
||||||
|
* @link http://codex.wordpress.org/Function_Reference/register_nav_menus
|
||||||
|
*/
|
||||||
|
register_nav_menus([
|
||||||
|
'primary_navigation' => __('Primary Navigation', 'sage')
|
||||||
|
]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable post thumbnails
|
||||||
|
* @link http://codex.wordpress.org/Post_Thumbnails
|
||||||
|
* @link http://codex.wordpress.org/Function_Reference/set_post_thumbnail_size
|
||||||
|
* @link http://codex.wordpress.org/Function_Reference/add_image_size
|
||||||
|
*/
|
||||||
|
add_theme_support('post-thumbnails');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable post formats
|
||||||
|
* @link http://codex.wordpress.org/Post_Formats
|
||||||
|
*/
|
||||||
|
add_theme_support('post-formats', ['aside', 'gallery', 'link', 'image', 'quote', 'video', 'audio']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable HTML5 markup support
|
||||||
|
* @link http://codex.wordpress.org/Function_Reference/add_theme_support#HTML5
|
||||||
|
*/
|
||||||
|
add_theme_support('html5', ['caption', 'comment-form', 'comment-list', 'gallery', 'search-form']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use main stylesheet for visual editor
|
||||||
|
* @see /assets/styles/layouts/_tinymce.scss
|
||||||
|
*/
|
||||||
|
add_editor_style(asset_path('styles/main.css'));
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register sidebars
|
||||||
|
*/
|
||||||
|
add_action('widgets_init', function () {
|
||||||
|
$config = function ($name, $id = '') {
|
||||||
|
return [
|
||||||
|
'name' => __($name, 'sage'),
|
||||||
|
'id' => 'sidebar-' . $id ?: sanitize_title($name),
|
||||||
|
'before_widget' => '<section class="widget %1$s %2$s">',
|
||||||
|
'after_widget' => '</section>',
|
||||||
|
'before_title' => '<h3>',
|
||||||
|
'after_title' => '</h3>'
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
register_sidebar($config('Primary'));
|
||||||
|
register_sidebar($config('Footer'));
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Theme assets
|
||||||
|
*/
|
||||||
|
add_action('wp_enqueue_scripts', function () {
|
||||||
|
wp_enqueue_style('sage/css', asset_path('styles/main.css'), false, null);
|
||||||
|
|
||||||
|
if (is_single() && comments_open() && get_option('thread_comments')) {
|
||||||
|
wp_enqueue_script('comment-reply');
|
||||||
|
}
|
||||||
|
|
||||||
|
wp_enqueue_script('sage/js', asset_path('scripts/main.js'), ['jquery'], null, true);
|
||||||
|
}, 100);
|
||||||
@@ -12,7 +12,7 @@ var eslint = require('gulp-eslint');
|
|||||||
var lazypipe = require('lazypipe');
|
var lazypipe = require('lazypipe');
|
||||||
var less = require('gulp-less');
|
var less = require('gulp-less');
|
||||||
var merge = require('merge-stream');
|
var merge = require('merge-stream');
|
||||||
var cssNano = require('gulp-cssnano');
|
var minifyCss = require('gulp-minify-css');
|
||||||
var plumber = require('gulp-plumber');
|
var plumber = require('gulp-plumber');
|
||||||
var rev = require('gulp-rev');
|
var rev = require('gulp-rev');
|
||||||
var runSequence = require('run-sequence');
|
var runSequence = require('run-sequence');
|
||||||
|
|||||||
10
package.json
10
package.json
@@ -40,11 +40,11 @@
|
|||||||
"gulp-imagemin": "^2.4.0",
|
"gulp-imagemin": "^2.4.0",
|
||||||
"gulp-less": "^3.0.5",
|
"gulp-less": "^3.0.5",
|
||||||
"gulp-cssnano": "^2.1.0",
|
"gulp-cssnano": "^2.1.0",
|
||||||
"gulp-flatten": "0.1.1",
|
"gulp-eslint": "^1.1.1",
|
||||||
"gulp-if": "^1.2.5",
|
"gulp-flatten": "0.2.0",
|
||||||
"gulp-imagemin": "^2.3.0",
|
"gulp-if": "^2.0.0",
|
||||||
"gulp-jshint": "^1.11.2",
|
"gulp-imagemin": "^2.4.0",
|
||||||
"gulp-less": "^3.0.3",
|
"gulp-less": "^3.0.5",
|
||||||
"gulp-plumber": "^1.0.1",
|
"gulp-plumber": "^1.0.1",
|
||||||
"gulp-rename": "^1.2.2",
|
"gulp-rename": "^1.2.2",
|
||||||
"gulp-rev": "^6.0.1",
|
"gulp-rev": "^6.0.1",
|
||||||
|
|||||||
43
ruleset.xml
Normal file
43
ruleset.xml
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<ruleset name="Roots">
|
||||||
|
<description>Roots Coding Standards</description>
|
||||||
|
|
||||||
|
<!-- Use PSR-2 as a base -->
|
||||||
|
<rule ref="PSR2">
|
||||||
|
<!-- Allow opening and closing braces for functions and classes to be on the same line -->
|
||||||
|
<exclude name="Squiz.Functions.MultiLineFunctionDeclaration.BraceOnSameLine"/>
|
||||||
|
<exclude name="PSR2.Classes.ClassDeclaration.OpenBraceNewLine"/>
|
||||||
|
<exclude name="Squiz.WhiteSpace.ScopeClosingBrace"/>
|
||||||
|
|
||||||
|
<!-- Disable newline after opening brace -->
|
||||||
|
<exclude name="Squiz.ControlStructures.ControlSignature.NewlineAfterOpenBrace"/>
|
||||||
|
|
||||||
|
<!-- Allow multiple PHP statements in the same line (usually in template files) -->
|
||||||
|
<exclude name="Generic.Formatting.DisallowMultipleStatements.SameLine"/>
|
||||||
|
|
||||||
|
<!-- Disable PSR-2 indentation rules that are buggy with 2 spaces -->
|
||||||
|
<exclude name="PSR2.ControlStructures.SwitchDeclaration.BreakIndent"/>
|
||||||
|
<exclude name="PSR2.Methods.FunctionCallSignature.Indent"/>
|
||||||
|
</rule>
|
||||||
|
|
||||||
|
<!-- Don't require a blank line after the last `use` in templates/ directory -->
|
||||||
|
<rule ref="PSR2.Namespaces.UseDeclaration.SpaceAfterLastUse">
|
||||||
|
<exclude-pattern>templates/*</exclude-pattern>
|
||||||
|
</rule>
|
||||||
|
|
||||||
|
<!-- Allow PHP closing tags on templates -->
|
||||||
|
<rule ref="PSR2.Files.ClosingTag.NotAllowed">
|
||||||
|
<exclude-pattern>templates/*</exclude-pattern>
|
||||||
|
</rule>
|
||||||
|
|
||||||
|
<!-- Force 2 spaces indentation -->
|
||||||
|
<rule ref="Generic.WhiteSpace.ScopeIndent">
|
||||||
|
<properties>
|
||||||
|
<property name="indent" value="2"/>
|
||||||
|
<property name="tabIndent" value="false"/>
|
||||||
|
</properties>
|
||||||
|
</rule>
|
||||||
|
|
||||||
|
<!-- Verify that operators have valid spacing surrounding them -->
|
||||||
|
<rule ref="Squiz.WhiteSpace.OperatorSpacing"></rule>
|
||||||
|
</ruleset>
|
||||||
Reference in New Issue
Block a user