This commit is contained in:
Thomas Günther 2024-02-27 12:06:55 +01:00
parent e204c8a53e
commit 4d479cedaf
77 changed files with 1 additions and 4761 deletions

View File

View File

@ -12,7 +12,7 @@ class BdpVersionChecker
{ {
$plugin_data = get_plugin_data( BDP_LV_STARTUP_FILE ); $plugin_data = get_plugin_data( BDP_LV_STARTUP_FILE );
$this->plugin_slug = BDP_LV_PLUGIN_SLUG; $this->plugin_slug = BDP_LV_PLUGIN_SLUG;
$this->updateUrl = $plugin_data['UpdateURI'] . '/info_development.json'; $this->updateUrl = $plugin_data['UpdateURI'] . '/info.json';
$this->version = $plugin_data['Version']; $this->version = $plugin_data['Version'];
$this->cache_key = 'bdp-kompass-upd'; $this->cache_key = 'bdp-kompass-upd';
$this->cache_allowed = false; $this->cache_allowed = false;

View File

@ -1,104 +0,0 @@
@charset "UTF-8";
@import url("font/ihs.css");
html, body { border: 0 none; padding: 0; margin: 0; min-height: 100%; position: static; }
html { font-family: Sans-Serif; background: url("img/holz.jpg") #dbb97b; position: relative; }
body { margin: 1em; padding: 1em; max-width: 710px; background: #fff; font-size: 81.3% !important; }
body.post-type-gallery { background: transparent; }
header, hgroup, nav, footer, article { display: block; }
.h, h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 { margin: 0; font-family: IHS, Serif; font-size: 1em; font-weight: normal; font-style: normal; }
button, input, select, optgroup, option { margin: 0; font: inherit; color: inherit; }
button, input[type="button"], input[type="submit"], input[type="reset"] { cursor: pointer; }
p, ul, ol, dt { line-height: 1.5; }
abbr { border-bottom: 1px dotted; }
a { color: #1d4899; }
figure, .wp-caption { margin: 0; max-width: 100%; }
figcaption, .wp-caption-text { font-style: italic; padding: 0.5em 0; }
.screen-reader-text { display: none; }
.aligncenter { margin: 0 auto; }
.alignleft { float: left; margin: 0 1em 0 0; }
.alignright { float: right; margin: 0 0 0 1em; }
::-moz-selection { background: #1d4899; color: #ffcb04; text-shadow: none; outline: 2px solid #1d4899; }
::selection { background: #1d4899; color: #ffcb04; text-shadow: none; outline: 2px solid #1d4899; }
/* Media object */
.media { margin: 1em 0; }
.media, .bd { overflow: hidden; _overflow: visible; }
/*.media img { display: block; }*/
/* Clearfix */
.clearfix::after,
.clearfix::before,
.media::after,
.media::before { content: " "; display: table; }
.clearfix::after,
.media::after { clear: both; }
/* Überschriften mit Bild darunter */
.h-box { position: relative; display: block; margin-bottom: 1em; text-decoration: none; }
.h-box > img { position: absolute; top: 0; left: 0; height: 100%; width: 100%; }
.h-box > .wrap { position: absolute; max-width: 100%; left: 0; }
.h-box > .wrap > * { display: inline; -o-box-decoration-break: clone; -webkit-box-decoration-break: clone; box-decoration-break: clone; }
.h-box-teaser { box-shadow: 0 5px 5px rgba(0, 0, 0, 0.3); margin-left: -240px; line-height: 1; display: inline-block; width: 1300px; max-width: 100%; }
.h-box-teaser > img { position: static; }
.h-box-teaser > .wrap { bottom: 1em; padding-left: 240px; }
.h-box-teaser > .wrap > * { background: rgba(56, 46, 35, 0.7); color: #ffcb04; padding: 2px 13px 4px; font-size: 52px; line-height: 78px; }
@media (max-width: 720px) {
.h-box-teaser { margin-top: 1em; margin-left: 0; }
.h-box-teaser > .wrap { padding-left: 1em; }
.h-box-teaser > .wrap > * { font-size: 2em; line-height: 39px; }
}
.h-box-blaugelb { padding-top: 47.1428571%; }
.h-box-blaugelb > .wrap { bottom: 0; font-size: 18px; }
.h-box-blaugelb > .wrap > * { color: #1d4899; background: #ffcb04; padding: 3px 5px; line-height: 26px; }
.h-box-blaugelb-bildlos { padding: 0; }
.h-box-blaugelb-bildlos > .wrap { position: static; }
/**/
.container { max-width: 1020px; }
.page .container,
.single-post:not(.single-format-gallery) .container { max-width: 710px; }
.content-singular .format-gallery { background: transparent; padding: 0; margin: 0; position: relative; }
.content-singular .format-gallery .gallery { display: flex; flex-wrap: wrap; align-content: space-between; align-items: flex-start; }
.content-singular .format-gallery .gallery-item { background: #fff; padding: 1em; margin: 0 1em 1em 0; }
.gallery-columns-1 .gallery-item { flex: 1 0 50%; }
.gallery-columns-2 .gallery-item { flex: 1 0 34%; }
.gallery-columns-3 .gallery-item { flex: 1 0 25%; }
.gallery-columns-4 .gallery-item { flex: 1 0 20%; }
.content-gallery { display: flex; position: relative; z-index: 10; flex-wrap: wrap; overflow: hidden; }
.content-gallery > article { flex: 1 1 25%; }
body > :first-child { margin-top: 0; }
body > :last-child { margin-bottom: 0; }
.content-singular > article:not(.format-gallery),
.content-gallery > article,
.commentlist article,
.comment-form { min-width: 20em; background: #fff; box-shadow: 0 5px 5px rgba(0, 0, 0, 0.1); }
.content-gallery > article { max-width: calc(33.333% - 1em); }
@media (max-width: 800px) { .content-gallery > article { max-width: 100%; } }
/* WordPress-Wünsche */
.sticky {}
img { max-width: 100%; height: auto; border: 0 none; vertical-align: middle; }
ul, ol { padding-left: 2em; }
dl, ul, ol, h1, h2, h3, h4, h5, h6, blockquote, p, table { margin: 0.5em 0; }
dd, li > ol, li > ul { margin: 0; }
dt { font-weight: bold; }
blockquote, dd { padding-left: 2em; }
body > p:empty:last-child { margin: -0.5em 0 0.5em; }
h3, .h3, h4, .h4, h5, .h5, h6, .h6 { display: inline-block; background: #ffcb04; color: #1d4899; margin-bottom: 0; padding: 2px 4px; }
h3, .h3 { font-size: 18px; padding: 3px 5px; }
h4, .h4 { font-size: 16px; }
h5, .h5 { font-size: 14px; }
.gallery-caption {}
.bypostauthor {}
.twitter-tweet {}
h1, .h1, h2, .h2 { font-size: 20px; }
h1::after, h2::after { color: red; background: black; display: block; padding: 5px; content: "Bitte Überschriften ab 3. Ordnung benutzen."; }

View File

@ -1,11 +0,0 @@
@font-face {
font-family: IHS;
src: url('ihs.eot');
src: url('ihs.eot?#iefix') format('embedded-opentype'),
url('ihs.woff2') format('woff2'),
url('ihs.woff') format('woff'),
url('ihs.ttf') format('truetype'),
url('ihs.svg#immenhausenregular') format('svg');
font-weight: normal;
font-style: normal;
}

Binary file not shown.

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 783 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 332 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 379 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 599 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 639 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 561 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 2400 2400" width="14" height="14"><path style="fill:#fff;stroke:none" d="m 975,25 q 129,0 252,34 123,34 227,95.5 104,61.5 191.5,149 87.5,87.5 149,192 61.5,104.5 95.5,227.5 34,123 34,251 0,278 -152,514 l 588,588 q 15,14 15,35 0,21 -15,36 l -213,213 q -15,15 -36,15 -21,0 -35,-15 l -588,-588 q -235,152 -513,152 -129,0 -252,-34 Q 600,1856 496,1794.5 392,1733 304,1645.5 216,1558 155,1453.5 94,1349 59.5,1226 25,1103 25,974.5 25,846 59.5,723 94,600 155,495.5 216,391 304,303.5 392,216 496,154.5 600,93 723,59 846,25 975,25 Z m -0.5,302 Q 843,327 723,378 603,429 516.5,516 430,603 378.5,723 327,843 327,974.5 q 0,131.5 51.5,251.5 51.5,120 138,207 86.5,87 206.5,138 120,51 251.5,51 131.5,0 251.5,-51 120,-51 207,-138 87,-87 138.5,-207 Q 1623,1106 1623,974.5 1623,843 1571.5,723 1520,603 1433,516 1346,429 1226,378 1106,327 974.5,327 Z" /></svg>

Before

Width:  |  Height:  |  Size: 907 B

View File

@ -1 +0,0 @@
<svg xmlns='http://www.w3.org/2000/svg' height='300' width='470' viewBox='0 0 300 425' preserveAspectRatio='xMinYMin meet'><defs><linearGradient id='v' x1='0' y1='0' x2='0' y2='140%'><stop offset='0' stop-color='#000' stop-opacity='0.7' /><stop offset='50%' stop-color='#000' stop-opacity='0.4' /><stop offset='80%' stop-color='#000' stop-opacity='0.1' /><stop offset='100%' stop-color="#000" stop-opacity='0' /></linearGradient></defs><path d='M10,200 C150,170 450,180 615,190 L608,00 L15,0 Z' style='stroke:none;' fill='url(#v)'></path></svg>

Before

Width:  |  Height:  |  Size: 545 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

View File

@ -1,103 +0,0 @@
Buena
=======
Das WordPress-Theme zum neuen Corporate Design des BdP.
Änderungswünsche? Kritik?
philipp.cordes@pfadfinden.de
Anderthalb Hinweise zur Benutzung
-----------------------------------
Das Theme ist noch nicht ganz fertig, an einigen Stellen wird noch gehobelt.
In Beiträgen mögt ihr bitte erst Überschriften ab 3. Ordnung verwenden,
die erster Ordnung sind für den Header und die zweiter Ordnung sind für
die Titel der Beiträge. Es gibt dafür auch fette Hinweise beim Bearbeiten.
Eine kleine Änderungshistorie
-------------------------------
v1.0 - TODO
- Das Abschalten des Posterbilds für ist Seiten und Beiträge ohne Bild möglich.
- Beitragsarten und deren unterschiedliche Darstellung ist auch für Seiten verfügbar.
- Schmale Beitragsbilder (<1300px Breite) zerlegen das Layout nicht mehr.
- Login-Formular im Widgetbereich unterstützen.
v0.99.7 - 21.09.2015
- Safari bricht jetzt Artikelauflistungen richtig um. Die anderen machen es auch etwas besser.
- Safari zeigt jetzt Suchfelder richtig an.
- Safari malt die Trennline in der Navigation nicht mehr zu dick.
- Wenn das Ajax-Login-Formular benutzt wird, verschwindet das Hamburgermenü nicht mehr.
v0.99.6 - 19.09.2015
- Weitere Blau- und Gelbtöne einheitlich umgesetzt, v.a. im Editor.
- Update für Milu: Zusatz „Kategorie“ wird im Titel auf abendlager.pfadfinden.de nicht mehr angezeigt.
- Der linke Rand wird jetzt immer eingehalten, egal wie lang der Navigationsbereich ist.
- Anpassung an WordPress 4.3: Favicon kommt nur aus dem Theme, wenn kein eigenes gesetzt ist.
- Der Hinweis, dass Kommentare nicht möglich sind, wird standardmäßig ausgeblendet.
- Links in der Navigation färben sich jetzt anhand der Hierarchie im Menü ein, nicht derer der Seiten.
v0.99.5 - 19.08.2015
- Seitentitel beschreiben jetzt besser, was tatsächlich angezeigt wird.
- Farben aus dem Handbuch einheitlich umgesetzt.
v0.99.4 - 13.08.2015
- Das Menü wird automatisch wieder eingeblendet, wenn die Fensterbreite über 720px steigt.
- Fehlerkorrektur: Es werden keine Urls mehr unter dem Editorfeld ausgegeben.
- Das Theme ist nicht mehr auf das Plugin angewiesen. Die benötigte Bilbiothek shy-wordpress wird direkt mitgeliefert.
v0.99.3 - 01.08.2015
- Der Editor sollte jetzt in den meisten Fällen eine realistische Vorschau bieten.
- Überschriften sind jetzt blau auf gelb.
Überschriften erster und zweiter Ordnung in Beiträgen und Seiten werden durch Überschriften dritter Ordnung ersetzt.
- Schrift „Immenhausen“ durch verbesserte Variante ausgetauscht.
- Kleinere Korrekturen an Abständen.
v0.99.2 - 27.07.2015
- Kleinere Textanpassungen.
v0.99.1 - 27.07.2015
- Auf großen Displays wird das Beitragsbild nicht mehr verzerrt.
v0.99 - 26.07.2015
- Erster Kandidat zur Veröffentlichung als Version 1.0.
- Die Überschriften erstrahlen in vollem Glanz.
- Kommentare sehen besser aus.
- Das Theme ist responsive bis runter auf 300px.
- Fußleiste überarbeitet und zweigeteilt.
v0.9.1 - 07.07.2015
- Fehlerkorrektur: Der Titel wird nicht mehr doppelt angezeigt.
v0.9 - 03.07.2015
- Kommentare werden jetzt angezeigt.
- Etwas mehr responsive: Mindestbreite 700px für ordentliche Anzeige.
v0.8 - 21.06.2015
- Standardwidgets sehen jetzt in der Leiste gut aus.
- Die Fußzeile sitzt jetzt fester an ihrem Platz.
v0.7 - 18.06.2015
- Große Posterbilder hinzugefügt, die auch auf der Bundeswebseite zu sehen sind.
- Erhebliche Verbesserungen der Darstellung.
v0.6 - 16.06.2015
- Mehr Unterstützung für HTML5.
v0.5 - 16.06.2015
- Fehler behoben, der die WordPress-Installation unbrauchbar machen könnte.
v0.4 - 11.06.2015
- Navigation überarbeitet.
v0.3 - 10.06.2015
- Webfont Immenhausen für Überschriften.
v0.2 - 04.06.2015
- Grafiken eingebaut.
v0.1 - 20.04.2015
- Erste Veröffentlichung.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 336 KiB

View File

@ -1,24 +0,0 @@
<?php
namespace plugins\buena\src\Pfadfinden\WordPress;
use Pfadfinden\WordPress\wordpress;
use wordpress\src\Shy\WordPress\CompositeOption;
class BuenaSettings extends wordpress\src\Shy\WordPress\CompositeOption
{
public function __construct()
{
parent::__construct( 'buena-theme' );
}
public function getDefaults()
{
return [
'use_cdn' => false,
'always_show_poster' => true,
];
}
}

View File

@ -1,32 +0,0 @@
<?php
namespace plugins\buena\src\Pfadfinden\WordPress;
use Shy\WordPress\Administration\SettingsPage;
use Shy\WordPress\Administration\CheckboxField;
class BuenaSettingsPage extends SettingsPage
{
public function getFields()
{
$this->addSection( '', 'buena' );
return array(
'use_cdn' => new CheckboxField(),
'always_show_poster' => new CheckboxField(),
);
}
public function getParentSlug()
{
return 'themes.php';
}
public function getTitle()
{
return __( 'Buena-Einstellungen', 'buena-theme' );
}
}

View File

@ -1,320 +0,0 @@
<?php
namespace plugins\buena\src\Pfadfinden\WordPress;
use Pfadfinden\WordPress\wordpress;
use plugins\buena\src\Pfadfinden\WordPress\BuenaSettings;
use plugins\buena\src\Pfadfinden\WordPress\BuenaSettingsPage;
use wordpress\src\Shy\WordPress\Theme;
class BuenaTheme extends wordpress\src\Shy\WordPress\Theme
{
/**
* @var BuenaSettings
*/
protected $settings;
public function getContentWidth()
{
return 684;
}
public function __construct()
{
parent::__construct();
$this->settings = new BuenaSettings();
$this->addHookMethod( 'after_setup_theme', 'afterSetupTheme' );
$this->addHookMethod( 'wp_enqueue_scripts', 'enqueueScriptsStyles' );
$this->addHookMethod( 'buena_search_form', 'printSearchForm' );
$this->addHookMethod( 'admin_init', 'initAdministration' );
$this->addHookMethod( 'mce_css', 'filterEditorStylesheets' );
$this->addHookMethod( 'wp_page_menu', 'filterPageMenu' );
$this->addHookMethod( 'widgets_init', 'registerSidebars' );
$this->addHookMethod( 'the_content', 'filterContent' );
$this->addHookMethod( 'image_size_names_choose', 'filterImageSizeNames' );
$this->addHookMethod( 'media_upload_tabs', 'filterMediaTabs' );
$this->addHookMethod( 'media_view_settings', 'filterMediaViewSettings' );
$this->addHookMethod( 'media_view_strings', 'filterMediaViewSettings' );
$this->addHookMethod( 'print_media_templates', 'printMediaTemplates' );
}
public function afterSetupTheme()
{
add_theme_support( 'title-tag' );
add_theme_support( 'automatic-feed-links' );
register_nav_menu( 'primary', __( 'Hauptmenü', 'buena-theme' ) );
register_nav_menu( 'footer', __( 'Fußzeile', 'buena-theme' ) );
add_theme_support( 'html5', [
'comment-list', 'comment-form', 'search-form', 'gallery', 'caption',
] );
add_theme_support( 'post-thumbnails' );
$custom_header = [
'width' => apply_filters( 'buena_header_image_width', 1300 ),
'height' => apply_filters( 'buena_header_image_height', 635 ),
'flex-width' => true,
'flex-height' => true,
'default-image' => get_template_directory_uri() . '/img/leitbild_aktionen_low.jpg',
'uploads' => true,
'header-text' => false,
];
add_theme_support( 'custom-header', $custom_header );
set_post_thumbnail_size( $custom_header['width'], $custom_header['height'], true );
add_image_size( 'gallery-thumb', 350, 165, true );
register_default_headers( [
'aktionen' => [
'url' => '%s/img/leitbild_aktionen_low.jpg',
'thumbnail_url' => '%s/img/leitbild_aktionen_low_klein.jpg',
'description' => __( 'Leitbild Aktionen', 'buena-theme' ),
],
'bund' => [
'url' => '%s/img/leitbild_bund_crop.jpg',
'thumbnail_url' => '%s/img/leitbild_bund_crop_klein.jpg',
'description' => __( 'Leitbild Bund', 'buena-theme' ),
],
'ihs' => [
'url' => '%s/img/leitbild_ihs.jpg',
'thumbnail_url' => '%s/img/leitbild_ihs_klein.jpg',
'description' => __( 'Leitbild Immenhausen', 'buena-theme' ),
],
'international' => [
'url' => '%s/img/leitbild_int2_low.jpg',
'thumbnail_url' => '%s/img/leitbild_int2_low_klein.jpg',
'description' => __( 'Leitbild International', 'buena-theme' ),
],
'kontakt' => [
'url' => '%s/img/leitbild_Kontakt_low.jpg',
'thumbnail_url' => '%s/img/leitbild_Kontakt_low_klein.jpg',
'description' => __( 'Leitbild Kontakt', 'buena-theme' ),
],
'pfadfinden' => [
'url' => '%s/img/leitbild_pfadfinden_low.jpg',
'thumbnail_url' => '%s/img/leitbild_pfadfinden_low_klein.jpg',
'description' => __( 'Leitbild Pfadfinden', 'buena-theme' ),
],
] );
}
public function getTeaserImage()
{
if ( is_page() || have_posts() && is_single() ) { // FIXME: is_singular()?
the_post();
$thumb = get_the_post_thumbnail( null, 'post-thumbnail', [ 'alt' => '' ] );
rewind_posts();
if ( $thumb ) {
return $thumb;
}
}
if ( is_home() || $this->settings['always_show_poster'] ) {
return sprintf(
'<img src="%s" height="%d" width="%d" alt="" />',
get_header_image(),
get_custom_header()->height,
get_custom_header()->width
);
}
return '';
}
/**
* Gibt einen Titel für die aktuelle Seite aus.
*/
public function printTitle()
{
if ( is_singular() ) {
the_title();
} elseif ( is_category() && strpos( $_SERVER['HTTP_HOST'], 'abendlager.pfadfinden.de' ) !== false ) {
// FIXME: Workaround mit 1.0 entfernen.
single_cat_title( '', true );
} elseif ( is_archive() ) {
the_archive_title();
} elseif ( is_search() ) {
esc_html_e( sprintf(
__( 'Suche nach „%s“', 'buena-theme' ),
get_search_query( false )
) );
} else {
bloginfo( 'description' );
}
}
public function enqueueScriptsStyles()
{
wp_enqueue_style( 'immenhausen-font', get_template_directory_uri() . '/font/ihs.css' );
wp_enqueue_style( 'buena-style', get_stylesheet_uri() );
}
/**
* Gibt das Suchformular aus. Nötig, damit im Kopf anderer Code stehen kann als anderswo.
*/
public function printSearchForm()
{
get_search_form( true );
}
/**
* Tut, was dransteht.
*/
public function registerSidebars()
{
register_sidebar( [
'id' => 'below-navigation',
'name' => __( 'Unter Navigation', 'buena-theme' ),
'description' => __( 'Ziemlich schmal.', 'buena-theme' ),
'before_title' => '<h4 class="h-widget">',
'after_title' => '</h4>',
] );
register_sidebar( [
'id' => 'footer',
'name' => __( 'Fußleiste', 'buena-theme' ),
'description' => __( 'Rechte Spalte des Briefumschlags. Recht flach. Füllt die ganze Breite aus, wenn kein Navigationsmenü zugewiesen ist.', 'buena-theme' ),
'before_title' => '<h4 class="h-widget">',
'after_title' => '</h4>',
] );
}
/**
* Ausgabe von wp_page_menu() filtern, dass sie wie wp_nav_menu() aussieht.
*
* @param string $menu
* @param array $args
* @return string
*/
public function filterPageMenu( $menu, array $args )
{
if ( ! isset( $args['fallback_cb'] ) || $args['fallback_cb'] !== 'wp_page_menu' ) {
return $menu;
}
$vorher = '<div class="' . esc_attr( $args['menu_class'] ) . '">';
$danach = '<' . $args['container'];
if ( $args['container_class'] ) {
// In diesem Fall doch optional…
$danach .= ' class="' . esc_attr( $args['container_class'] ) . '"';
}
if ( $args['container_id'] ) {
$danach .= ' id="' . esc_attr( $args['container_id'] ) . '"';
}
$danach .= '>';
if ( strpos( $menu, '<ul>' ) !== false ) {
// Wenn das Menü leer ist, enthält es den <ul>-Teil nicht.
$vorher .= '<ul>';
$danach .= '<ul class="' . esc_attr( $args['menu_class'] ) . '">';
}
$menu = str_replace( $vorher, $danach, $menu );
$menu = substr( $menu, 0, -5 ) . $args['container'] . ">\n";
$menu = str_replace( "class='children'", 'class="sub-menu"', $menu );
$menu = str_replace( 'current_page_item', 'current_page_item current-menu-item', $menu );
$menu = str_replace( 'current_page_ancestor', 'current_page_ancestor current-menu-ancestor', $menu );
return $menu;
}
/**
* Zusatzfunktionen für das Backend laden.
*/
public function initAdministration()
{
if ( isset( $_GET['exp'] ) && class_exists( 'plugins\buena\src\Pfadfinden\WordPress\BuenaSettingsPage' ) ) {
new BuenaSettingsPage( $this->settings );
}
add_editor_style();
}
/**
* Standard-Skin des Editors rauswerfen.
*
* @param string $stylesheets
* @return string
*/
public function filterEditorStylesheets( $stylesheets )
{
$stylesheets = explode( ',', $stylesheets );
$stylesheets = array_filter( $stylesheets, function ( $url ) {
return strpos( $url, 'tinymce' ) === false;
} );
return implode( ',', $stylesheets );
}
/**
* Überschriften <h1> und <h2> durch <h3> ersetzen.
*
* @param string $content
* @return string
*/
public function filterContent( $content )
{
$content = preg_replace( '/\\<h[12]([^>]*)>(.*?)\\<\\/h[12]>/', '<h3$1>$2</h3>', $content );
return $content;
}
/**
* @param array $names
* @return array
*/
public function filterImageSizeNames( array $names )
{
return $names;
}
/**
* @param array $tabs
* @return array
*/
public function filterMediaTabs( $tabs )
{
return $tabs;
return $tabs + [
'insert-poster' => __( 'Posterbilder', 'buena-theme' ),
];
// Erzeugt einen <iframe> von wp-admin/media-upload.php?chromeless=1&post_id=123456&tab=insert-poster
}
public function filterMediaViewSettings( $settings )
{
//var_dump( $settings );
return $settings;
}
/**
* Weitere Templates für Medienbrowser ausgeben.
*/
public function printMediaTemplates()
{
global $_wp_default_headers;
?>
<script type="text/html" id="tmpl-insert-poster">
<ul>
<?php foreach ( $_wp_default_headers as $k => $header ) : ?>
<img alt="<?php esc_attr_e( $header['description'] ); ?>" src="<?php echo esc_url( sprintf( $header['thumbnail_url'], get_template_directory_uri() ) ); ?>" />
<?php endforeach; ?>
</ul>
</script>
<?php
}
}

View File

@ -1,250 +0,0 @@
@charset "UTF-8";
/**
Theme Name: Buena
Version: 0.99.7
Theme URI: http://lab.hanseaten-bremen.de/themes/buena/
Author: Philipp Cordes <philipp.cordes@pfadfinden.de>
Description: Das neue Corporate Design, jetzt auch für WordPress.
License: Proprietary
Tags: one-column, three-columns, responsive-layout, automatic-feed-links, post-thumbnails, featured-images, custom-menu, blue, white, yellow, editor-style
*/
/*
Farben:
- gelb: #ffcb04 (Handbuch, manchmal T3), #ffca28 (T3)
- Verlauf: #9f7515 bis #e1af22, #e0cb84 bis #fff (IE-Fallback)
- blass: #fff5d9 (T3-Zebra)
- blau: #1d4899 (Handbuch, manchmal T3), #0d52a5 (T3)
- Markierung (T3): #b3d4fc
*/
html, body { border: 0 none; padding: 0; margin: 0; min-height: 100%; position: static; }
html { font-family: Sans-Serif; font-size: 81.3%; background: url("img/holz.jpg") #dbb97b; position: relative; }
header, hgroup, nav, footer, article { display: block; }
.h, h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 { margin: 0; font-family: IHS, Serif; font-size: 1em; font-weight: normal; font-style: normal; }
button, input, select, optgroup, option { margin: 0; font: inherit; color: inherit; }
button, input[type="button"], input[type="submit"], input[type="reset"] { cursor: pointer; }
input[type="search"] { -webkit-appearance: textfield; }
p, ul, ol, dt { line-height: 1.5; }
abbr { border-bottom: 1px dotted; }
a { color: #1d4899; }
figure, .wp-caption { margin: 0; max-width: 100%; }
figcaption, .wp-caption-text { font-style: italic; padding: 0.5em 0; }
.screen-reader-text { display: none; }
.aligncenter { margin: 0 auto; }
.alignleft { float: left; margin: 0 1em 0 0; }
.alignright { float: right; margin: 0 0 0 1em; }
::-moz-selection { background: #1d4899; color: #ffcb04; text-shadow: none; outline: 2px solid #1d4899; }
::selection { background: #1d4899; color: #ffcb04; text-shadow: none; outline: 2px solid #1d4899; }
/* Media object */
.media { margin: 1em 0; }
.media, .bd { overflow: hidden; _overflow: visible; }
/*.media img { display: block; }*/
/* Clearfix */
.clearfix::after,
.clearfix::before,
.media::after,
.media::before { content: " "; display: table; }
.clearfix::after,
.media::after { clear: both; }
/* Layout */
#wrap { background: url("img/klufthemd.png") no-repeat; padding: 0 0 2em; }
#footer { background: url("img/loeffel-topf.png") no-repeat 100% 100%; position: absolute; width: 100%; bottom: 0; }
#footer .wrapper { background: url("img/briefumschlag.png") no-repeat; margin: 0 0 0 240px; padding: 112px 7px 0 21px; height: 286px; width: 700px; box-sizing: border-box; }
#footer header { color: #ffcb04; text-align: center; font-size: 25px; margin: -111px 0 13px; line-height: 111px; }
#footer .widgets { padding: 0 2em 0 0; }
#left { margin: -18px -200px 0 40px; width: 160px; z-index: 30; float: left; position: relative; }
#main { overflow: hidden; padding: 0 0 286px 240px; }
@media (max-width: 960px) {
/* Umschlag unter die Navigation umbrechen */
#left { margin-bottom: 300px; }
#footer .wrapper { margin-left: 0; }
}
@media (max-width: 720px) {
#main { padding-left: 0; }
#left { margin-right: 0; }
}
/* FIXME: Positionierung des Schattens weiter vereinfachen, auch Untertitel verlinken. */
/* FIXME: Branding umbenennen, siehe https://github.com/pfadfinden/wordpress-theme-updater/issues/13 */
#branding { min-height: 145px; padding: 0 33px 20px 240px; text-align: center; position: relative; width: 425px; margin-bottom: -27px; }
#branding::after { content: ""; display: block; position: absolute; bottom: 0; right: 0; z-index: 15; height: 143px; width: 457px; background: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIGhlaWdodD0nMzAwJyB3aWR0aD0nNDcwJyB2aWV3Qm94PScwIDAgMzAwIDQyNScgcHJlc2VydmVBc3BlY3RSYXRpbz0neE1pbllNaW4gbWVldCc+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSd2JyB4MT0nMCcgeTE9JzAnIHgyPScwJyB5Mj0nMTQwJSc+PHN0b3Agb2Zmc2V0PScwJyBzdG9wLWNvbG9yPScjMDAwJyBzdG9wLW9wYWNpdHk9JzAuNycgLz48c3RvcCBvZmZzZXQ9JzUwJScgc3RvcC1jb2xvcj0nIzAwMCcgc3RvcC1vcGFjaXR5PScwLjQnIC8+PHN0b3Agb2Zmc2V0PSc4MCUnIHN0b3AtY29sb3I9JyMwMDAnIHN0b3Atb3BhY2l0eT0nMC4xJyAvPjxzdG9wIG9mZnNldD0nMTAwJScgc3RvcC1jb2xvcj0iIzAwMCIgc3RvcC1vcGFjaXR5PScwJyAvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxwYXRoIGQ9J00xMCwyMDAgQzE1MCwxNzAgNDUwLDE4MCA2MTUsMTkwIEw2MDgsMDAgTDE1LDAgWicgc3R5bGU9J3N0cm9rZTpub25lOycgZmlsbD0ndXJsKCN2KSc+PC9wYXRoPjwvc3ZnPg0K") no-repeat 50% 0; }
#branding > * { margin: 0; position: relative; z-index: 20; }
.site-title { font-size: 20px; background: #ffcb04; color: #0d53a5; margin-top: auto; line-height: 115px; }
.site-title a { display: block; vertical-align: bottom; }
.site-title img { vertical-align: bottom; padding-bottom: 16px; }
.site-description { font-size: 18px; background: #0d53a5; color: #ffcb04; line-height: 30px; font-family: IHS, Serif; letter-spacing: 1px; word-spacing: 2px; }
#header .search-form { background: url("img/streichholzschachtel.png") no-repeat; position: absolute; height: 89px; left: 750px; top: 1.5em; width: 98px; padding: 25px 47px 0 35px; }
#header .search-form label { display: block; position: relative; margin: 25px 0 -50px; text-align: left; }
#header .search-field { background: transparent; border: 2px solid #ffcb04; padding: 2px; color: #fff; display: block; max-width: 100%; box-sizing: border-box; }
#header .search-submit { background: transparent; color: #ffcb04; border: 0 none; font-family: IHS, Serif; font-size: 1.4em; padding: 0; display: block; box-sizing: border-box; }
#header > nav { position: absolute; top: 0; right: 0; z-index: 9999; display: none; }/* FIXME: Workaround Branding-Doppelung */
#responsiveMenu { border: 0 none; background: transparent; height: 51px; margin: 1em; }
@media (max-width: 960px) { /* Suche ausblenden */
#header .search-form { display: none; }
}
.nav-menu ul { list-style: none; padding: 0; margin: 0; }
.nav-menu-primary > ul { font-family: IHS, Serif; }
.nav-menu-primary > ul > .current-menu-ancestor,
.nav-menu-primary > ul > .current-menu-item { background: #e1af22 no-repeat; background-image: linear-gradient(#9f7515 0%, #e1af22 100%); border-bottom: 1px solid #9f7515; border-top: 1px solid #9f7515; margin: 0.5em 0; padding: 0.5em 0; }
.nav-menu-primary .sub-menu { display: none; }
.nav-menu-primary a { padding: 0.4em 0.5em 0.4em 1em; display: block; text-decoration: none; color: #6b5742; font-size: 1.4em; }
.nav-menu-primary li ul a { font-family: Georgia, Serif; font-size: 12px; font-style: italic; padding: 5px 5px 5px 25px; color: #000; }
.nav-menu-primary .current-menu-ancestor .sub-menu,
.nav-menu-primary .current-menu-item .sub-menu { display: block; }
.nav-menu-primary .current-menu-ancestor a { color: #000; }
.nav-menu-primary .current-menu-item > a { color: #fff; }
.nav-menu-primary a:hover,
.nav-menu-primary a:focus { color: #000; }
.nav-menu .current-menu-ancestor a:hover,
.nav-menu .current-menu-ancestor a:focus,
.nav-menu .sub-menu a:hover,
.nav-menu .sub-menu a:focus,
.nav-menu-footer a:hover,
.nav-menu-footer a:focus { text-decoration: underline; }
.nav-menu-footer { font-family: Georgia, Serif; font-style: italic; padding-left: 2em; }
.nav-menu-footer > ul { width: 323px; height: 174px; position: relative; display: flex; -webkit-flex-flow: column; flex-flow: column; -webkit-justify-content: center; justify-content: center; -webkit-align-items: stretch; align-items: stretch; }
.nav-menu-footer li { margin-bottom: 0.75em; }
.nav-menu-footer a { padding: 4px 4px 4px 25px; text-decoration: none; }
.widget_recent_entries > ul,
.widget_recent_comments > ul,
.widget_archive > ul,
.widget_categories > ul,
.widget_meta > ul { list-style: none; padding: 0; margin: 0; }
#left > .nav-menu { background: #ffcb04; color: #6b5742; padding: 10px 0 2em; }
#left > .widgets { background: rgba(56, 46, 35, 0.7); color: #ffcb04; padding: 1em 15px 15px 20px; font-size: 13px; font-style: italic; }
#left > .widgets a { color: #fff; text-decoration: none; }
#left > .widgets a:hover,
#left > .widgets a:focus { text-decoration: underline; }
/* Widgets: Basisdarstellung */
.widgets { list-style: none; padding: 0; margin: 0; font-family: Georgia, Serif; font-style: italic; }
.widget_calendar table { text-align: center; }
/* Widgets: Korrekturen für unsere Seitenleiste */
#left .widget_search form { display: flex; }
#left .widget_search form > * { border: 2px solid #ffcb04; }
#left .widget_search input { box-sizing: border-box; width: 100%; border: 0 none; background: transparent; color: #fff; text-align: center; padding: 3px 0.25em 4px; }
#left .widget_search button { color: transparent; background: url("res/lupe.svg") 50% 50% no-repeat #ffcb04; width: 31px; }
#left .widget_calendar > div { margin: 0 -15px 0 -20px; }
#left .widget_calendar > div > table { text-align: center; margin: 0 auto; }
#left .widget_pages ul { padding-left: 2em; }
#left .widget_pages > ul { list-style: none; padding: 0; }
#left > .widgets .widget { margin: 0; padding: 1em 0; }
.widgets .h-widget { color: #ffcb04; font-size: 16px; }
#left > .widgets .menu,
.widgets .widget_categories ul { list-style: none; padding: 0; }
/* Überschriften mit Bild darunter */
.h-box { position: relative; display: block; margin-bottom: 1em; text-decoration: none; }
.h-box > img { position: absolute; top: 0; left: 0; height: 100%; width: 100%; }
.h-box > .wrap { position: absolute; max-width: 100%; left: 0; }
.h-box > .wrap > * { display: inline; -o-box-decoration-break: clone; -webkit-box-decoration-break: clone; box-decoration-break: clone; }
.h-box-teaser { box-shadow: 0 5px 5px rgba(0, 0, 0, 0.3); line-height: 1; display: inline-block; width: 1300px; max-width: 100%; }
.h-box-teaser > img { position: static; }
.h-box-teaser > .wrap { bottom: 1em; padding-left: 240px; }
.h-box-teaser > .wrap > * { background: rgba(56, 46, 35, 0.7); color: #ffcb04; padding: 2px 13px 4px; font-size: 52px; line-height: 78px; }
@media (max-width: 720px) {
.h-box-teaser { margin-top: 1em; margin-left: 0; }
.h-box-teaser > .wrap { padding-left: 1em; }
.h-box-teaser > .wrap > * { font-size: 2em; line-height: 39px; }
}
.h-box-blaugelb { padding-top: 47.1428571%; }
.h-box-blaugelb > .wrap { bottom: 0; font-size: 18px; }
.h-box-blaugelb > .wrap > * { color: #1d4899; background: #ffcb04; padding: 3px 5px; line-height: 26px; }
.h-box-blaugelb-bildlos { padding: 0; }
.h-box-blaugelb-bildlos > .wrap { position: static; }
/**/
.container { max-width: 1020px; }
.page .container,
.single-post:not(.single-format-gallery) .container { max-width: 710px; }
.content-singular .format-gallery { background: transparent; padding: 0; margin: 0; position: relative; }
.content-singular .format-gallery .gallery { display: flex; -webkit-flex-wrap: wrap; flex-wrap: wrap; -webkit-align-content: space-between; align-content: space-between; -webkit-align-items: flex-start; align-items: flex-start; }
.content-singular .format-gallery .gallery-item { background: #fff; padding: 1em; margin: 0 1em 1em 0; }
.gallery-columns-1 .gallery-item { flex: 1 0 50%; }
.gallery-columns-2 .gallery-item { flex: 1 0 34%; }
.gallery-columns-3 .gallery-item { flex: 1 0 25%; }
.gallery-columns-4 .gallery-item { flex: 1 0 20%; }
.content-gallery { display: flex; position: relative; z-index: 10; -webkit-flex-wrap: wrap; flex-wrap: wrap; overflow: hidden; }
.container article,
.commentlist article,
.comment-form { padding: 1em; margin: 0 1em 1em 0; transition: width 0.5s, height 0.5s; box-sizing: border-box; }
.container article > :first-child,
.comment-form > :first-child { margin-top: 0; }
.container article > :last-child,
.comment-form > .form-submit { margin-bottom: 0; }
.content-singular > article:not(.format-gallery),
.content-gallery > article,
.commentlist article,
.comment-form { min-width: 20em; background: #fff; box-shadow: 0 5px 5px rgba(0, 0, 0, 0.1); }
.content-gallery > article { flex: 1 1 25%; max-width: calc(33.333% - 1em); }
@media (max-width: 1070px) { .content-gallery > article { flex: 1 1 34%; max-width: calc(50% - 1em); } }
@media (max-width: 800px) { .content-gallery > article { flex: 1 1 50%; max-width: 100%; } }
.container > .pagination { margin-right: 1em; }
/* WordPress-Wünsche */
.sticky {}
img { max-width: 100%; height: auto; border: 0 none; vertical-align: middle; }
ul, ol { padding-left: 2em; }
dl, ul, ol, h1, h2, h3, h4, h5, h6, blockquote, p, table { margin: 0.5em 0; }
dd, li > ol, li > ul { margin: 0; }
dt { font-weight: bold; }
blockquote, dd { padding-left: 2em; }
article > p:empty:last-child { margin: -0.5em 0 0.5em; }
article h3, article .h3, article h4, article .h4, article h5, article .h5, article h6, article .h6 { display: inline-block; background: #ffcb04; color: #1d4899; margin-bottom: 0; padding: 2px 4px; }
article h3, article .h3 { font-size: 18px; padding: 3px 5px; }
article h4, article .h4 { font-size: 16px; }
article h5, article .h5 { font-size: 14px; }
.gallery-caption {}
.bypostauthor {}
.twitter-tweet {}
/* Kommentare */
#comments, #reply-title { font-size: 2.5em; color: #fff; margin: 0.5em 0 0.25em; }
.commentlist { list-style: none; padding: 0; }
.commentlist .children { list-style: none; padding-left: 1em; }
.comment-form > p > * { vertical-align: top; }
.comment-form > p > label::after { content: ": "; }
.comment-body { position: relative; }
.comment-metadata { position: absolute; top: 1em; right: 1em; display: flex; -webkit-flex-direction: column; flex-direction: column; -webkit-justify-content: flex-end; justify-content: flex-end; }
.comment-form textarea { resize: vertical; display: block; box-sizing: border-box; width: 100%; }
/* Responsive: Der komplizierte Kram. Hurra! */
@media (max-width: 720px) { /* Gestapelt anordnen */
#main { padding-bottom: 0; }
#wrap, #footer .wrapper { background-image: none; }
#branding { text-align: left; width: auto; padding: 0; margin: 0; min-height: 0; }
#branding::after { display: none; background-image: none; }
#branding h1 { line-height: 51px; }
#branding h2 { padding: 0 1em; }
.site-title a { display: inline-block; }
.site-title img { height: 51px; width: auto; padding: 13px; }
#header > nav { display: block; }
#left { float: none; transition: 0.5s height; margin: 0; width: auto; }
#left, #left .widgets { display: none; }
.show-responsive-menu #left { display: block; }
#content, .comments { margin-left: 1em; }
#footer { background: #c4a164; position: static; }
#footer .wrapper { padding: 1em; height: auto; width: auto; }
#footer header { color: #000; margin: 0; line-height: 1.5; }
.nav-menu-footer, #footer .widgets { float: none; margin: 1em 0 0; padding: 1em; }
.nav-menu-footer > ul { height: auto; }
}

View File

@ -1,7 +0,0 @@
# Eclipse project files
.buildpath
.project
.settings
# Local PHPUnit configuration
phpunit.xml

View File

@ -1,7 +0,0 @@
<phpunit boostrap="tests/bootstrap.php">
<testsuites>
<testsuite>
<directory suffix="Test.php" phpVersion="5.4.0">tests</directory>
</testsuite>
</testsuites>
</phpunit>

View File

@ -1,97 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: pfadfinden-theme-updater\n"
"POT-Creation-Date: 2015-08-26 01:49+0100\n"
"PO-Revision-Date: 2015-08-26 02:02+0100\n"
"Last-Translator: Philipp Cordes <philipp.cordes@pfadfinden.de>\n"
"Language-Team: \n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.6.10\n"
"X-Poedit-Basepath: ..\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;_x;esc_html_e;esc_html__;esc_attr_e;esc_attr__;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_x:1,2c;_n:1,2;_n_noop:1,2;__ngettext_noop:1,2;_c,_nc:4c,1,2;\n"
"X-Poedit-SearchPath-0: .\n"
#: pfadfinden-theme-updater.php:70
msgid ""
"Couldnt load required library “shy-wordpress”. Reinstalling the plugin may "
"solve this problem."
msgstr ""
"Konnte die erforderliche Bibliothek „shy-wordpress“ nicht laden. "
"Neuinstallation des Plugins sollte das Problem beheben."
#: pfadfinden-theme-updater.php:81
msgid "The plugin is incomplete. Reinstalling it may solve this problem."
msgstr ""
"Das Plugin ist unvollständig. Neuinstallation sollte das Problem beheben."
#: pfadfinden-theme-updater.php:96
#, php-format
msgid ""
"You need at least PHP 5.4 to use Pfadfinden Theme Updater. Your are using %s."
msgstr ""
"Du brauchst mindestens PHP 5.4, um den Pfadfinden-Theme-Updater zu benutzen. "
"Aktuell benutzt du PHP %s."
#: pfadfinden-theme-updater.php:104
msgid "Pfadfinden Theme Updater"
msgstr "Pfadfinden-Theme-Updater"
#: pfadfinden-theme-updater.php:105
msgid ""
"Adds the Pfadfinden theme repository to your choice of themes. Requires an "
"API key."
msgstr ""
"Fügt den Pfadfinden-Theme-Katalog zu Deiner Auswahl an Themes hinzu. "
"Benötigt einen API-Schlüssel."
#: src/Pfadfinden/WordPress/ThemeRepository.php:81
msgid "Your theme repository query is too long."
msgstr "Deine Anfrage an den Theme-Katalog ist zu lang."
#: src/Pfadfinden/WordPress/ThemeRepository.php:114
msgid "Unknown theme repository server error, no message attached."
msgstr ""
"Unbekannter Theme-Katalog-Serverfehler, keine Fehlerbeschreibung "
"mitgeschickt."
#: src/Pfadfinden/WordPress/ThemeRepository.php:186
msgid "Ambiguous result for single theme information call."
msgstr "Mehrere Ergebnisse für Abfrage nach Informationen zu einem Theme."
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:69
msgid "Pfadfinden Theme Updater Settings"
msgstr "Pfadfinden-Theme-Updater-Einstellungen"
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:74
msgid "Pfadfinden Updater"
msgstr "Pfadfinden-Updater"
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:84
msgid "API Key"
msgstr "API-Schlüssel"
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:89
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:116
msgid "An API key consists of 10 alphanumeric characters."
msgstr "Ein API-Schlüssel besteht aus zehn alphanumerischen Zeichen."
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:96
msgid "Keep Settings"
msgstr "Einstellungen merken"
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:97
msgid "Dont delete settings when uninstalling the plugin."
msgstr "Einstellungen nicht löschen, wenn das Plugin deinstalliert wird."
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:107
msgid "Just testing? Try APITESTKEY."
msgstr ""
"Nur Ausprobieren? Nimm APITESTKEY. Aber BdP-Themes gibt es damit nicht…"
#~ msgid "Activated Features"
#~ msgstr "Aktivierte Funktionen"

View File

@ -1,84 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: pfadfinden-theme-updater\n"
"POT-Creation-Date: 2015-08-26 01:49+0100\n"
"PO-Revision-Date: 2015-08-26 01:50+0100\n"
"Last-Translator: Philipp Cordes <philipp.cordes@pfadfinden.de>\n"
"Language-Team: \n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.6.10\n"
"X-Poedit-Basepath: ..\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;_x;esc_html_e;esc_html__;esc_attr_e;esc_attr__;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_x:1,2c;_n:1,2;_n_noop:1,2;__ngettext_noop:1,2;_c,_nc:4c,1,2;\n"
"X-Poedit-SearchPath-0: .\n"
#: pfadfinden-theme-updater.php:70
msgid ""
"Couldnt load required library “shy-wordpress”. Reinstalling the plugin may "
"solve this problem."
msgstr ""
#: pfadfinden-theme-updater.php:81
msgid "The plugin is incomplete. Reinstalling it may solve this problem."
msgstr ""
#: pfadfinden-theme-updater.php:96
#, php-format
msgid ""
"You need at least PHP 5.4 to use Pfadfinden Theme Updater. Your are using %s."
msgstr ""
#: pfadfinden-theme-updater.php:104
msgid "Pfadfinden Theme Updater"
msgstr ""
#: pfadfinden-theme-updater.php:105
msgid ""
"Adds the Pfadfinden theme repository to your choice of themes. Requires an "
"API key."
msgstr ""
#: src/Pfadfinden/WordPress/ThemeRepository.php:81
msgid "Your theme repository query is too long."
msgstr ""
#: src/Pfadfinden/WordPress/ThemeRepository.php:114
msgid "Unknown theme repository server error, no message attached."
msgstr ""
#: src/Pfadfinden/WordPress/ThemeRepository.php:186
msgid "Ambiguous result for single theme information call."
msgstr ""
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:69
msgid "Pfadfinden Theme Updater Settings"
msgstr ""
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:74
msgid "Pfadfinden Updater"
msgstr ""
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:84
msgid "API Key"
msgstr ""
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:89
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:116
msgid "An API key consists of 10 alphanumeric characters."
msgstr ""
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:96
msgid "Keep Settings"
msgstr ""
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:97
msgid "Dont delete settings when uninstalling the plugin."
msgstr ""
#: src/Pfadfinden/WordPress/ThemeUpdaterSettings.php:107
msgid "Just testing? Try APITESTKEY."
msgstr ""

View File

@ -1,149 +0,0 @@
<?php
/*
Plugin Name: Pfadfinden Theme Updater
Plugin URI: http://lab.hanseaten-bremen.de/themes/
Description: Adds the Pfadfinden theme repository to your choice of themes. Requires an API key.
Version: 0.2
Author: Philipp Cordes
Text Domain: pfadfinden-theme-updater
Domain Path: /languages/
License: GPLv2 or later
*/
if ( ! defined( 'ABSPATH' ) ) {
die( 'Im a plugin.' );
}
/**
* Load localized strings for the plugin.
*
* @see http://geertdedeckere.be/article/loading-wordpress-language-files-the-right-way
*/
function pfadfinden_theme_updater_load_textdomain()
{
remove_action( 'init', __FUNCTION__ );
$domain = 'pfadfinden-theme-updater';
// Filter known from load_plugin_textdomain().
$locale = apply_filters( 'plugin_locale', get_locale(), $domain );
load_textdomain( $domain, WP_LANG_DIR . "/pfadfinden-theme-updater/$domain-$locale.mo" );
load_plugin_textdomain( $domain, false, basename( __DIR__ ) . '/languages/' );
}
add_action( 'init', 'pfadfinden_theme_updater_load_textdomain' );
if ( ! function_exists( 'trigger_pfadfinden_plugin_error' ) ) {
/**
* Show an error message.
*
* @see http://www.squarepenguin.com/wordpress/?p=6 Inspiration
*
* @param string $message
* @param int $type optional
* @return bool
*/
function trigger_pfadfinden_plugin_error( $message, $type = 0 )
{
if ( isset( $_GET['action'] ) && 'error_scrape' === $_GET['action'] ) {
echo $message;
return true;
}
if ( ! $type ) {
$type = E_USER_WARNING;
}
return trigger_error( $message, $type );
}
}
// Check for suitable environment
if ( defined( 'PHP_VERSION_ID' ) && PHP_VERSION_ID >= 50400 ) {
// If were the first user of the library, use the bundled one
if ( ! class_exists( 'plugins\buena\use\shy-wordpress\src\Shy\WordPress\Plugin' ) ) {
pfadfinden_theme_updater_load_textdomain();
if ( ! include_once __DIR__ . '/use/shy-wordpress/src/autoloader.php' ) {
trigger_pfadfinden_plugin_error(
__( 'Couldnt load required library “shy-wordpress”. Reinstalling the plugin may solve this problem.', 'pfadfinden-theme-updater' ),
E_USER_ERROR
);
return;
}
}
// Register our autoloader
if ( ! include_once __DIR__ . '/src/autoloader.php' ) {
pfadfinden_theme_updater_load_textdomain();
trigger_pfadfinden_plugin_error(
__( 'The plugin is incomplete. Reinstalling it may solve this problem.', 'pfadfinden-theme-updater' ),
E_USER_ERROR
);
return;
}
// PHP < 5.3 issues a parse error if we instance the class here
return require_once __DIR__ . '/startup.php';
}
// Display error message
pfadfinden_theme_updater_load_textdomain();
trigger_pfadfinden_plugin_error(
sprintf(
__( 'You need at least PHP 5.4 to use Pfadfinden Theme Updater. Your are using %s.', 'pfadfinden-theme-updater' ),
PHP_VERSION
),
E_USER_ERROR
);
if ( false ) {
// Dummy calls for translation to include metadata in translation files
__( 'Pfadfinden Theme Updater', 'pfadfinden-theme-updater' );
__( 'Adds the Pfadfinden theme repository to your choice of themes. Requires an API key.', 'pfadfinden-theme-updater' );
}
class Nginx {
private $plugin = 'nginx-helper/nginx-helper.php';
private $pluginPath = ABSPATH . 'wp-content/plugins/nginx-helper/nginx-helper.php';
public function __construct() {
if(is_readable($this->pluginPath)) {
require_once(ABSPATH .'/wp-admin/includes/plugin.php');
$this->activatePlugin();
$this->loadCss();
}
}
private function activatePlugin() {
if( is_plugin_active( $this->plugin ) && get_option('cloudpit_nginx_activated_once') == 1 ) {
//if the plugin is active already and our option is set, do nothing
return;
}
if( !is_plugin_active( $this->plugin ) && get_option('cloudpit_nginx_activated_once') == 1 ) {
//if the plugin is deactivated on purpuse after installation, do nothing
return;
}
activate_plugin($this->pluginPath);
$options = 'a:23:{s:12:"enable_purge";s:1:"1";s:12:"cache_method";s:14:"enable_fastcgi";s:12:"purge_method";s:11:"get_request";s:10:"enable_map";N;s:10:"enable_log";N;s:9:"log_level";s:4:"INFO";s:12:"log_filesize";s:1:"5";s:12:"enable_stamp";N;s:22:"purge_homepage_on_edit";s:1:"1";s:21:"purge_homepage_on_del";s:1:"1";s:21:"purge_archive_on_edit";s:1:"1";s:20:"purge_archive_on_del";s:1:"1";s:28:"purge_archive_on_new_comment";N;s:32:"purge_archive_on_deleted_comment";N;s:17:"purge_page_on_mod";s:1:"1";s:25:"purge_page_on_new_comment";s:1:"1";s:29:"purge_page_on_deleted_comment";s:1:"1";s:14:"redis_hostname";s:9:"127.0.0.1";s:10:"redis_port";s:4:"6379";s:12:"redis_prefix";s:12:"nginx-cache:";s:9:"purge_url";s:0:"";s:25:"redis_enabled_by_constant";i:0;s:28:"smart_http_expire_form_nonce";s:10:"87a3b2c240";}';
add_option('rt_wp_nginx_helper_options', unserialize($options));
if(!get_option('cloudpit_nginx_activated_once')) {
add_option('cloudpit_nginx_activated_once', 1);
}
}
private function loadCss() {
if( !is_plugin_active( $this->plugin ) ) {
return;
}
wp_enqueue_style('cloudpit-css', plugin_dir_url( __FILE__ ) . 'assets/style.css',array(), filemtime(plugin_dir_path( __FILE__ ) . 'assets/style.css'));
}
}

View File

@ -1,7 +0,0 @@
<phpunit bootstrap="tests/bootstrap.php">
<testsuites>
<testsuite>
<directory suffix="Test.php" phpVersion="5.4.0">tests</directory>
</testsuite>
</testsuites>
</phpunit>

View File

@ -1,31 +0,0 @@
=== Pfadfinden Theme Updater ===
Contributors: Corphi
Tags: themes
Requires at least: 4.0
Tested up to: 4.3
Stable tag: trunk
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
This plugin allows for easy installation of BdP e.V. corporate design themes. If you <a href="http://lab.hanseaten-bremen.de/register/">have an API key</a>.
== Description ==
This plugins makes all corporate design themes of the BdP e.V. available to your WordPress installation.
== Installation ==
1. Install the plugin from the plugin repository.
1. Activate the plugin through the 'Plugins' menu in WordPress.
1. Get an API key from http://lab.hanseaten-bremen.de/register/.
1. Enter the API key in the setting section.
1. Browse the additional featured themes.
== Changelog ==
= 0.2 =
* Users of PHP versions below 5.3 should now get reasonable error messages.
= 0.1 =
* Initial release.

View File

@ -1,207 +0,0 @@
<?php
namespace Pfadfinden\WordPress;
/**
* A theme repository.
*
* Its a simple wrapper around a web service mimicking the wordpress.org theme repository.
*
* @author Philipp Cordes <philipp.cordes@pfadfinden.de>
*/
class ThemeRepository
{
const URL = 'http://lab.hanseaten-bremen.de/themes/api/';
/**
* Slugs of managed themes.
*
* FIXME: Move to a transient.
*
* @var array<string>
*/
private $known_themes = [ 'bdp-reloaded', 'bdp-test', 'buena' ];
/**
* @var ThemeUpdaterSettings
*/
protected $settings;
public function __construct( ThemeUpdaterSettings $settings )
{
$this->settings = $settings;
}
/**
* Whether theme information is available.
*
* @param string $theme_slug
* @return bool
*/
public function isKnownTheme( $theme_slug )
{
return in_array( $theme_slug, $this->known_themes, true );
}
/**
* Wrapper around HTTP calls, always returns an array of theme information.
*
* @param string $action One of the supported actions of the repository
* @param array $params Parameters for the action
* @param string $locale
* @return array<object>|\WP_Error
*/
protected function doApiQuery( $action, array $params = [], $locale = '' )
{
$url_params = [
'key' => $this->settings['key'],
'action' => $action,
];
if ( $params ) {
if ( function_exists( 'gzcompress' ) ) {
$url_params['gzparams'] = gzcompress( json_encode( $params ), 9 );
} else {
$url_params['params'] = json_encode( $params );
}
}
$url_params = array_map( 'rawurlencode', $url_params );
$url = add_query_arg( $url_params, self::URL );
if ( strlen( $url ) > 2000 ) {
// Lengths beyond 2000 seem unhealthy.
return new \WP_Error(
815,
__( 'Your theme repository query is too long.', 'pfadfinden-theme-updater' )
);
}
$headers = [];
if ( ! strlen( $locale ) ) {
$locale = get_locale();
}
if ( strlen( $locale ) ) {
$locale = str_replace( '_', '-', $locale );
$headers['Accept-Language'] = "$locale, en; q=0.6, *; q=0.1";
}
// A GET request allows for caching
$response = wp_remote_get( $url, [
'headers' => $headers,
] );
if ( is_wp_error( $response ) ) {
return $response;
}
$body = json_decode( wp_remote_retrieve_body( $response ), true );
if ( isset( $body['type'] ) && 'success' === $body['type'] ) {
return array_map( function ( array $theme ) {
return (object) $theme;
}, $body['themes'] );
}
if ( WP_DEBUG ) {
trigger_error( wp_remote_retrieve_body( $response ), E_USER_ERROR );
}
$error = new \WP_Error(
wp_remote_retrieve_response_code( $response ),
isset( $body['message'] ) ? $body['message'] : __( 'Unknown theme repository server error, no message attached.', 'pfadfinden-theme-updater' )
);
if ( isset( $body['exception'] ) ) {
$error->add_data( $body['exception'] );
}
return $error;
}
/**
* @param array<bool> $fields to explicitly include or exclude
* @param string $locale
* @return array<object {
* @type string $name
* @type string $slug lowercase, hyphenated
* @type string $version
* @type string $author
* @type string $preview_url
* @type string $screenshot_url
* @type float $rating between 0 and 100
* @type int $num_ratings
* @type int $downloaded
* @type string $last_updated Y-m-d
* @type string $homepage
* @type string $description
* @type array $tags
* }>
*/
public function queryFeaturedThemes( array $fields = [], $locale = '' )
{
return $this->doApiQuery( 'featured', [ 'fields' => $fields ], $locale );
}
/**
* Query information about a specific theme.
*
* @param string|array $slugs theme slug(s)
* @param array<bool> $fields to explicitly include or exclude
* @param string $locale
* @return object {
* @type string $name
* @type string $slug
* @type string $version
* @type string $author
* @type string $preview_url
* @type string $screenshot_url
* @type float $rating between 0.0 and 100.0
* @type int $num_ratings
* @type int $downloaded
* @type string $last_updated
* @type string $homepage
* @type array $sections {
* @type string $description
* }
* @type string $description empty string when having sections
* @type string $download_link
* @type array<string> $tags keys are tag slugs, values also lowercase. strange.
* }
*/
public function queryThemeInformation( $slugs, array $fields = [], $locale = '' )
{
$themes = $this->doApiQuery( 'information', [
'slugs' => (array) $slugs,
'fields' => $fields,
], $locale );
if ( is_wp_error( $themes ) ) {
return $themes;
}
if ( is_string( $slugs ) ) {
if ( count( $themes ) !== 1 ) {
return new \WP_Error( __( 'Ambiguous result for single theme information call.', 'pfadfinden-theme-updater' ) );
}
return reset( $themes );
}
return $themes;
}
/**
* Query information about updates for installed themes.
*
* @param array<bool> $fields to explicitly include or exclude
* @param string $locale
* @return array<object>
*/
public function queryUpdates( array $fields = [], $locale = '' )
{
// FIXME: Only include installed themes
return $this->queryThemeInformation( $this->known_themes, $fields, $locale );
}
}

View File

@ -1,231 +0,0 @@
<?php
namespace Pfadfinden\WordPress;
use wordpress\src\Shy\WordPress\Plugin;
/**
* A plugin that hooks the Pfadfinden theme repository into the Theme Updater.
*
* It knows about the way that WordPress handles and stores theme information.
*
* @author Philipp Cordes <philipp.cordes@pfadfinden.de>
*/
class ThemeUpdaterPlugin extends wordpress\src\Shy\WordPress\Plugin
{
const ACTION_QUERY_THEMES = 'query_themes';
const ACTION_FEATURE_LIST = 'feature_list';
const ACTION_THEME_INFORMATION = 'theme_information';
/**
* @var ThemeUpdaterSettings
*/
protected $settings;
/**
* @var ThemeRepository
*/
protected $repository;
public function __construct()
{
$this->settings = new ThemeUpdaterSettings();
if ( ! $this->settings['key'] ) {
// Bail out if there is no key.
return;
}
$this->repository = new ThemeRepository( $this->settings );
$this->addHookMethod( 'themes_api', 'filterApiCall' );
$this->addHookMethod( 'themes_api_result', 'filterApiResult' );
$this->addHookMethod( 'themes_update_check_locales', 'filterThemeUpdateLocales' );
}
/**
* Replace a Theme API call.
*
* Actually, only the call for theme information in special cases.
*
* @param \WP_Error|object|false $result
* @param string $action 'theme_information', 'feature_list' or 'query_themes'
* @param object $args
* @return \WP_Error|object|array|false
*/
public function filterApiCall( $result, $action, $args )
{
if ( is_wp_error( $result ) ) {
return $result;
}
if ( self::ACTION_THEME_INFORMATION === $action
&& $this->repository->isKnownTheme( $args->slug )
) {
// Only handle our theme information calls
return $this->repository->queryThemeInformation( $args->slug, $args->fields, $args->locale );
}
return $result;
}
/**
* Filter a Theme API result.
*
* Inject our themes at appropriate places.
*
* @param object|\WP_Error $result
* @param string $action 'theme_information', 'feature_list', 'query_themes'
* @param object|array $args An array after using built-in API, object otherwise.
* @return object
*/
public function filterApiResult( $result, $action, $args )
{
if ( is_wp_error( $result ) ) {
return $result;
}
// FIXME: Workaround to be removed on 2015-10-23
if ( is_array( $args ) && isset( $args['body']['request'] ) ) {
// See https://core.trac.wordpress.org/ticket/29079, fixed in 4.2
$args = unserialize( $args['body']['request'] ); // Unpack original args
}
if ( self::ACTION_QUERY_THEMES !== $action || ! isset( $args->browse ) || 'featured' !== $args->browse ) {
return $result;
}
if ( ! $result || ! is_object( $result ) ) {
// Construct empty result
// FIXME: Maybe unneccessary
$result = (object) [
'info' => [
'page' => 1,
'pages' => 0,
'results' => false,
],
'themes' => [],
];
}
$themes = $this->repository->queryFeaturedThemes( $args->fields, $args->locale );
if ( ! is_wp_error( $themes ) ) {
$this->spliceThemes( $result, $themes );
}
return $result;
}
/**
* Splice additional themes into an existing Theme API result.
*
* Put them in front.
*
* @param object $result {
* @type object $info {
* @type integer|false $results have browser count if false
* @type integer|string $page
* @type integer $pages may be 0
* }
* @type array $themes
* }
* @param array $themes
* @return void
*/
public function spliceThemes( $result, array $themes )
{
$add = function ( $number, $increment ) {
return is_integer( $number ) ? $number + $increment : $number;
};
if ( is_array( $result->info ) ) {
$result->info['results'] = $add( $result->info['results'], count( $themes ) );
} elseif ( is_object( $result->info ) ) {
// Seemed to be an object once…
$result->info->results = $add( $result->info->results, count( $themes ) );
}
array_splice( $result->themes, 0, 0, $themes );
}
/**
* Filter locales queried for a theme update.
*
* Just in time to wait for the theme updates HTTP request…
*
* @param array $locales
* @return array
*/
public function filterThemeUpdateLocales( $locales )
{
$this->addHookMethod( 'http_response', 'filterThemeUpdateResponse' );
return $locales;
}
/**
* @param string $url
* @return bool
*/
protected function isThemeUpdateUrl( $url )
{
return (bool) preg_match( '@^https?://api.wordpress.org/themes/update-check/1.1/$@', $url );
}
/**
* Add our updates to the list.
*
* @param array $response
* @param array $args Original args to request
* @param string $url
*/
public function filterThemeUpdateResponse( array $response, array $args, $url )
{
if ( ! $this->isThemeUpdateUrl( $url ) ) {
return;
}
$this->removeHookMethod( 'http_response', __FUNCTION__ );
$themes = $this->repository->queryUpdates( [
// Eliminate worst offenders
'author' => false,
'description' => false,
'preview_url' => false,
'screenshot_url' => false,
] );
if ( is_wp_error( $themes ) ) {
// Silently fail.
return $response;
}
$updates = json_decode( wp_remote_retrieve_body( $response ), true );
foreach ( $themes as $theme ) {
$installed_theme = wp_get_theme( $theme->slug );
if ( ! $installed_theme->exists() || version_compare( $theme->version, $installed_theme->version, '<=' ) ) {
continue;
}
// Because thats why: Rename all the fields.
$updates['themes'][ $theme->slug ] = [
'theme' => $theme->slug,
'new_version' => $theme->version,
'url' => $theme->homepage,
'package' => $theme->download_link,
];
}
$response['body'] = json_encode( $updates );
return $response;
}
}

View File

@ -1,131 +0,0 @@
<?php
namespace Pfadfinden\WordPress;
use wordpress\src\Shy\WordPress\SettingsPage;
/**
* The code managing the plugin settings.
*
* @author Philipp Cordes <philipp.cordes@pfadfinden.de>
*/
class ThemeUpdaterSettings extends wordpress\src\Shy\WordPress\SettingsPage
{
/**
* Full path of plugin main file.
*
* @return string
*/
protected function getPluginFilename()
{
return preg_replace( '/src\\/.*?$/', 'pfadfinden-theme-updater.php', __DIR__ );
}
public function __construct()
{
parent::__construct( 'pfadfinden-theme-updater' );
$this->addHookMethod( 'plugin_action_links', 'filterPluginActions' );
}
/**
* Add our settings entry to the plugin actions.
*
* @param array<string> $actions
* @param string $plugin_file
* @param array $plugin_data
* @param string $context
* @return array<string>
*/
public function filterPluginActions( array $actions, $plugin_file, array $plugin_data, $context )
{
// Dereference possible symlink
$plugin_file = realpath( WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $plugin_file );
if ( $this->getPluginFilename() !== $plugin_file ) {
return $actions;
}
return array(
'settings' => sprintf(
'<a href="themes.php?page=%s">%s</a>',
esc_attr( urlencode( $this->slug ) ),
esc_html__( 'Settings' )
),
) + $actions;
}
protected function getParentSlug()
{
return 'themes.php';
}
protected function getPageTitle()
{
return __( 'Pfadfinden Theme Updater Settings', 'pfadfinden-theme-updater' );
}
protected function getMenuTitle()
{
return __( 'Pfadfinden Updater', 'pfadfinden-theme-updater' );
}
public function registerSettings()
{
$this->addSection( '', 'plugin' );
$this->addTextField(
'key',
__( 'API Key', 'pfadfinden-theme-updater' ),
[ 'attr' => [
'minlength' => '10',
'maxlength' => '10',
'pattern' => '^[A-Za-z0-9]{10}$',
'title' => __( 'An API key consists of 10 alphanumeric characters.', 'pfadfinden-theme-updater' ),
] ],
[ $this, 'renderApiKeyField' ]
);
$this->addCheckboxField(
'keep-settings',
__( 'Keep Settings', 'pfadfinden-theme-updater' ),
__( 'Dont delete settings when uninstalling the plugin.', 'pfadfinden-theme-updater' )
);
parent::registerSettings();
}
public function renderApiKeyField( array $args )
{
$this->renderTextField( $args );
echo '<p class="description">' . __( 'Just testing? Try APITESTKEY.', 'pfadfinden-theme-updater' ) . '</p>';
}
public function sanitizeOptions( array $options )
{
if ( isset( $options['key'] ) ) {
$key = preg_replace( '/[^A-Za-z0-9]+/', '', $options['key'] );
$keylen = strlen( $key );
if ( 0 !== $keylen && 10 !== $keylen ) {
$this->addError( 'key', __( 'An API key consists of 10 alphanumeric characters.', 'pfadfinden-theme-updater' ) );
}
$options['key'] = $key;
}
return $options + $this->getDefaults();
}
public function getDefaults()
{
return [
'key' => '',
'keep-settings' => false,
];
}
}

View File

@ -1,19 +0,0 @@
<?php
/**
* Try to load a Pfadfinden WordPress class.
*
* @param string $name
* @return bool
*/
function pfadfinden_wordpress_autoloader( $name )
{
if ( substr( $name, 0, 21 ) !== 'Pfadfinden\\WordPress\\' ) {
return false;
}
$name = __DIR__ . '/' . str_replace( '\\', DIRECTORY_SEPARATOR, $name ) . '.php';
return is_file( $name ) && include( $name );
}
spl_autoload_register( 'pfadfinden_wordpress_autoloader' );

View File

@ -1,3 +0,0 @@
<?php
return new \Pfadfinden\WordPress\ThemeUpdaterPlugin();

View File

@ -1,10 +0,0 @@
<?php
namespace Pfadfinden\WordPress\Tests;
class ThemeRepositoryTest extends \WP_UnitTestCase
{
}

View File

@ -1,10 +0,0 @@
<?php
namespace Pfadfinden\WordPress\Tests;
class ThemeUpdaterPluginTest extends \WP_UnitTestCase
{
}

View File

@ -1,122 +0,0 @@
<?php
namespace Pfadfinden\WordPress\Tests;
use Pfadfinden\WordPress\ThemeUpdaterSettings;
use PHPUnit_Framework_MockObject_MockObject as MockObject;
use PHPUnit_Framework_MockObject_Builder_InvocationMocker as BuilderInvocationMocker;
class ThemeUpdaterSettingsTest extends \WP_UnitTestCase
{
/**
* @return ThemeUpdaterSettings|MockObject {
* @method BuilderInvocationMocker method(string)
* }
*/
protected function createMock()
{
return $this->getMockBuilder( 'Pfadfinden\WordPress\ThemeUpdaterSettings' )
->enableProxyingToOriginalMethods()
->getMock();
}
/**
* @return array<array {
* @type array<string> $0
* }>
*/
public function pluginActionProvider()
{
return array(
array( array() ),
array( array( 'edit' => '<a href="edit-url.php">Edit</a>' ) ),
);
}
/**
* @dataProvider pluginActionProvider
* @param array<string> $old_actions
*/
public function testFilterPluginActions( array $old_actions )
{
$settings = $this->createMock();
$new_actions = $settings->filterPluginActions( $old_actions, 'pfadfinden-theme-updater/pfadfinden-theme-updater.php', array(), 'All' );
$this->assertCount( 1, array_diff_assoc( $new_actions, $old_actions ), 'Our action gets added.' );
$this->assertCount( 0, array_diff_assoc( $old_actions, $new_actions ), 'No actions are removed.' );
}
public function testRegisterSettings()
{
global $wp_settings_fields;
$settings = $this->createMock();
$settings->registerSettings();
$sections = $settings->getSections();
$this->assertCount( 1, $sections, 'One section is generated.' );
$fields = $settings->getFieldsForSection( $sections[0] );
$this->assertEquals( array( 'key', 'keep-settings' ), array_keys( $fields ), 'Known settings are there.' );
}
public function testSanitizeOptionDefaults()
{
$settings = $this->createMock();
$this->assertEquals(
$settings->getDefaults(),
$settings->sanitizeOptions( array() ),
'sanitizeOptions() adds in default values if missing.'
);
}
/**
* @return array<array {
* @type string $0
* @type string $1
* @type int $2
* }>
*/
public function keyProvider()
{
return array(
array( '', '', 0 ),
array( 'ABCDEFGHIJ', 'ABCDEFGHIJ', 0 ),
array( 'abcdefghij', 'abcdefghij', 0 ),
array( '1234567890', '1234567890', 0 ),
array( '123456789', '123456789', 1 ),
array( '12345678901', '12345678901', 1 ),
array( ' 1234567890', '1234567890', 0 ),
);
}
/**
* @dataProvider keyProvider
* @param string $key
* @param string $expected
* @param int $errorCount
*/
public function testSanitizeKeyOption( $key, $expected, $errorCount )
{
$settings = $this->createMock();
$sanitized = $settings->sanitizeOptions( array( 'key' => $key ) )['key'];
$this->assertEquals( $expected, $sanitized, 'Expected sanitized value.' );
$this->assertCount( $errorCount, $settings->getErrors(), 'Number of generated errors.' );
}
public function testDefaults()
{
$defaults = $this->createMock()->getDefaults();
$this->assertEquals(
array( 'key', 'keep-settings' ),
array_keys( $defaults ),
'Defaults for all options.'
);
}
}

View File

@ -1,19 +0,0 @@
<?php
/**
* Try to load a Pfadfinden WordPress class.
*
* @param string $name
* @return boolean
*/
function pfadfinden_wordpress_tests_autoloader( $name )
{
if ( substr( $name, 0, 27 ) !== 'Pfadfinden\\WordPress\\Tests\\' ) {
return false;
}
$name = __DIR__ . '/' . str_replace( '\\', DIRECTORY_SEPARATOR, $name ) . '.php';
return is_file( $name ) && include( $name );
}
spl_autoload_register( 'pfadfinden_wordpress_tests_autoloader' );

View File

@ -1,33 +0,0 @@
<?php
/**
* PHPUnit bootstrap file
*
* Variant of the one from github.com/tierra/wordpress-plugins-tests
*/
require_once __DIR__ . '/../use/shy-wordpress/src/autoloader.php';
require_once __DIR__ . '/../src/autoloader.php';
require_once __DIR__ . '/autoloader.php';
$GLOBALS['wp_test_plugins'] = array(
'active_plugins' => array( 'pfadfinden-theme-updater/pfadfinden-theme-updater.php' ),
);
echo 'Setting up WordPress...' . PHP_EOL;
if ( ! isset( $argv )
|| ( ! in_array( '-v', $argv ) && ! in_array( '--verbose', $argv ) )
) {
ob_start();
}
require_once ( getenv( 'WP_DEVELOP_DIR' ) ?: '../../../..' )
. '/tests/phpunit/includes/bootstrap.php';
if ( ob_get_level() ) {
ob_end_clean();
}

View File

@ -1,7 +0,0 @@
<phpunit boostrap="tests/bootstrap.php">
<testsuites>
<testsuite>
<directory suffix="Test.php" phpVersion="5.4.0">tests</directory>
</testsuite>
</testsuites>
</phpunit>

View File

@ -1,98 +0,0 @@
<?php
namespace Shy\WordPress;
use plugins\buena\use\shy/**
* A composite option with a fixed number of suboptions and their default values.
*/
abstract class CompositeOption implements \ArrayAccess, \Countable, \IteratorAggregate
{
use HookableTrait;
/**
* @var string
*/
protected $slug;
/**
* @return string
*/
public function getSlug()
{
return $this->slug;
}
protected function __construct( $slug )
{
$this->slug = (string) $slug;
$this->addHookMethod( 'default_option_' . $this->slug, 'getDefaults' );
}
/**
* Return default values for all suboptions.
* Hooked into get_option() defaults.
*
* @return array
*/
abstract public function getDefaults();
/**
* @param string $offset
* @return mixed
*/
public function getDefault( $offset )
{
return $this->getDefaults()[ $offset ];
}
public function offsetExists( $offset )
{
$settings = get_option( $this->slug );
return isset( $settings[ $offset ] );
}
public function offsetGet( $offset )
{
$settings = get_option( $this->slug );
if ( ! isset( $settings[ $offset ] ) ) {
throw new \OutOfBoundsException( "There is no setting '$offset'." );
}
return $settings[ $offset ];
}
public function offsetSet( $offset, $value )
{
$settings = get_option( $this->slug );
if ( ! isset( $settings[ $offset ] ) ) {
throw new \OutOfBoundsException( "There is no setting '$offset'." );
}
$settings[ $offset ] = $value;
update_option( $this->slug, $settings );
}
public function offsetUnset( $offset )
{
throw new \BadMethodCallException( 'You cannot unset settings.' );
}
public function count()
{
return count( $this->getDefaults() );
}
public function getIterator()
{
return new \ArrayIterator( get_option( $this->slug ) );
}
}

View File

@ -1,35 +0,0 @@
<?php
namespace Shy\WordPress;
/**
* Making actions and filters how they should be.
*
* Default to pass all arguments.
*/
trait HookableTrait
{
/**
* @param string $action_or_filter
* @param string $method
* @param int $priority
* @param int $acceptedArgs
*/
protected function addHookMethod( $action_or_filter, $method, $priority = 10, $acceptedArgs = 99 )
{
add_filter( $action_or_filter, array( $this, $method ), $priority, $acceptedArgs );
}
/**
* @param string $action_or_filter
* @param string $method
* @param int $priority
* @param int $acceptedArgs
*/
protected function removeHookMethod( $action_or_filter, $method, $priority = 10, $acceptedArgs = 99 )
{
remove_filter( $action_or_filter, array( $this, $method ), $priority, $acceptedArgs );
}
}

View File

@ -1,49 +0,0 @@
<?php
namespace Shy\WordPress;
/**
* Options wrapper.
*/
class Options implements \ArrayAccess
{
/**
* Remember a default value.
*
* Creates a closure and hooks it into the 'default_option_*' filter.
*
* @param string $option
* @param mixed $value
*/
public function setDefault( $option, $value )
{
add_filter( 'default_option_' . $option, function () use ( $value ) {
return $value;
} );
}
public function offsetExists( $option )
{
// Unfortunately, we cant really tell whether it exists…
$value = get_option( $option );
return false !== $value && null !== $value;
}
public function offsetGet( $option )
{
return get_option( $option );
}
public function offsetSet( $option, $value )
{
update_option( $option, $value );
}
public function offsetUnset( $option )
{
delete_option( $option );
}
}

View File

@ -1,13 +0,0 @@
<?php
namespace Shy\WordPress;
use plugins\buena\use\shy/**
* Marker class for WordPress plugins.
*/
abstract class Plugin
{
use HookableTrait;
}

View File

@ -1,378 +0,0 @@
<?php
namespace Shy\WordPress;
use plugins\buena\use\shyuse plugins\buena\use\shy/**
* Abstracts common functionality and escaping for the Settings API.
*
* TODO: Check slug and field names for illegal characters.
* TODO: Refactor to not extend but use CompositeOption
*/
abstract class SettingsPage extends CompositeOption
{
use HookableTrait;
/**
* @var string
*/
protected $capability;
/**
* Slug (file name) of the parent menu entry.
*
* @see add_submenu_page() for suggestions.
*
* @return string|null
*/
protected function getParentSlug()
{
return 'options-general.php';
}
/**
* Title for this setting page.
*
* @return string
*/
abstract protected function getPageTitle();
/**
* String to show in the menu entry.
*
* @return string
*/
protected function getMenuTitle()
{
return $this->getPageTitle();
}
/**
* @param string $slug Page slug
* @param string $capability Required capability to view
*/
protected function __construct( $slug, $capability = 'manage_options' )
{
parent::__construct( $slug );
$this->capability = (string) $capability;
$this->addHookMethod( 'admin_menu', 'registerPage' );
$this->addHookMethod( 'admin_init', 'registerSettings' );
}
/**
* Register our options page.
*
* @return void
*/
public function registerPage()
{
add_submenu_page(
$this->getParentSlug(),
$this->getPageTitle(),
$this->getMenuTitle(),
$this->capability,
$this->slug,
array( $this, 'renderPage' )
);
}
/**
* Register the actual settings.
* Override and use addSection() and add*Field() methods.
*
* @return void
*/
public function registerSettings()
{
register_setting(
$this->slug,
$this->slug,
array( $this, 'sanitizeOptions' )
);
}
/**
* Sanitize option values after form submission.
*
* @param array $options
* @return array
*/
abstract public function sanitizeOptions( array $options );
/**
* Section to add fields to.
*
* Parameter default from add_settings_field().
*
* @var string
*/
protected $currentSection = 'default';
/**
* Add a new section and return its generated name.
*
* @param string $title optional, can be empty
* @param string $name optional, will be generated if empty
* @return string
*/
protected function addSection( $title = '', $name = '' )
{
$name = (string) $name;
if ( ! strlen( $name ) ) {
$name = $this->slug . '-section' . ( count( $this->getSections() ) + 1 );
}
add_settings_section(
$name,
esc_html( $title ),
array( $this, 'renderSectionTeaser' ),
$this->slug
);
return $this->currentSection = $name;
}
/**
* Callback before output of section fields.
*
* Teasers must escape their output themselves.
*
* @param array $section {
* @type string $id
* @type string $title
* @type callable $callback
* }
*/
public function renderSectionTeaser( array $section )
{
}
/**
* Get all known section names on this page.
*
* @global $wp_settings_fields
* @return array<string>
*/
public function getSections()
{
global $wp_settings_fields;
if ( ! isset( $wp_settings_fields[ $this->slug ] ) ) {
return array();
}
return array_keys( $wp_settings_fields[ $this->slug ] );
}
/**
* @global $wp_settings_fields
* @param string $section
* @return array<string, array {
* @type string $id
* @type string $title
* @type callable $callback
* @type array $args
* }>
*/
public function getFieldsForSection( $section )
{
global $wp_settings_fields;
return $wp_settings_fields[ $this->slug ][ $section ];
}
/**
* Add a custom field to this setting page.
*
* @param string $name
* @param string $label
* @param callable $callback
* @param array $args
*/
protected function addField( $name, $label, $callback, $args = array() )
{
if ( ! is_callable( $callback ) ) {
throw new \InvalidArgumentException( 'Parameter $callback must be callable.' );
}
add_settings_field(
$name,
esc_html( $label ),
$callback,
$this->slug,
$this->currentSection,
$args
);
}
/**
* Add a text field to this settings page.
*
* @param string $name
* @param string $label
* @param array $args
* @param string $callback
*/
protected function addTextField( $name, $label, $args = array(), $callback = '' )
{
if ( ! $callback || ! is_callable( $callback ) ) {
$callback = array( $this, 'renderTextField' );
}
$this->addField(
$name,
$label,
$callback,
$args + array(
'label_for' => $this->slug . '-' . $name,
'name' => $name,
'attr' => array(),
)
);
}
/**
* @param string $name
* @param string $label
* @param string $caption
* @param array $args
* @param callable $callback
*/
protected function addCheckboxField( $name, $label, $caption, $args = array(), $callback = '' )
{
if ( ! $callback || ! is_callable( $callback ) ) {
$callback = array( $this, 'renderCheckboxField' );
}
$this->addField(
$name,
$label,
$callback,
$args + array(
'label_for' => $this->slug . '-' . $name,
'name' => $name,
'caption' => $caption,
'attr' => array(),
)
);
}
/**
* Add an error.
*
* @param string $code
* @param string $message
*/
protected function addError( $code, $message )
{
add_settings_error( $this->slug, $code, $message );
}
/**
* Errors for this setting.
*
* @return array {
* @type string $setting
* @type string $code
* @type string $message
* @type string $type 'error'
* }
*/
public function getErrors()
{
return get_settings_errors( $this->slug );
}
/**
* Render a setting as text field.
*
* @param array $args {
* @type string $name
* @type string $label_for
* @type array $attr
* }
*/
public function renderTextField( array $args )
{
$name = $args['name'];
$this->renderInputTag( array(
'type' => 'text',
'id' => $args['label_for'],
'class' => 'regular-text',
'name' => $this->slug . '[' . $name . ']',
'value' => $this[ $name ],
) + $args['attr'] );
}
/**
* Render a setting as checkbox.
*
* @param array $args {
* @type string $caption
* @type string $name
* @type string $label_for
* @type array $attr
* }
*/
public function renderCheckboxField( array $args )
{
$name = $args['name'];
echo '<label>';
$this->renderInputTag( array(
'type' => 'checkbox',
'id' => isset( $args['label_for'] ) ? $args['label_for'] : null,
'name' => $this->slug . '[' . $name . ']',
'value' => '1',
'checked' => $this[ $name ] ? 'checked' : null,
) + $args['attr'] );
echo ' ' . esc_html( $args['caption'] ) . '</label>';
}
/**
* Output an input tag with given HTML attributes.
*
* @param array $attr
*/
protected function renderInputTag( array $attr )
{
echo '<input';
foreach ( $attr as $k => $v ) {
if ( null !== $v ) {
printf( ' %s="%s"', $k, esc_attr( $v ) );
}
}
echo ' />';
}
/**
* Output settings page.
*/
public function renderPage()
{
if ( ! current_user_can( $this->capability ) ) {
wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
}
?>
<div class="wrap">
<h2><?php echo esc_html( $this->getPageTitle() ); ?></h2>
<form action="options.php" method="post">
<?php settings_errors( 'general' ); // “Settings saved.” message ?>
<?php settings_fields( $this->slug ); ?>
<?php do_settings_sections( $this->slug ); ?>
<?php submit_button(); ?>
</form>
</div>
<?php
}
}

View File

@ -1,49 +0,0 @@
<?php
namespace Shy\WordPress;
/**
* Site options wrapper.
*/
class SiteOptions implements \ArrayAccess
{
/**
* Remember a default value.
*
* Creates a closure and hooks it into the 'default_site_option_*' filter.
*
* @param string $option
* @param mixed $value
*/
public function setDefault( $option, $value )
{
add_filter( 'default_site_option_' . $option, function () use ( $value ) {
return $value;
} );
}
public function offsetExists( $option )
{
// Unfortunately, we cant really tell whether it exists…
$value = get_site_option( $option );
return false !== $value && null !== $value;
}
public function offsetGet( $option )
{
return get_site_option( $option );
}
public function offsetSet( $option, $value )
{
update_site_option( $option, $value );
}
public function offsetUnset( $option )
{
delete_site_option( $option );
}
}

View File

@ -1,18 +0,0 @@
<?php
namespace Shy\WordPress;
use plugins\buena\use\shyabstract class Theme extends Plugin
{
public function __construct()
{
$GLOBALS['content_width'] = $this->getContentWidth();
}
/**
* @return integer
*/
abstract public function getContentWidth();
}

View File

@ -1,20 +0,0 @@
<?php
/**
* Try to load a Shy WordPress class.
*
* @param string $name
* @return boolean
*/
function shy_wordpress_autoloader( $name )
{
if ( substr( $name, 0, 14 ) !== 'Shy\\WordPress\\' ) {
return false;
}
$name = __DIR__ . '/' . str_replace( '\\', DIRECTORY_SEPARATOR, $name ) . '.php';
return is_file( $name ) && include( $name );
}
spl_autoload_register( 'shy_wordpress_autoloader' );

View File

@ -1,40 +0,0 @@
<?php
namespace Shy\WordPress\Tests;
use wordpress\src\Shy\WordPress\HookableTrait;
/**
* Check that HookableTrait actually works.
*
* @author Philipp Cordes <pc@irgendware.net>
*/
class HookableTraitTest extends \WP_UnitTestCase
{
use HookableTrait;
public function actionMethod()
{
}
public function testWorksAsAction()
{
$this->addHookMethod( 'shywp_test_action', 'actionMethod' );
$this->assertTrue( has_action( 'shywp_test_action' ), 'Registering an action via addHookMethod() worked.' );
}
public function filterMethod( $value )
{
return $value;
}
public function testWorksAsFilter()
{
$this->addHookMethod( 'shywp_test_filter', 'filterMethod' );
$this->assertTrue( has_filter( 'shywp_test_filter' ), 'Registering a filter via addHookMethod() worked.' );
}
}

View File

@ -1,181 +0,0 @@
<?php
namespace Shy\WordPress\Tests;
use wordpress\src\Shy\WordPress\SettingsPage;
use PHPUnit_Framework_MockObject_MockObject as MockObject;
use PHPUnit_Framework_MockObject_Builder_InvocationMocker as BuilderInvocationMocker;
class SettingsPageTest extends \WP_UnitTestCase
{
/**
* Mock a SettingsPage.
*
* @param string|null $slug
* @param string $capability
*
* @return wordpress\src\Shy\WordPress\SettingsPage|MockObject {
* @method BuilderInvocationMocker method(string)
* }
*/
protected function mockSettingsPage( $slug = null, $capability = 'manage_options' )
{
$builder = $this->getMockBuilder( 'plugins\buena\use\shy-wordpress\src\Shy\WordPress\SettingsPage' )
->enableProxyingToOriginalMethods();
if ( null === $slug ) {
$builder->disableOriginalConstructor();
} else {
$builder->setConstructorArgs( array( $slug, $capability ) );
}
return $builder->getMock();
}
/**
* Test reading defaults from the settings page.
*
* @covers wordpress\src\Shy\WordPress\SettingsPage::__construct()
* @covers wordpress\src\Shy\WordPress\SettingsPage::getDefaults()
* @covers wordpress\src\Shy\WordPress\SettingsPage::offsetExists()
* @covers wordpress\src\Shy\WordPress\SettingsPage::offsetGet()
* @expectedException OutOfBoundsException
*/
public function testReading()
{
$slug = 'shywp_settingspage_test_slug_reading';
$defaults = array( 'foo' => 'bar' );
$page = $this->mockSettingsPage( $slug );
$page->method( 'getDefaults' )->willReturn( $defaults );
$this->assertEquals( $defaults, get_option( $slug ) );
$this->assertArrayHasKey( 'foo', $page );
$this->assertEquals( $defaults['foo'], $page['foo'] );
$this->assertArrayNotHasKey( 'baz', $page );
$page['baz'];
}
/**
* Test writing to the settings page.
*
* @covers wordpress\src\Shy\WordPress\SettingsPage::offsetSet()
* @expectedException OutOfBoundsException
*/
public function testWriting()
{
$slug = 'shywp_settingspage_test_slug_writing';
$defaults = array( 'foo' => 'bar' );
$page = $this->mockSettingsPage( $slug );
$page->method( 'getDefaults' )->willReturn( $defaults );
$page['foo'] = 'foo';
$this->assertEquals( 'foo', $page['foo'] );
$page['baz'] = '123';
}
/**
* Fail to remove a setting.
*
* @covers SettingPage::offsetUnset()
* @expectedException BadMethodCallException
*/
public function testRemoving()
{
$slug = 'shywp_settingspage_test_slug_removing';
$defaults = array();
$page = $this->mockSettingsPage( $slug );
$page->method( 'getDefaults' )->willReturn( $defaults );
unset( $page['baz'] );
}
/**
* Test whether the settings page can be showed.
*
* @covers wordpress\src\Shy\WordPress\SettingsPage::__construct()
* @covers wordpress\src\Shy\WordPress\SettingsPage::getParentSlug()
* @covers wordpress\src\Shy\WordPress\SettingsPage::getPageTitle()
* @covers wordpress\src\Shy\WordPress\SettingsPage::getMenuTitle()
*/
public function testRegisterPage()
{
$this->expectOutputRegex( '/&lt;page&amp;title&gt;/' );
$slug = 'shywp_settingspage_test_slug_registerpage';
$page = $this->mockSettingsPage( $slug );
$page->method( 'getParentSlug' )->willReturn( 'index.php' );
$page->method( 'getPageTitle' )->willReturn( '<page&title>' );
$page->method( 'getMenuTitle' )->willReturn( '<menu&title>' );
$page->expects( $this->once() )->method( 'registerPage' )->with();
$page->expects( $this->once() )->method( 'registerSettings' )->with();
// FIXME: Simulate display of backend.
}
/**
* @covers wordpress\src\Shy\WordPress\SettingsPage::sanitizeOptions()
*/
public function testSanitize()
{
$slug = 'shywp_settingspage_test_slug_sanitize';
$page = $this->mockSettingsPage( $slug );
$page->method( 'sanitizeOptions' )->will( $this->returnArgument( 0 ) );
$page->expects( $this->atLeastOnce() )->method( 'sanitizeOptions' );
$this->markTestIncomplete();
// FIXME: Simulate form submission
}
public function testRenderTextField()
{
$this->expectOutputRegex( '/^<input type="text"/' );
$page = $this->mockSettingsPage();
$page->renderTextField( array(
'label_for' => 'foo',
'name' => 'bar',
) );
}
public function testRenderCheckboxField()
{
$this->expectOutputRegex( '/^<label><input type="checkbox"/' );
$page = $this->mockSettingsPage();
$page->renderCheckboxField( array(
'label_for' => 'foo',
'name' => 'bar',
'caption' => 'baz',
) );
}
public function testRenderPage()
{
$this->markTestIncomplete();
$this->expectOutputRegex( '/<form action="options.php" method="post">.*&lt;3&amp;&gt;.*cryptic_teaser.*</form>/' );
$slug = 'shywp_settingspage_test_slug_renderpage';
$page = $this->mockSettingsPage( $slug, 'read' );
$page->method( 'getPageTitle' )->willReturn( '<3&>' );
$page->method( 'renderSectionTeaser' )->will( $this->returnCallback( function () use ( $teaser ) {
echo 'cryptic_teaser';
} ) );
// FIXME: Simulate view of the settings page
$page->renderPage();
}
}

View File

@ -1,20 +0,0 @@
<?php
/**
* Try to load a Shy WordPress test class.
*
* @param string $name
* @return boolean
*/
function shy_wordpress_tests_autoloader( $name )
{
if ( substr( $name, 0, 20 ) !== 'Shy\\WordPress\\Tests\\' ) {
return false;
}
$name = __DIR__ . '/' . str_replace( '\\', DIRECTORY_SEPARATOR, $name ) . '.php';
return is_file( $name ) && include( $name );
}
spl_autoload_register( 'shy_wordpress_tests_autoloader' );

View File

@ -1,14 +0,0 @@
<?php
/**
* PHPUnit bootstrap file
*
* Variant of the one from github.com/tierra/wordpress-plugins-tests
*/
require_once '../src/autoloader.php';
require_once 'autoloader.php';
require_once ( getenv( 'WP_DEVELOP_DIR' ) ?: '../../../..' )
. '/tests/phpunit/includes/bootstrap.php';