diff --git a/files/Resume.pdf b/files/Resume.pdf index 17f3ba5..b4a18bc 100644 Binary files a/files/Resume.pdf and b/files/Resume.pdf differ diff --git a/src/Pages/OpenSourcePage.php b/src/Pages/OpenSourcePage.php index acc5d71..977aaab 100644 --- a/src/Pages/OpenSourcePage.php +++ b/src/Pages/OpenSourcePage.php @@ -9,6 +9,69 @@ #[SitemapEntry( 'OpenSource' )] class OpenSourcePage extends BasePage { + private const OPEN_SOURCE_PRESENTATIONS = [ + 'PHP-8.5' => [ + 'title' => 'PHP 8.5: New Features from the Source', + 'iterations' => [ + [ + 'conf' => 'Longhorn PHP Conference', + 'loc' => 'Austin, Texas', + 'date' => 'October 2025', + 'slides' => '20251025 Longhorn PHP presentation.pdf', + 'blog' => '20251029-longhorn-php#content-my-talk', + ], + [ + 'conf' => 'MergePHP', + 'loc' => 'Remote', + 'date' => 'November 2025', + 'slides' => '20251117 MergePHP presentation.pdf', + 'blog' => '20251118-mergephp-talk', + ], + [ + 'conf' => 'ConFoo Montreal 2026', + 'loc' => 'Montreal, Canada', + 'date' => 'February 2026', + 'slides' => '20260226 ConFoo PHP presentation.pdf', + 'blog' => '20260302-confoo#content-php-85', + ], + ], + ], + 'Intro-Rust-Experience-Devs' => [ + 'title' => 'Introduction to Rust for Experienced Software Developers', + 'iterations' => [ + [ + 'conf' => 'ConFoo Montreal 2026', + 'loc' => 'Montreal, Canada', + 'date' => 'February 2026', + 'slides' => '20260225 ConFoo Rust presentation.pdf', + 'blog' => '20260302-confoo#content-intro-to-rust', + ], + ], + ], + 'PHP-8.6' => [ + 'title' => 'PHP 8.6: The Inside Scoop', + 'iterations' => [ + [ + 'conf' => 'PHP Tek 2026', + 'loc' => 'Chicago, Illinois', + 'date' => 'May 2026', + 'upcoming' => true, + ], + ], + ], + 'PHP-SemVer' => [ + 'title' => 'Semantic Versioning and the PHP Ecosystem: A Reality Check', + 'iterations' => [ + [ + 'conf' => 'PHP Tek 2026', + 'loc' => 'Chicago, Illinois', + 'date' => 'May 2026', + 'upcoming' => true, + ], + ], + ], + ]; + private const PHP_RFCS = [ 'Attributes-on-constants' => [ 'name' => 'Attributes on Constants', @@ -45,6 +108,20 @@ class OpenSourcePage extends BasePage { 'desc' => 'Support the #[\Deprecated] attribute on traits', 'status' => 'implemented in PHP 8.5', ], + 'Debugable Enums' => [ + 'name' => 'Debugable Enums', + 'link' => 'https://wiki.php.net/rfc/debugable-enums', + 'date' => 'March 2026', + 'desc' => 'Allow __debugInfo() on enums', + 'status' => 'under discussion', + ], + '#[\Override] for class constants' => [ + 'name' => '#[\Override] for class constants', + 'link' => 'https://wiki.php.net/rfc/override_constants', + 'date' => 'March 2026', + 'desc' => 'Extend #[\Override] to target class constants', + 'status' => 'in draft', + ], ]; private const PHP_PACKAGES = [ @@ -79,7 +156,7 @@ protected function build(): void { 'p', [], [ - 'I contribute to open-source libraries on GitHub as ', + 'I contribute to open-source projects on GitHub as ', FluentHTML::make( 'a', [ @@ -93,11 +170,84 @@ protected function build(): void { ] ) ); + $this->addTalksSection(); $this->addPHPSection(); $this->addPackagesSection(); $this->addWebsiteSection(); } + private function addTalksSection(): void { + $this->contentWrapper->append( + FluentHTML::make( 'h3', [ 'class' => 'subsection-header' ], 'Conference Presentations' ), + FluentHTML::make( + 'p', + [], + [ + << [ + FluentHTML::make( 'em', [], $details['conf'] ), + '. ', + $details['loc'], + ', ', + $details['date'], + ...( + ( $details['upcoming'] ?? false ) ? [ '. Upcoming.' ] : + [ + '. (', + FluentHTML::make( + 'a', + [ 'href' => './files/' . $details['slides'] ], + 'Slides' + ), + ', ', + FluentHTML::make( + 'a', + [ 'href' => './blog/' . $details['blog'] ], + 'Blog write up' + ), + ')', + ] + ), + ]; + $list = FluentHTML::fromTag( 'ul' ); + foreach ( array_reverse( self::OPEN_SOURCE_PRESENTATIONS ) as $details ) { + if ( count( $details['iterations'] ) === 1 ) { + $once = $details['iterations'][0]; + $item = FluentHTML::make( + 'li', + [], + [ + '"' . $details['title'] . '," ', + ...( $makeDetails( $details['iterations'][0] ) ), + ] + ); + $list->append( $item ); + continue; + } + $iterations = array_map( + static fn ( $iter ) => FluentHTML::make( 'li', [], $makeDetails( $iter ) ), + array_reverse( $details['iterations'] ) + ); + $item = FluentHTML::make( + 'li', + [], + [ + '"' . $details['title'] . '"', + FluentHTML::make( 'ul', [], $iterations ), + ] + ); + $list->append( $item ); + } + $this->contentWrapper->append( $list ); + } + private function addPHPSection(): void { $makeLink = static fn ( $href, $text ) => FluentHTML::make( 'a', @@ -189,10 +339,6 @@ private function addPackagesSection(): void { ], $text ); - $reflectionLink = $makeLink( - 'https://www.php.net/manual/en/book.reflection.php', - 'Reflection extension' - ); $this->contentWrapper->append( FluentHTML::make( 'h3', [ 'class' => 'subsection-header' ], 'Packages' ), FluentHTML::make( diff --git a/src/Pages/WorkPage.php b/src/Pages/WorkPage.php index ac5e9de..a80138a 100644 --- a/src/Pages/WorkPage.php +++ b/src/Pages/WorkPage.php @@ -10,17 +10,25 @@ class WorkPage extends BasePage { private const WIKITEQ_EXTENSIONS = [ + 'MixedVisibilityFiles' => [ + 'https://github.com/WikiTeq/mediawiki-extension-MixedVisibilityFiles', + 'Support making some on-wiki files public and others private', + ], + 'ZoteroConnector' => [ + 'https://github.com/WikiTeq/mediawiki-extension-ZoteroConnector', + 'Import references and attachments from Zotero into a wiki', + ], + 'MarkdownPages' => [ + 'https://github.com/WikiTeq/mediawiki-extension-MarkdownPages', + 'Add support for markdown as a page content model', + ], 'HoneyPot' => [ 'https://gerrit.wikimedia.org/g/mediawiki/extensions/HoneyPot', - 'Implementation of a honey pot during account creation [created]', + 'Implementation of a honey pot during account creation', ], 'MinimalExample' => [ 'https://github.com/WikiTeq/mediawiki-extension-MinimalExample', - 'Demonstration of the process of building an extension [created]', - ], - 'PagePort' => [ - 'https://gerrit.wikimedia.org/g/mediawiki/extensions/PagePort/', - 'Extension for exporting and importing groups of wiki pages [significant improvements]', + 'Demonstration of the process of building an extension', ], ]; @@ -95,13 +103,14 @@ private function addWikiTeqSection(): void { <<append( $item ); } $this->contentWrapper->append( $list ); + $this->contentWrapper->append( + FluentHTML::make( + 'p', + [], + [ + 'For talks that I have given at open-source conferences in ' + . 'my personal capacity, see ', + FluentHTMl::make( 'a', [ 'href' => './OpenSource' ], 'the page about open source' ), + '.', + ] + ) + ); } } diff --git a/tests/data/OpenSource.html b/tests/data/OpenSource.html index 17be408..c17cc91 100644 --- a/tests/data/OpenSource.html +++ b/tests/data/OpenSource.html @@ -1,5 +1,7 @@ -Open source

Open source contributions

I contribute to open-source libraries on GitHub as @DanielEScherzer.

PHP

I started contributing to the PHP source in August 2024, working primarily on +Open source

Open source contributions

I contribute to open-source projects on GitHub as @DanielEScherzer.

Conference Presentations

I have given a few presentation at various open-source-related conferences. The +slides and my post-conference write-ups in my blog are listed below. Note that +even when a presentation is given multiple times, the content changes.

  • "Semantic Versioning and the PHP Ecosystem: A Reality Check," PHP Tek 2026. Chicago, Illinois, May 2026. Upcoming.
  • "PHP 8.6: The Inside Scoop," PHP Tek 2026. Chicago, Illinois, May 2026. Upcoming.
  • "Introduction to Rust for Experienced Software Developers," ConFoo Montreal 2026. Montreal, Canada, February 2026. (Slides, Blog write up)
  • "PHP 8.5: New Features from the Source"

PHP

I started contributing to the PHP source in August 2024, working primarily on bug fixes, improvements to the Reflection extension and various cleanup. In March 2025, I requested and was granted access to make direct changes (and approve others' changes) to PHP. I also became the official maintainer of the reflection extension.

Also in March 2025, I volunteered to serve as one of the release managers for @@ -7,7 +9,7 @@ decide between the volunteers (luckily there were plenty of candidates) and I was one of the two "rookie" candidates chosen to help with the release. You can read more in my blog post.

PHP uses a process of requests for comment when proposing and implementing major -changes; my RFCs include:

Packages

I also wrote multiple open-source PHP packages - though they are currently +changes; my RFCs include:

Packages

I also wrote multiple open-source PHP packages - though they are currently primarily used by me, I am a firm supporter of open-source code and figured that they might be useful to others. The packages that I have created so far are:

Website

The source code for my website is also public, in case the code is useful to others. The actual text about me is probably not going to be relevant, but my diff --git a/tests/data/Work.html b/tests/data/Work.html index 89e8a7b..14dc29e 100644 --- a/tests/data/Work.html +++ b/tests/data/Work.html @@ -1,7 +1,8 @@ Work

Work experience

WikiTeq

I first joined WikiTeq in January 2023 as a Technical Project Manager, working with a team of developers around the world to support clients that use -MediaWiki. As part of my work at WikiTeq, I have worked with multiple MediaWiki -extensions, though most of them are private. My contributions made as part of -my work at WikiTeq are all available under the account @DanielWTQ on GitHub. Some public extension contributions include:

  • HoneyPot: Implementation of a honey pot during account creation [created]
  • MinimalExample: Demonstration of the process of building an extension [created]
  • PagePort: Extension for exporting and importing groups of wiki pages [significant improvements]

I also gave talks at multiple MediaWiki-related conferences on behalf of -WikiTeq. Those talks were recorded and are available publicly:

\ No newline at end of file +MediaWiki, including major corporations and government agencies. As part of my +work at WikiTeq, I have developed multiple MediaWiki extensions, though most of +them are private. My contributions made as part of my work at WikiTeq are all +available under the account @DanielWTQ on GitHub. Public extensions that I created include:

  • MixedVisibilityFiles: Support making some on-wiki files public and others private
  • ZoteroConnector: Import references and attachments from Zotero into a wiki
  • MarkdownPages: Add support for markdown as a page content model
  • HoneyPot: Implementation of a honey pot during account creation
  • MinimalExample: Demonstration of the process of building an extension

I also gave talks at multiple MediaWiki-related conferences on behalf of +WikiTeq. Those talks were recorded and are available publicly:

For talks that I have given at open-source conferences in my personal capacity, see the page about open source.

\ No newline at end of file