*
* @package org.cocur.slugify
* @author Florian Eckerstorfer <florian@eckerstorfer.co>
* @author Marchenko Alexandr
* @copyright 2012-2014 Florian Eckerstorfer
* @license http://www.opensource.org/licenses/MIT The MIT License
*/
interface SlugifyInterface
{
/**
* Return a URL safe version of a string.
*
* @param string $string
* @param string|array|null $options
*
* @return string
*
* @api
*/
public function slugify(string $string, array|string|null $options = null): string;
}
"syntax error, unexpected '|', expecting variable (T_VARIABLE) (View: /home/forge/dev.tfs.staging.poundandgrain.ca/releases/20241113033749/web/app/themes/tfs/resources/views/single.blade.php)"
*
* @param string $__path
* @param array $__data
* @return string
*/
protected function evaluatePath($__path, $__data)
{
$obLevel = ob_get_level();
ob_start();
extract($__data, EXTR_SKIP);
// We'll evaluate the contents of the view inside a try/catch block so we can
// flush out any stray output that might get out before an error occurs or
// an exception is thrown. This prevents any partial views from leaking.
try {
include $__path;
} catch (Throwable $e) {
$this->handleViewException($e, $obLevel);
}
return ltrim(ob_get_clean());
}
/**
* Handle a view exception.
*
* @param \Throwable $e
* @param int $obLevel
* @return void
*
* @throws \Throwable
*/
protected function handleViewException(Throwable $e, $obLevel)
{
while (ob_get_level() > $obLevel) {
ob_end_clean();
}
*
* @package org.cocur.slugify
* @author Florian Eckerstorfer <florian@eckerstorfer.co>
* @author Marchenko Alexandr
* @copyright 2012-2014 Florian Eckerstorfer
* @license http://www.opensource.org/licenses/MIT The MIT License
*/
interface SlugifyInterface
{
/**
* Return a URL safe version of a string.
*
* @param string $string
* @param string|array|null $options
*
* @return string
*
* @api
*/
public function slugify(string $string, array|string|null $options = null): string;
}
"syntax error, unexpected '|', expecting variable (T_VARIABLE)"
public function unregister()
{
spl_autoload_unregister(array($this, 'loadClass'));
if (null !== $this->vendorDir) {
unset(self::$registeredLoaders[$this->vendorDir]);
}
}
/**
* Loads the given class or interface.
*
* @param string $class The name of the class
* @return true|null True if loaded, null otherwise
*/
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
$includeFile = self::$includeFile;
$includeFile($file);
return true;
}
return null;
}
/**
* Finds the path to the file where the class is defined.
*
* @param string $class The name of the class
*
* @return string|false The path if found, false otherwise
*/
public function findFile($class)
{
// class map lookup
if (isset($this->classMap[$class])) {
return $this->classMap[$class];
}
*
* For the full copyright and license information, please view the LICENSE.md
* file that was distributed with this source code.
*
* ------------------------------------------------------------------
*/
declare(strict_types=1);
namespace TOC;
use Cocur\Slugify\Slugify;
use Cocur\Slugify\SlugifyInterface;
/**
* UniqueSlugify creates slugs from text without repeating the same slug twice per instance
*
* @author Casey McLaughlin <caseyamcl@gmail.com>
*/
class UniqueSlugify implements SlugifyInterface
{
/**
* @var SlugifyInterface
*/
private $slugify;
/**
* @var array
*/
private $used;
/**
* Constructor
*
* @param SlugifyInterface|null $slugify
*/
public function __construct(?SlugifyInterface $slugify = null)
{
$this->used = array();
$this->slugify = $slugify ?: new Slugify();
/**
* @return void
*/
private static function initializeIncludeClosure()
{
if (self::$includeFile !== null) {
return;
}
/**
* Scope isolated include.
*
* Prevents access to $this/self from included files.
*
* @param string $file
* @return void
*/
self::$includeFile = \Closure::bind(static function($file) {
include $file;
}, null, null);
}
}
"/home/forge/dev.tfs.staging.poundandgrain.ca/releases/20241113033749/vendor/caseyamcl/toc/src/UniqueSlugify.php"
public function unregister()
{
spl_autoload_unregister(array($this, 'loadClass'));
if (null !== $this->vendorDir) {
unset(self::$registeredLoaders[$this->vendorDir]);
}
}
/**
* Loads the given class or interface.
*
* @param string $class The name of the class
* @return true|null True if loaded, null otherwise
*/
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
$includeFile = self::$includeFile;
$includeFile($file);
return true;
}
return null;
}
/**
* Finds the path to the file where the class is defined.
*
* @param string $class The name of the class
*
* @return string|false The path if found, false otherwise
*/
public function findFile($class)
{
// class map lookup
if (isset($this->classMap[$class])) {
return $this->classMap[$class];
}
/**
* @var HTML5
*/
private $htmlParser;
/**
* @var SlugifyInterface
*/
private $slugifier;
/**
* Constructor
*
* @param HTML5|null $htmlParser
* @param SlugifyInterface|null $slugify
*/
public function __construct(?HTML5 $htmlParser = null, ?SlugifyInterface $slugify = null)
{
$this->htmlParser = $htmlParser ?? new HTML5();
$this->slugifier = $slugify ?? new UniqueSlugify();
}
/**
* Fix markup
*
* @param string $markup
* @param int $topLevel
* @param int $depth
* @return string Markup with added IDs
* @throws RuntimeException
*/
public function fix(string $markup, int $topLevel = 1, int $depth = 6): string
{
if (! $this->isFullHtmlDocument($markup)) {
$partialID = uniqid('toc_generator_');
$markup = sprintf("<body id='%s'>%s</body>", $partialID, $markup);
}
$domDocument = $this->htmlParser->loadHTML($markup);
$domDocument->preserveWhiteSpace = true; // do not clobber whitespace
<?php
namespace App\View\Composers;
use DOMDocument;
use Roots\Acorn\View\Composer;
class BlogPost extends Composer
{
protected static $views = [
'partials.content-single',
];
public function override()
{
$fields = get_fields();
$htmlContent = apply_filters( 'the_content', get_the_content() );
$markupFixer = new \TOC\MarkupFixer();
$tocGenerator = new \TOC\TocGenerator();
$htmlContent = $markupFixer->fix($htmlContent);
$fields['toc'] = $tocGenerator->getOrderedHtmlMenu($htmlContent);
$fields['the_content'] = $htmlContent;
$fields['the_category'] = $this->getCategory();
return $fields;
}
public function getCategory() {
$category = null;
if(get_the_terms(get_the_id(), 'category')) {
foreach(get_the_terms(get_the_id(), 'category') as $term) {
if($term->name !== "Blog" && $term->name !== "Events" && $term->name !== "News") {
$category = $term;
return $category;
}
}
}
*/
public function compose(View $view)
{
$this->view = $view;
$this->data = new Fluent($view->getData());
$view->with($this->merge());
}
/**
* Data to be merged and passed to the view before rendering.
*
* @return array
*/
protected function merge()
{
return array_merge(
$this->with(),
$this->view->getData(),
$this->override()
);
}
/**
* Data to be passed to view before rendering
*
* @return array
*/
protected function with()
{
return [];
}
/**
* Data to be passed to view before rendering
*
* @return array
*/
protected function override()
{
return static::$views;
}
$view = array_slice(explode('\\', static::class), 3);
$view = array_map([Str::class, 'snake'], $view, array_fill(0, count($view), '-'));
return implode('/', $view);
}
/**
* Compose the view before rendering.
*
* @param \Illuminate\View\View $view
* @return void
*/
public function compose(View $view)
{
$this->view = $view;
$this->data = new Fluent($view->getData());
$view->with($this->merge());
}
/**
* Data to be merged and passed to the view before rendering.
*
* @return array
*/
protected function merge()
{
return array_merge(
$this->with(),
$this->view->getData(),
$this->override()
);
}
/**
* Data to be passed to view before rendering
*
* @return array
return $callback;
}
/**
* Build a class based container callback Closure.
*
* @param string $class
* @param string $prefix
* @return \Closure
*/
protected function buildClassEventCallback($class, $prefix)
{
[$class, $method] = $this->parseClassEvent($class, $prefix);
// Once we have the class and method name, we can build the Closure to resolve
// the instance out of the IoC container and call the method on it with the
// given arguments that are passed to the Closure as the composer's data.
return function () use ($class, $method) {
return $this->container->make($class)->{$method}(...func_get_args());
};
}
/**
* Parse a class based composer name.
*
* @param string $class
* @param string $prefix
* @return array
*/
protected function parseClassEvent($class, $prefix)
{
return Str::parseCallback($class, $this->classEventMethodForPrefix($prefix));
}
/**
* Determine the class event method based on the given prefix.
*
* @param string $prefix
* @return string
* @param \Closure|string $listener
* @param bool $wildcard
* @return \Closure
*/
public function makeListener($listener, $wildcard = false)
{
if (is_string($listener)) {
return $this->createClassListener($listener, $wildcard);
}
if (is_array($listener) && isset($listener[0]) && is_string($listener[0])) {
return $this->createClassListener($listener, $wildcard);
}
return function ($event, $payload) use ($listener, $wildcard) {
if ($wildcard) {
return $listener($event, $payload);
}
return $listener(...array_values($payload));
};
}
/**
* Create a class based listener using the IoC container.
*
* @param string $listener
* @param bool $wildcard
* @return \Closure
*/
public function createClassListener($listener, $wildcard = false)
{
return function ($event, $payload) use ($listener, $wildcard) {
if ($wildcard) {
return call_user_func($this->createClassCallable($listener), $event, $payload);
}
$callable = $this->createClassCallable($listener);
return $callable(...array_values($payload));
* @param bool $halt
* @return array|null
*/
public function dispatch($event, $payload = [], $halt = false)
{
// When the given "event" is actually an object we will assume it is an event
// object and use the class as the event name and this event itself as the
// payload to the handler, which makes object based events quite simple.
[$event, $payload] = $this->parseEventAndPayload(
$event, $payload
);
if ($this->shouldBroadcast($payload)) {
$this->broadcastEvent($payload[0]);
}
$responses = [];
foreach ($this->getListeners($event) as $listener) {
$response = $listener($event, $payload);
// If a response is returned from the listener and event halting is enabled
// we will just return this response, and not call the rest of the event
// listeners. Otherwise we will add the response on the response list.
if ($halt && ! is_null($response)) {
return $response;
}
// If a boolean false is returned from a listener, we will stop propagating
// the event to any further listeners down in the chain, else we keep on
// looping through the listeners and firing every one in our sequence.
if ($response === false) {
break;
}
$responses[] = $response;
}
return $halt ? null : $responses;
}
protected function addEventListener($name, $callback)
{
if (Str::contains($name, '*')) {
$callback = function ($name, array $data) use ($callback) {
return $callback($data[0]);
};
}
$this->events->listen($name, $callback);
}
/**
* Call the composer for a given view.
*
* @param \Illuminate\Contracts\View\View $view
* @return void
*/
public function callComposer(ViewContract $view)
{
$this->events->dispatch('composing: '.$view->name(), [$view]);
}
/**
* Call the creator for a given view.
*
* @param \Illuminate\Contracts\View\View $view
* @return void
*/
public function callCreator(ViewContract $view)
{
$this->events->dispatch('creating: '.$view->name(), [$view]);
}
}
} catch (Throwable $e) {
$this->factory->flushState();
throw $e;
}
}
/**
* Get the contents of the view instance.
*
* @return string
*/
protected function renderContents()
{
// We will keep track of the amount of views being rendered so we can flush
// the section after the complete rendering operation is done. This will
// clear out the sections for any separate views that may be rendered.
$this->factory->incrementRender();
$this->factory->callComposer($this);
$contents = $this->getContents();
// Once we've finished rendering the view, we'll decrement the render count
// so that each sections get flushed out next time a view is created and
// no old sections are staying around in the memory of an environment.
$this->factory->decrementRender();
return $contents;
}
/**
* Get the evaluated contents of the view.
*
* @return string
*/
protected function getContents()
{
return $this->engine->get($this->path, $this->gatherData());
}
$this->view = $view;
$this->path = $path;
$this->engine = $engine;
$this->factory = $factory;
$this->data = $data instanceof Arrayable ? $data->toArray() : (array) $data;
}
/**
* Get the string contents of the view.
*
* @param callable|null $callback
* @return array|string
*
* @throws \Throwable
*/
public function render(callable $callback = null)
{
try {
$contents = $this->renderContents();
$response = isset($callback) ? $callback($this, $contents) : null;
// Once we have the contents of the view, we will flush the sections if we are
// done rendering all views so that there is nothing left hanging over when
// another view gets rendered in the future by the application developer.
$this->factory->flushStateIfDoneRendering();
return ! is_null($response) ? $response : $contents;
} catch (Throwable $e) {
$this->factory->flushState();
throw $e;
}
}
/**
* Get the contents of the view instance.
*
* @return string
<?php $__env->startSection('content'); ?>
<?php while(have_posts()): ?> <?php (the_post()); ?>
<?php echo $__env->first(['partials.content-single-' . get_post_type(), 'partials.content-single'], \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?>
<?php endwhile; ?>
<?php $__env->stopSection(); ?>
<?php echo $__env->make('layouts.app', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?><?php /**PATH /home/forge/dev.tfs.staging.poundandgrain.ca/releases/20241113033749/web/app/themes/tfs/resources/views/single.blade.php ENDPATH**/ ?>
/**
* Get the evaluated contents of the view at the given path.
*
* @param string $__path
* @param array $__data
* @return string
*/
protected function evaluatePath($__path, $__data)
{
$obLevel = ob_get_level();
ob_start();
extract($__data, EXTR_SKIP);
// We'll evaluate the contents of the view inside a try/catch block so we can
// flush out any stray output that might get out before an error occurs or
// an exception is thrown. This prevents any partial views from leaking.
try {
include $__path;
} catch (Throwable $e) {
$this->handleViewException($e, $obLevel);
}
return ltrim(ob_get_clean());
}
/**
* Handle a view exception.
*
* @param \Throwable $e
* @param int $obLevel
* @return void
*
* @throws \Throwable
*/
protected function handleViewException(Throwable $e, $obLevel)
{
while (ob_get_level() > $obLevel) {
ob_end_clean();
"/home/forge/dev.tfs.staging.poundandgrain.ca/releases/20241113033749/web/app/themes/tfs/storage/framework/views/eb422c8beb3d93cfa2fe08ce3b438f23bc0fae21.php"
*
* @param string $path
* @param array $data
* @return string
*/
public function get($path, array $data = [])
{
$this->lastCompiled[] = $path;
// If this given view has expired, which means it has simply been edited since
// it was last compiled, we will re-compile the views so we can evaluate a
// fresh copy of the view. We'll pass the compiler the path of the view.
if ($this->compiler->isExpired($path)) {
$this->compiler->compile($path);
}
// Once we have the path to the compiled file, we will evaluate the paths with
// typical PHP just like any other templates. We also keep a stack of views
// which have been rendered for right exception messages to be generated.
$results = $this->evaluatePath($this->compiler->getCompiledPath($path), $data);
array_pop($this->lastCompiled);
return $results;
}
/**
* Handle a view exception.
*
* @param \Throwable $e
* @param int $obLevel
* @return void
*
* @throws \Throwable
*/
protected function handleViewException(Throwable $e, $obLevel)
{
$e = new ViewException($this->getMessage($e), 0, 1, $e->getFile(), $e->getLine(), $e);
parent::handleViewException($e, $obLevel);
$this->factory->callComposer($this);
$contents = $this->getContents();
// Once we've finished rendering the view, we'll decrement the render count
// so that each sections get flushed out next time a view is created and
// no old sections are staying around in the memory of an environment.
$this->factory->decrementRender();
return $contents;
}
/**
* Get the evaluated contents of the view.
*
* @return string
*/
protected function getContents()
{
return $this->engine->get($this->path, $this->gatherData());
}
/**
* Get the data bound to the view instance.
*
* @return array
*/
public function gatherData()
{
$data = array_merge($this->factory->getShared(), $this->data);
foreach ($data as $key => $value) {
if ($value instanceof Renderable) {
$data[$key] = $value->render();
}
}
return $data;
}
throw $e;
}
}
/**
* Get the contents of the view instance.
*
* @return string
*/
protected function renderContents()
{
// We will keep track of the amount of views being rendered so we can flush
// the section after the complete rendering operation is done. This will
// clear out the sections for any separate views that may be rendered.
$this->factory->incrementRender();
$this->factory->callComposer($this);
$contents = $this->getContents();
// Once we've finished rendering the view, we'll decrement the render count
// so that each sections get flushed out next time a view is created and
// no old sections are staying around in the memory of an environment.
$this->factory->decrementRender();
return $contents;
}
/**
* Get the evaluated contents of the view.
*
* @return string
*/
protected function getContents()
{
return $this->engine->get($this->path, $this->gatherData());
}
/**
$this->view = $view;
$this->path = $path;
$this->engine = $engine;
$this->factory = $factory;
$this->data = $data instanceof Arrayable ? $data->toArray() : (array) $data;
}
/**
* Get the string contents of the view.
*
* @param callable|null $callback
* @return array|string
*
* @throws \Throwable
*/
public function render(callable $callback = null)
{
try {
$contents = $this->renderContents();
$response = isset($callback) ? $callback($this, $contents) : null;
// Once we have the contents of the view, we will flush the sections if we are
// done rendering all views so that there is nothing left hanging over when
// another view gets rendered in the future by the application developer.
$this->factory->flushStateIfDoneRendering();
return ! is_null($response) ? $response : $contents;
} catch (Throwable $e) {
$this->factory->flushState();
throw $e;
}
}
/**
* Get the contents of the view instance.
*
* @return string
<!doctype html>
<html <?php language_attributes(); ?>>
<?php echo \Roots\view(\Roots\app('sage.view'), \Roots\app('sage.data'))->render(); ?>
</html>
}
break;
}
}
if ( ! $template ) {
$template = get_index_template();
}
/**
* Filters the path of the current template before including it.
*
* @since 3.0.0
*
* @param string $template The path of the template to include.
*/
$template = apply_filters( 'template_include', $template );
if ( $template ) {
include $template;
} elseif ( current_user_can( 'switch_themes' ) ) {
$theme = wp_get_theme();
if ( $theme->errors() ) {
wp_die( $theme->errors() );
}
}
return;
}
"/home/forge/dev.tfs.staging.poundandgrain.ca/releases/20241113033749/web/app/themes/tfs/index.php"
<?php
/**
* Loads the WordPress environment and template.
*
* @package WordPress
*/
if ( ! isset( $wp_did_header ) ) {
$wp_did_header = true;
// Load the WordPress library.
require_once __DIR__ . '/wp-load.php';
// Set up the WordPress query.
wp();
// Load the theme template.
require_once ABSPATH . WPINC . '/template-loader.php';
}
"/home/forge/dev.tfs.staging.poundandgrain.ca/releases/20241113033749/web/wp/wp-includes/template-loader.php"
<?php
/**
* WordPress View Bootstrapper
*/
define('WP_USE_THEMES', true);
require __DIR__ . '/wp/wp-blog-header.php';
"/home/forge/dev.tfs.staging.poundandgrain.ca/releases/20241113033749/web/wp/wp-blog-header.php"
Key | Value |
query_vars | array:3 [ "page" => "" "name" => "toronto-film-school-creatives-support-hirebipoc-in-mission-to-eradicate-systemic-racism-from-canadian-media-landscape-one-job-at-a-time" "category_name" => "news" ] |
query_string | "name=toronto-film-school-creatives-support-hirebipoc-in-mission-to-eradicate-systemic-racism-from-canadian-media-landscape-one-job-at-a-time&category_name=news"
|
request | "news/toronto-film-school-creatives-support-hirebipoc-in-mission-to-eradicate-systemic-racism-from-canadian-media-landscape-one-job-at-a-time"
|
matched_rule | "(.+?)/([^/]+)(?:/([0-9]+))?/?$"
|
matched_query | "category_name=news&name=toronto-film-school-creatives-support-hirebipoc-in-mission-to-eradicate-systemic-racism-from-canadian-media-landscape-one-job-at-a-time&page="
|
did_permalink | true
|
Key | Value |
query | array:3 [ "page" => "" "name" => "toronto-film-school-creatives-support-hirebipoc-in-mission-to-eradicate-systemic-racism-from-canadian-media-landscape-one-job-at-a-time" "category_name" => "news" ] |
query_vars | array:66 [ "page" => 0 "name" => "toronto-film-school-creatives-support-hirebipoc-in-mission-to-eradicate-systemic-racism-from-canadian-media-landscape-one-job-at-a-time" "category_name" => "news" "error" => "" "m" => "" "p" => 0 "post_parent" => "" "subpost" => "" "subpost_id" => "" "attachment" => "" "attachment_id" => 0 "pagename" => "" "page_id" => 0 "second" => "" "minute" => "" "hour" => "" "day" => 0 "monthnum" => 0 "year" => 0 "w" => 0 "tag" => "" "cat" => "" "tag_id" => "" "author" => "" "author_name" => "" "feed" => "" "tb" => "" "paged" => 0 "meta_key" => "" "meta_value" => "" "preview" => "" "s" => "" "sentence" => "" "title" => "" "fields" => "" "menu_order" => "" "embed" => "" "category__in" => [] "category__not_in" => [] "category__and" => [] "post__in" => [] "post__not_in" => [] "post_name__in" => [] "tag__in" => [] "tag__not_in" => [] "tag__and" => [] "tag_slug__in" => [] "tag_slug__and" => [] "post_parent__in" => [] "post_parent__not_in" => [] "author__in" => [] "author__not_in" => [] "search_columns" => [] "ignore_sticky_posts" => false "suppress_filters" => false "cache_results" => true "update_post_term_cache" => true "update_menu_item_cache" => false "lazy_load_term_meta" => true "update_post_meta_cache" => true "post_type" => "" "posts_per_page" => 10 "nopaging" => false "comments_per_page" => "50" "no_found_rows" => false "order" => "DESC" ] |
meta_query | WP_Meta_Query {#2559} |
queried_object | WP_Post {#2560} |
queried_object_id | 20846
|
request | """ SELECT wp_posts.*\n \t\t\t\t\t FROM wp_posts \n \t\t\t\t\t WHERE 1=1 AND wp_posts.post_name = 'toronto-film-school-creatives-support-hirebipoc-in-mission-to-eradicate-systemic-racism-from-canadian-media-landscape-one-job-at-a-time' AND wp_posts.post_type = 'post'\n \t\t\t\t\t \n \t\t\t\t\t ORDER BY wp_posts.post_date DESC\n \t\t\t\t\t """ |
post_count | 1
|
in_the_loop | true
|
current_comment | -1
|
found_posts | 1
|
is_single | true
|
is_singular | true
|
Key | Value |
ID | 20846
|
post_author | "43"
|
post_date | "2020-10-09 13:12:43"
|
post_date_gmt | "2020-10-09 13:12:43"
|
post_content | """ <img src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2021/02/TFS_FP_HoCheAndersonHeadshot_0923.jpg" alt="" width="670" height="393" class="alignnone size-medium wp-image-22256" />\n \n \n Over the course of a visual storytelling career that’s spanned more than 30 years, Toronto Film School alumnus <a href="//E0174C3F-8F4C-4160-BEB1-278E49D96374/Ho%20Che%20Anderson">Ho Che Anderson</a> has carved out a unique niche for himself both behind the drawing table and in the director’s chair.\n \n \n \n A lifelong comic lover, the talented writer/illustrator has proven a particularly prolific graphic novelist – tackling a variety of genres from <a href="https://www.amazon.ca/Sand-Fury-Scream-Queen-Adventure/dp/1606993216">horror thrillers</a> and <a href="https://www.amazon.ca/Godhead-Ho-Che-Anderson/dp/1683960807">sci-fi action adventures</a>, to <a href="https://www.amazon.ca/King-Special-Ho-Che-Anderson/dp/1606993100">historical biography</a> and <a href="https://blog.fantagraphics.com/january-book-a-day-sale-i-want-to-be-your-dog/">erotic fiction</a>.\n \n \n \n <img class="size-medium wp-image-20778 aligncenter" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2020/09/TFS_FP_HoCheAnderson_StoneSketch_0923.jpg" alt="" width="670" height="442" />\n \n \n \n As a filmmaker, the Class of 2011 <a href="https://www.torontofilmschool.ca/programs/film-production-diploma/">Film Production</a> graduate and <a href="https://telefilm.ca/en/news-releases/telefilm-canada-and-the-talent-fund-unveil-the-new-wave-of-canadian-talent">Telefilm Talent to Watch</a> winner has proven equally adept behind the camera. He wrote and directed no less than five short films during his 18 months at Toronto Film School – one of which, <em><a href="https://www.youtube.com/watch?time_continue=5&v=wMrqlEWenic&feature=emb_logo">Lotus Eaters</a></em>, not only won Best Picture at the <a href="https://www.torontofilmschool.ca/blog/film/tfs-festival-of-films-videos/">2014 TFS Festival of Films</a>, but was also an official selection at the 2014 <a href="https://www.reelworld.ca/">Reelworld Film Festival</a>.\n \n \n \n In celebration of <a href="https://nationaltoday.com/national-comic-book-day/">National Comic Book Day</a>, we caught up with Anderson to look back on his career so far; delve into the complementary nature of his dual passions; celebrate the Sept. 15 publication of his latest illustrated novella, <em><a href="https://www.amazon.com/Stone-Ho-Che-Anderson-ebook/dp/B08GHZRGSX">Stone</a></em>, and the Sept. 21 release of his National Film Board animated short, <em><a href="https://www.youtube.com/watch?v=kHlMOdgfwug">Governance</a></em>; and discuss what projects he’s working on next.\n \n \n \n <strong>When was your interest in comic books first piqued? </strong>\n \n \n \n I was born in London and spent my first five years there, in a place called Wembley, very close to the famous Wembley Stadium. Then my family moved here to Toronto in 1975.\n \n \n \n Two of my earliest memories are I think from when we were still in England. One of my father’s friends showed me a Walt Disney cartoon called <em><a href="https://www.youtube.com/watch?v=rBgkrhnThek">Man in Space</a>. </em>It had an image that always stuck with me, of a rocket ship counting down and then going up into space. And then after that, I saw <em><a href="https://www.starwars.com/films/star-wars-episode-iv-a-new-hope">Star Wars</a> </em>when it first came out. So, it was a love of comics and movies and science fiction that was engendered pretty early in my childhood.\n \n \n \n <strong>Do you remember the first comic story you wrote/drew? </strong>\n \n \n \n I don’t remember a time I wasn’t drawing. I was drawing pretty much as soon as I could hold a pen, and writing stories from the start. There was never a starting point, it was always just kind of part of who I was.\n \n \n \n The first thing that I remember writing was a short story and it was a rip-off – a complete and utter rip-off – of the <em><a href="https://en.wikipedia.org/wiki/The_Empire_Strikes_Back">Empire Strikes Back</a>.</em> I was, like, 10 years old or something like that. That’s the first thing I remember writing, but I’m sure that wasn’t the first thing, because I always remember scribbling something down with a pen or a pencil when I was a child.\n \n \n \n <strong>What were some of the first graphic novels you had published? </strong>\n \n <strong> </strong>\n \n In the late 80s, I was working for a company called <a href="https://en.wikipedia.org/wiki/Comico:_The_Comic_Company">Comico</a> and they had a series called <em><a href="https://en.wikipedia.org/wiki/Grendel_(comics)">Grendel</a> – </em>sort of a superhero/antihero type of character, and I did my first published work with them.\n \n <strong> </strong>\n \n Then I started working with a company called <a href="https://www.fantagraphics.com/">Fantagraphics Books</a>, and the first one I did with them was a book called <em><a href="https://blog.fantagraphics.com/january-book-a-day-sale-i-want-to-be-your-dog/">I Want to be Your Dog</a> – </em>kind of an erotic thriller, shall we say. Then <em><a href="https://blog.fantagraphics.com/king-the-special-edition-by-ho-che-anderson-previews-pre-order/">King</a></em> (Anderson’s critically acclaimed biography of Martin Luther King Jr.) was actually the second project I published with them, and it was the one where I kind of made a breakthrough.\n \n \n \n <img class="alignnone size-medium wp-image-20764 aligncenter" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2020/09/TFS_FP_HoCheAnderson_KingSpecialEditionCover_0923.jpg" alt="" width="347" height="526" />\n \n \n \n When I got involved with Fantagraphics, they had in mind that they wanted to do a series of historical books, the first of which was Martin Luther King Jr., because the publisher had really had a deep admiration for him and just thought it was important to bring his story to an audience that maybe wasn’t as familiar with the work of the civil rights movement. And I think my being a creative of colour – which is rare now, but was even more rare when I was starting out – I think he just saw that I would probably be at least sympathetic to telling King’s story, which I was. I don’t think I was properly qualified at that point, because I was just starting out and it probably should’ve gone to someone with more years of experience than I had, but I’m the guy who wound up with the job and it worked out well, in the end.\n \n \n \n <strong>What made you decide to pursue filmmaking? </strong>\n \n \n \n My whole life I’ve been interested in visual storytelling. Comics were my first love, but it was the idea of telling stories through pictures that was so compelling to me – and there’s no bigger canvas than the movie screen for a visual storyteller.\n \n \n \n I started out making short films with a friend, but I sort of felt like it would be more beneficial to me to get some formal education in filmmaking, and also to make come of those connections that are necessary to forge a career in this field…Also, just to be with likeminded people and getting to play with the tools and toys and just kind of immerse ourselves in the whole filmmaking world was an exciting prospect to me.\n \n \n \n <strong>What drew you to Toronto Film School?</strong>\n \n \n \n I’d heard about Toronto Film School before…but I started working at the Toronto Star at around the same time, so that didn’t work out and it fell off my radar for a little while. But then, when Rick (Bennett) launched the current version of TFS, I thought, ‘You know what? This is my shot. I should just go for this now, before I get too old to do it seriously.’ So yeah, I jumped in with both feet.\n \n \n \n And honestly, I loved everything about TFS: I loved our teachers and I loved the students that I got to work with – many of whom I’m still very close with and still make films with today…but the thing that I loved the most was just getting together with people and taking equipment out on weekends to make our own films. That was one of the biggest reasons I wanted to go to TFS, because I knew it was such a hands-on environment. So, I made sure to avail myself of that opportunity every chance I got. I didn’t just wait for assignments to come our way to make stuff, I was getting people together and making stuff on my own all throughout the year and a half we were at TFS.\n \n \n \n <strong>Tell us about some of the projects you worked on as a student at Toronto Film School</strong>\n \n \n \n When I was at TFS, I made <em>Search and Seizure</em>, I made <em>Old Rug</em>, <em>Lotus Eaters</em>, <em>The Draft</em> and a documentary called <em>Alkaline</em>, a pretty fascinating story about a buddy who was an Iraq War veteran who was poisoned when he was in a caravan over there. I think I made those five films just as a writer/director, and then I also shot, gosh, I must’ve shot 30 or 40 films for other people when I was there. I was always working on a project the entire time.\n \n \n \n I definitely enjoyed that we got a shot at a little bit of everything (in terms of filmmaking roles). The only thing I never did was sound. I knew I wanted to write and direct, so I did a lot of that. I was also interested in editing, so I edited some other students’ films and I edited pretty much all of my films.\n \n \n \n I also shot a lot, too, and I was really interested in pursuing a career as a cinematographer for a while…I had a feeling I would enjoy doing that, just because of my visual arts background. It’s very much like picking up a paint brush and creating an image, with the added aspect of motion, which is just so exciting and fascinating. But I’ve kind of moved away from cinematography recently, just because it’s hard enough to get shots directing, so I decided to focus my efforts doing that.\n \n \n \n <strong>Have you ever thought of merging your passions for illustration and filmmaking by adapting one of your graphic novels for the screen? </strong>\n \n \n \n We’re actually adapting one of my books right now. I shouldn’t say too much, because the production company kind of wants to keep it under wraps, but I’m working with a company called Antigravity Entertainment on an adaptation of <em><a href="https://www.amazon.ca/Sand-Fury-Scream-Queen-Adventure/dp/1606993216">Sand & Fury</a></em>, actually, so that’s kinda cool.\n \n \n \n <img class="size-medium wp-image-20765 aligncenter" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2020/09/TFS_FP_HoCheAnderson_SandFuryCover_0923.jpg" alt="" width="437" height="526" />\n \n \n \n I also got to make an animated short film this summer called <em><a href="https://www.youtube.com/watch?v=kHlMOdgfwug">Governance</a></em> with the <a href="https://www.nfb.ca/">NFB (National Film Board)</a>, which was hella cool, because I grew up watching NFB films when I was a kid in class. It’s part of a series called <em>The Big Reset</em>, and what that is is four short films about three minutes in length, each interviewing a different luminary about how we can change our society, hopefully for the better, moving forward. One was with David Suzuki, another with Bruce Mau, (another with economist Armine Yalnizyan), and then ours was with Munira Abukar a criminologist and Ryerson graduate, who was also running for city councillor out in Brampton.\n \n \n \n [embed]https://www.youtube.com/watch?v=kHlMOdgfwug[/embed]\n \n \n \n In it, she talks about her thoughts on how we can remold, for example, the police in terms of defunding them, or as I would prefer, to abolish them and just rethink that whole institution, and also just how we can treat people more fairly in our system of government. I got to design and direct the film, so it was cool to bring in my illustration background and merge it with the work I’ve been doing the last few years in movies. It was a lot of fun.\n \n \n \n <strong>Your latest illustrated novella, Stone, was just released by indie digital publisher NeoText. Tell us about that project. </strong>\n \n <strong> </strong>\n \n <em><a href="https://www.amazon.com/Stone-Ho-Che-Anderson-ebook/dp/B08GHZRGSX">Stone</a></em> is set in a society in which the kind of dictatorship that the Trump administration has been threatening for the last little while has become a reality, and so rather than elections, it’s basically rigged elections for an ultra-conservative party that has been in power for the last 10 years. So there’s this thing called the air tax, which is basically a tax to live. If you don’t pay this tax, you’re sent away to a chain gang. It’s almost like what they’re doing to some of the people who have run afoul of American immigration policies who sort of find themselves in detainment camps and horrible situations. So it’s sort of that society, writ large.\n \n \n \n <img class="size-medium wp-image-20766 aligncenter" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2020/09/TFS_FP_HoCheAnderson_NeoText_StoneCover1_0923.jpg" alt="" width="347" height="526" />\n \n \n \n Our main character, Graciella ‘Stone’ O’Leary, is a basketball player and extremely intelligent. She’s looking forward to utilizing her brain and athletic ability to better her life and her father’s life, only to be informed by the local ruling family, who are representatives of this dictatorship, that her skills have been recognized and she now belongs to them. She’s basically an indentured servant and she decides this is not going to happen and she’s going to burn down this system of government and start anew. So, she kind of becomes a vigilante and that’s sort of the centre for the story.\n \n \n \n We’re hoping to tell more stories with this character, but it’s interesting to me to have a woman – and a woman of colour – be a vigilante, just because of the history of vigilantism. It was sort of set up to take over from the police in their earliest stages, before they came to resemble the institution that we have today, where it was just a bunch of angry dudes who decided to take on the system, and how it evolved into posses to take down runaway slaves, essentially. I think it’s kinda interesting to subvert their origins and kind of make it a person who would’ve been the victim of vigilantes, to now become one and exact her own form of justice.\n \n \n \n <strong>Stone sounds like it has a lot of screen adaptation potential. Was that the intention all along? </strong>\n \n \n \n The idea right from the start was, as much as this is a literary creation and I’m very happy to have it remain a literary creation, the idea was always, with this company, to try to create material that could potentially be turned into cinematic or television material.\n \n \n \n <img class="alignnone size-medium wp-image-20768 aligncenter" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2020/09/TFS_FP_HoCheAnderson_StoneRizzo_0923.jpg" alt="" width="670" height="442" />\n \n \n \n That said, one of the first jobs I had was kind of mapping out how it would go if we were to turn it into a multi-year series. So, I mapped out, like, four seasons of this character’s story. But even if it doesn’t move beyond its roots on the page, I still have a roadmap of many years worth of stories that I can tell with this set of characters. We’ve even got the next book ready to go. I wrote a follow-up called <em>Rizzo</em>, which is set in the same world, with illustrations by a friend of mine called <a href="https://www.benjaminmarra.com/">Ben Marra</a>, who’s a very excellent cartoonist. I’m not sure when that’s gonna drop yet, but it should be in the next six months or so. So, there’s many years ahead of us, hopefully, on this adventure.\n \n \n \n <img class="size-medium wp-image-20769 aligncenter" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2020/09/TFS_FP_HoCheAnderson_ICantBreathe_0923.jpg" alt="" width="360" height="526" />\n \n \n \n <strong>How much of your work is influenced and inspired by the current state of the world? </strong>\n \n <strong> </strong>\n \n All of it. There’s a lot is going on right now. When we started working on <em>Stone</em>, there were rumblings in the air the way things might go, but it was still very much fantasy. I wrote that story two years ago, and over the last two years, it’s become more and more real. And there’s more and more potential for it to become even more real and that’s a horrifying thought. There’s definitely no shortage of material to draw inspiration from and to comment on, and that’s sort of both a blessing and a curse for a writer. I sort of wish there were less stuff to work with right now, to be honest.\n \n \n \n <strong>What are some of the other upcoming graphic novels you’re currently working on? </strong>\n \n \n \n I’m very excited about a book called <em>The Resurrectionists</em>. I’m actually just finishing up my research and will start the scripting on it this week. It’s a story set in 1800s New York City, and it’s about a character who has been severely disenfranchised. She has accidentally been the cause of her family’s death, only to discover that she has the ability to bring the dead back to life. But when she tries to kind of use that ability on her own family, she discovers that it doesn’t work for her loved ones. And she ends up joining a group of resurrectionists – which are basically grave robbers back in the day that sell bodies to medical research.\n \n \n \n So, half the story is a rough-and-tumble adventure about these resurrectionists trying to make a living in a very tough time, but then it morphs into more of a supernatural story in which we examine grief and loss and what it would mean if you were able to bring a loved one back to reality…Also God is a literal character in our story. So, it starts as one thing, then it morphs into something of a little bit of a grander design than it starts as. I’m really excited about that book, I think it’s going to be pretty good.\n \n \n \n <img class="size-medium wp-image-20770 aligncenter" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2020/09/TFS_FP_HoCheAnderson_CaptainCanuck_0923.jpg" alt="" width="360" height="526" />\n \n \n \n The other graphic novel I’m working on is something called <em>Captain Canuck</em> – a venerable Canadian superhero that I loved when I was a child. That was another one like the NFB project, where its’s great thrill to be able to take custodianship of something that I had a childhood affection for.\n \n \n \n <strong>What advice would you give Toronto Film School students looking to follow in your career footsteps? </strong>\n \n \n \n My advice would be to always say yes. If somebody asks you to do a project, just say yes. Or, in other words, make as much stuff as you possibly can. You’re only in school for a year and a half. the time is going to go by before you know it, and you’re granted an incredible opportunity to have access to lots of equipment and lots of people who are there to learn and to make stuff, so take advantage of that, man. If someone comes to you and asks ‘Can you do x, y, z?’ Say ‘Yeah, absolutely, I can do that.’ That’s my advice.\n \n \n \n """ |
post_title | "Toronto Film School Creatives Support HireBIPOC in Mission to Eradicate Systemic Racism From Canadian Media Landscape One Job at a Time"
|
post_excerpt | "" |
post_status | "publish"
|
comment_status | "closed"
|
ping_status | "open"
|
post_password | "" |
post_name | "toronto-film-school-creatives-support-hirebipoc-in-mission-to-eradicate-systemic-racism-from-canadian-media-landscape-one-job-at-a-time"
|
to_ping | "" |
pinged | "" |
post_modified | "2023-03-27 21:07:50"
|
post_modified_gmt | "2023-03-27 21:07:50"
|
post_content_filtered | "" |
post_parent | 0
|
guid | "https://dev.tfs.staging.poundandgrain.ca/?p=20846"
|
menu_order | 0
|
post_type | "post"
|
post_mime_type | "" |
comment_count | "0"
|
filter | "raw"
|
Key | Value |
SERVER_SOFTWARE | "nginx/1.22.1"
|
REQUEST_URI | "/news/toronto-film-school-creatives-support-hirebipoc-in-mission-to-eradicate-systemic-racism-from-canadian-media-landscape-one-job-at-a-time/"
|
USER | "forge"
|
HOME | "/home/forge"
|
HTTP_REFERER | "https://dev.tfs.staging.poundandgrain.ca/news/toronto-film-school-creatives-support-hirebipoc-in-mission-to-eradicate-systemic-racism-from-canadian-media-landscape-one-job-at-a-time"
|
HTTP_ACCEPT_ENCODING | "gzip, br, zstd, deflate"
|
HTTP_USER_AGENT | "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)"
|
HTTP_ACCEPT | "*/*"
|
HTTP_HOST | "dev.tfs.staging.poundandgrain.ca"
|
REDIRECT_STATUS | "200"
|
HTTPS | "on"
|
SERVER_NAME | "dev.tfs.staging.poundandgrain.ca"
|
SERVER_PORT | "443"
|
SERVER_ADDR | "10.0.1.187"
|
REMOTE_PORT | "38950"
|
REMOTE_ADDR | "3.15.31.168"
|
GATEWAY_INTERFACE | "CGI/1.1"
|
SERVER_PROTOCOL | "HTTP/2.0"
|
DOCUMENT_ROOT | "/home/forge/dev.tfs.staging.poundandgrain.ca/releases/20241113033749/web"
|
DOCUMENT_URI | "/index.php"
|
SCRIPT_NAME | "/index.php"
|
SCRIPT_FILENAME | "/home/forge/dev.tfs.staging.poundandgrain.ca/releases/20241113033749/web/index.php"
|
CONTENT_LENGTH | "" |
CONTENT_TYPE | "" |
REQUEST_METHOD | "GET"
|
QUERY_STRING | "" |
FCGI_ROLE | "RESPONDER"
|
PHP_SELF | "/index.php"
|
REQUEST_TIME_FLOAT | 1731875966.2211
|
REQUEST_TIME | 1731875966
|
DB_NAME | "tfs_dev"
|
DB_USER | "***"
|
DB_PASSWORD | "************"
|
WP_ENV | "development"
|
WP_HOME | "https://dev.tfs.staging.poundandgrain.ca"
|
WP_SITEURL | "https://dev.tfs.staging.poundandgrain.ca/wp"
|
WP_DEBUG_LOG | "/path/to/debug.log"
|
AUTH_KEY | "****************************************************************"
|
SECURE_AUTH_KEY | "****************************************************************"
|
LOGGED_IN_KEY | "****************************************************************"
|
NONCE_KEY | "****************************************************************"
|
AUTH_SALT | "****************************************************************"
|
SECURE_AUTH_SALT | "****************************************************************"
|
LOGGED_IN_SALT | "****************************************************************"
|
NONCE_SALT | "****************************************************************"
|
ACF_PRO_KEY | "b3JkZXJfaWQ9NDQxMjV8dHlwZT1kZXZlbG9wZXJ8ZGF0ZT0yMDE0LTExLTEyIDA2OjA0OjE3"
|
Key | Value |
DB_NAME | "tfs_dev"
|
DB_USER | "***"
|
DB_PASSWORD | "************"
|
WP_ENV | "development"
|
WP_HOME | "https://dev.tfs.staging.poundandgrain.ca"
|
WP_SITEURL | "https://dev.tfs.staging.poundandgrain.ca/wp"
|
WP_DEBUG_LOG | "/path/to/debug.log"
|
AUTH_KEY | "****************************************************************"
|
SECURE_AUTH_KEY | "****************************************************************"
|
LOGGED_IN_KEY | "****************************************************************"
|
NONCE_KEY | "****************************************************************"
|
AUTH_SALT | "****************************************************************"
|
SECURE_AUTH_SALT | "****************************************************************"
|
LOGGED_IN_SALT | "****************************************************************"
|
NONCE_SALT | "****************************************************************"
|
ACF_PRO_KEY | "b3JkZXJfaWQ9NDQxMjV8dHlwZT1kZXZlbG9wZXJ8ZGF0ZT0yMDE0LTExLTEyIDA2OjA0OjE3"
|