*
* @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" => "tfs-instructor-julia-paton-to-moderate-toronto-black-film-festival-panel" "category_name" => "news" ] |
query_string | "name=tfs-instructor-julia-paton-to-moderate-toronto-black-film-festival-panel&category_name=news"
|
request | "news/tfs-instructor-julia-paton-to-moderate-toronto-black-film-festival-panel"
|
matched_rule | "(.+?)/([^/]+)(?:/([0-9]+))?/?$"
|
matched_query | "category_name=news&name=tfs-instructor-julia-paton-to-moderate-toronto-black-film-festival-panel&page="
|
did_permalink | true
|
Key | Value |
query | array:3 [ "page" => "" "name" => "tfs-instructor-julia-paton-to-moderate-toronto-black-film-festival-panel" "category_name" => "news" ] |
query_vars | array:66 [ "page" => 0 "name" => "tfs-instructor-julia-paton-to-moderate-toronto-black-film-festival-panel" "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 | 24668
|
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 = 'tfs-instructor-julia-paton-to-moderate-toronto-black-film-festival-panel' 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 | 24668
|
post_author | "43"
|
post_date | "2022-02-01 17:56:49"
|
post_date_gmt | "2022-02-01 17:56:49"
|
post_content | """ <a href="https://torontoblackfilm.com/" target="_blank" rel="noopener noreferrer">Toronto Black Film Festival</a> organizers recently tapped veteran Toronto Film School instructor <a href="https://www.imdb.com/name/nm0665724/" target="_blank" rel="noopener noreferrer">Julia Paton</a> to moderate a ‘how-to’ panel discussion about voice-over acting during their upcoming 10<sup>th</sup> anniversary festivities.\n \n \n \n Presented as part of the festival’s popular discussion series, <a href="https://torontoblackfilm.com/serie/tbff-black-market/" target="_blank" rel="noopener noreferrer">The Black Market</a>, <strong><em><a href="https://torontoblackfilm.com/event/voice-over-talent-how-to/" target="_blank" rel="noopener noreferrer">Voice Over Talent – How To?</a> </em></strong>will be streamed on the <a href="https://www.facebook.com/torontoblackfilmfestival" target="_blank" rel="noopener noreferrer">TBFF Facebook page</a> on Sunday, Feb. 20 at 1 p.m. (EST).\n \n \n \n The panel of professional voice-over actors contributing to the discussion include long-time <a href="https://player.vimeo.com/video/256994263?h=1d7900e938" target="_blank" rel="noopener noreferrer">Soul Train Awards announcer</a>, <a href="https://keshamonkvo.com/" target="_blank" rel="noopener noreferrer">Kesha Monk</a>; <a href="https://www.apple.com/ca/apple-news/" target="_blank" rel="noopener noreferrer">Apple News</a> narrator, <a href="https://www.andrewlandervo.com/" target="_blank" rel="noopener noreferrer">Andrew Lander</a>; and <a href="https://www.bluewavevoiceover.com/voices/george-washington-iii/" target="_blank" rel="noopener noreferrer">George Washington III</a>, one of the voices of the <a href="https://nmaahc.si.edu/" target="_blank" rel="noopener noreferrer">National Museum of African-American History and Culture</a>.\n \n \n \n <img class="aligncenter wp-image-24679 size-medium" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2022/02/BLK-MARKET-TBFF22_VOICE-1.png" alt="Toronto Black Film Festival promo" width="526" height="526" />\n \n \n \n During the more than hourlong, pre-taped conversation, Paton guided the featured panelists in a discussion about what it takes to become a voice-over actor; how one breaks into the business; what skills are important to have; and how to foster more Black artists in the field.\n \n \n \n “The panelists offered up some truly amazing perspectives and they were very generous with sharing their time, their ideas and their life experiences,” Paton said of the panel, which covered topics from microphone technique and demo reels, to securing an agent and booking jobs.\n \n \n \n “I was pretty gratified at the end of the panel to find that everything the panelists talked about, I’ve been teaching to my students at TFS,” added Paton, a founding member of the TFS faculty, who co-created the curriculum for Voice Acting 4 and 6, among others.\n \n \n \n “Even though I’m a voice over actor and camera actor and theatre actor myself, I spend a lot of time teaching, so it’s really important to know that the courses I teach are current – and they are.”\n \n \n \n The Paton-moderated <em>Voice-Over Talent – How To?</em> panel is just one of several the Toronto Black Film Festival will be featuring during this year’s lineup of free <a href="https://torontoblackfilm.com/serie/tbff22-black-market/" target="_blank" rel="noopener noreferrer">Black Market</a> events – an industry series where both locally and internationally renowned industry professionals, experts, thought leaders, and visionaries will share an exciting blend of cutting-edge thinking and real-world experience on today’s most critical filmmaking issues.\n \n \n \n Presented by <a href="https://www.facebook.com/CdnHeritage?__tn__=-%5DK*F" target="_blank" rel="noopener noreferrer">Canadian Heritage</a>, <a href="https://www.facebook.com/bellfund/?__tn__=kK*F" target="_blank" rel="noopener noreferrer">Bell Fund</a>, <a href="https://www.facebook.com/telefilmcanada?__tn__=-%5DK*F" target="_blank" rel="noopener noreferrer">Telefilm Canada</a>, and <a href="https://www.facebook.com/torontoartscouncil/?__tn__=kK*F" target="_blank" rel="noopener noreferrer">Toronto Arts Council</a>, other 2022 Black Market events will be streamed on the <a href="https://www.facebook.com/torontoblackfilmfestival/" target="_blank" rel="noopener noreferrer">Toronto Black Film Festival’s Facebook Page</a> as follows:\n \n \n <ul>\n \t<li style="text-align: left;"><a href="https://torontoblackfilm.com/event/hair-and-makeup-equity-in-the-film-and-television-industry/" target="_blank" rel="noopener noreferrer">Hair and Makeup Equity in the Film & Television Industry</a> – Feb. 19 at 11 a.m. (EST)</li>\n \t<li style="text-align: left;"><a href="https://torontoblackfilm.com/event/representation-does-it-make-a-difference/" target="_blank" rel="noopener noreferrer">Representation | Does it Make a Difference</a> – Feb. 19 at 1:30 p.m. (EST)</li>\n \t<li style="text-align: left;"><a href="https://torontoblackfilm.com/event/are-we-there-yet/" target="_blank" rel="noopener noreferrer">Are We There Yet?</a> – Feb. 19 at 3:30 p.m. (EST)</li>\n \t<li style="text-align: left;"><a href="https://torontoblackfilm.com/event/the-imposter-in-the-room/" target="_blank" rel="noopener noreferrer">The Imposter in the Room</a> – Feb. 20 at 9:30 a.m. (EST)</li>\n \t<li style="text-align: left;"><a href="https://torontoblackfilm.com/event/music-in-film/" target="_blank" rel="noopener noreferrer">Music in Film</a> – Feb. 20 at 11 a.m. (EST)</li>\n \t<li style="text-align: left;"><a href="https://torontoblackfilm.com/event/the-filmmakers-handbook-what-every-new-filmmaker-needs-to-know-when-making-a-film/" target="_blank" rel="noopener noreferrer">The Filmmaker’s Handbook</a> – Feb. 20 at 3 p.m. (EST)</li>\n \t<li style="text-align: left;"><a href="https://torontoblackfilm.com/event/landing-the-role/" target="_blank" rel="noopener noreferrer">Landing the Role</a> – Feb. 20 at 5 p.m. (EST)</li>\n \t<li style="text-align: left;"><a href="https://torontoblackfilm.com/event/what-has-changed-since-the-blm-movement-2/" target="_blank" rel="noopener noreferrer">What has Changed Since the BLM Movement?</a> – Feb. 21 at 4 p.m. (EST)</li>\n \t<li style="text-align: left;"><a href="https://torontoblackfilm.com/event/black-wealth-matters-2/" target="_blank" rel="noopener noreferrer">Black Wealth Matters</a> – Feb. 21 at 9 p.m. (EST)</li>\n </ul>\n \n \n <img class="aligncenter wp-image-24672 size-medium" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2022/02/TFS_ACT_TorontoBlackFilmFestPoster_0201.jpg" alt="Toronto Black Film Festival, Feb. 16 – 21, 2022" width="670" height="327" />\n \n \n \n This year’s <a href="https://torontoblackfilm.com/toronto-black-film-festival-celebrates-its-10th-anniversary-feb-16-21-2022-online/" target="_blank" rel="noopener noreferrer">Toronto Black Film Festival</a>, which runs from Feb. 16 – 21, will celebrate its milestone 10th anniversary with a record 200 films from 30 countries – including 18 world premieres, 28 international premieres, 60 Canadian premieres, 18 Ontario premieres and 25 Toronto premieres.\n \n \n \n Lauded as Canada’s largest celebration of <a href="https://www.canada.ca/en/canadian-heritage/campaigns/black-history-month.html" target="_blank" rel="noopener noreferrer">Black History Month</a>, the festival annually attracts hundreds of thousands of festival-goers with its bold and diverse programming that allows members of all cultural communities to better understand one another.\n \n \n \n “It’s been an honour and a privilege to spotlight Black artists and Black stories in Toronto for the last 10 years. Torontonians have shown tremendous support towards our cause at this pivotal moment in our history,” <a href="https://fabiennecolas.com/" target="_blank" rel="noopener noreferrer">Fabienne Colas</a>, President and Founder of the Black Film Festivals in Montreal, Toronto, Halifax, Ottawa, Calgary, and Vancouver, said in a statement.\n \n \n \n “Thanks to the support of thousands of festival-goers and the creativity of the artists, the Toronto Black Film Festival has made big strides creating awareness about the industry’s severe lack of diversity. With the support of our loyal partners, we will continue to leverage the power of the arts for even more social and economic impact.”\n \n \n \n This year’s lineup consists of remarkable feature and documentary films highlight important topics, such as women’s issues, politics, social injustice, discrimination, mental health, arts, sports, and accomplishment, among others.\n \n \n \n TBFF 2022’s must-see feature films include: <em><a href="https://www.imdb.com/title/tt11040762/" target="_blank" rel="noopener noreferrer">Alice</a>, <a href="https://www.imdb.com/title/tt9839038/?ref_=fn_tt_tt_1" target="_blank" rel="noopener noreferrer">Jim Button and the Wild 13</a>, <a href="https://www.imdb.com/title/tt3890456/?ref_=fn_al_tt_1" target="_blank" rel="noopener noreferrer">Queen of Glory</a>, <a href="https://www.imdb.com/title/tt9093870/?ref_=fn_al_tt_1" target="_blank" rel="noopener noreferrer">The White Line</a> </em>and<em> <a href="https://www.imdb.com/title/tt15138462/?ref_=fn_al_tt_1" target="_blank" rel="noopener noreferrer">Vuta N’Kuvute</a>.</em>\n \n <em> </em>\n \n Unmissable TBFF 2022 documentaries include: <em><a href="https://www.imdb.com/title/tt15079066/?ref_=fn_al_tt_1" target="_blank" rel="noopener noreferrer">Gemmel & Tim</a>,<a href="https://www.imdb.com/title/tt14521502/?ref_=fn_al_tt_1" target="_blank" rel="noopener noreferrer"> Zinder</a>, <a href="https://www.imdb.com/title/tt2490578/?ref_=fn_al_tt_4" target="_blank" rel="noopener noreferrer">The Ants and the Grasshopper</a>, <a href="//www.imdb.com/title/tt10782898/?ref_=fn_al_tt_1" target="_blank" rel="noopener noreferrer">Target: St. Louis Vol. 1</a>, <a href="https://www.imdb.com/title/tt15699036/?ref_=fn_al_tt_1" target="_blank" rel="noopener noreferrer">Feisty Fighter – The Marnesba Tackett Story</a>, <a href="https://www.imdb.com/title/tt14527688/?ref_=fn_al_tt_1" target="_blank" rel="noopener noreferrer">She Dreams at Sunrise</a>, </em>and<em> <a href="https://www.imdb.com/title/tt12788828/?ref_=fn_al_tt_1" target="_blank" rel="noopener noreferrer">Being Black in Canada</a>.</em>\n \n \n \n All-Access Passes to the 2022 Toronto Black Film Festival are available for $99 <a href="https://torontoblackfilm.com/tickets/buy-tickets-and-passes/" target="_blank" rel="noopener noreferrer">here</a>. Individual tickets are also available for purchase <a href="https://torontoblackfilm.com/tickets/buy-tickets-and-passes/" target="_blank" rel="noopener noreferrer">here</a>.\n \n \n \n For full programming and events, go to <strong><a href="https://torontoblackfilm.com/" target="_blank" rel="noopener noreferrer">www.TorontoBlackFilm.com</a></strong>\n \n \n <h2 style="text-align: center;"><strong><u>About the Voice Over Talent – How To? Panelists:</u></strong></h2>\n \n \n <img class="aligncenter wp-image-24673 size-full" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2022/02/TFS_KeshaMonkHeadshot_0124.jpg" alt="Kesha Monk - panelist" width="650" height="450" />\n <p style="text-align: center;"><a href="https://keshamonkvo.com/"><strong>Kesha Monk</strong></a></p>\n <p style="text-align: center;">Kesha Monk has been wowing people with her voice for over 25 years. Her professional career began as a radio personality in Raleigh, North Carolina, and took her to many cities across the country, including New York, Los Angeles, Chicago and Boston. She was also the co-host of a syndicated countdown show with <em>American Idol</em>’s <a href="https://en.wikipedia.org/wiki/Randy_Jackson">Randy Jackson</a>, which ran for five years and aired in 50 US cities and internationally in Japan and Kenya.</p>\n <p style="text-align: center;">After 20 years in radio, her career path shifted after a devastating cancer diagnosis. During a chemotherapy break, Kesha decided to enter a contest, whose award was a hefty voiceover contract. Her audition got her in the door of a reputable talent agency and catapulted her into the world of voiceover.</p>\n <p style="text-align: center;">Since then, Kesha’s cancer has returned multiple times – however, her experience has only made her stronger. Her ability to connect with content has made her a voice talent to be reckoned with. She has recorded projects for global brands such as <a href="https://en.wikipedia.org/wiki/McDonald%27s">McDonald’s</a>, <a href="https://en.wikipedia.org/wiki/DreamWorks_Pictures">DreamWorks</a>, <a href="https://en.wikipedia.org/wiki/Busch_Gardens">Busch Gardens</a>, <a href="https://en.wikipedia.org/wiki/SeaWorld">SeaWorld</a>, <a href="https://en.wikipedia.org/wiki/Coca-Cola">Coca-Cola</a>, <a href="https://en.wikipedia.org/wiki/Dunkin%27_Donuts">Dunkin’ Donuts</a> and more. She has narrated a children’s audiobook and recently entered her third season as the continuity voice for <em><a href="https://www.pbs.org/pov/">POV</a></em>, a weekly documentary series that airs on PBS. She is also the live announcer for the <a href="https://en.wikipedia.org/wiki/Soul_Train_Music_Awards">Soul Train Awards</a> on <a href="https://www.bet.com/">BET</a>, the most prominent television network targeting African American audiences.</p>\n \n \n \n <p style="text-align: center;"><strong><img class="alignnone wp-image-24674 size-full" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2022/02/TFS_AndrewLanderHeadshot_0124.jpg" alt="Andrew Lander - panelist" width="650" height="450" /> </strong></p>\n <p style="text-align: center;"><a href="https://www.andrewlandervo.com/"><strong>Andrew Lander</strong></a></p>\n <p style="text-align: center;">Andrew Lander is an award-winning, African American voice actor with a not-quite-Urban but distinctly Black(ish) sound. Andrew has worked with <a href="https://www.afscme.org/">AFSCME</a> in support of their progressive politics at their 2020 International Convention. His voice resonates with Millennials and Gen Z, representing the indie gaming company <a href="https://www.11bitstudios.com/">11 bit studios</a> during their 2020 virtual trade show livestream.</p>\n <p style="text-align: center;">Andrew can most often be heard as the engaging and down-to-earth voice of reason for explainers and internal corporate presentations. He's like the cool, young professor you wish you had in undergrad, or the fun dad who let you stay up past your bedtime. You can hear Andrew on your iPhone narrating stories for <a href="https://www.apple.com/ca/apple-news/">Apple News</a>. You can also hear him on the national TV spot for <a href="https://www.ocrevus.com/">Ocrevus</a>, a prescription medicine used to treat adults with MS.</p>\n \n \n \n \n <img class="aligncenter wp-image-24675 size-full" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2022/02/TFS_GeorgeWashingtonIII_0124.jpg" alt="George Washington III - panelist" width="650" height="450" />\n <p style="text-align: center;"><a href="https://www.bluewavevoiceover.com/voices/george-washington-iii/"><strong>George Washington III</strong></a></p>\n <p style="text-align: center;">George is a full-time political voice actor with 17-years of experience in the business of helping clients communicate their stories. After spending 20+ years in IT industry, George has been the voice of <a href="https://northwest.rootsports.com/">ROOT Sports Northwest</a>, <a href="https://corporate.mcdonalds.com/corpmcd/home.html">McDonald’s</a>, <a href="https://open.spotify.com/__noul__">Spotify</a>, and <a href="https://mountaindew.fandom.com/wiki/Mountain_Dew_Ice">Mountain Dew ICE</a>. George also spent 12 years as a baritone with <a href="https://operacarolina.org/">Opera Carolina</a>. His proudest voiceover moment was becoming one of the voices of the <a href="https://nmaahc.si.edu/">National Museum of African-American History and Culture</a>.</p>\n <p style="text-align: center;">George's voiceover work extends to radio and television commercials, e-learning, corporate narration, and telephony, providing solutions for clients all over the US and around the world.</p>\n \n \n \n \n <img class="aligncenter wp-image-24676 size-full" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2022/02/TFS_ACT_JuliaPaton_0120.jpg" alt="Julia Paton - Toronto Film School " width="650" height="450" />\n <p style="text-align: center;"><strong><a href="https://www.imdb.com/name/nm0665724/?ref_=fn_al_nm_1">Julia Paton</a></strong></p>\n <p style="text-align: center;">Julia is an actress, director, and teacher. She was a series regular on CBC's comedy <em><a href="https://www.imdb.com/title/tt0244356/">P.R.</a></em>, Conan O'Brien's sitcom pilot <em>Beat Cops</em> for FOX and NBC, as well as guesting on the Global TV's <em><a href="https://www.imdb.com/title/tt0996557/?ref_=fn_al_tt_1">Da Kink In My Hair</a></em>. She has also acted in a range of Hollywood feature films alongside Cate Blanchett in <em><a href="https://www.imdb.com/title/tt0120797/?ref_=fn_al_tt_1">Pushing Tin</a></em>, Jamie Foxx in <em><a href="https://www.imdb.com/title/tt0118750/?ref_=fn_al_tt_1">Booty Call</a></em>, and William H. Macy and Laura Dern in <em><a href="https://www.imdb.com/title/tt0246628/">Focus</a></em>.</p>\n <p style="text-align: center;">Julia has worked twice with Emmy-award winning director <a href="https://www.imdb.com/name/nm0035106/?ref_=fn_al_nm_1">Allan Arkush</a>, in FOX's <em><a href="https://www.imdb.com/title/tt0261203/">Prince Charming</a>, </em>and in <em><a href="https://www.imdb.com/title/tt0122474/?ref_=fn_al_tt_1">Elvis Meets Nixon </a></em>for Showtime. She also worked with <a href="https://www.imdb.com/name/nm0005162/?ref_=fn_al_nm_1">Robert Loggia</a> in the <em><a href="https://www.imdb.com/title/tt0128285/?ref_=nm_flmg_act_9">Joe Torre Story </a></em>for Showtime, and was the female lead in <em>The Edge</em>. Her selected TV series credits include <em><a href="https://www.imdb.com/title/tt0108756/?ref_=fn_al_tt_1">Due South</a></em>, <em>Once A Thief</em> and <em><a href="https://www.imdb.com/title/tt0283724/?ref_=nm_flmg_act_6">Doc</a></em>. She has performed in numerous TV and radio commercials, as well as lending her voice to audiobooks, cartoon pilots and toys.</p>\n <p style="text-align: center;">Julia is a versatile voice, theatre and camera director. Her voice directing credits include over 20 English and French webcasts for one of Canada’s top five banks, an interactive documentary for Fort York and the City of Toronto, as well as numerous podcasts for Seneca College’s Aviation Program and e-learning modules for Human Resources. Julia was the voice director at Toronto Film School for over 40 live radio plays and podcasts, as well as directing the casting and recording sessions for over 20 video game pilots. She has also directed commercials and a cartoon pilot.</p>\n <p style="text-align: center;">Julia’s selected theatre directing credits include a traditional Commedia dell’Arte Fringe production of <em>The Servant of Two Masters</em> at Toronto’s Factory Theatre, as well as productions of <em>The Road To Mecca</em> and <em>Dial M For Murder.</em></p>\n <p style="text-align: center;">Julia was the first female faculty member for both Toronto Film School and Seneca College’s Acting programs, and was a founding faculty member with TFS as it launched in October 2010.</p>\n <p style="text-align: center;">She created Toronto Film School’s curriculum for Camera Acting 2 and Performance History 1 and 2, and co-created the curriculum for Voice Acting 4 and 6.</p>\n <p style="text-align: center;">She is a member of ACTRA and CAEA. Julia has a Bachelor of Arts, Honours Degree from Queen's University with a major in Drama, where she twice won the <em>Award for Musical Theatre</em> performance.</p>\n \n \n """ |
post_title | "TFS Instructor Julia Paton to Moderate Toronto Black Film Festival Panel"
|
post_excerpt | "" |
post_status | "publish"
|
comment_status | "closed"
|
ping_status | "open"
|
post_password | "" |
post_name | "tfs-instructor-julia-paton-to-moderate-toronto-black-film-festival-panel"
|
to_ping | "" |
pinged | "" |
post_modified | "2023-03-27 21:07:10"
|
post_modified_gmt | "2023-03-27 21:07:10"
|
post_content_filtered | "" |
post_parent | 0
|
guid | "https://dev.tfs.staging.poundandgrain.ca/?p=24668"
|
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/tfs-instructor-julia-paton-to-moderate-toronto-black-film-festival-panel/"
|
USER | "forge"
|
HOME | "/home/forge"
|
HTTP_REFERER | "https://dev.tfs.staging.poundandgrain.ca/news/tfs-instructor-julia-paton-to-moderate-toronto-black-film-festival-panel"
|
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 | "41246"
|
REMOTE_ADDR | "3.135.218.39"
|
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 | 1731861117.643
|
REQUEST_TIME | 1731861117
|
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"
|