From 191bc34e1608c65d8770f91b267616f3f8dcd0e9 Mon Sep 17 00:00:00 2001 From: Benjamin Klemencic Date: Thu, 17 Oct 2024 19:09:03 +0200 Subject: [PATCH 1/3] Update increment-version.js --- increment-version.js | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/increment-version.js b/increment-version.js index e41cb3f..edb361a 100644 --- a/increment-version.js +++ b/increment-version.js @@ -59,14 +59,26 @@ try { process.exit(1); } -// Update Stable tag in README.md -if (fs.existsSync(readmePath)) { - updateVersionInFile(readmePath, `Stable tag: ${oldVersion}`, `Stable tag: ${newVersion}`); +try { + // Update Stable tag in README.md + if (fs.existsSync(readmePath)) { + updateVersionInFile(readmePath, `Stable tag: ${oldVersion}`, `Stable tag: ${newVersion}`); + } else { + console.warn(`File ${readmePath} not found.`); + } +} catch (error) { + console.error(`Error updating version in file ${readmePath}:`, error); } -// Update version in rrze-hello-lenny.php -if (fs.existsSync(pluginFilePath)) { - updateVersionInFile(pluginFilePath, `Version: ${oldVersion}`, `Version: ${newVersion}`); +try { + // Update version in PLUGIN-NAME.php + if (fs.existsSync(pluginFilePath)) { + updateVersionInFile(pluginFilePath, `Version: ${oldVersion}`, `Version: ${newVersion}`); + } else { + console.warn(`File ${pluginFilePath} not found.`); + } +} catch (error) { + console.error(`Error updating version in file ${pluginFilePath}:`, error); } console.log(`Version successfully updated to ${newVersion}`); From 6efbb85703805daea868a03ca55ab2c958eac4c8 Mon Sep 17 00:00:00 2001 From: Benjamin Klemencic Date: Thu, 17 Oct 2024 19:10:07 +0200 Subject: [PATCH 2/3] 1.3.1 (successfully tested updated increment-version.js) --- README.md | 2 +- package.json | 2 +- rrze-hello-lenny.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4e9485f..4d9e9f4 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Tags: hello lenny, shortcode, block, fun Requires at least: 6.6 Tested up to: 6.6 Requires PHP: 8.2 -Stable tag: 1.3.0 +Stable tag: 1.3.1 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html Author: RRZE Webteam diff --git a/package.json b/package.json index d8192db..2408ed7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rrze-hello-lenny", - "version": "1.3.0", + "version": "1.3.1", "main": "build/index.js", "scripts": { "build-css": "node-sass --output-style compressed src/sass/ -o build/", diff --git a/rrze-hello-lenny.php b/rrze-hello-lenny.php index 9fc629a..08d99ed 100644 --- a/rrze-hello-lenny.php +++ b/rrze-hello-lenny.php @@ -6,7 +6,7 @@ * Plugin Name: RRZE Hello Lenny * Plugin URI: https://github.com/RRZE-Webteam/rrze-hello-lenny/ * Description: A plugin inspired by Hello Dolly, using both a shortcode and a Gutenberg block. - * Version: 1.3.0 + * Version: 1.3.1 * Requires at least: 6.6 * Requires PHP: 8.2 * Author: RRZE Webteam From 38bc194b0c8813a611c0af8ed2de6fe2789772c2 Mon Sep 17 00:00:00 2001 From: Lukas Niebler <58593037+lukasniebler@users.noreply.github.com> Date: Fri, 8 Nov 2024 09:49:01 +0100 Subject: [PATCH 3/3] Restructure the src directory Restructuring the src directory, removing the webpack.config, using create-block as a template, adding screenshots --- .editorconfig | 18 +++ README.md | 27 +--- assets/js/random-bark.js | 66 ++++++++++ assets/screenshot-1.png | Bin 0 -> 18879 bytes assets/screenshot-2.png | Bin 0 -> 45361 bytes build/block.asset.php | 1 - build/block.js | 1 - build/editor.asset.php | 1 - build/editor.css | 1 - build/editor.js | 0 build/frontend.asset.php | 1 - build/frontend.css | 1 - build/frontend.js | 0 build/hello-lenny/block.json | 37 ++++++ build/hello-lenny/index-rtl.css | 1 + build/hello-lenny/index.asset.php | 1 + build/hello-lenny/index.css | 1 + build/hello-lenny/index.js | 1 + build/hello-lenny/style-index-rtl.css | 1 + build/hello-lenny/style-index.css | 1 + includes/BlockEditor.php | 26 ++-- includes/Config.php | 1 + includes/Main.php | 27 +--- includes/Shortcode.php | 43 +++---- package.json | 11 +- readme.txt | 35 ++++++ rrze-hello-lenny.php | 11 +- src/hello-lenny/block.json | 37 ++++++ src/hello-lenny/edit.js | 117 ++++++++++++++++++ src/{sass => hello-lenny}/editor.scss | 10 ++ src/hello-lenny/index.js | 39 ++++++ src/hello-lenny/save.js | 20 +++ .../frontend.scss => hello-lenny/style.scss} | 16 ++- src/js/block.js | 108 ---------------- src/js/random-bark.js | 43 ------- webpack.config.js | 13 -- 36 files changed, 457 insertions(+), 260 deletions(-) create mode 100644 .editorconfig create mode 100644 assets/js/random-bark.js create mode 100644 assets/screenshot-1.png create mode 100644 assets/screenshot-2.png delete mode 100644 build/block.asset.php delete mode 100644 build/block.js delete mode 100644 build/editor.asset.php delete mode 100644 build/editor.css delete mode 100644 build/editor.js delete mode 100644 build/frontend.asset.php delete mode 100644 build/frontend.css delete mode 100644 build/frontend.js create mode 100644 build/hello-lenny/block.json create mode 100644 build/hello-lenny/index-rtl.css create mode 100644 build/hello-lenny/index.asset.php create mode 100644 build/hello-lenny/index.css create mode 100644 build/hello-lenny/index.js create mode 100644 build/hello-lenny/style-index-rtl.css create mode 100644 build/hello-lenny/style-index.css create mode 100644 readme.txt create mode 100644 src/hello-lenny/block.json create mode 100644 src/hello-lenny/edit.js rename src/{sass => hello-lenny}/editor.scss (72%) create mode 100644 src/hello-lenny/index.js create mode 100644 src/hello-lenny/save.js rename src/{sass/frontend.scss => hello-lenny/style.scss} (58%) delete mode 100644 src/js/block.js delete mode 100644 src/js/random-bark.js delete mode 100644 webpack.config.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..b5df0fc --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +# This file is for unifying the coding style for different editors and IDEs +# editorconfig.org + +# WordPress Coding Standards +# https://make.wordpress.org/core/handbook/coding-standards/ + +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = tab + +[*.{yml,yaml}] +indent_style = space +indent_size = 2 diff --git a/README.md b/README.md index 4d9e9f4..cee5d2e 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,10 @@ -=== RRZE Hello Lenny === -Contributors: rrze-webteam -Plugin URI: https://github.com/RRZE-Webteam/rrze-hello-lenny/ -Tags: hello lenny, shortcode, block, fun -Requires at least: 6.6 -Tested up to: 6.6 -Requires PHP: 8.2 -Stable tag: 1.3.1 -License: GPLv2 or later -License URI: http://www.gnu.org/licenses/gpl-2.0.html -Author: RRZE Webteam -Author URI: https://blogs.fau.de/webworking/ -Text Domain: rrze-hello-lenny -Domain Path: /languages - -[![Aktuelle Version](https://img.shields.io/github/package-json/v/rrze-webteam/rrze-hello-lenny/main?label=Version)](https://github.com/RRZE-Webteam/rrze-hello-lenny) -[![Release Version](https://img.shields.io/github/v/release/rrze-webteam/rrze-hello-lenny?label=Release+Version)](https://github.com/rrze-webteam/rrze-hello-lenny/releases/) -[![GitHub License](https://img.shields.io/github/license/rrze-webteam/rrze-hello-lenny)](https://github.com/RRZE-Webteam/rrze-hello-lenny) -[![GitHub issues](https://img.shields.io/github/issues/RRZE-Webteam/rrze-hello-lenny)](https://github.com/RRZE-Webteam/rrze-hello-lenny/issues) -![GitHub milestone details](https://img.shields.io/github/milestones/progress-percent/RRZE-Webteam/rrze-hello-lenny/3) +[![Aktuelle Version](https://img.shields.io/github/package-json/v/rrze-webteam/rrze-hello-lenny/main?label=Version)](https://github.com/RRZE-Webteam/rrze-hello-lenny) [![Release Version](https://img.shields.io/github/v/release/rrze-webteam/rrze-hello-lenny?label=Release+Version)](https://github.com/rrze-webteam/rrze-hello-lenny/releases/) [![GitHub License](https://img.shields.io/github/license/rrze-webteam/rrze-hello-lenny)](https://github.com/RRZE-Webteam/rrze-hello-lenny) [![GitHub issues](https://img.shields.io/github/issues/RRZE-Webteam/rrze-hello-lenny)](https://github.com/RRZE-Webteam/rrze-hello-lenny/issues) ![GitHub milestone details](https://img.shields.io/github/milestones/progress-percent/RRZE-Webteam/rrze-hello-lenny/3) A plugin that brings Lenny to WordPress – with a shortcode and block. -This README.md file serves as a template: [GitHub Issue #8](https://github.com/RRZE-Webteam/rrze-hello-lenny/issues/8) - # RRZE Hello Lenny -This plugin is inspired by the famous "Hello Dolly" plugin and brings the dog Lenny to your WordPress site. It supports both a shortcode and a Gutenberg block. +This plugin is inspired by the "Hello Dolly" plugin and brings the dog Lenny to your WordPress site. It supports both a shortcode and a Gutenberg block. ## Using as a Block @@ -39,5 +18,5 @@ You can use the shortcode `[rrze-hello-lenny]` to add Lenny anywhere in your con ```html [hello-lenny] - +``` diff --git a/assets/js/random-bark.js b/assets/js/random-bark.js new file mode 100644 index 0000000..181d4c1 --- /dev/null +++ b/assets/js/random-bark.js @@ -0,0 +1,66 @@ +/** + * Use this file for JavaScript code that you want to run in the front-end + * on posts/pages that contain this block and wherever the shortcode is used. + * + * When this file is defined as the value of the `viewScript` property + * in `block.json` it will be enqueued on the front end of the site. + * + * Example: + * + * ```js + * { + * "viewScript": "script-handle" + * } + * ``` + * + * If you're not making any changes to this file because your project doesn't need any + * JavaScript running in the front-end, then you should delete this file and remove + * the `viewScript` property from `block.json`. + * + * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-metadata/#view-script + */ + +jQuery(document).ready(function ($) { + console.log("Wuff! Hello from the front-end!"); + const cssClasses = [ + "wouf-ucfirst", + "wouf-uppercase", + "wouf-lowercase", + "wouf-small", + "wouf-large", + "wouf-xlarge", + ]; + + function getRandomClass() { + // Randomly select one CSS class + const randomIndex = Math.floor(Math.random() * cssClasses.length); + return cssClasses[randomIndex]; + } + + // Function to append "Wouf!" to the paragraph + function appendWouf() { + // Find the paragraph element inside the blockquote + const $blockquote = $(".rrze-hello-lenny p"); + if ($blockquote.length === 0) { + return; // Exit if the blockquote element is not found + } + + // Create a new span element with the "Wouf!" text and set the class attribute + const $span = $("").text("Wouf!").attr("class", getRandomClass()); + + // Append the new span to the paragraph + $blockquote.append($span).append(" "); // Add a space after the "Wouf!" + } + + // Function to schedule the appending of "Wouf!" after a random delay + function scheduleWouf() { + const randomDelay = Math.floor(Math.random() * 5000) + 1000; // Random delay between 1s and 5s + setTimeout(function () { + appendWouf(); + scheduleWouf(); // Schedule the next "Wouf!" append + }, randomDelay); + } + + // Start the initial "Wouf!" scheduling + scheduleWouf(); +}); diff --git a/assets/screenshot-1.png b/assets/screenshot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..6d62d076f06083bf7ebaa04436f9f22a9e0c678d GIT binary patch literal 18879 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 N@<3CmO!3Lf{|4!KOymFn literal 0 HcmV?d00001 diff --git a/assets/screenshot-2.png b/assets/screenshot-2.png new file mode 100644 index 0000000000000000000000000000000000000000..55a35e416236a2847252da467fba930b97124976 GIT binary patch literal 45361 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 array(), 'version' => '4215db89d846e18af242'); diff --git a/build/block.js b/build/block.js deleted file mode 100644 index 61e574e..0000000 --- a/build/block.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{var e,o,l,r,n,t,s,a,i,c,u,__;e=window.wp.blocks,o=window.wp.element,l=window.wp.blockEditor,r=window.wp.components,n=window.wp.i18n,t=o.createElement,s=e.registerBlockType,a=l.InspectorControls,i=r.PanelBody,c=r.TextControl,u=r.ColorPicker,s("lenny/quote-block",{title:(__=n.__)("Lenny Quote","rrze-hello-lenny"),icon:"format-quote",category:"widgets",attributes:{cssClasses:{type:"string",default:""},backgroundColor:{type:"string",default:"#ffffff"},borderColor:{type:"string",default:"#000000"}},edit:function(e){var o=e.attributes,l=e.setAttributes;return[t(a,{key:"inspector"},t(i,{title:__("Block Settings","rrze-hello-lenny"),initialOpen:!0},t(c,{label:__("CSS Classes","rrze-hello-lenny"),value:o.cssClasses,onChange:function(e){l({cssClasses:e})}}),t("div",{style:{marginBottom:"20px"}},t(u,{label:__("Background Color","rrze-hello-lenny"),color:o.backgroundColor,onChangeComplete:function(e){l({backgroundColor:e.hex})},disableAlpha:!0})),t("div",{style:{marginBottom:"20px"}},t(u,{label:__("Border Color","rrze-hello-lenny"),color:o.borderColor,onChangeComplete:function(e){l({borderColor:e.hex})},disableAlpha:!0})))),t("blockquote",{className:"rrze-hello-lenny "+o.cssClasses,style:{backgroundColor:o.backgroundColor,borderColor:o.borderColor,borderStyle:"solid"},lang:"de"},t("p",{},t("span",{className:"wouf-ucfirst"},__("Wuff!","rrze-hello-lenny"))," ",t("span",{className:"wouf-ucfirst wouf-uppercase"},__("Wuff!","rrze-hello-lenny"))),t("cite",{},"🐶 Lenny"))]},save:function(){return null}})})(); \ No newline at end of file diff --git a/build/editor.asset.php b/build/editor.asset.php deleted file mode 100644 index 7f1de7e..0000000 --- a/build/editor.asset.php +++ /dev/null @@ -1 +0,0 @@ - array(), 'version' => 'e9bff0d4310710d7800b'); diff --git a/build/editor.css b/build/editor.css deleted file mode 100644 index 8112867..0000000 --- a/build/editor.css +++ /dev/null @@ -1 +0,0 @@ -.rrze-hello-lenny.shortcode{border-style:solid}.rrze-hello-lenny.block{border-style:dotted}.rrze-hello-lenny .wouf-ucfirst{text-transform:lowercase}.rrze-hello-lenny .wouf-lowercase,.rrze-hello-lenny .wouf-ucfirst:first-letter,.rrze-hello-lenny .wouf-uppercase{text-transform:uppercase}.rrze-hello-lenny .wouf-small{font-size:.8rem}.rrze-hello-lenny .wouf-large{font-size:1.5rem}.rrze-hello-lenny .wouf-xlarge{font-size:2rem} diff --git a/build/editor.js b/build/editor.js deleted file mode 100644 index e69de29..0000000 diff --git a/build/frontend.asset.php b/build/frontend.asset.php deleted file mode 100644 index 7f1de7e..0000000 --- a/build/frontend.asset.php +++ /dev/null @@ -1 +0,0 @@ - array(), 'version' => 'e9bff0d4310710d7800b'); diff --git a/build/frontend.css b/build/frontend.css deleted file mode 100644 index 8112867..0000000 --- a/build/frontend.css +++ /dev/null @@ -1 +0,0 @@ -.rrze-hello-lenny.shortcode{border-style:solid}.rrze-hello-lenny.block{border-style:dotted}.rrze-hello-lenny .wouf-ucfirst{text-transform:lowercase}.rrze-hello-lenny .wouf-lowercase,.rrze-hello-lenny .wouf-ucfirst:first-letter,.rrze-hello-lenny .wouf-uppercase{text-transform:uppercase}.rrze-hello-lenny .wouf-small{font-size:.8rem}.rrze-hello-lenny .wouf-large{font-size:1.5rem}.rrze-hello-lenny .wouf-xlarge{font-size:2rem} diff --git a/build/frontend.js b/build/frontend.js deleted file mode 100644 index e69de29..0000000 diff --git a/build/hello-lenny/block.json b/build/hello-lenny/block.json new file mode 100644 index 0000000..19eb387 --- /dev/null +++ b/build/hello-lenny/block.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "rrze/hello-lenny", + "version": "0.1.0", + "title": "Hello Lenny", + "category": "widgets", + "icon": "smiley", + "description": "Example block scaffolded with Create Block tool.", + "example": {}, + "supports": { + "html": false + }, + "attributes": { + "cssClasses": { + "type": "string", + "default": "" + }, + "backgroundColor": { + "type": "string", + "default": "#ffffff" + }, + "borderColor": { + "type": "string", + "default": "#000000" + }, + "textColor": { + "type": "string", + "default": "#000000" + } + }, + "textdomain": "rrze-hello-lenny", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-index.css", + "viewScript": "lenny-random-bark" +} \ No newline at end of file diff --git a/build/hello-lenny/index-rtl.css b/build/hello-lenny/index-rtl.css new file mode 100644 index 0000000..9a300b4 --- /dev/null +++ b/build/hello-lenny/index-rtl.css @@ -0,0 +1 @@ +.wp-block-create-block-hello-ruediger{border:1px dotted red}.rrze-hello-lenny.shortcode{border-style:solid}.rrze-hello-lenny.block{border-style:dotted}.rrze-hello-lenny .wouf-ucfirst{text-transform:lowercase}.rrze-hello-lenny .wouf-lowercase,.rrze-hello-lenny .wouf-ucfirst:first-letter,.rrze-hello-lenny .wouf-uppercase{text-transform:uppercase}.rrze-hello-lenny .wouf-small{font-size:.8rem}.rrze-hello-lenny .wouf-large{font-size:1.5rem}.rrze-hello-lenny .wouf-xlarge{font-size:2rem} diff --git a/build/hello-lenny/index.asset.php b/build/hello-lenny/index.asset.php new file mode 100644 index 0000000..beca230 --- /dev/null +++ b/build/hello-lenny/index.asset.php @@ -0,0 +1 @@ + array('react-jsx-runtime', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-i18n'), 'version' => '804655961add3d4f6934'); diff --git a/build/hello-lenny/index.css b/build/hello-lenny/index.css new file mode 100644 index 0000000..9a300b4 --- /dev/null +++ b/build/hello-lenny/index.css @@ -0,0 +1 @@ +.wp-block-create-block-hello-ruediger{border:1px dotted red}.rrze-hello-lenny.shortcode{border-style:solid}.rrze-hello-lenny.block{border-style:dotted}.rrze-hello-lenny .wouf-ucfirst{text-transform:lowercase}.rrze-hello-lenny .wouf-lowercase,.rrze-hello-lenny .wouf-ucfirst:first-letter,.rrze-hello-lenny .wouf-uppercase{text-transform:uppercase}.rrze-hello-lenny .wouf-small{font-size:.8rem}.rrze-hello-lenny .wouf-large{font-size:1.5rem}.rrze-hello-lenny .wouf-xlarge{font-size:2rem} diff --git a/build/hello-lenny/index.js b/build/hello-lenny/index.js new file mode 100644 index 0000000..f73f6d1 --- /dev/null +++ b/build/hello-lenny/index.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,r={886:()=>{const e=window.wp.blocks,r=window.wp.i18n,o=(window.wp.components,window.wp.blockEditor),l=window.ReactJSXRuntime,n=JSON.parse('{"UU":"rrze/hello-lenny"}');(0,e.registerBlockType)(n.UU,{edit:function({attributes:e,setAttributes:n}){const{cssClasses:t,backgroundColor:s,borderColor:i,textColor:a}=e,c=(0,o.useBlockProps)({className:t,style:{backgroundColor:s,borderColor:i,borderStyle:"solid",color:a}});return(0,l.jsxs)("div",{...c,children:[(0,l.jsx)(o.InspectorControls,{children:(0,l.jsx)(o.PanelColorSettings,{title:(0,r.__)("Color Settings","rrze-hello-lenny"),initialOpen:!0,colorSettings:[{value:s,onChange:e=>{n({backgroundColor:e})},label:(0,r.__)("Background Color","rrze-hello-lenny")},{value:i,onChange:e=>{n({borderColor:e})},label:(0,r.__)("Border Color","rrze-hello-lenny")},{value:a,onChange:e=>{n({textColor:e})},label:(0,r.__)("Text Color","rrze-hello-lenny")}],children:(0,l.jsx)(o.ContrastChecker,{textColor:a,backgroundColor:s})})}),(0,l.jsxs)("blockquote",{lang:"de",children:[(0,l.jsxs)("p",{children:[(0,l.jsx)("span",{className:"wouf-ucfirst",children:(0,r.__)("Wuff!","rrze-hello-lenny")}),(0,l.jsx)("span",{className:"wouf-ucfirst wouf-uppercase",children:(0,r.__)("Wuff!","rrze-hello-lenny")})]}),(0,l.jsx)("cite",{children:"🐶 Lenny"})]})]})},save:function(){return null}})}},o={};function l(e){var n=o[e];if(void 0!==n)return n.exports;var t=o[e]={exports:{}};return r[e](t,t.exports,l),t.exports}l.m=r,e=[],l.O=(r,o,n,t)=>{if(!o){var s=1/0;for(u=0;u=t)&&Object.keys(l.O).every((e=>l.O[e](o[a])))?o.splice(a--,1):(i=!1,t0&&e[u-1][2]>t;u--)e[u]=e[u-1];e[u]=[o,n,t]},l.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),(()=>{var e={189:0,609:0};l.O.j=r=>0===e[r];var r=(r,o)=>{var n,t,s=o[0],i=o[1],a=o[2],c=0;if(s.some((r=>0!==e[r]))){for(n in i)l.o(i,n)&&(l.m[n]=i[n]);if(a)var u=a(l)}for(r&&r(o);cl(886)));n=l.O(n)})(); \ No newline at end of file diff --git a/build/hello-lenny/style-index-rtl.css b/build/hello-lenny/style-index-rtl.css new file mode 100644 index 0000000..1b9aa36 --- /dev/null +++ b/build/hello-lenny/style-index-rtl.css @@ -0,0 +1 @@ +.rrze-hello-lenny{padding:1rem 2rem}.rrze-hello-lenny.shortcode{border-style:solid}.rrze-hello-lenny.block{border-style:dotted}.rrze-hello-lenny .wouf-ucfirst{text-transform:lowercase}.rrze-hello-lenny .wouf-lowercase,.rrze-hello-lenny .wouf-ucfirst:first-letter,.rrze-hello-lenny .wouf-uppercase{text-transform:uppercase}.rrze-hello-lenny .wouf-small{font-size:1rem;padding:1rem}.rrze-hello-lenny .wouf-large{font-size:2.5rem;padding:2.5rem}.rrze-hello-lenny .wouf-xlarge{font-size:4rem;padding:4rem} diff --git a/build/hello-lenny/style-index.css b/build/hello-lenny/style-index.css new file mode 100644 index 0000000..1b9aa36 --- /dev/null +++ b/build/hello-lenny/style-index.css @@ -0,0 +1 @@ +.rrze-hello-lenny{padding:1rem 2rem}.rrze-hello-lenny.shortcode{border-style:solid}.rrze-hello-lenny.block{border-style:dotted}.rrze-hello-lenny .wouf-ucfirst{text-transform:lowercase}.rrze-hello-lenny .wouf-lowercase,.rrze-hello-lenny .wouf-ucfirst:first-letter,.rrze-hello-lenny .wouf-uppercase{text-transform:uppercase}.rrze-hello-lenny .wouf-small{font-size:1rem;padding:1rem}.rrze-hello-lenny .wouf-large{font-size:2.5rem;padding:2.5rem}.rrze-hello-lenny .wouf-xlarge{font-size:4rem;padding:4rem} diff --git a/includes/BlockEditor.php b/includes/BlockEditor.php index 33ff41d..c6f55a2 100644 --- a/includes/BlockEditor.php +++ b/includes/BlockEditor.php @@ -12,33 +12,35 @@ public function __construct($defaultAttributes) { $this->defaultAttributes = $defaultAttributes; add_action('init', [$this, 'registerBlock']); - add_action('enqueue_block_assets', [$this, 'enqueueBlockAssets']); + // add_action('enqueue_block_assets', [$this, 'enqueueBlockAssets']); } public function registerBlock() { - register_block_type('lenny/quote-block', [ - 'editor_script' => 'lenny-block-editor-script', - 'editor_style' => 'lenny-block-editor-style', - 'style' => 'lenny-block-style', - 'render_callback' => [$this, 'renderBlock'] - ]); + register_block_type( + dirname(__DIR__) . '/build/hello-lenny', + array( + 'render_callback' => array($this, 'renderBlock'), + ) + ); } + public function enqueueBlockAssets() { - if (!is_admin()) { - wp_enqueue_style('lenny-block-style'); - } + // if (!is_admin()) { + // wp_enqueue_style('lenny-block-style'); + // } } public function renderBlock($attributes) { // Sanitize attributes - $attributes['css_classes'] = !empty($attributes['cssClasses']) ? sanitize_hex_color($attributes['cssClasses']) : ''; + $attributes['css_classes'] = !empty($attributes['cssClasses']) ? sanitize_text_field($attributes['cssClasses']) : ''; $attributes['background_color'] = !empty($attributes['backgroundColor']) ? sanitize_hex_color($attributes['backgroundColor']) : ''; $attributes['border_color'] = !empty($attributes['borderColor']) ? sanitize_hex_color($attributes['borderColor']) : ''; - + $attributes['text_color'] = !empty($attributes['textColor']) ? sanitize_hex_color($attributes['textColor']) : ''; + wp_enqueue_script('lenny-random-bark'); return Shortcode::generateWuffOutput($attributes); diff --git a/includes/Config.php b/includes/Config.php index 6a00912..3317808 100644 --- a/includes/Config.php +++ b/includes/Config.php @@ -19,6 +19,7 @@ public static function getDefaultAttributes() 'css_classes' => '', 'background_color' => '#ffffff', 'border_color' => '#000000', + 'text_color' => '#000000' ]; } } diff --git a/includes/Main.php b/includes/Main.php index ee13a05..1dd931d 100644 --- a/includes/Main.php +++ b/includes/Main.php @@ -23,7 +23,7 @@ class Main * The version of the plugin. * @var string */ - protected $pluginVersion; + protected $pluginVersion; /** * Assign values to variables. @@ -59,7 +59,7 @@ protected function setPluginVersion() { $pluginData = get_file_data($this->pluginFile, ['Version' => 'Version'], false); $this->pluginVersion = $pluginData['Version'] ?? '1.0.0'; - } + } /** * Register assets. @@ -69,32 +69,17 @@ public function registerAssets() // Register scripts and styles wp_register_script( 'lenny-random-bark', - plugins_url('src/js/random-bark.js', plugin_basename($this->pluginFile)), + plugin_dir_url($this->pluginFile) . 'assets/js/random-bark.js', ['jquery'], - filemtime(plugin_dir_path($this->pluginFile) . 'src/js/random-bark.js') ?: $this->pluginVersion, + $this->pluginVersion, true ); wp_register_style( 'lenny-frontend-style', - plugins_url('build/frontend.css', plugin_basename($this->pluginFile)), - [], - filemtime(plugin_dir_path($this->pluginFile) . 'build/frontend.css') ?: $this->pluginVersion - ); - - wp_register_script( - 'lenny-block-editor-script', - plugins_url('build/block.js', plugin_basename($this->pluginFile)), - ['wp-blocks', 'wp-element', 'wp-editor'], - filemtime(plugin_dir_path($this->pluginFile) . 'build/block.js') ?: $this->pluginVersion, - true - ); - - wp_register_style( - 'lenny-block-editor-style', - plugins_url('build/editor.css', plugin_basename($this->pluginFile)), + plugins_url('build/hello-lenny/style-index.css', plugin_basename($this->pluginFile)), [], - filemtime(plugin_dir_path($this->pluginFile) . 'build/editor.css') ?: $this->pluginVersion + $this->pluginVersion ); } diff --git a/includes/Shortcode.php b/includes/Shortcode.php index 731baee..e4ed0b1 100644 --- a/includes/Shortcode.php +++ b/includes/Shortcode.php @@ -6,7 +6,6 @@ class Shortcode { - protected $defaultAttributes; public function __construct($defaultAttributes) @@ -20,29 +19,25 @@ public function renderShortcode($attributes = []) // Merge user-provided attributes with default values $attributes = shortcode_atts($this->defaultAttributes, $attributes); - // Sanitize parameters $attributes['css_classes'] = sanitize_text_field($attributes['css_classes']); - $attributes['background_color'] = sanitize_text_field($attributes['background_color']); - $attributes['border_color'] = sanitize_text_field($attributes['border_color']); - - // echo '
';
-        // var_dump($attributes);
-        // exit;
+        $attributes['background_color'] = sanitize_hex_color($attributes['background_color']);
+        $attributes['border_color'] = sanitize_hex_color($attributes['border_color']);
+        $attributes['text_color'] = sanitize_hex_color($attributes['text_color']);
 
         // Enqueue assets
         wp_enqueue_style('lenny-frontend-style');
         wp_enqueue_script('lenny-random-bark');
 
         // Generate the output
-        return $this->generateWuffOutput($attributes);
+        return self::generateWuffOutput($attributes);
     }
 
     public static function generateWuffOutput($attributes)
     {
         $lang = get_bloginfo('language');
         $numWuffs = rand(1, 4);
-    
+
         $cssClasses = [
             'wouf-ucfirst',
             'wouf-uppercase',
@@ -51,27 +46,33 @@ public static function generateWuffOutput($attributes)
             'wouf-large',
             'wouf-xlarge'
         ];
-    
+
         // Add custom CSS classes
         $customClasses = !empty($attributes['css_classes']) ? esc_attr($attributes['css_classes']) : '';
-    
+
         // Create the blockquote with custom styles
         $style = sprintf(
-            'background-color: %s; border-color: %s;',
+            'background-color: %s; border-color: %s; color: %s;',
             esc_attr($attributes['background_color']),
-            esc_attr($attributes['border_color'])
+            esc_attr($attributes['border_color']),
+            esc_attr($attributes['text_color'])
         );
-    
-        $output = sprintf('

', $customClasses, esc_attr($lang), $style); - + + $output = sprintf( + '

', + $customClasses, + esc_attr($lang), + $style + ); + for ($i = 0; $i < $numWuffs; $i++) { $randomIndex = array_rand($cssClasses); $classString = $cssClasses[$randomIndex]; - $output .= '' . esc_html(__('Wouf!', 'rrze-hello-lenny')) . ' '; + $output .= '' . esc_html__('Wouf!', 'rrze-hello-lenny') . ' '; } - + $output .= '

🐶 Lenny
'; - + return $output; } - } +} diff --git a/package.json b/package.json index 2408ed7..ff96707 100644 --- a/package.json +++ b/package.json @@ -3,11 +3,14 @@ "version": "1.3.1", "main": "build/index.js", "scripts": { - "build-css": "node-sass --output-style compressed src/sass/ -o build/", - "watch-css": "node-sass --watch src/sass/ -o build/", + "build": "wp-scripts build", + "format": "wp-scripts format", + "lint:css": "wp-scripts lint-style", + "lint:js": "wp-scripts lint-js", + "packages-update": "wp-scripts packages-update", + "plugin-zip": "wp-scripts plugin-zip", + "start": "wp-scripts start", "increment-version": "node increment-version.js patch", - "build": "npm run increment-version && npm run build-css && wp-scripts build", - "start": "npm run watch-css && wp-scripts start", "precommit": "npm run increment-version" }, "devDependencies": { diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..0fafb48 --- /dev/null +++ b/readme.txt @@ -0,0 +1,35 @@ +=== Hello Ruediger === +Contributors: Regionales Rechenzentrum Erlangen (RRZE) +Tags: hello lenny, shortcode, block +Tested up to: 6.6 +Stable tag: 1.3.1 +License: GPL-2.0-or-later +License URI: https://www.gnu.org/licenses/gpl-2.0.html + +Example dynamic Block with Shortcode implementation + +== Description == + +This plugin shows a variation of the npx create-blocks package with Shortcode implementation. + +== Installation == + +1. Upload the plugin files to the `/wp-content/plugins/rrze-hello-lenny` directory, or install the plugin through the WordPress plugins screen directly. +1. Activate the plugin through the 'Plugins' screen in WordPress + + +== Frequently Asked Questions == + += Why Hello Lenny? = + +This plugin is inspired by the "Hello Dolly" plugin and brings the dog Lenny to your WordPress site. It supports both a shortcode and a Gutenberg block. + +== Screenshots == + +1. Lenny just barks all day long without any end in sight. +2. Wouf wouf… + +== Changelog == + += 1.0.0 = +* Release \ No newline at end of file diff --git a/rrze-hello-lenny.php b/rrze-hello-lenny.php index 08d99ed..fdce99c 100644 --- a/rrze-hello-lenny.php +++ b/rrze-hello-lenny.php @@ -130,12 +130,13 @@ function onLoaded() $tag = is_plugin_active_for_network(plugin_basename(__FILE__)) ? 'network_admin_notices' : 'admin_notices'; add_action($tag, function () use ($pluginName, $error) { printf( - '

' . + '

%s

', + sprintf( /* translators: 1: The plugin name, 2: The error string. */ - esc_html__('Plugins: %1$s: %2$s', 'rrze-hello-lenny') . - '

', - $pluginName, - $error + esc_html__('Plugins: %1$s: %2$s', 'rrze-hello-lenny'), + esc_html($pluginName), + esc_html($error) + ) ); }); } diff --git a/src/hello-lenny/block.json b/src/hello-lenny/block.json new file mode 100644 index 0000000..e87aca5 --- /dev/null +++ b/src/hello-lenny/block.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "rrze/hello-lenny", + "version": "0.1.0", + "title": "Hello Lenny", + "category": "widgets", + "icon": "smiley", + "description": "Example block scaffolded with Create Block tool.", + "example": {}, + "supports": { + "html": false + }, + "attributes": { + "cssClasses": { + "type": "string", + "default": "" + }, + "backgroundColor": { + "type": "string", + "default": "#ffffff" + }, + "borderColor": { + "type": "string", + "default": "#000000" + }, + "textColor": { + "type": "string", + "default": "#000000" + } + }, + "textdomain": "rrze-hello-lenny", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css", + "style": "file:./style-index.css", + "viewScript": "lenny-random-bark" +} diff --git a/src/hello-lenny/edit.js b/src/hello-lenny/edit.js new file mode 100644 index 0000000..a7fd5d3 --- /dev/null +++ b/src/hello-lenny/edit.js @@ -0,0 +1,117 @@ +/** + * Retrieves the translation of text. + * + * @see https://developer.wordpress.org/block-editor/reference-guides/packages/packages-i18n/ + */ +import { __ } from "@wordpress/i18n"; + +/** + * Import all the components we need from the WordPress library. + * You can find a complete list with components here: https://wordpress.github.io/gutenberg/?path=/docs/docs-introduction--page + */ +import { PanelBody, PanelRow, TextControl } from "@wordpress/components"; + +/** + * React hook that is used to mark the block wrapper element. + * It provides all the necessary props like the class name. + * + * @see https://developer.wordpress.org/block-editor/reference-guides/packages/packages-block-editor/#useblockprops + */ +import { + InspectorControls, + PanelColorSettings, + ContrastChecker, + useBlockProps, +} from "@wordpress/block-editor"; + +/** + * Lets webpack process CSS, SASS or SCSS files referenced in JavaScript files. + * Those files can contain any CSS code that gets applied to the editor. + * + * @see https://www.npmjs.com/package/@wordpress/scripts#using-css + */ +import "./editor.scss"; + +/** + * The edit function describes the structure of your block in the context of the + * editor. This represents what the editor will render when the block is used. + * + * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-edit-save/#edit + * + * @return {Element} Element to render. + */ +export default function Edit({ attributes, setAttributes }) { + const { cssClasses, backgroundColor, borderColor, textColor } = attributes; + + // Update attribute values. + const onChangeCssClasses = (newCssClasses) => { + setAttributes({ cssClasses: newCssClasses }); + }; + + const onChangeBackgroundColor = (newBackgroundColor) => { + setAttributes({ backgroundColor: newBackgroundColor }); + }; + + const onChangeBorderColor = (newBorderColor) => { + setAttributes({ borderColor: newBorderColor }); + }; + + const onChangeTextColor = (newTextColor) => { + setAttributes({ textColor: newTextColor }); + }; + + // Apply styles and classes to the block. + const blockProps = useBlockProps({ + className: cssClasses, + style: { + backgroundColor: backgroundColor, + borderColor: borderColor, + borderStyle: "solid", + color: textColor, + }, + }); + + return ( +
+ + + + + +
+

+ + {__("Wuff!", "rrze-hello-lenny")} + + + {__("Wuff!", "rrze-hello-lenny")} + +

+ 🐶 Lenny +
+
+ ); +} diff --git a/src/sass/editor.scss b/src/hello-lenny/editor.scss similarity index 72% rename from src/sass/editor.scss rename to src/hello-lenny/editor.scss index 06c79a0..28128ca 100644 --- a/src/sass/editor.scss +++ b/src/hello-lenny/editor.scss @@ -1,3 +1,13 @@ +/** + * The following styles get applied inside the editor only. + * + * Replace them with your own styles or remove the file completely. + */ + + .wp-block-create-block-hello-ruediger { + border: 1px dotted #f00; +} + .rrze-hello-lenny { &.shortcode { border-style: solid; diff --git a/src/hello-lenny/index.js b/src/hello-lenny/index.js new file mode 100644 index 0000000..ade1e47 --- /dev/null +++ b/src/hello-lenny/index.js @@ -0,0 +1,39 @@ +/** + * Registers a new block provided a unique name and an object defining its behavior. + * + * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-registration/ + */ +import { registerBlockType } from '@wordpress/blocks'; + +/** + * Lets webpack process CSS, SASS or SCSS files referenced in JavaScript files. + * All files containing `style` keyword are bundled together. The code used + * gets applied both to the front of your site and to the editor. + * + * @see https://www.npmjs.com/package/@wordpress/scripts#using-css + */ +import './style.scss'; + +/** + * Internal dependencies + */ +import Edit from './edit'; +import save from './save'; +import metadata from './block.json'; + +/** + * Every block starts by registering a new block type definition. + * + * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-registration/ + */ +registerBlockType( metadata.name, { + /** + * @see ./edit.js + */ + edit: Edit, + + /** + * @see ./save.js + */ + save, +} ); diff --git a/src/hello-lenny/save.js b/src/hello-lenny/save.js new file mode 100644 index 0000000..5a12b1c --- /dev/null +++ b/src/hello-lenny/save.js @@ -0,0 +1,20 @@ +/** + * React hook that is used to mark the block wrapper element. + * It provides all the necessary props like the class name. + * + * @see https://developer.wordpress.org/block-editor/reference-guides/packages/packages-block-editor/#useblockprops + */ +import { useBlockProps } from '@wordpress/block-editor'; + +/** + * The save function defines the way in which the different attributes should + * be combined into the final markup, which is then serialized by the block + * editor into `post_content`. + * + * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-edit-save/#save + * + * @return {Element} Element to render. + */ +export default function save() { + return null; // Rendered in PHP +} diff --git a/src/sass/frontend.scss b/src/hello-lenny/style.scss similarity index 58% rename from src/sass/frontend.scss rename to src/hello-lenny/style.scss index 06c79a0..e9149ad 100644 --- a/src/sass/frontend.scss +++ b/src/hello-lenny/style.scss @@ -1,4 +1,11 @@ +/** + * The following styles get applied both on the front of your site + * and in the editor. + * + * Replace them with your own styles or remove the file completely. + */ .rrze-hello-lenny { + padding: 1rem 2rem; &.shortcode { border-style: solid; } @@ -21,12 +28,15 @@ text-transform: uppercase; } .wouf-small { - font-size: 0.8rem; + font-size: 1rem; + padding: 1rem; } .wouf-large { - font-size: 1.5rem; + font-size: 2.5rem; + padding: 2.5rem; } .wouf-xlarge { - font-size: 2rem; + font-size: 4rem; + padding: 4rem; } } diff --git a/src/js/block.js b/src/js/block.js deleted file mode 100644 index a50ba88..0000000 --- a/src/js/block.js +++ /dev/null @@ -1,108 +0,0 @@ -(function (blocks, element, blockEditor, components, i18n) { - var el = element.createElement; - var registerBlockType = blocks.registerBlockType; - var InspectorControls = blockEditor.InspectorControls; - var PanelBody = components.PanelBody; - var TextControl = components.TextControl; - var ColorPicker = components.ColorPicker; - var __ = i18n.__; - - registerBlockType("lenny/quote-block", { - title: __("Lenny Quote", "rrze-hello-lenny"), - icon: "format-quote", - category: "widgets", - attributes: { - cssClasses: { - type: "string", - default: "" - }, - backgroundColor: { - type: "string", - default: "#ffffff" - }, - borderColor: { - type: "string", - default: "#000000" - } - }, - edit: function (props) { - var attributes = props.attributes; - var setAttributes = props.setAttributes; - - return [ - el( - InspectorControls, - { key: "inspector" }, - el( - PanelBody, - { title: __("Block Settings", "rrze-hello-lenny"), initialOpen: true }, - el(TextControl, { - label: __("CSS Classes", "rrze-hello-lenny"), - value: attributes.cssClasses, - onChange: function (newVal) { - setAttributes({ cssClasses: newVal }); - } - }), - el("div", { style: { marginBottom: "20px" } }, - el(ColorPicker, { - label: __("Background Color", "rrze-hello-lenny"), - color: attributes.backgroundColor, - onChangeComplete: function (newColor) { - setAttributes({ backgroundColor: newColor.hex }); - }, - disableAlpha: true - }) - ), - el("div", { style: { marginBottom: "20px" } }, - el(ColorPicker, { - label: __("Border Color", "rrze-hello-lenny"), - color: attributes.borderColor, - onChangeComplete: function (newColor) { - setAttributes({ borderColor: newColor.hex }); - }, - disableAlpha: true - }) - ) - ) - ), - el( - "blockquote", - { - className: "rrze-hello-lenny " + attributes.cssClasses, - style: { - backgroundColor: attributes.backgroundColor, - borderColor: attributes.borderColor, - borderStyle: "solid" - }, - lang: "de" - }, - el( - "p", - {}, - el( - "span", - { className: "wouf-ucfirst" }, - __("Wuff!", "rrze-hello-lenny") - ), - " ", - el( - "span", - { className: "wouf-ucfirst wouf-uppercase" }, - __("Wuff!", "rrze-hello-lenny") - ) - ), - el("cite", {}, "🐶 Lenny") - ) - ]; - }, - save: function () { - return null; // Rendered in PHP on the frontend - } - }); -})( - window.wp.blocks, - window.wp.element, - window.wp.blockEditor, - window.wp.components, - window.wp.i18n -); diff --git a/src/js/random-bark.js b/src/js/random-bark.js deleted file mode 100644 index be333d7..0000000 --- a/src/js/random-bark.js +++ /dev/null @@ -1,43 +0,0 @@ -jQuery(document).ready(function($) { - const cssClasses = [ - 'wouf-ucfirst', - 'wouf-uppercase', - 'wouf-lowercase', - 'wouf-small', - 'wouf-large', - 'wouf-xlarge' - ]; - - function getRandomClass() { - // Randomly select one CSS class - const randomIndex = Math.floor(Math.random() * cssClasses.length); - return cssClasses[randomIndex]; - } - - // Function to append "Wouf!" to the paragraph - function appendWouf() { - // Find the paragraph element inside the blockquote - const $blockquote = $('.rrze-hello-lenny p'); - if ($blockquote.length === 0) { - return; // Exit if the blockquote element is not found - } - - // Create a new span element with the "Wouf!" text and set the class attribute - const $span = $('').text('Wouf!').attr('class', getRandomClass()); - - // Append the new span to the paragraph - $blockquote.append($span).append(' '); // Add a space after the "Wouf!" - } - - // Function to schedule the appending of "Wouf!" after a random delay - function scheduleWouf() { - const randomDelay = Math.floor(Math.random() * 5000) + 1000; // Random delay between 1s and 5s - setTimeout(function() { - appendWouf(); - scheduleWouf(); // Schedule the next "Wouf!" append - }, randomDelay); - } - - // Start the initial "Wouf!" scheduling - scheduleWouf(); -}); diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 811fafb..0000000 --- a/webpack.config.js +++ /dev/null @@ -1,13 +0,0 @@ -const defaultConfig = require( '@wordpress/scripts/config/webpack.config' ); -module.exports = { - ...defaultConfig, - entry: { - 'block': './src/js/block.js', - 'editor': './src/sass/editor.scss', - 'frontend': './src/sass/frontend.scss' - }, - output: { - path: __dirname + '/build/', - filename: '[name].js' - } -};