lucamauri / paragraphlinks
MediaWiki extension that adds hover link icons to paragraphs, enabling one-click paragraph link copying
Package info
github.com/lucamauri/ParagraphLinks
Type:mediawiki-extension
pkg:composer/lucamauri/paragraphlinks
Requires
- php: >=7.4
- composer/installers: ^2|^1.0.1
Requires (Dev)
- mediawiki/mediawiki-codesniffer: 43.0.0
- mediawiki/mediawiki-phan-config: 0.14.0
This package is auto-updated.
Last update: 2026-04-25 14:59:45 UTC
README
ParagraphLinks is a MediaWiki extension that adds a hover-activated copy-link icon (🔗) to every section heading in wiki page content. Clicking the icon copies the full URL — including the heading's anchor fragment — to the clipboard, letting users share deep links to specific sections without inspecting the page source.
Features
- Hover link icons: Shows a 🔗 icon when hovering over section headings (
h2–h6) - One-click copy: Copies the full URL with anchor fragment to the clipboard
- User notification: Displays a success or error message after the copy attempt
- Accessible: Full
aria-labelsupport for screen readers; keyboard-navigable - Mobile friendly: Adapts to touch devices where hover is unavailable
- Configurable: Can be enabled or disabled globally and per namespace
- No database changes: Pure client-side implementation; no schema modifications required
Requirements
- MediaWiki 1.35.0 or higher
- PHP 7.4 or higher
- JavaScript enabled in the browser
Installation
Manual installation
- Clone the repository into your
extensions/directory:cd /path/to/mediawiki/extensions/ git clone https://github.com/lucamauri/ParagraphLinks.git ParagraphLinks - Enable the extension in
LocalSettings.php:wfLoadExtension( 'ParagraphLinks' );
Composer installation
- Add the package to your
composer.local.json:{ "require": { "lucamauri/paragraphlinks": "~1.0" } } - Run Composer:
composer update --no-dev
- Enable the extension in
LocalSettings.php:wfLoadExtension( 'ParagraphLinks' );
Note: No database update is required. Do not run
maintenance/update.phpfor this extension.
Configuration
Add any of the following to your LocalSettings.php after the wfLoadExtension call:
// Enable or disable the extension globally (default: true) $wgParagraphLinksEnabled = true; // Namespaces where heading links are active // Default: [0, 4, 10, 12, 14] (Main, Project, Template, Help, Category) $wgParagraphLinksNamespaces = [ NS_MAIN, // 0 NS_PROJECT, // 4 NS_TEMPLATE, // 10 NS_HELP, // 12 NS_CATEGORY // 14 ];
How It Works
- On each page view, the PHP hook
BeforePageDisplaychecks whether the extension is enabled and whether the current namespace is in$wgParagraphLinksNamespaces. - If both conditions are met, the
ext.paragraphlinksResourceLoader module is enqueued. - The JavaScript module attaches a 🔗 icon to every
h2–h6element inside#mw-content-text. - Clicking the icon copies
window.location.href— with the heading'sidas the fragment — to the clipboard using the browser's native Clipboard API. - A MediaWiki notification confirms success or reports an error.
File Structure
ParagraphLinks/
├── extension.json # Extension manifest
├── composer.json # Composer metadata
├── includes/
│ └── ParagraphLinksHooks.php # PHP hook handler
├── resources/
│ ├── ext.paragraphlinks.js # Client-side logic
│ └── ext.paragraphlinks.css # Heading icon styles
├── i18n/
│ ├── en.json # English messages
│ ├── it.json # Italian messages
│ └── qqq.json # Message documentation for translators
├── tests/
│ └── phpunit/
│ └── ParagraphLinksHooksTest.php # PHPUnit tests
├── CHANGELOG.md
├── CONTRIBUTING.md
├── README.md
└── LICENSE
Development
Running Tests
# Run PHPUnit tests php tests/phpunit/phpunit.php extensions/ParagraphLinks/tests/phpunit/ # Run with HTML coverage report php tests/phpunit/phpunit.php --coverage-html coverage extensions/ParagraphLinks/tests/phpunit/
Development Setup
- Clone into your MediaWiki
extensions/directory and enable the extension. - Enable detailed error reporting in
LocalSettings.php:$wgShowExceptionDetails = true; $wgDevelopmentWarnings = true; $wgShowDBErrorBacktrace = true;
- Disable caching to see changes immediately:
$wgMainCacheType = CACHE_NONE; $wgCacheDirectory = false;
Contributing
- Fork the repository on GitHub.
- Create a feature branch:
git checkout -b feature/your-feature - Make your changes and add or update tests.
- Verify all tests pass.
- Open a pull request against
main.
Please follow MediaWiki coding conventions and add PHPDoc comments to all public methods.
Troubleshooting
Icons not appearing
- Confirm the extension is enabled and
$wgParagraphLinksEnabledistrue. - Check that the current page's namespace is listed in
$wgParagraphLinksNamespaces. - Verify JavaScript is enabled in your browser and there are no console errors.
Copy to clipboard not working
- The browser Clipboard API requires the page to be served over HTTPS.
- Check the browser console for permission errors.
Security Considerations
- All processing happens client-side; no user input is sent to the server.
- No database modifications are made.
- The extension uses the browser's native Clipboard API when available.
Browser Support
| Feature | Modern browsers | Older browsers |
|---|---|---|
| Clipboard copy | Native Clipboard API | document.execCommand fallback |
| Icon display | Full CSS support | Graceful degradation |
License
This extension is licensed under the GPL-2.0-or-later license.