Skip to content

Instantly share code, notes, and snippets.

View mortenson's full-sized avatar
💧
Did you try to clear cache?

Samuel Mortenson mortenson

💧
Did you try to clear cache?
View GitHub Profile
@mortenson
mortenson / secure_vendor_unserialize.php
Last active June 29, 2022 17:20
An idea about how to secure unserialize() calls in PHP dependencies that aren't using allowed_classes.
<?php
namespace Some\Namespace\I\Dont\Trust;
function unserialize($data, array $options = []) {
if (empty($options)) {
$options = [
'allowed_classes' => [
\DateTime::class, // Set to classes used in namespace.
],
@mortenson
mortenson / drupal_autowire.php
Last active May 7, 2022 17:55
Stupid auto wiring for any function/method in Drupal
<?php
// You shouldn't call this at runtime - do it when something builds (ex: plugins) and store the args somewhere.
function get_autowire_args(callable $callback, \Drupal\Component\DependencyInjection\Container $container) {
$cache = &drupal_static(__FUNCTION__);
$args = [];
$reflection = new \ReflectionFunction($callback);
foreach ($reflection->getParameters() as $i => $param) {
$type_obj = $param->getType();
if (!$type_obj || ($type_obj instanceof \ReflectionNamedType && $type_obj->isBuiltin())) {
@mortenson
mortenson / ddrush.sh
Last active March 20, 2022 09:51
What I currently use for local Drupal/Tome dev
#! /bin/bash
# This runs a new Docker container, mounts the current directory (Drupal root),
# and runs an arbitrary drush command, in case you don't want to run it in dsession.
sudo docker run --rm -it --init -v "$(pwd)":/var/www/tome mortenson/tome drush "$@"
@mortenson
mortenson / ghpages.js
Last active January 22, 2021 19:56
Publish a sub-directory in your repository as the contents of your gh-pages branch
/**
This script takes a sub-directory of your repository, renames relative links
in HTML files to point to a Github Pages subdirectory, and publishes to your
gh-pages branch.
Use:
1. Download this script into the root of your project.
2. Run npm install --save-dev fs-extra rebase gh-pages
3. Rename "your-project" to the name of your Github project
4. If you have more than one HTML file, add it to the "files"
@mortenson
mortenson / assets.sh
Last active September 28, 2020 11:37
Watch mode for a game I'm working on
#! /bin/bash
function processSprite {
file=$1
echo "Creating sprite sheet for $file..."
filename=$(basename $file .aseprite)
aseprite -b "$file" --sheet "assets/$filename-Sheet.png" > /dev/null
}
function processTilemap {
@mortenson
mortenson / index.js
Last active September 11, 2020 09:26
A quick CSS audit script for finding overly long/specific selectors in CSS files
#!/usr/bin/env node
// This is a quick CSS audit script I wrote for finding overly long/specific selectors in CSS files.
// Usage: Download this file, then run:
// $ npx https://gist.github.com/mortenson/628fd527a25efe4fd1a4940e14c31066 <space separated list of CSS files to audit>
const listSelectors = require('list-selectors');
const { calculate, compare } = require('specificity');
// This is useful if you want to anonymize the results to avoid blaming.
@mortenson
mortenson / example_alpine_autocomplete.sfc
Created July 8, 2020 14:04
Drupal single file components livewire demo
<!--
This is a complex but realistic example of how you might use frameworks like
Alpine.js and dom-diffing libraries like morphdom to create components that
are re-rendered server-side. This example is heavily influenced by Livewire.
In production, it might make more sense for just the dynamic part of the
component to be AJAX-ified, in this case that would probably mean making the
autocomplete results their own component. There are lots of ways to do this!
-->
@mortenson
mortenson / docker-drush
Last active January 7, 2020 11:53
Quick way to proxy Drush commands to your Docker container
#!/bin/bash
# Save this to a file named "drush" (not "drush.sh") and put it in the same
# directory as your docker-compose file. Replace "SERVICE" with your docker
# container's name.
# Now every time you run "drush" from this directory, it runs drush inside
# your container instead. Cool!
docker-compose exec SERVICE drush $@
@mortenson
mortenson / static.sh
Created October 31, 2019 23:10
An example script that caches Tome Static builds by copying the static directory and database to /tmp between builds. Useful on CI.
#!/bin/bash
# This directory should persist between builds.
CACHE_DIR=/tmp/tome_static
set -e
composer install
mkdir -p "$CACHE_DIR"
@mortenson
mortenson / DiceRoll.php
Created August 29, 2019 18:04
Thinking about how Drupal 8 single file components could abstractly provide forms and derive other plugins like blocks
<?php
namespace Drupal\sfc_example\Plugin\SingleFileComponent;
use Drupal\Core\Form\FormStateInterface;
use Drupal\sfc\ComponentBase;
/**
* Contains an example component that provides a block.
*