Add files via upload
This commit is contained in:
+1994
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,106 @@
|
|||||||
|
# Google Docs Markdown Viewer for WordPress
|
||||||
|
|
||||||
|
A WordPress plugin that allows you to display Google Docs content as markdown in your WordPress site using shortcodes. This plugin provides a seamless way to maintain your content in Google Docs while displaying it on your WordPress site with proper markdown formatting.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Easy integration with Google Docs
|
||||||
|
- Simple shortcode implementation
|
||||||
|
- Secure markdown parsing with safe mode enabled
|
||||||
|
- Clean content display without image clutter
|
||||||
|
- Support for standard markdown syntax
|
||||||
|
- Automatic content updates when Google Doc is modified
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
1. Download the plugin files
|
||||||
|
2. Upload the plugin folder to the `/wp-content/plugins/` directory
|
||||||
|
3. Activate the plugin through the 'Plugins' menu in WordPress
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
1. Create a Google Doc and write your content using standard Google Docs formatting
|
||||||
|
2. Make sure your Google Doc is publicly accessible (or at least viewable by anyone with the link)
|
||||||
|
3. Get your Google Doc ID from the URL:
|
||||||
|
- Example URL: `https://docs.google.com/document/d/1234567890abcdef/edit`
|
||||||
|
- The ID is: `1234567890abcdef`
|
||||||
|
4. Use the shortcode in your WordPress posts or pages:
|
||||||
|
```
|
||||||
|
[gdocs_markdown id="YOUR_GOOGLE_DOC_ID"]
|
||||||
|
```
|
||||||
|
The plugin will automatically convert your Google Docs formatting to markdown when displaying the content on your WordPress site.
|
||||||
|
|
||||||
|
## Supported Markdown Elements
|
||||||
|
|
||||||
|
The plugin supports standard markdown syntax including:
|
||||||
|
|
||||||
|
- Headers (h1-h6)
|
||||||
|
- Paragraphs
|
||||||
|
- Bold and italic text
|
||||||
|
- Blockquotes
|
||||||
|
- Ordered and unordered lists
|
||||||
|
- Links
|
||||||
|
- And more...
|
||||||
|
|
||||||
|
## Security Features
|
||||||
|
|
||||||
|
- Safe Mode enabled by default
|
||||||
|
- HTML sanitization
|
||||||
|
- Restricted HTML tags
|
||||||
|
- Protected against XSS attacks
|
||||||
|
|
||||||
|
## Technical Details
|
||||||
|
|
||||||
|
The plugin uses:
|
||||||
|
- Parsedown library for markdown parsing
|
||||||
|
- WordPress HTTP API for fetching Google Docs content
|
||||||
|
- WordPress Shortcode API for implementation
|
||||||
|
- Content sanitization through wp_kses
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- WordPress 4.7 or higher
|
||||||
|
- PHP 5.6 or higher
|
||||||
|
- Access to Google Docs
|
||||||
|
|
||||||
|
## Limitations
|
||||||
|
|
||||||
|
- Images from Google Docs are not supported (they are automatically removed)
|
||||||
|
- Direct HTML in Google Docs may be stripped for security
|
||||||
|
- Google Doc must be publicly accessible
|
||||||
|
|
||||||
|
## Error Handling
|
||||||
|
|
||||||
|
The plugin provides clear error messages for common issues:
|
||||||
|
- Missing Google Doc ID
|
||||||
|
- Inaccessible documents
|
||||||
|
- Missing Parsedown library
|
||||||
|
- Failed markdown parsing
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This plugin is licensed under the MIT License - see the LICENSE file for details.
|
||||||
|
|
||||||
|
## Author
|
||||||
|
|
||||||
|
Vincent Rozenberg
|
||||||
|
- Website: [https://vincentrozenberg.com](https://vincentrozenberg.com)
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Contributions are welcome! Please feel free to submit a Pull Request.
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
### 1.0.0
|
||||||
|
- Initial release
|
||||||
|
- Basic markdown support
|
||||||
|
- Google Docs integration
|
||||||
|
- Security features implementation
|
||||||
|
- Error handling
|
||||||
|
- Content cleaning functionality
|
||||||
|
|
||||||
|
## Acknowledgments
|
||||||
|
|
||||||
|
- [Parsedown](https://github.com/erusev/parsedown) - Markdown Parser in PHP
|
||||||
|
- [WordPress Plugin Development](https://developer.wordpress.org/plugins/)
|
||||||
+170
@@ -0,0 +1,170 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Plugin Name: Google Docs Markdown Viewer
|
||||||
|
* Plugin URI: https://vincentrozenberg.com/
|
||||||
|
* Description: Display Google Docs content as markdown in WordPress using shortcodes. Usage: Create a Google Doc, add your content using markdown syntax, then use [gdocs_markdown id="YOUR_GOOGLE_DOC_ID"] in any post or page. To get the document ID, look at your Google Doc URL: it's the long string between /d/ and /edit, for example in https://docs.google.com/document/d/1234567890abcdef/edit the ID is 1234567890abcdef.
|
||||||
|
* Version: 1.0.0
|
||||||
|
* Author: Vincent Rozenberg
|
||||||
|
* Author URI: https://vincentrozenberg.com
|
||||||
|
* License: MIT
|
||||||
|
* Text Domain: gdocs-markdown
|
||||||
|
* Domain Path: /languages
|
||||||
|
*
|
||||||
|
* @package GDocsMarkdown
|
||||||
|
*/
|
||||||
|
|
||||||
|
// If this file is called directly, abort.
|
||||||
|
if (!defined('WPINC')) {
|
||||||
|
die;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main plugin class
|
||||||
|
*/
|
||||||
|
class GDocsMarkdown {
|
||||||
|
/**
|
||||||
|
* Initialize the plugin
|
||||||
|
*/
|
||||||
|
public function __construct() {
|
||||||
|
add_shortcode('gdocs_markdown', array($this, 'render_markdown'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clean markdown content by removing image references
|
||||||
|
*
|
||||||
|
* @param string $markdown The markdown content
|
||||||
|
* @return string Cleaned markdown without images
|
||||||
|
*/
|
||||||
|
private function clean_markdown($markdown) {
|
||||||
|
// Remove image references from the bottom of the document
|
||||||
|
$parts = explode("\n\nSources\n\n", $markdown);
|
||||||
|
$content = $parts[0];
|
||||||
|
|
||||||
|
// Remove inline image references
|
||||||
|
$content = preg_replace('/!\[([^\]]*)\]\[([^\]]*)\]/', '', $content);
|
||||||
|
|
||||||
|
// Remove any remaining image syntax
|
||||||
|
$content = preg_replace('/!\[([^\]]*)\]\(([^)]*)\)/', '', $content);
|
||||||
|
|
||||||
|
// Clean up multiple blank lines that might be left after removing images
|
||||||
|
$content = preg_replace("/[\r\n]+/", "\n\n", $content);
|
||||||
|
|
||||||
|
return trim($content);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render markdown content from Google Docs
|
||||||
|
*
|
||||||
|
* @param array $atts Shortcode attributes
|
||||||
|
* @return string Rendered HTML content
|
||||||
|
*/
|
||||||
|
public function render_markdown($atts) {
|
||||||
|
// Parse attributes
|
||||||
|
$atts = shortcode_atts(
|
||||||
|
array(
|
||||||
|
'id' => '',
|
||||||
|
),
|
||||||
|
$atts,
|
||||||
|
'gdocs_markdown'
|
||||||
|
);
|
||||||
|
|
||||||
|
// Validate document ID
|
||||||
|
if (empty($atts['id'])) {
|
||||||
|
return '<p>' . esc_html__('Error: Google Doc ID is required.', 'gdocs-markdown') . '</p>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build the Google Docs export URL
|
||||||
|
$url = sprintf(
|
||||||
|
'https://docs.google.com/document/d/%s/export?format=md',
|
||||||
|
esc_attr($atts['id'])
|
||||||
|
);
|
||||||
|
|
||||||
|
// Fetch the markdown content
|
||||||
|
$response = wp_remote_get($url);
|
||||||
|
|
||||||
|
// Check for errors
|
||||||
|
if (is_wp_error($response)) {
|
||||||
|
return '<p>' . esc_html__('Error: Unable to fetch document content.', 'gdocs-markdown') . '</p>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the response body
|
||||||
|
$markdown = wp_remote_retrieve_body($response);
|
||||||
|
|
||||||
|
// Check if content is empty
|
||||||
|
if (empty($markdown)) {
|
||||||
|
return '<p>' . esc_html__('Error: Document is empty or not accessible.', 'gdocs-markdown') . '</p>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean markdown by removing images
|
||||||
|
$markdown = $this->clean_markdown($markdown);
|
||||||
|
|
||||||
|
// Include Parsedown if it exists
|
||||||
|
$parsedown_path = plugin_dir_path(__FILE__) . 'Parsedown.php';
|
||||||
|
if (!file_exists($parsedown_path)) {
|
||||||
|
return '<p>' . esc_html__('Error: Parsedown library not found.', 'gdocs-markdown') . '</p>';
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once $parsedown_path;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Create Parsedown instance and convert markdown to HTML
|
||||||
|
$parsedown = new Parsedown();
|
||||||
|
$parsedown->setSafeMode(true);
|
||||||
|
$html = $parsedown->text($markdown);
|
||||||
|
|
||||||
|
// Define allowed HTML tags
|
||||||
|
$allowed_html = array(
|
||||||
|
'div' => array(
|
||||||
|
'class' => array(),
|
||||||
|
),
|
||||||
|
'p' => array(),
|
||||||
|
'h1' => array(),
|
||||||
|
'h2' => array(),
|
||||||
|
'h3' => array(),
|
||||||
|
'h4' => array(),
|
||||||
|
'h5' => array(),
|
||||||
|
'h6' => array(),
|
||||||
|
'strong' => array(),
|
||||||
|
'em' => array(),
|
||||||
|
'blockquote' => array(),
|
||||||
|
'ul' => array(),
|
||||||
|
'ol' => array(),
|
||||||
|
'li' => array(),
|
||||||
|
'a' => array(
|
||||||
|
'href' => array(),
|
||||||
|
'title' => array(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Return the processed content
|
||||||
|
return wp_kses(
|
||||||
|
sprintf('<div class="gdocs-markdown-content">%s</div>', $html),
|
||||||
|
$allowed_html
|
||||||
|
);
|
||||||
|
|
||||||
|
} catch (Exception $e) {
|
||||||
|
return '<p>' . esc_html__('Error: Failed to parse markdown content.', 'gdocs-markdown') . '</p>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize the plugin
|
||||||
|
new GDocsMarkdown();
|
||||||
|
|
||||||
|
// Activation hook
|
||||||
|
register_activation_hook(__FILE__, 'gdocs_markdown_activate');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plugin activation callback
|
||||||
|
*/
|
||||||
|
function gdocs_markdown_activate() {
|
||||||
|
// Check if Parsedown exists
|
||||||
|
$parsedown_path = plugin_dir_path(__FILE__) . 'Parsedown.php';
|
||||||
|
if (!file_exists($parsedown_path)) {
|
||||||
|
wp_die(
|
||||||
|
esc_html__('Parsedown library is required but not found. Please install Parsedown.php in the plugin directory.', 'gdocs-markdown'),
|
||||||
|
esc_html__('Plugin Activation Error', 'gdocs-markdown'),
|
||||||
|
array('back_link' => true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user