Large cleanup
This commit is contained in:
parent
3f880f2014
commit
5484bd0592
75 changed files with 2 additions and 5486 deletions
169
README.md
169
README.md
|
@ -1,173 +1,8 @@
|
||||||
# Scripts
|
# Scripts
|
||||||
A collection of all my scripts - written in different Language
|
|
||||||
|
|
||||||
## How to use
|
A collection of all my scripts - written in different languages.
|
||||||
|
|
||||||
If nothing other is written, do this:
|
You can find further instructions in the corresponding README.
|
||||||
|
|
||||||
1. Download the script you want.
|
|
||||||
2. Run ``chmod +x script`` to make it executable
|
|
||||||
3. Run it with ``./script``
|
|
||||||
|
|
||||||
## buildpdf.sh
|
|
||||||
|
|
||||||
A script for automatically creating PDf files from a latex document. You can set the amounts of builds and the time between the builds.
|
|
||||||
|
|
||||||
**Usage:** ``./buildpdf.sh filename [build amount] [time between builds in s]``
|
|
||||||
|
|
||||||
## cpy_pst
|
|
||||||
|
|
||||||
A small but useful script for copying and pasting files and directories once or more often.
|
|
||||||
|
|
||||||
**Install:** ``sudo make install``
|
|
||||||
|
|
||||||
**Usage:**
|
|
||||||
|
|
||||||
```
|
|
||||||
cpy filename # Copies a file / directory
|
|
||||||
pst filename # Pasts a file / directory
|
|
||||||
```
|
|
||||||
|
|
||||||
**Remove:** ``sudo make uninstall``
|
|
||||||
|
|
||||||
## intellij-hidpi.sh
|
|
||||||
|
|
||||||
This is a small script for enabling and disabling HiDPI support on IntelliJ IDEA Community Edition on every Linux distribution where IntelliJ is installed in /usr/share/intellijidea-ce/. If the installation is somewhere else you have to change the variable IDEA_PATH.
|
|
||||||
|
|
||||||
**Usage:**
|
|
||||||
|
|
||||||
- Help: ``./intellij-hidpi.sh -h``
|
|
||||||
- Enable ``./intellij-hidpi.sh -e``
|
|
||||||
- Disable ``./intellij-hidpi.sh -d``
|
|
||||||
|
|
||||||
## android-studio-hidpi.sh
|
|
||||||
|
|
||||||
This is a small script for enabling and disabling HiDPI support in Android Stuido on every linux distribution where Android Stuido is installed in /opt/android-studio. If the installation is somewhere else you have to change the variable STUDIO_PATH.
|
|
||||||
|
|
||||||
**Usage:**
|
|
||||||
|
|
||||||
- Help: ``./android-studio-hidpi.sh -h``
|
|
||||||
- Enable ``./android-studio-hidpi.sh -e``
|
|
||||||
- Disable ``./android-studio-hidpi.sh -d``
|
|
||||||
|
|
||||||
## jekyll2rangitaki
|
|
||||||
|
|
||||||
A small script for converting Jekyll markdown blog posts to Rangitaki blog posts.
|
|
||||||
|
|
||||||
### How to use
|
|
||||||
|
|
||||||
You don"t have to install anything. Just run
|
|
||||||
|
|
||||||
```
|
|
||||||
ruby jekyll2rangitaki.rb
|
|
||||||
```
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
```
|
|
||||||
chmod +x jekyll2rangitaki.rb
|
|
||||||
./jekyll2rangitaki.rb
|
|
||||||
```
|
|
||||||
|
|
||||||
The converter will read all `.md` and `.markdown` in the directory `./in/`, so copy the blog posts, you want to convert into this directory, and it will then throw the converted files out into the directory `./out/`.
|
|
||||||
|
|
||||||
## PHP Scripts
|
|
||||||
|
|
||||||
These scripts are **not for web development**, there for executing on your computer. Just like a bash script, but written in PHP. There also **written for Linux**. I have no idea if they run under another system and I'm not going to test it (if you tested it and if they worked, write me a mail at opensource(at)mmk2410(dot)org and I will add it to this README).
|
|
||||||
|
|
||||||
In order to use these scripts you have to install `php` on your computer.
|
|
||||||
|
|
||||||
Here are installation instruction for a few distributions:
|
|
||||||
|
|
||||||
```
|
|
||||||
Arch Linux:
|
|
||||||
sudo pacman -S php-cgi
|
|
||||||
|
|
||||||
Ubuntu:
|
|
||||||
sudo apt-get install php5-cli
|
|
||||||
|
|
||||||
Fedora:
|
|
||||||
sudo dnf install php-cli
|
|
||||||
```
|
|
||||||
|
|
||||||
### md2html
|
|
||||||
|
|
||||||
md2html is a simple script that converts markdown files to html code and optionally saves it into a .txt or .html file. The library that powers the whole thing is [Parsedown](https://github.com/erusev/parsedown).
|
|
||||||
|
|
||||||
#### Installation
|
|
||||||
|
|
||||||
To use this script, install `php` (see the section above) and run the following command:
|
|
||||||
```
|
|
||||||
sudo make install
|
|
||||||
```
|
|
||||||
|
|
||||||
**You have to add /opt/md2html to your open_basedir in php.ini**
|
|
||||||
|
|
||||||
#### Usage
|
|
||||||
|
|
||||||
Print the help:
|
|
||||||
```
|
|
||||||
md2html --help
|
|
||||||
```
|
|
||||||
|
|
||||||
To just print out the HTML code of the given `.md` file run:
|
|
||||||
```
|
|
||||||
md2html text.md
|
|
||||||
```
|
|
||||||
|
|
||||||
To print the HTML code into a `.txt` or `.html` file run:
|
|
||||||
```
|
|
||||||
md2html text.md text.html
|
|
||||||
```
|
|
||||||
If you pass a `.html` file for the output it will automatically add a basic HTML5 structure.
|
|
||||||
|
|
||||||
### blogger2rangitaki
|
|
||||||
|
|
||||||
This is a small PHP script for converting a Blogger XML to Rangitaki blog posts.
|
|
||||||
|
|
||||||
This script uses [html-to-markdown](https://github.com/thephpleague/html-to-markdown) to convert the blogposts.
|
|
||||||
|
|
||||||
#### Usage
|
|
||||||
|
|
||||||
You don't need to install that script on your computer. It is enough to make it runnable:
|
|
||||||
|
|
||||||
```
|
|
||||||
chmod +x blogger2rangitaki.php
|
|
||||||
```
|
|
||||||
|
|
||||||
And to run it:
|
|
||||||
|
|
||||||
```
|
|
||||||
./blogger2rangitaki.php blog.xml
|
|
||||||
```
|
|
||||||
|
|
||||||
where `blog.xml` is your Blogger XML file (the exported blog).
|
|
||||||
|
|
||||||
**This script doesn't import your media files into Rangitaki.**
|
|
||||||
|
|
||||||
### pblog2rangitaki
|
|
||||||
|
|
||||||
This is a small script which converts pBlog/Rangitaki 0.2.x XML files into Rangitaki blog posts
|
|
||||||
|
|
||||||
### Usage
|
|
||||||
|
|
||||||
You don't need to install this script on your computer, it's enough to make it executable:
|
|
||||||
|
|
||||||
```
|
|
||||||
chmod +x pblog2rangitaki.php
|
|
||||||
```
|
|
||||||
|
|
||||||
Run it then:
|
|
||||||
|
|
||||||
```
|
|
||||||
./pblog2rangitaki.php posts.xml
|
|
||||||
```
|
|
||||||
|
|
||||||
Where `posts.xml` is your pBlog/Rangitaki 0.2 XML file.
|
|
||||||
|
|
||||||
The Rangitaki blog posts are saved in `articles/`
|
|
||||||
|
|
||||||
**The `<otherlinks>` tag is not supported.**
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
COPYRIGHT (c) 2015 mmk2410
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 3, 29 June 2007
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
@ -1,29 +0,0 @@
|
||||||
# android-studio-hidpi.sh
|
|
||||||
|
|
||||||
This is a small script for enabling and disabling HiDPI support in Android Studio. It works just like the one for IntelliJ IDEA since Android Studio is based upon this IDE.
|
|
||||||
|
|
||||||
## How to use
|
|
||||||
|
|
||||||
Download it from GitLab. To make it runnable execute:
|
|
||||||
|
|
||||||
```
|
|
||||||
chmod +x android-studio-hidpi.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
For some help run
|
|
||||||
|
|
||||||
```
|
|
||||||
./android-studio-hidpi.sh -h
|
|
||||||
```
|
|
||||||
|
|
||||||
To enable HiDPI support
|
|
||||||
|
|
||||||
```
|
|
||||||
./android-studio-hidpi.sh -e
|
|
||||||
```
|
|
||||||
|
|
||||||
To disable it
|
|
||||||
|
|
||||||
```
|
|
||||||
./android-studio-hidpi.sh -d
|
|
||||||
```
|
|
|
@ -1,75 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# This is a small script for enabling and disabling HiDPI support in Android Stuido on every Linux distribution where Android Stuido is installed in /opt/android-studio. If the installation is somewhere else you have to change the variable STUDIO_PATH.
|
|
||||||
# Marcel Michael Kapfer
|
|
||||||
# 27 May 2015
|
|
||||||
# GNU GPL v3.0 -> Feel free to re-distribute or fork it
|
|
||||||
|
|
||||||
## Android Stuido path
|
|
||||||
STUDIO_PATH="/opt/android-studio/bin"
|
|
||||||
|
|
||||||
## Enable HiDPI
|
|
||||||
function enable_hidpi {
|
|
||||||
sudo echo "-Dhidpi=true" >> $STUDIO_PATH/stuido.vmoptions
|
|
||||||
sudo echo "-Dhidpi=true" >> $STUDIO_PATH/studio64.vmoptions
|
|
||||||
echo "HiDPI enabled"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
## Disable HiDPI
|
|
||||||
function disable_hidpi {
|
|
||||||
idea=$(sed '/-Dhidpi=true/d' $STUDIO_PATH/studio.vmoptions)
|
|
||||||
idea64=$(sed '/-Dhidpi=true/d' $STUDIO_PATH/studio64.vmoptions)
|
|
||||||
sudo echo "$idea" > $STUDIO_PATH/studio.vmoptions
|
|
||||||
sudo echo "$idea64" > $STUDIO_PATH/studio64.vmoptions
|
|
||||||
echo "HiDPI disabled"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
usage=$(
|
|
||||||
cat <<EOF
|
|
||||||
Usage:
|
|
||||||
|
|
||||||
Enable HiDPI support:
|
|
||||||
--enable
|
|
||||||
or
|
|
||||||
-e
|
|
||||||
|
|
||||||
Disabling HiDPI support:
|
|
||||||
--disable
|
|
||||||
or
|
|
||||||
-d
|
|
||||||
|
|
||||||
Help (prints this)
|
|
||||||
--help
|
|
||||||
or
|
|
||||||
-h
|
|
||||||
|
|
||||||
EOF
|
|
||||||
)
|
|
||||||
|
|
||||||
## Options
|
|
||||||
### Runns if no argument is given
|
|
||||||
if [[ -z "$1" ]]
|
|
||||||
then
|
|
||||||
echo
|
|
||||||
echo "$usage"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
### Runs if an argument is given
|
|
||||||
until [[ $1 == -- ]]; do
|
|
||||||
case $1 in
|
|
||||||
-e | --enable)
|
|
||||||
enable_hidpi
|
|
||||||
;;
|
|
||||||
-d | --disable)
|
|
||||||
disable_hidpi
|
|
||||||
;;
|
|
||||||
-h | --help)
|
|
||||||
echo "$usage"
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
|
@ -1,22 +0,0 @@
|
||||||
COPYRIGHT (c) 2015 mmk2410
|
|
||||||
|
|
||||||
MIT License
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
"Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
@ -1,31 +0,0 @@
|
||||||
# blogger2rangitaki
|
|
||||||
|
|
||||||
This is a small PHP script for converting a Blogger XML to Rangitaki blog posts.
|
|
||||||
|
|
||||||
This script uses [html-to-markdown](https://github.com/thephpleague/html-to-markdown) to convert the blogposts.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
You don't need to install that script on your computer. It is enough to make it runnable:
|
|
||||||
|
|
||||||
```
|
|
||||||
chmod +x blogger2rangitaki.php
|
|
||||||
```
|
|
||||||
|
|
||||||
And to run it:
|
|
||||||
|
|
||||||
```
|
|
||||||
./blogger2rangitaki.php blog.xml
|
|
||||||
```
|
|
||||||
|
|
||||||
where `blog.xml` is your Blogger XML file (the exported blog).
|
|
||||||
|
|
||||||
**This script doesn't import your media files into Rangitaki.**
|
|
||||||
|
|
||||||
## HHVM
|
|
||||||
|
|
||||||
This script works also in HHVM. Just replace the first line with
|
|
||||||
|
|
||||||
```
|
|
||||||
#!/bin/hhvm
|
|
||||||
```
|
|
|
@ -1,106 +0,0 @@
|
||||||
#!/bin/php
|
|
||||||
<?php
|
|
||||||
// This is a php script for converting a blogger atom feed into rangitaki blog posts
|
|
||||||
require './vendor/autoload.php';
|
|
||||||
use League\HTMLToMarkdown\HtmlConverter;
|
|
||||||
if(in_array($argv[1], array("-h", "--help", "--usage", "-?"))) {
|
|
||||||
help();
|
|
||||||
} else if (isset($argv[1])) {
|
|
||||||
$content = file_get_contents("$argv[1]");
|
|
||||||
$xml = new SimpleXMLElement($content);
|
|
||||||
$converter = new HtmlConverter(array('strip_tags' => true));
|
|
||||||
$i = 0;
|
|
||||||
foreach ($xml->entry as $entry) {
|
|
||||||
if($i > 56) {
|
|
||||||
|
|
||||||
// TITLE
|
|
||||||
$title = $entry->title;
|
|
||||||
|
|
||||||
// CONTENT
|
|
||||||
$content = $entry->content;
|
|
||||||
$content = $converter->convert($content);
|
|
||||||
|
|
||||||
// AUTHOR
|
|
||||||
$author = $entry->author->name;
|
|
||||||
|
|
||||||
// TAGS
|
|
||||||
if (isset($entry->categories)) {
|
|
||||||
echo "YES!";
|
|
||||||
foreach ($entry->categories->attributes as $tag) {
|
|
||||||
if (!(substr_compare($tag->scheme, "http://schemas.google.com/", 0, 26))) {
|
|
||||||
$tags = $tags . $tag->term . ", ";
|
|
||||||
}
|
|
||||||
$tags = substr($tags, 0, strlen($tags) - 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pubdate
|
|
||||||
$pubdate = $entry->published;
|
|
||||||
date_default_timezone_set("UTC");
|
|
||||||
$pubdate = date("d F Y", strtotime($pubdate));
|
|
||||||
|
|
||||||
// FILENAME
|
|
||||||
$date = $entry->published;
|
|
||||||
$date = date("Y-m-d-H-i", strtotime($date));
|
|
||||||
$filetitle = str_replace(" ", "-", $title);
|
|
||||||
$filename = $date . "-" . $filetitle . ".md";
|
|
||||||
|
|
||||||
if(isset($tags)){
|
|
||||||
$filecontent = <<<EOD
|
|
||||||
%TITLE: $title
|
|
||||||
%DATE: $pubdate
|
|
||||||
%AUTHOR: $author
|
|
||||||
%TAGS: $tags
|
|
||||||
|
|
||||||
$content
|
|
||||||
EOD;
|
|
||||||
} else {
|
|
||||||
$filecontent = <<<EOD
|
|
||||||
%TITLE: $title
|
|
||||||
%DATE: $pubdate
|
|
||||||
%AUTHOR: $author
|
|
||||||
|
|
||||||
$content
|
|
||||||
EOD;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Make a output directory
|
|
||||||
if(!(file_exists("articles"))) {
|
|
||||||
mkdir("articles");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save the file
|
|
||||||
$handle = fopen("articles/$filename", "c");
|
|
||||||
fwrite($handle, $filecontent);
|
|
||||||
fclose($handle);
|
|
||||||
}
|
|
||||||
$i++;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
help();
|
|
||||||
}
|
|
||||||
|
|
||||||
function help() {
|
|
||||||
$help = <<<EOD
|
|
||||||
|
|
||||||
blogger2rangitaki
|
|
||||||
|
|
||||||
A small PHP script which converts a Blogger XML export to Rangitaki blog posts.
|
|
||||||
|
|
||||||
COPYRIGHT © 2015 Rangitaki Project
|
|
||||||
|
|
||||||
MIT License
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
|
|
||||||
./blogger2rangitaki filename.xml
|
|
||||||
|
|
||||||
Where filename.xml is the Blogger export.
|
|
||||||
|
|
||||||
The articels are saved in articles/
|
|
||||||
|
|
||||||
EOD;
|
|
||||||
|
|
||||||
echo $help;
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
"require": {
|
|
||||||
"league/html-to-markdown": "~4.0"
|
|
||||||
}
|
|
||||||
}
|
|
78
blogger2rangitaki/composer.lock
generated
78
blogger2rangitaki/composer.lock
generated
|
@ -1,78 +0,0 @@
|
||||||
{
|
|
||||||
"_readme": [
|
|
||||||
"This file locks the dependencies of your project to a known state",
|
|
||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
|
||||||
"This file is @generated automatically"
|
|
||||||
],
|
|
||||||
"hash": "58637a0fe75a453726c4f248ef834809",
|
|
||||||
"packages": [
|
|
||||||
{
|
|
||||||
"name": "league/html-to-markdown",
|
|
||||||
"version": "4.0.0",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/thephpleague/html-to-markdown.git",
|
|
||||||
"reference": "16f0fe21c60e8a76a51bdf3b256cb7a54bb1cac4"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/16f0fe21c60e8a76a51bdf3b256cb7a54bb1cac4",
|
|
||||||
"reference": "16f0fe21c60e8a76a51bdf3b256cb7a54bb1cac4",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"ext-dom": "*",
|
|
||||||
"ext-xml": "*",
|
|
||||||
"php": ">=5.3.3"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"phpunit/phpunit": "4.*",
|
|
||||||
"scrutinizer/ocular": "~1.1"
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"extra": {
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-master": "4.1-dev"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"League\\HTMLToMarkdown\\": "src/"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Colin O'Dell",
|
|
||||||
"email": "colinodell@gmail.com",
|
|
||||||
"homepage": "http://www.colinodell.com",
|
|
||||||
"role": "Lead Developer"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Nick Cernis",
|
|
||||||
"email": "nick@cern.is",
|
|
||||||
"homepage": "http://modernnerd.net",
|
|
||||||
"role": "Original Author"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "An HTML-to-markdown conversion helper for PHP",
|
|
||||||
"homepage": "https://github.com/thephpleague/html-to-markdown",
|
|
||||||
"keywords": [
|
|
||||||
"html",
|
|
||||||
"markdown"
|
|
||||||
],
|
|
||||||
"time": "2015-07-25 16:38:14"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"packages-dev": [],
|
|
||||||
"aliases": [],
|
|
||||||
"minimum-stability": "stable",
|
|
||||||
"stability-flags": [],
|
|
||||||
"prefer-stable": false,
|
|
||||||
"prefer-lowest": false,
|
|
||||||
"platform": [],
|
|
||||||
"platform-dev": []
|
|
||||||
}
|
|
7
blogger2rangitaki/vendor/autoload.php
vendored
7
blogger2rangitaki/vendor/autoload.php
vendored
|
@ -1,7 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
// autoload.php @generated by Composer
|
|
||||||
|
|
||||||
require_once __DIR__ . '/composer' . '/autoload_real.php';
|
|
||||||
|
|
||||||
return ComposerAutoloaderInit7f8e28eb5836e5d023a7e972b858cf6e::getLoader();
|
|
413
blogger2rangitaki/vendor/composer/ClassLoader.php
vendored
413
blogger2rangitaki/vendor/composer/ClassLoader.php
vendored
|
@ -1,413 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Composer.
|
|
||||||
*
|
|
||||||
* (c) Nils Adermann <naderman@naderman.de>
|
|
||||||
* Jordi Boggiano <j.boggiano@seld.be>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Composer\Autoload;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ClassLoader implements a PSR-0 class loader
|
|
||||||
*
|
|
||||||
* See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
|
|
||||||
*
|
|
||||||
* $loader = new \Composer\Autoload\ClassLoader();
|
|
||||||
*
|
|
||||||
* // register classes with namespaces
|
|
||||||
* $loader->add('Symfony\Component', __DIR__.'/component');
|
|
||||||
* $loader->add('Symfony', __DIR__.'/framework');
|
|
||||||
*
|
|
||||||
* // activate the autoloader
|
|
||||||
* $loader->register();
|
|
||||||
*
|
|
||||||
* // to enable searching the include path (eg. for PEAR packages)
|
|
||||||
* $loader->setUseIncludePath(true);
|
|
||||||
*
|
|
||||||
* In this example, if you try to use a class in the Symfony\Component
|
|
||||||
* namespace or one of its children (Symfony\Component\Console for instance),
|
|
||||||
* the autoloader will first look for the class under the component/
|
|
||||||
* directory, and it will then fallback to the framework/ directory if not
|
|
||||||
* found before giving up.
|
|
||||||
*
|
|
||||||
* This class is loosely based on the Symfony UniversalClassLoader.
|
|
||||||
*
|
|
||||||
* @author Fabien Potencier <fabien@symfony.com>
|
|
||||||
* @author Jordi Boggiano <j.boggiano@seld.be>
|
|
||||||
*/
|
|
||||||
class ClassLoader
|
|
||||||
{
|
|
||||||
// PSR-4
|
|
||||||
private $prefixLengthsPsr4 = array();
|
|
||||||
private $prefixDirsPsr4 = array();
|
|
||||||
private $fallbackDirsPsr4 = array();
|
|
||||||
|
|
||||||
// PSR-0
|
|
||||||
private $prefixesPsr0 = array();
|
|
||||||
private $fallbackDirsPsr0 = array();
|
|
||||||
|
|
||||||
private $useIncludePath = false;
|
|
||||||
private $classMap = array();
|
|
||||||
|
|
||||||
private $classMapAuthoritative = false;
|
|
||||||
|
|
||||||
public function getPrefixes()
|
|
||||||
{
|
|
||||||
if (!empty($this->prefixesPsr0)) {
|
|
||||||
return call_user_func_array('array_merge', $this->prefixesPsr0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getPrefixesPsr4()
|
|
||||||
{
|
|
||||||
return $this->prefixDirsPsr4;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getFallbackDirs()
|
|
||||||
{
|
|
||||||
return $this->fallbackDirsPsr0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getFallbackDirsPsr4()
|
|
||||||
{
|
|
||||||
return $this->fallbackDirsPsr4;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getClassMap()
|
|
||||||
{
|
|
||||||
return $this->classMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $classMap Class to filename map
|
|
||||||
*/
|
|
||||||
public function addClassMap(array $classMap)
|
|
||||||
{
|
|
||||||
if ($this->classMap) {
|
|
||||||
$this->classMap = array_merge($this->classMap, $classMap);
|
|
||||||
} else {
|
|
||||||
$this->classMap = $classMap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a set of PSR-0 directories for a given prefix, either
|
|
||||||
* appending or prepending to the ones previously set for this prefix.
|
|
||||||
*
|
|
||||||
* @param string $prefix The prefix
|
|
||||||
* @param array|string $paths The PSR-0 root directories
|
|
||||||
* @param bool $prepend Whether to prepend the directories
|
|
||||||
*/
|
|
||||||
public function add($prefix, $paths, $prepend = false)
|
|
||||||
{
|
|
||||||
if (!$prefix) {
|
|
||||||
if ($prepend) {
|
|
||||||
$this->fallbackDirsPsr0 = array_merge(
|
|
||||||
(array) $paths,
|
|
||||||
$this->fallbackDirsPsr0
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$this->fallbackDirsPsr0 = array_merge(
|
|
||||||
$this->fallbackDirsPsr0,
|
|
||||||
(array) $paths
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$first = $prefix[0];
|
|
||||||
if (!isset($this->prefixesPsr0[$first][$prefix])) {
|
|
||||||
$this->prefixesPsr0[$first][$prefix] = (array) $paths;
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ($prepend) {
|
|
||||||
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
|
||||||
(array) $paths,
|
|
||||||
$this->prefixesPsr0[$first][$prefix]
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
|
||||||
$this->prefixesPsr0[$first][$prefix],
|
|
||||||
(array) $paths
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a set of PSR-4 directories for a given namespace, either
|
|
||||||
* appending or prepending to the ones previously set for this namespace.
|
|
||||||
*
|
|
||||||
* @param string $prefix The prefix/namespace, with trailing '\\'
|
|
||||||
* @param array|string $paths The PSR-0 base directories
|
|
||||||
* @param bool $prepend Whether to prepend the directories
|
|
||||||
*
|
|
||||||
* @throws \InvalidArgumentException
|
|
||||||
*/
|
|
||||||
public function addPsr4($prefix, $paths, $prepend = false)
|
|
||||||
{
|
|
||||||
if (!$prefix) {
|
|
||||||
// Register directories for the root namespace.
|
|
||||||
if ($prepend) {
|
|
||||||
$this->fallbackDirsPsr4 = array_merge(
|
|
||||||
(array) $paths,
|
|
||||||
$this->fallbackDirsPsr4
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$this->fallbackDirsPsr4 = array_merge(
|
|
||||||
$this->fallbackDirsPsr4,
|
|
||||||
(array) $paths
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
|
|
||||||
// Register directories for a new namespace.
|
|
||||||
$length = strlen($prefix);
|
|
||||||
if ('\\' !== $prefix[$length - 1]) {
|
|
||||||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
|
||||||
}
|
|
||||||
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
|
||||||
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
|
||||||
} elseif ($prepend) {
|
|
||||||
// Prepend directories for an already registered namespace.
|
|
||||||
$this->prefixDirsPsr4[$prefix] = array_merge(
|
|
||||||
(array) $paths,
|
|
||||||
$this->prefixDirsPsr4[$prefix]
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
// Append directories for an already registered namespace.
|
|
||||||
$this->prefixDirsPsr4[$prefix] = array_merge(
|
|
||||||
$this->prefixDirsPsr4[$prefix],
|
|
||||||
(array) $paths
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a set of PSR-0 directories for a given prefix,
|
|
||||||
* replacing any others previously set for this prefix.
|
|
||||||
*
|
|
||||||
* @param string $prefix The prefix
|
|
||||||
* @param array|string $paths The PSR-0 base directories
|
|
||||||
*/
|
|
||||||
public function set($prefix, $paths)
|
|
||||||
{
|
|
||||||
if (!$prefix) {
|
|
||||||
$this->fallbackDirsPsr0 = (array) $paths;
|
|
||||||
} else {
|
|
||||||
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a set of PSR-4 directories for a given namespace,
|
|
||||||
* replacing any others previously set for this namespace.
|
|
||||||
*
|
|
||||||
* @param string $prefix The prefix/namespace, with trailing '\\'
|
|
||||||
* @param array|string $paths The PSR-4 base directories
|
|
||||||
*
|
|
||||||
* @throws \InvalidArgumentException
|
|
||||||
*/
|
|
||||||
public function setPsr4($prefix, $paths)
|
|
||||||
{
|
|
||||||
if (!$prefix) {
|
|
||||||
$this->fallbackDirsPsr4 = (array) $paths;
|
|
||||||
} else {
|
|
||||||
$length = strlen($prefix);
|
|
||||||
if ('\\' !== $prefix[$length - 1]) {
|
|
||||||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
|
||||||
}
|
|
||||||
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
|
||||||
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Turns on searching the include path for class files.
|
|
||||||
*
|
|
||||||
* @param bool $useIncludePath
|
|
||||||
*/
|
|
||||||
public function setUseIncludePath($useIncludePath)
|
|
||||||
{
|
|
||||||
$this->useIncludePath = $useIncludePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Can be used to check if the autoloader uses the include path to check
|
|
||||||
* for classes.
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function getUseIncludePath()
|
|
||||||
{
|
|
||||||
return $this->useIncludePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Turns off searching the prefix and fallback directories for classes
|
|
||||||
* that have not been registered with the class map.
|
|
||||||
*
|
|
||||||
* @param bool $classMapAuthoritative
|
|
||||||
*/
|
|
||||||
public function setClassMapAuthoritative($classMapAuthoritative)
|
|
||||||
{
|
|
||||||
$this->classMapAuthoritative = $classMapAuthoritative;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Should class lookup fail if not found in the current class map?
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function isClassMapAuthoritative()
|
|
||||||
{
|
|
||||||
return $this->classMapAuthoritative;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers this instance as an autoloader.
|
|
||||||
*
|
|
||||||
* @param bool $prepend Whether to prepend the autoloader or not
|
|
||||||
*/
|
|
||||||
public function register($prepend = false)
|
|
||||||
{
|
|
||||||
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unregisters this instance as an autoloader.
|
|
||||||
*/
|
|
||||||
public function unregister()
|
|
||||||
{
|
|
||||||
spl_autoload_unregister(array($this, 'loadClass'));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Loads the given class or interface.
|
|
||||||
*
|
|
||||||
* @param string $class The name of the class
|
|
||||||
* @return bool|null True if loaded, null otherwise
|
|
||||||
*/
|
|
||||||
public function loadClass($class)
|
|
||||||
{
|
|
||||||
if ($file = $this->findFile($class)) {
|
|
||||||
includeFile($file);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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)
|
|
||||||
{
|
|
||||||
// work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
|
|
||||||
if ('\\' == $class[0]) {
|
|
||||||
$class = substr($class, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// class map lookup
|
|
||||||
if (isset($this->classMap[$class])) {
|
|
||||||
return $this->classMap[$class];
|
|
||||||
}
|
|
||||||
if ($this->classMapAuthoritative) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$file = $this->findFileWithExtension($class, '.php');
|
|
||||||
|
|
||||||
// Search for Hack files if we are running on HHVM
|
|
||||||
if ($file === null && defined('HHVM_VERSION')) {
|
|
||||||
$file = $this->findFileWithExtension($class, '.hh');
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($file === null) {
|
|
||||||
// Remember that this class does not exist.
|
|
||||||
return $this->classMap[$class] = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $file;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function findFileWithExtension($class, $ext)
|
|
||||||
{
|
|
||||||
// PSR-4 lookup
|
|
||||||
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
|
|
||||||
|
|
||||||
$first = $class[0];
|
|
||||||
if (isset($this->prefixLengthsPsr4[$first])) {
|
|
||||||
foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
|
|
||||||
if (0 === strpos($class, $prefix)) {
|
|
||||||
foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
|
|
||||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
|
|
||||||
return $file;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PSR-4 fallback dirs
|
|
||||||
foreach ($this->fallbackDirsPsr4 as $dir) {
|
|
||||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
|
|
||||||
return $file;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PSR-0 lookup
|
|
||||||
if (false !== $pos = strrpos($class, '\\')) {
|
|
||||||
// namespaced class name
|
|
||||||
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
|
|
||||||
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
|
|
||||||
} else {
|
|
||||||
// PEAR-like class name
|
|
||||||
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($this->prefixesPsr0[$first])) {
|
|
||||||
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
|
|
||||||
if (0 === strpos($class, $prefix)) {
|
|
||||||
foreach ($dirs as $dir) {
|
|
||||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
|
||||||
return $file;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PSR-0 fallback dirs
|
|
||||||
foreach ($this->fallbackDirsPsr0 as $dir) {
|
|
||||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
|
||||||
return $file;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PSR-0 include paths.
|
|
||||||
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
|
|
||||||
return $file;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Scope isolated include.
|
|
||||||
*
|
|
||||||
* Prevents access to $this/self from included files.
|
|
||||||
*/
|
|
||||||
function includeFile($file)
|
|
||||||
{
|
|
||||||
include $file;
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
// autoload_classmap.php @generated by Composer
|
|
||||||
|
|
||||||
$vendorDir = dirname(dirname(__FILE__));
|
|
||||||
$baseDir = dirname($vendorDir);
|
|
||||||
|
|
||||||
return array(
|
|
||||||
);
|
|
|
@ -1,9 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
// autoload_namespaces.php @generated by Composer
|
|
||||||
|
|
||||||
$vendorDir = dirname(dirname(__FILE__));
|
|
||||||
$baseDir = dirname($vendorDir);
|
|
||||||
|
|
||||||
return array(
|
|
||||||
);
|
|
|
@ -1,10 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
// autoload_psr4.php @generated by Composer
|
|
||||||
|
|
||||||
$vendorDir = dirname(dirname(__FILE__));
|
|
||||||
$baseDir = dirname($vendorDir);
|
|
||||||
|
|
||||||
return array(
|
|
||||||
'League\\HTMLToMarkdown\\' => array($vendorDir . '/league/html-to-markdown/src'),
|
|
||||||
);
|
|
|
@ -1,50 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
// autoload_real.php @generated by Composer
|
|
||||||
|
|
||||||
class ComposerAutoloaderInit7f8e28eb5836e5d023a7e972b858cf6e
|
|
||||||
{
|
|
||||||
private static $loader;
|
|
||||||
|
|
||||||
public static function loadClassLoader($class)
|
|
||||||
{
|
|
||||||
if ('Composer\Autoload\ClassLoader' === $class) {
|
|
||||||
require __DIR__ . '/ClassLoader.php';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function getLoader()
|
|
||||||
{
|
|
||||||
if (null !== self::$loader) {
|
|
||||||
return self::$loader;
|
|
||||||
}
|
|
||||||
|
|
||||||
spl_autoload_register(array('ComposerAutoloaderInit7f8e28eb5836e5d023a7e972b858cf6e', 'loadClassLoader'), true, true);
|
|
||||||
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
|
||||||
spl_autoload_unregister(array('ComposerAutoloaderInit7f8e28eb5836e5d023a7e972b858cf6e', 'loadClassLoader'));
|
|
||||||
|
|
||||||
$map = require __DIR__ . '/autoload_namespaces.php';
|
|
||||||
foreach ($map as $namespace => $path) {
|
|
||||||
$loader->set($namespace, $path);
|
|
||||||
}
|
|
||||||
|
|
||||||
$map = require __DIR__ . '/autoload_psr4.php';
|
|
||||||
foreach ($map as $namespace => $path) {
|
|
||||||
$loader->setPsr4($namespace, $path);
|
|
||||||
}
|
|
||||||
|
|
||||||
$classMap = require __DIR__ . '/autoload_classmap.php';
|
|
||||||
if ($classMap) {
|
|
||||||
$loader->addClassMap($classMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
$loader->register(true);
|
|
||||||
|
|
||||||
return $loader;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function composerRequire7f8e28eb5836e5d023a7e972b858cf6e($file)
|
|
||||||
{
|
|
||||||
require $file;
|
|
||||||
}
|
|
64
blogger2rangitaki/vendor/composer/installed.json
vendored
64
blogger2rangitaki/vendor/composer/installed.json
vendored
|
@ -1,64 +0,0 @@
|
||||||
[
|
|
||||||
{
|
|
||||||
"name": "league/html-to-markdown",
|
|
||||||
"version": "4.0.0",
|
|
||||||
"version_normalized": "4.0.0.0",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/thephpleague/html-to-markdown.git",
|
|
||||||
"reference": "16f0fe21c60e8a76a51bdf3b256cb7a54bb1cac4"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/16f0fe21c60e8a76a51bdf3b256cb7a54bb1cac4",
|
|
||||||
"reference": "16f0fe21c60e8a76a51bdf3b256cb7a54bb1cac4",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"ext-dom": "*",
|
|
||||||
"ext-xml": "*",
|
|
||||||
"php": ">=5.3.3"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"phpunit/phpunit": "4.*",
|
|
||||||
"scrutinizer/ocular": "~1.1"
|
|
||||||
},
|
|
||||||
"time": "2015-07-25 16:38:14",
|
|
||||||
"type": "library",
|
|
||||||
"extra": {
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-master": "4.1-dev"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"installation-source": "dist",
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"League\\HTMLToMarkdown\\": "src/"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Colin O'Dell",
|
|
||||||
"email": "colinodell@gmail.com",
|
|
||||||
"homepage": "http://www.colinodell.com",
|
|
||||||
"role": "Lead Developer"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Nick Cernis",
|
|
||||||
"email": "nick@cern.is",
|
|
||||||
"homepage": "http://modernnerd.net",
|
|
||||||
"role": "Original Author"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "An HTML-to-markdown conversion helper for PHP",
|
|
||||||
"homepage": "https://github.com/thephpleague/html-to-markdown",
|
|
||||||
"keywords": [
|
|
||||||
"html",
|
|
||||||
"markdown"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
|
@ -1,12 +0,0 @@
|
||||||
preset: recommended
|
|
||||||
|
|
||||||
enabled:
|
|
||||||
- concat_with_spaces
|
|
||||||
- strict
|
|
||||||
|
|
||||||
disabled:
|
|
||||||
- concat_without_spaces
|
|
||||||
- phpdoc_short_description
|
|
||||||
- psr0
|
|
||||||
- short_array_syntax
|
|
||||||
|
|
|
@ -1,120 +0,0 @@
|
||||||
# Change Log
|
|
||||||
All notable changes to this project will be documented in this file.
|
|
||||||
Updates should follow the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
|
|
||||||
|
|
||||||
## [Unreleased][unreleased]
|
|
||||||
|
|
||||||
## [4.0.0]
|
|
||||||
|
|
||||||
This release changes the visibility of several methods/properties. #42 and #43 brought to light that some visiblities were
|
|
||||||
not ideally set, so this releases fixes that. Moving forwards this should reduce the chance of introducing BC-breaking changes.
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- Added new `HtmlConverter::getEnvironment()` method to expose the `Environment` (#42, #43)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- Changed `Environment::addConverter()` from `protected` to `public`, enabling custom converters to be added (#42, #43)
|
|
||||||
- Changed `HtmlConverter::createDOMDocument()` from `protected` to `private`
|
|
||||||
- Changed `Element::nextCached` from `protected` to `private`
|
|
||||||
- Made the `Environment` class `final`
|
|
||||||
|
|
||||||
## [3.1.1]
|
|
||||||
### Fixed
|
|
||||||
- Empty HTML strings now result in empty Markdown documents (#40, #41)
|
|
||||||
|
|
||||||
## [3.1.0]
|
|
||||||
### Added
|
|
||||||
- Added new `equals` method to `Element` to check for equality
|
|
||||||
|
|
||||||
### Changes
|
|
||||||
- Use Linux line endings consistently instead of plaform-specific line endings (#36)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- Cleaned up code style
|
|
||||||
|
|
||||||
## [3.0.0]
|
|
||||||
### Changed
|
|
||||||
- Changed namespace to `League\HTMLToMarkdown`
|
|
||||||
- Changed packagist name to `league/html-to-markdown`
|
|
||||||
- Re-organized code into several separate classes
|
|
||||||
- `<a>` tags with identical href and inner text are now rendered using angular bracket syntax (#31)
|
|
||||||
- `<div>` elements are now treated as block-level elements (#33)
|
|
||||||
|
|
||||||
## [2.2.2]
|
|
||||||
### Added
|
|
||||||
- Added support for PHP 5.6 and HHVM
|
|
||||||
- Enabled testing against PHP 7 nightlies
|
|
||||||
- Added this CHANGELOG.md
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- Fixed whitespace preservation between inline elements (#9 and #10)
|
|
||||||
|
|
||||||
## [2.2.1]
|
|
||||||
### Fixed
|
|
||||||
- Preserve placeholder links (#22)
|
|
||||||
|
|
||||||
## [2.2.0]
|
|
||||||
### Added
|
|
||||||
- Added CircleCI config
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- `<pre>` blocks are now treated as code elements
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
- Dropped support for PHP 5.2
|
|
||||||
- Removed incorrect README comment regarding `#text` nodes (#17)
|
|
||||||
|
|
||||||
## [2.1.2]
|
|
||||||
### Added
|
|
||||||
- Added the ability to blacklist/remove specific node types (#11)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- Line breaks are now placed after divs instead of before them
|
|
||||||
- Newlines inside of link texts are now removed
|
|
||||||
- Updated the minimum PHPUnit version to 4.*
|
|
||||||
|
|
||||||
## [2.1.1]
|
|
||||||
### Added
|
|
||||||
- Added options to customize emphasis characters
|
|
||||||
|
|
||||||
## [2.1.0]
|
|
||||||
### Added
|
|
||||||
- Added option to strip HTML tags without Markdown equivalents
|
|
||||||
- Added `convert()` method for converter reuse
|
|
||||||
- Added ability to set options after instance construction
|
|
||||||
- Documented the required PHP extensions (#4)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- ATX style now used for h1 and h2 tags inside blockquotes
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- Newlines inside blockquotes are now started with a bracket
|
|
||||||
- Fixed some incorrect docblocks
|
|
||||||
- `__toString()` now returns an empty string if input is empty
|
|
||||||
- Convert head tag if body tag is empty (#7)
|
|
||||||
- Preserve special characters inside tags without md equivalents (#6)
|
|
||||||
|
|
||||||
|
|
||||||
## [2.0.1]
|
|
||||||
### Fixed
|
|
||||||
- Fixed first line indentation for multi-line code blocks
|
|
||||||
- Fixed consecutive anchors get separating spaces stripped (#3)
|
|
||||||
|
|
||||||
## [2.0.0]
|
|
||||||
### Added
|
|
||||||
- Initial release
|
|
||||||
|
|
||||||
[unreleased]: https://github.com/thephpleague/html-to-markdown/compare/4.0.0...master
|
|
||||||
[4.0.0]: https://github.com/thephpleague/html-to-markdown/compare/3.1.1...4.0.0
|
|
||||||
[3.1.1]: https://github.com/thephpleague/html-to-markdown/compare/3.1.0...3.1.1
|
|
||||||
[3.1.0]: https://github.com/thephpleague/html-to-markdown/compare/3.0.0...3.1.0
|
|
||||||
[3.0.0]: https://github.com/thephpleague/html-to-markdown/compare/2.2.2...3.0.0
|
|
||||||
[2.2.2]: https://github.com/thephpleague/html-to-markdown/compare/2.2.1...2.2.2
|
|
||||||
[2.2.1]: https://github.com/thephpleague/html-to-markdown/compare/2.2.0...2.2.1
|
|
||||||
[2.2.0]: https://github.com/thephpleague/html-to-markdown/compare/2.1.2...2.2.0
|
|
||||||
[2.1.2]: https://github.com/thephpleague/html-to-markdown/compare/2.1.1...2.1.2
|
|
||||||
[2.1.1]: https://github.com/thephpleague/html-to-markdown/compare/2.1.0...2.1.1
|
|
||||||
[2.1.0]: https://github.com/thephpleague/html-to-markdown/compare/2.0.1...2.1.0
|
|
||||||
[2.0.1]: https://github.com/thephpleague/html-to-markdown/compare/2.0.0...2.0.1
|
|
||||||
[2.0.0]: https://github.com/thephpleague/html-to-markdown/compare/775f91e...2.0.0
|
|
||||||
|
|
|
@ -1,32 +0,0 @@
|
||||||
# Contributing
|
|
||||||
|
|
||||||
Contributions are **welcome** and will be fully **credited**.
|
|
||||||
|
|
||||||
We accept contributions via Pull Requests on [Github](https://github.com/thephpleague/html-to-markdown).
|
|
||||||
|
|
||||||
|
|
||||||
## Pull Requests
|
|
||||||
|
|
||||||
- **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** - The easiest way to apply the conventions is to install [PHP Code Sniffer](http://pear.php.net/package/PHP_CodeSniffer).
|
|
||||||
|
|
||||||
- **Add tests!** - Your patch won't be accepted if it doesn't have tests.
|
|
||||||
|
|
||||||
- **Document any change in behaviour** - Make sure the `README.md` and any other relevant documentation are kept up-to-date.
|
|
||||||
|
|
||||||
- **Consider our release cycle** - We try to follow [SemVer v2.0.0](http://semver.org/). Randomly breaking public APIs is not an option.
|
|
||||||
|
|
||||||
- **Create feature branches** - Don't ask us to pull from your master branch.
|
|
||||||
|
|
||||||
- **One pull request per feature** - If you want to do more than one thing, send multiple pull requests.
|
|
||||||
|
|
||||||
- **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please [squash them](http://www.git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages) before submitting.
|
|
||||||
|
|
||||||
|
|
||||||
## Running Tests
|
|
||||||
|
|
||||||
``` bash
|
|
||||||
$ ./vendor/bin/phpunit
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
**Happy coding**!
|
|
|
@ -1,22 +0,0 @@
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2015 Colin O'Dell
|
|
||||||
|
|
||||||
Originally created by Nick Cernis
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
||||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
||||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
@ -1,151 +0,0 @@
|
||||||
HTML To Markdown for PHP
|
|
||||||
========================
|
|
||||||
|
|
||||||
[![Latest Version](https://img.shields.io/packagist/v/league/html-to-markdown.svg?style=flat-square)](https://packagist.org/packages/league/html-to-markdown)
|
|
||||||
[![Software License](http://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
|
|
||||||
[![Build Status](https://img.shields.io/travis/thephpleague/html-to-markdown/master.svg?style=flat-square)](https://travis-ci.org/thephpleague/html-to-markdown)
|
|
||||||
[![Coverage Status](https://img.shields.io/scrutinizer/coverage/g/thephpleague/html-to-markdown.svg?style=flat-square)](https://scrutinizer-ci.com/g/thephpleague/html-to-markdown/code-structure)
|
|
||||||
[![Quality Score](https://img.shields.io/scrutinizer/g/thephpleague/html-to-markdown.svg?style=flat-square)](https://scrutinizer-ci.com/g/thephpleague/html-to-markdown)
|
|
||||||
[![Total Downloads](https://img.shields.io/packagist/dt/league/html-to-markdown.svg?style=flat-square)](https://packagist.org/packages/league/html-to-markdown)
|
|
||||||
|
|
||||||
Library which converts HTML to [Markdown](http://daringfireball.net/projects/markdown/) for your sanity and convenience.
|
|
||||||
|
|
||||||
|
|
||||||
**Requires**: PHP 5.3+
|
|
||||||
|
|
||||||
**Lead Developer**: [@colinodell](http://twitter.com/colinodell)
|
|
||||||
|
|
||||||
**Original Author**: [@nickcernis](http://twitter.com/nickcernis)
|
|
||||||
|
|
||||||
|
|
||||||
### Why convert HTML to Markdown?
|
|
||||||
|
|
||||||
*"What alchemy is this?"* you mutter. *"I can see why you'd convert [Markdown to HTML](https://github.com/thephpleague/commonmark),"* you continue, already labouring the question somewhat, *"but why go the other way?"*
|
|
||||||
|
|
||||||
Typically you would convert HTML to Markdown if:
|
|
||||||
|
|
||||||
1. You have an existing HTML document that needs to be edited by people with good taste.
|
|
||||||
2. You want to store new content in HTML format but edit it as Markdown.
|
|
||||||
3. You want to convert HTML email to plain text email.
|
|
||||||
4. You know a guy who's been converting HTML to Markdown for years, and now he can speak Elvish. You'd quite like to be able to speak Elvish.
|
|
||||||
5. You just really like Markdown.
|
|
||||||
|
|
||||||
### How to use it
|
|
||||||
|
|
||||||
Require the library in your composer.json:
|
|
||||||
|
|
||||||
{
|
|
||||||
"require": {
|
|
||||||
"league/html-to-markdown": "~4.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Then `composer install` and add `require 'vendor/autoload.php';` to the top of your script.
|
|
||||||
|
|
||||||
Next, create a new HtmlConverter instance, passing in your valid HTML code to its `convert()` function:
|
|
||||||
|
|
||||||
use League\HTMLToMarkdown\HtmlConverter;
|
|
||||||
|
|
||||||
$converter = new HtmlConverter();
|
|
||||||
|
|
||||||
$html = "<h3>Quick, to the Batpoles!</h3>";
|
|
||||||
$markdown = $converter->convert($html);
|
|
||||||
|
|
||||||
The `$markdown` variable now contains the Markdown version of your HTML as a string:
|
|
||||||
|
|
||||||
echo $markdown; // ==> ### Quick, to the Batpoles!
|
|
||||||
|
|
||||||
The included `demo` directory contains an HTML->Markdown conversion form to try out.
|
|
||||||
|
|
||||||
### Conversion options
|
|
||||||
|
|
||||||
By default, HTML To Markdown preserves HTML tags without Markdown equivalents, like `<span>` and `<div>`.
|
|
||||||
|
|
||||||
To strip HTML tags that don't have a Markdown equivalent while preserving the content inside them, set `strip_tags` to true, like this:
|
|
||||||
|
|
||||||
$converter = new HtmlConverter(array('strip_tags' => true));
|
|
||||||
|
|
||||||
$html = '<span>Turnips!</span>';
|
|
||||||
$markdown = $converter->convert($html); // $markdown now contains "Turnips!"
|
|
||||||
|
|
||||||
Or more explicitly, like this:
|
|
||||||
|
|
||||||
$converter = new HtmlConverter();
|
|
||||||
$converter->setOption('strip_tags', true);
|
|
||||||
|
|
||||||
$html = '<span>Turnips!</span>';
|
|
||||||
$markdown = $converter->convert($html); // $markdown now contains "Turnips!"
|
|
||||||
|
|
||||||
Note that only the tags themselves are stripped, not the content they hold.
|
|
||||||
|
|
||||||
To strip tags and their content, pass a space-separated list of tags in `remove_nodes`, like this:
|
|
||||||
|
|
||||||
$converter = new HtmlConverter(array('remove_nodes' => 'span div'));
|
|
||||||
|
|
||||||
$html = '<span>Turnips!</span><div>Monkeys!</div>';
|
|
||||||
$markdown = $converter->convert($html); // $markdown now contains ""
|
|
||||||
|
|
||||||
### Style options
|
|
||||||
|
|
||||||
Bold and italic tags are converted using the asterisk syntax by default. Change this to the underlined syntax using the `bold_style` and `italic_style` options.
|
|
||||||
|
|
||||||
$converter = new HtmlConverter();
|
|
||||||
$converter->setOption('italic_style', '_');
|
|
||||||
$converter->setOption('bold_style', '__');
|
|
||||||
|
|
||||||
$html = '<em>Italic</em> and a <strong>bold</strong>';
|
|
||||||
$markdown = $converter->convert($html); // $markdown now contains "_Italic_ and a __bold__"
|
|
||||||
|
|
||||||
### Limitations
|
|
||||||
|
|
||||||
- Markdown Extra, MultiMarkdown and other variants aren't supported – just Markdown.
|
|
||||||
|
|
||||||
### Known issues
|
|
||||||
|
|
||||||
- Nested lists and lists containing multiple paragraphs aren't converted correctly.
|
|
||||||
- Lists inside blockquotes aren't converted correctly.
|
|
||||||
- Any reported [open issues here](https://github.com/thephpleague/html-to-markdown/issues?state=open).
|
|
||||||
|
|
||||||
[Report your issue or request a feature here.](https://github.com/thephpleague/html-to-markdown/issues/new) Issues with patches or failing tests are especially welcome.
|
|
||||||
|
|
||||||
### Style notes
|
|
||||||
|
|
||||||
- Setext (underlined) headers are the default for H1 and H2. If you prefer the ATX style for H1 and H2 (# Header 1 and ## Header 2), set `header_style` to 'atx' in the options array when you instantiate the object:
|
|
||||||
|
|
||||||
`$converter = new HtmlConverter(array('header_style'=>'atx'));`
|
|
||||||
|
|
||||||
Headers of H3 priority and lower always use atx style.
|
|
||||||
|
|
||||||
- Links and images are referenced inline. Footnote references (where image src and anchor href attributes are listed in the footnotes) are not used.
|
|
||||||
- Blockquotes aren't line wrapped – it makes the converted Markdown easier to edit.
|
|
||||||
|
|
||||||
### Dependencies
|
|
||||||
|
|
||||||
HTML To Markdown requires PHP's [xml](http://www.php.net/manual/en/xml.installation.php), [lib-xml](http://www.php.net/manual/en/libxml.installation.php), and [dom](http://www.php.net/manual/en/dom.installation.php) extensions, all of which are enabled by default on most distributions.
|
|
||||||
|
|
||||||
Errors such as "Fatal error: Class 'DOMDocument' not found" on distributions such as CentOS that disable PHP's xml extension can be resolved by installing php-xml.
|
|
||||||
|
|
||||||
### Contributors
|
|
||||||
|
|
||||||
Many thanks to all [contributors](https://github.com/thephpleague/html-to-markdown/graphs/contributors) so far. Further improvements and feature suggestions are very welcome.
|
|
||||||
|
|
||||||
### How it works
|
|
||||||
|
|
||||||
HTML To Markdown creates a DOMDocument from the supplied HTML, walks through the tree, and converts each node to a text node containing the equivalent markdown, starting from the most deeply nested node and working inwards towards the root node.
|
|
||||||
|
|
||||||
### To-do
|
|
||||||
|
|
||||||
- Support for nested lists and lists inside blockquotes.
|
|
||||||
- Offer an option to preserve tags as HTML if they contain attributes that can't be represented with Markdown (e.g. `style`).
|
|
||||||
|
|
||||||
### Trying to convert Markdown to HTML?
|
|
||||||
|
|
||||||
Use one of these great libraries:
|
|
||||||
|
|
||||||
- [league/commonmark](https://github.com/thephpleague/commonmark) (recommended)
|
|
||||||
- [cebe/markdown](https://github.com/cebe/markdown)
|
|
||||||
- [PHP Markdown](https://michelf.ca/projects/php-markdown/)
|
|
||||||
- [Parsedown](https://github.com/erusev/parsedown)
|
|
||||||
|
|
||||||
No guarantees about the Elvish, though.
|
|
||||||
|
|
|
@ -1,46 +0,0 @@
|
||||||
{
|
|
||||||
"name": "league/html-to-markdown",
|
|
||||||
"type": "library",
|
|
||||||
"description": "An HTML-to-markdown conversion helper for PHP",
|
|
||||||
"keywords": ["markdown", "html"],
|
|
||||||
"homepage": "https://github.com/thephpleague/html-to-markdown",
|
|
||||||
"license": "MIT",
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Colin O'Dell",
|
|
||||||
"email": "colinodell@gmail.com",
|
|
||||||
"homepage": "http://www.colinodell.com",
|
|
||||||
"role": "Lead Developer"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Nick Cernis",
|
|
||||||
"email": "nick@cern.is",
|
|
||||||
"homepage": "http://modernnerd.net",
|
|
||||||
"role": "Original Author"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"League\\HTMLToMarkdown\\": "src/"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"autoload-dev": {
|
|
||||||
"psr-4": {
|
|
||||||
"League\\HTMLToMarkdown\\Test\\": "tests"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": ">=5.3.3",
|
|
||||||
"ext-dom": "*",
|
|
||||||
"ext-xml": "*"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"phpunit/phpunit": "4.*",
|
|
||||||
"scrutinizer/ocular": "~1.1"
|
|
||||||
},
|
|
||||||
"extra": {
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-master": "4.1-dev"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,180 +0,0 @@
|
||||||
<?php
|
|
||||||
require_once dirname(__FILE__) . '/../vendor/autoload.php';
|
|
||||||
|
|
||||||
$markdown = '';
|
|
||||||
$html = ($_POST) ? $_POST['html'] : null;
|
|
||||||
|
|
||||||
if (!is_null($html)) {
|
|
||||||
if (get_magic_quotes_gpc()) {
|
|
||||||
$html = stripslashes($html);
|
|
||||||
}
|
|
||||||
|
|
||||||
$markdown = new \League\HTMLToMarkdown\HtmlConverter($html);
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<title>HTML To Markdown Demo</title>
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
font-family: helvetica, arial, sans-serif;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<div style="width:50%;float:left;">
|
|
||||||
<h3>HTML</h3>
|
|
||||||
|
|
||||||
<form method="post" action="">
|
|
||||||
|
|
||||||
<?php if (!is_null($html)): ?>
|
|
||||||
<textarea rows="30" style="width:95%" name="html" id="html"><?php echo $html ?></textarea><br/>
|
|
||||||
<?php else: ?>
|
|
||||||
<textarea rows="30" style="width:95%" name="html" id="html">
|
|
||||||
<h1>A level one header</h1>
|
|
||||||
|
|
||||||
<p>Some paragraph text™ containing “UTF-8” chars…</p>
|
|
||||||
|
|
||||||
<h2>A longer level two header</h2>
|
|
||||||
|
|
||||||
<h3>Here's a <em>level 3</em> title</h3>
|
|
||||||
|
|
||||||
<p>Some text containing<br/>a forced break.</p>
|
|
||||||
|
|
||||||
<p>Some text containing an
|
|
||||||
unforced break.</p>
|
|
||||||
|
|
||||||
<h2>Blockquotes and horizontal rules</h2>
|
|
||||||
<blockquote>Here's a blockquote</blockquote>
|
|
||||||
|
|
||||||
<hr/>
|
|
||||||
|
|
||||||
<blockquote>
|
|
||||||
<p>This should have a single arrow.</p>
|
|
||||||
<blockquote>
|
|
||||||
<p>A blockquote inside a blockquote, with a double arrow, on a new line.</p>
|
|
||||||
</blockquote>
|
|
||||||
</blockquote>
|
|
||||||
|
|
||||||
<hr/>
|
|
||||||
|
|
||||||
<blockquote>
|
|
||||||
<p>A multi-paragraph blockquote.</p>
|
|
||||||
|
|
||||||
<p>Here's the second paragraph. (Should be inside blockquote.)</p>
|
|
||||||
|
|
||||||
<h4>A header inside a blockquote</h4>
|
|
||||||
|
|
||||||
<p><img src="/path/img.jpg" alt="Image in a blockquote" title="Image in a blockquote"/></p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>List in a blockquote</li>
|
|
||||||
<li>Second list item</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
</blockquote>
|
|
||||||
|
|
||||||
<h2>Lists</h2>
|
|
||||||
<ul>
|
|
||||||
<li>An unordered list</li>
|
|
||||||
<li>Appears with hyphens</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<ol>
|
|
||||||
<li>An ordered list</li>
|
|
||||||
<li>Appears with numbers.</li>
|
|
||||||
<li>Automatically indexed.</li>
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
<h2>Links and images</h2>
|
|
||||||
|
|
||||||
<p><img src="/path/img.jpg" alt="alt text" title="Title"/></p>
|
|
||||||
|
|
||||||
<p>An example of a <a href="http://url.com/" title="Title">link.</a></p>
|
|
||||||
|
|
||||||
<p>An image inside a link:<br/>
|
|
||||||
<a href="http://url.com/" title="Title"><img src="/path/img.jpg" alt="alt text" title="Title"/></a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2>Inline elements</h2>
|
|
||||||
|
|
||||||
<p><em>This text is in italics.</em></p>
|
|
||||||
|
|
||||||
<p><strong>This text is in bold.</strong></p>
|
|
||||||
|
|
||||||
<p>An <em>em</em> and a <strong>strong</strong> inside a paragraph.</p>
|
|
||||||
|
|
||||||
<p>A <em><span>span</span> inside</em> an em.</p>
|
|
||||||
|
|
||||||
<p>A <em><strong>strong</strong> inside</em> an em.</p>
|
|
||||||
|
|
||||||
<p>A <span><strong>strong</strong> inside</span> a span.</p>
|
|
||||||
|
|
||||||
|
|
||||||
<h2>Code blocks and spans</h2>
|
|
||||||
|
|
||||||
<p><code>
|
|
||||||
#sidebar h1 {
|
|
||||||
font-size: 1.5em;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
</code></p>
|
|
||||||
|
|
||||||
<p><code>A <strong>code</strong> span</code></p>
|
|
||||||
|
|
||||||
<h2>Bugs (tests from here on fail)</h2>
|
|
||||||
|
|
||||||
<h4>A list with multiple paragraphs</h4>
|
|
||||||
<ul>
|
|
||||||
<li><p>A list item.</p>
|
|
||||||
|
|
||||||
<p>With multiple paragraphs.</p></li>
|
|
||||||
<li>List item two.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h4>Mixed ordered and unordered nested lists</h4>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>List 1
|
|
||||||
<ul>
|
|
||||||
<li>List 2</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li>List 1b
|
|
||||||
<ol>
|
|
||||||
<li>List 3a</li>
|
|
||||||
<li>List 3b
|
|
||||||
<ul>
|
|
||||||
<li>List 4</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li>List 3c</li>
|
|
||||||
</ol>
|
|
||||||
</li>
|
|
||||||
<li>List 1c</li>
|
|
||||||
</ul>
|
|
||||||
</textarea>
|
|
||||||
<?php endif; ?>
|
|
||||||
<input type="submit" value="Convert HTML to Markdown >>" name="submit">
|
|
||||||
</form>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div style="width:50%;float:right;">
|
|
||||||
<h3>Markdown</h3>
|
|
||||||
<textarea rows="30" style="width:95%; font-family:monospace;" name="markdown" id="markdown"
|
|
||||||
style="font-family:monospace"><?php
|
|
||||||
echo htmlspecialchars($markdown); ?></textarea><br/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div style="clear:both;"></div>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<small><a href="https://github.com/thephpleague/html-to-markdown">HTML To Markdown</a> is a library to convert HTML into Markdown with PHP.</small>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,60 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown;
|
|
||||||
|
|
||||||
class Configuration
|
|
||||||
{
|
|
||||||
protected $config;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $config
|
|
||||||
*/
|
|
||||||
public function __construct(array $config = array())
|
|
||||||
{
|
|
||||||
$this->config = $config;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $config
|
|
||||||
*/
|
|
||||||
public function merge(array $config = array())
|
|
||||||
{
|
|
||||||
$this->config = array_replace_recursive($this->config, $config);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $config
|
|
||||||
*/
|
|
||||||
public function replace(array $config = array())
|
|
||||||
{
|
|
||||||
$this->config = $config;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $key
|
|
||||||
* @param mixed $value
|
|
||||||
*/
|
|
||||||
public function setOption($key, $value)
|
|
||||||
{
|
|
||||||
$this->config[$key] = $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string|null $key
|
|
||||||
* @param mixed|null $default
|
|
||||||
*
|
|
||||||
* @return mixed|null
|
|
||||||
*/
|
|
||||||
public function getOption($key = null, $default = null)
|
|
||||||
{
|
|
||||||
if ($key === null) {
|
|
||||||
return $this->config;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isset($this->config[$key])) {
|
|
||||||
return $default;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->config[$key];
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown;
|
|
||||||
|
|
||||||
interface ConfigurationAwareInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @param Configuration $config
|
|
||||||
*/
|
|
||||||
public function setConfig(Configuration $config);
|
|
||||||
}
|
|
|
@ -1,44 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown\Converter;
|
|
||||||
|
|
||||||
use League\HTMLToMarkdown\ElementInterface;
|
|
||||||
|
|
||||||
class BlockquoteConverter implements ConverterInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @param ElementInterface $element
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function convert(ElementInterface $element)
|
|
||||||
{
|
|
||||||
// Contents should have already been converted to Markdown by this point,
|
|
||||||
// so we just need to add '>' symbols to each line.
|
|
||||||
|
|
||||||
$markdown = '';
|
|
||||||
|
|
||||||
$quote_content = trim($element->getValue());
|
|
||||||
|
|
||||||
$lines = preg_split('/\r\n|\r|\n/', $quote_content);
|
|
||||||
|
|
||||||
$total_lines = count($lines);
|
|
||||||
|
|
||||||
foreach ($lines as $i => $line) {
|
|
||||||
$markdown .= '> ' . $line . "\n";
|
|
||||||
if ($i + 1 === $total_lines) {
|
|
||||||
$markdown .= "\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $markdown;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string[]
|
|
||||||
*/
|
|
||||||
public function getSupportedTags()
|
|
||||||
{
|
|
||||||
return array('blockquote');
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown\Converter;
|
|
||||||
|
|
||||||
use League\HTMLToMarkdown\ElementInterface;
|
|
||||||
|
|
||||||
class CommentConverter implements ConverterInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @param ElementInterface $element
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function convert(ElementInterface $element)
|
|
||||||
{
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string[]
|
|
||||||
*/
|
|
||||||
public function getSupportedTags()
|
|
||||||
{
|
|
||||||
return array('#comment');
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown\Converter;
|
|
||||||
|
|
||||||
use League\HTMLToMarkdown\ElementInterface;
|
|
||||||
|
|
||||||
interface ConverterInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @param ElementInterface $element
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function convert(ElementInterface $element);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string[]
|
|
||||||
*/
|
|
||||||
public function getSupportedTags();
|
|
||||||
}
|
|
|
@ -1,50 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown\Converter;
|
|
||||||
|
|
||||||
use League\HTMLToMarkdown\Configuration;
|
|
||||||
use League\HTMLToMarkdown\ConfigurationAwareInterface;
|
|
||||||
use League\HTMLToMarkdown\ElementInterface;
|
|
||||||
|
|
||||||
class DefaultConverter implements ConverterInterface, ConfigurationAwareInterface
|
|
||||||
{
|
|
||||||
const DEFAULT_CONVERTER = '_default';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Configuration
|
|
||||||
*/
|
|
||||||
protected $config;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Configuration $config
|
|
||||||
*/
|
|
||||||
public function setConfig(Configuration $config)
|
|
||||||
{
|
|
||||||
$this->config = $config;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param ElementInterface $element
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function convert(ElementInterface $element)
|
|
||||||
{
|
|
||||||
// If strip_tags is false (the default), preserve tags that don't have Markdown equivalents,
|
|
||||||
// such as <span> nodes on their own. C14N() canonicalizes the node to a string.
|
|
||||||
// See: http://www.php.net/manual/en/domnode.c14n.php
|
|
||||||
if ($this->config->getOption('strip_tags', false)) {
|
|
||||||
return $element->getValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
return html_entity_decode($element->getChildrenAsString());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string[]
|
|
||||||
*/
|
|
||||||
public function getSupportedTags()
|
|
||||||
{
|
|
||||||
return array(self::DEFAULT_CONVERTER);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,45 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown\Converter;
|
|
||||||
|
|
||||||
use League\HTMLToMarkdown\Configuration;
|
|
||||||
use League\HTMLToMarkdown\ConfigurationAwareInterface;
|
|
||||||
use League\HTMLToMarkdown\ElementInterface;
|
|
||||||
|
|
||||||
class DivConverter implements ConverterInterface, ConfigurationAwareInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var Configuration
|
|
||||||
*/
|
|
||||||
protected $config;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Configuration $config
|
|
||||||
*/
|
|
||||||
public function setConfig(Configuration $config)
|
|
||||||
{
|
|
||||||
$this->config = $config;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param ElementInterface $element
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function convert(ElementInterface $element)
|
|
||||||
{
|
|
||||||
if ($this->config->getOption('strip_tags', false)) {
|
|
||||||
return $element->getValue() . "\n\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
return html_entity_decode($element->getChildrenAsString());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string[]
|
|
||||||
*/
|
|
||||||
public function getSupportedTags()
|
|
||||||
{
|
|
||||||
return array('div');
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,50 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown\Converter;
|
|
||||||
|
|
||||||
use League\HTMLToMarkdown\Configuration;
|
|
||||||
use League\HTMLToMarkdown\ConfigurationAwareInterface;
|
|
||||||
use League\HTMLToMarkdown\ElementInterface;
|
|
||||||
|
|
||||||
class EmphasisConverter implements ConverterInterface, ConfigurationAwareInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var Configuration
|
|
||||||
*/
|
|
||||||
protected $config;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Configuration $config
|
|
||||||
*/
|
|
||||||
public function setConfig(Configuration $config)
|
|
||||||
{
|
|
||||||
$this->config = $config;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param ElementInterface $element
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function convert(ElementInterface $element)
|
|
||||||
{
|
|
||||||
$tag = $element->getTagName();
|
|
||||||
$value = $element->getValue();
|
|
||||||
|
|
||||||
if ($tag === 'i' || $tag === 'em') {
|
|
||||||
$style = $this->config->getOption('italic_style');
|
|
||||||
} else {
|
|
||||||
$style = $this->config->getOption('bold_style');
|
|
||||||
}
|
|
||||||
|
|
||||||
return $style . $value . $style;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string[]
|
|
||||||
*/
|
|
||||||
public function getSupportedTags()
|
|
||||||
{
|
|
||||||
return array('em', 'i', 'strong', 'b');
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown\Converter;
|
|
||||||
|
|
||||||
use League\HTMLToMarkdown\ElementInterface;
|
|
||||||
|
|
||||||
class HardBreakConverter implements ConverterInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @param ElementInterface $element
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function convert(ElementInterface $element)
|
|
||||||
{
|
|
||||||
return " \n";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string[]
|
|
||||||
*/
|
|
||||||
public function getSupportedTags()
|
|
||||||
{
|
|
||||||
return array('br');
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,78 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown\Converter;
|
|
||||||
|
|
||||||
use League\HTMLToMarkdown\Configuration;
|
|
||||||
use League\HTMLToMarkdown\ConfigurationAwareInterface;
|
|
||||||
use League\HTMLToMarkdown\ElementInterface;
|
|
||||||
|
|
||||||
class HeaderConverter implements ConverterInterface, ConfigurationAwareInterface
|
|
||||||
{
|
|
||||||
const STYLE_ATX = 'atx';
|
|
||||||
const STYLE_SETEXT = 'setext';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Configuration
|
|
||||||
*/
|
|
||||||
protected $config;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Configuration $config
|
|
||||||
*/
|
|
||||||
public function setConfig(Configuration $config)
|
|
||||||
{
|
|
||||||
$this->config = $config;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param ElementInterface $element
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function convert(ElementInterface $element)
|
|
||||||
{
|
|
||||||
$level = (int) substr($element->getTagName(), 1, 1);
|
|
||||||
$style = $this->config->getOption('header_style', self::STYLE_SETEXT);
|
|
||||||
|
|
||||||
if (($level === 1 || $level === 2) && !$element->isDescendantOf('blockquote') && $style === self::STYLE_SETEXT) {
|
|
||||||
return $this->createSetextHeader($level, $element->getValue());
|
|
||||||
} else {
|
|
||||||
return $this->createAtxHeader($level, $element->getValue());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string[]
|
|
||||||
*/
|
|
||||||
public function getSupportedTags()
|
|
||||||
{
|
|
||||||
return array('h1', 'h2', 'h3', 'h4', 'h5', 'h6');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param int $level
|
|
||||||
* @param string $content
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
private function createSetextHeader($level, $content)
|
|
||||||
{
|
|
||||||
$length = (function_exists('mb_strlen')) ? mb_strlen($content, 'utf-8') : strlen($content);
|
|
||||||
$underline = ($level === 1) ? '=' : '-';
|
|
||||||
|
|
||||||
return $content . "\n" . str_repeat($underline, $length) . "\n\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param int $level
|
|
||||||
* @param string $content
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
private function createAtxHeader($level, $content)
|
|
||||||
{
|
|
||||||
$prefix = str_repeat('#', $level) . ' ';
|
|
||||||
|
|
||||||
return $prefix . $content . "\n\n";
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown\Converter;
|
|
||||||
|
|
||||||
use League\HTMLToMarkdown\ElementInterface;
|
|
||||||
|
|
||||||
class HorizontalRuleConverter implements ConverterInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @param ElementInterface $element
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function convert(ElementInterface $element)
|
|
||||||
{
|
|
||||||
return "- - - - - -\n\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string[]
|
|
||||||
*/
|
|
||||||
public function getSupportedTags()
|
|
||||||
{
|
|
||||||
return array('hr');
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown\Converter;
|
|
||||||
|
|
||||||
use League\HTMLToMarkdown\ElementInterface;
|
|
||||||
|
|
||||||
class ImageConverter implements ConverterInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @param ElementInterface $element
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function convert(ElementInterface $element)
|
|
||||||
{
|
|
||||||
$src = $element->getAttribute('src');
|
|
||||||
$alt = $element->getAttribute('alt');
|
|
||||||
$title = $element->getAttribute('title');
|
|
||||||
|
|
||||||
if ($title !== '') {
|
|
||||||
// No newlines added. <img> should be in a block-level element.
|
|
||||||
$markdown = '![' . $alt . '](' . $src . ' "' . $title . '")';
|
|
||||||
} else {
|
|
||||||
$markdown = '![' . $alt . '](' . $src . ')';
|
|
||||||
}
|
|
||||||
|
|
||||||
return $markdown;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string[]
|
|
||||||
*/
|
|
||||||
public function getSupportedTags()
|
|
||||||
{
|
|
||||||
return array('img');
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,42 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown\Converter;
|
|
||||||
|
|
||||||
use League\HTMLToMarkdown\ElementInterface;
|
|
||||||
|
|
||||||
class LinkConverter implements ConverterInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @param ElementInterface $element
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function convert(ElementInterface $element)
|
|
||||||
{
|
|
||||||
$href = $element->getAttribute('href');
|
|
||||||
$title = $element->getAttribute('title');
|
|
||||||
$text = $element->getValue();
|
|
||||||
|
|
||||||
if ($title !== '') {
|
|
||||||
$markdown = '[' . $text . '](' . $href . ' "' . $title . '")';
|
|
||||||
} elseif ($href === $text) {
|
|
||||||
$markdown = '<' . $href . '>';
|
|
||||||
} else {
|
|
||||||
$markdown = '[' . $text . '](' . $href . ')';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$href) {
|
|
||||||
$markdown = html_entity_decode($element->getChildrenAsString());
|
|
||||||
}
|
|
||||||
|
|
||||||
return $markdown;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string[]
|
|
||||||
*/
|
|
||||||
public function getSupportedTags()
|
|
||||||
{
|
|
||||||
return array('a');
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown\Converter;
|
|
||||||
|
|
||||||
use League\HTMLToMarkdown\ElementInterface;
|
|
||||||
|
|
||||||
class ListBlockConverter implements ConverterInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @param ElementInterface $element
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function convert(ElementInterface $element)
|
|
||||||
{
|
|
||||||
return $element->getValue() . "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string[]
|
|
||||||
*/
|
|
||||||
public function getSupportedTags()
|
|
||||||
{
|
|
||||||
return array('ol', 'ul');
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown\Converter;
|
|
||||||
|
|
||||||
use League\HTMLToMarkdown\ElementInterface;
|
|
||||||
|
|
||||||
class ListItemConverter implements ConverterInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @param ElementInterface $element
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function convert(ElementInterface $element)
|
|
||||||
{
|
|
||||||
// If parent is an ol, use numbers, otherwise, use dashes
|
|
||||||
$list_type = $element->getParent()->getTagName();
|
|
||||||
$value = $element->getValue();
|
|
||||||
|
|
||||||
if ($list_type === 'ul') {
|
|
||||||
$markdown = '- ' . trim($value) . "\n";
|
|
||||||
} else {
|
|
||||||
$number = $element->getSiblingPosition();
|
|
||||||
$markdown = $number . '. ' . trim($value) . "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
return $markdown;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string[]
|
|
||||||
*/
|
|
||||||
public function getSupportedTags()
|
|
||||||
{
|
|
||||||
return array('li');
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown\Converter;
|
|
||||||
|
|
||||||
use League\HTMLToMarkdown\ElementInterface;
|
|
||||||
|
|
||||||
class ParagraphConverter implements ConverterInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @param ElementInterface $element
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function convert(ElementInterface $element)
|
|
||||||
{
|
|
||||||
$value = $element->getValue();
|
|
||||||
|
|
||||||
return (trim($value)) ? rtrim($value) . "\n\n" : '';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string[]
|
|
||||||
*/
|
|
||||||
public function getSupportedTags()
|
|
||||||
{
|
|
||||||
return array('p');
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,73 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown\Converter;
|
|
||||||
|
|
||||||
use League\HTMLToMarkdown\ElementInterface;
|
|
||||||
|
|
||||||
class PreformattedConverter implements ConverterInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @param ElementInterface $element
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function convert(ElementInterface $element)
|
|
||||||
{
|
|
||||||
// Store the content of the code block in an array, one entry for each line
|
|
||||||
|
|
||||||
$markdown = '';
|
|
||||||
|
|
||||||
$code_content = html_entity_decode($element->getChildrenAsString());
|
|
||||||
$code_content = str_replace(array('<code>', '</code>'), '', $code_content);
|
|
||||||
$code_content = str_replace(array('<pre>', '</pre>'), '', $code_content);
|
|
||||||
|
|
||||||
$lines = preg_split('/\r\n|\r|\n/', $code_content);
|
|
||||||
$total = count($lines);
|
|
||||||
|
|
||||||
// If there's more than one line of code, prepend each line with four spaces and no backticks.
|
|
||||||
if ($total > 1 || $element->getTagName() === 'pre') {
|
|
||||||
// Remove the first and last line if they're empty
|
|
||||||
$first_line = trim($lines[0]);
|
|
||||||
$last_line = trim($lines[$total - 1]);
|
|
||||||
$first_line = trim($first_line, '
'); //trim XML style carriage returns too
|
|
||||||
$last_line = trim($last_line, '
');
|
|
||||||
|
|
||||||
if (empty($first_line)) {
|
|
||||||
array_shift($lines);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (empty($last_line)) {
|
|
||||||
array_pop($lines);
|
|
||||||
}
|
|
||||||
|
|
||||||
$count = 1;
|
|
||||||
foreach ($lines as $line) {
|
|
||||||
$line = str_replace('
', '', $line);
|
|
||||||
$markdown .= ' ' . $line;
|
|
||||||
// Add newlines, except final line of the code
|
|
||||||
if ($count !== $total) {
|
|
||||||
$markdown .= "\n";
|
|
||||||
}
|
|
||||||
$count++;
|
|
||||||
}
|
|
||||||
$markdown .= "\n";
|
|
||||||
} else {
|
|
||||||
// There's only one line of code. It's a code span, not a block. Just wrap it with backticks.
|
|
||||||
$markdown .= '`' . $lines[0] . '`';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($element->getTagName() === 'pre') {
|
|
||||||
$markdown = "\n" . $markdown . "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
return $markdown;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string[]
|
|
||||||
*/
|
|
||||||
public function getSupportedTags()
|
|
||||||
{
|
|
||||||
return array('pre', 'code');
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown\Converter;
|
|
||||||
|
|
||||||
use League\HTMLToMarkdown\ElementInterface;
|
|
||||||
|
|
||||||
class TextConverter implements ConverterInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @param ElementInterface $element
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function convert(ElementInterface $element)
|
|
||||||
{
|
|
||||||
$value = $element->getValue();
|
|
||||||
|
|
||||||
$markdown = preg_replace('~\s+~', ' ', $value);
|
|
||||||
$markdown = preg_replace('~^#~', '\\\\#', $markdown);
|
|
||||||
|
|
||||||
if ($markdown === ' ') {
|
|
||||||
$next = $element->getNext();
|
|
||||||
if (!$next || $next->isBlock()) {
|
|
||||||
$markdown = '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $markdown;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string[]
|
|
||||||
*/
|
|
||||||
public function getSupportedTags()
|
|
||||||
{
|
|
||||||
return array('#text');
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,234 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown;
|
|
||||||
|
|
||||||
class Element implements ElementInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var \DOMNode
|
|
||||||
*/
|
|
||||||
protected $node;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var ElementInterface|null
|
|
||||||
*/
|
|
||||||
private $nextCached;
|
|
||||||
|
|
||||||
public function __construct(\DOMNode $node)
|
|
||||||
{
|
|
||||||
$this->node = $node;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function isBlock()
|
|
||||||
{
|
|
||||||
switch ($this->getTagName()) {
|
|
||||||
case 'blockquote':
|
|
||||||
case 'body':
|
|
||||||
case 'code':
|
|
||||||
case 'div':
|
|
||||||
case 'h1':
|
|
||||||
case 'h2':
|
|
||||||
case 'h3':
|
|
||||||
case 'h4':
|
|
||||||
case 'h5':
|
|
||||||
case 'h6':
|
|
||||||
case 'hr':
|
|
||||||
case 'html':
|
|
||||||
case 'li':
|
|
||||||
case 'p':
|
|
||||||
case 'ol':
|
|
||||||
case 'ul':
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function isText()
|
|
||||||
{
|
|
||||||
return $this->getTagName() === '#text';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function isWhitespace()
|
|
||||||
{
|
|
||||||
return $this->getTagName() === '#text' && trim($this->getValue()) === '';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getTagName()
|
|
||||||
{
|
|
||||||
return $this->node->nodeName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getValue()
|
|
||||||
{
|
|
||||||
return $this->node->nodeValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return ElementInterface|null
|
|
||||||
*/
|
|
||||||
public function getParent()
|
|
||||||
{
|
|
||||||
return new static($this->node->parentNode) ?: null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function hasChildren()
|
|
||||||
{
|
|
||||||
return $this->node->hasChildNodes();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return ElementInterface[]
|
|
||||||
*/
|
|
||||||
public function getChildren()
|
|
||||||
{
|
|
||||||
$ret = array();
|
|
||||||
/** @var \DOMNode $node */
|
|
||||||
foreach ($this->node->childNodes as $node) {
|
|
||||||
$ret[] = new static($node);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return ElementInterface|null
|
|
||||||
*/
|
|
||||||
public function getNext()
|
|
||||||
{
|
|
||||||
if ($this->nextCached === null) {
|
|
||||||
$nextNode = $this->getNextNode($this->node);
|
|
||||||
if ($nextNode !== null) {
|
|
||||||
$this->nextCached = new static($nextNode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->nextCached;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param \DomNode $node
|
|
||||||
*
|
|
||||||
* @return \DomNode|null
|
|
||||||
*/
|
|
||||||
private function getNextNode($node, $checkChildren = true)
|
|
||||||
{
|
|
||||||
if ($checkChildren && $node->firstChild) {
|
|
||||||
return $node->firstChild;
|
|
||||||
} elseif ($node->nextSibling) {
|
|
||||||
return $node->nextSibling;
|
|
||||||
} elseif ($node->parentNode) {
|
|
||||||
return $this->getNextNode($node->parentNode, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string[]|string $tagNames
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function isDescendantOf($tagNames)
|
|
||||||
{
|
|
||||||
if (!is_array($tagNames)) {
|
|
||||||
$tagNames = array($tagNames);
|
|
||||||
}
|
|
||||||
|
|
||||||
for ($p = $this->node->parentNode; $p !== false; $p = $p->parentNode) {
|
|
||||||
if (is_null($p)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_array($p->nodeName, $tagNames)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $markdown
|
|
||||||
*/
|
|
||||||
public function setFinalMarkdown($markdown)
|
|
||||||
{
|
|
||||||
$markdown_node = $this->node->ownerDocument->createTextNode($markdown);
|
|
||||||
$this->node->parentNode->replaceChild($markdown_node, $this->node);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getChildrenAsString()
|
|
||||||
{
|
|
||||||
return $this->node->C14N();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
public function getSiblingPosition()
|
|
||||||
{
|
|
||||||
$position = 0;
|
|
||||||
|
|
||||||
// Loop through all nodes and find the given $node
|
|
||||||
foreach ($this->getParent()->getChildren() as $current_node) {
|
|
||||||
if (!$current_node->isWhitespace()) {
|
|
||||||
$position++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Need a less-buggy way of comparing these
|
|
||||||
// Perhaps we can somehow ensure that we always have the exact same object and use === instead?
|
|
||||||
if ($this->equals($current_node)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $position;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $name
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getAttribute($name)
|
|
||||||
{
|
|
||||||
if ($this->node instanceof \DOMElement) {
|
|
||||||
return $this->node->getAttribute($name);
|
|
||||||
}
|
|
||||||
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param ElementInterface $element
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function equals(ElementInterface $element)
|
|
||||||
{
|
|
||||||
if ($element instanceof self) {
|
|
||||||
return $element->node === $this->node;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $element === $this;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,80 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown;
|
|
||||||
|
|
||||||
interface ElementInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function isBlock();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function isText();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function isWhitespace();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getTagName();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getValue();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return ElementInterface|null
|
|
||||||
*/
|
|
||||||
public function getParent();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string|string[] $tagNames
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function isDescendantOf($tagNames);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function hasChildren();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return ElementInterface[]
|
|
||||||
*/
|
|
||||||
public function getChildren();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return ElementInterface|null
|
|
||||||
*/
|
|
||||||
public function getNext();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
public function getSiblingPosition();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getChildrenAsString();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $markdown
|
|
||||||
*/
|
|
||||||
public function setFinalMarkdown($markdown);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $name
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getAttribute($name);
|
|
||||||
}
|
|
|
@ -1,102 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown;
|
|
||||||
|
|
||||||
use League\HTMLToMarkdown\Converter\BlockquoteConverter;
|
|
||||||
use League\HTMLToMarkdown\Converter\CommentConverter;
|
|
||||||
use League\HTMLToMarkdown\Converter\ConverterInterface;
|
|
||||||
use League\HTMLToMarkdown\Converter\DefaultConverter;
|
|
||||||
use League\HTMLToMarkdown\Converter\DivConverter;
|
|
||||||
use League\HTMLToMarkdown\Converter\EmphasisConverter;
|
|
||||||
use League\HTMLToMarkdown\Converter\HardBreakConverter;
|
|
||||||
use League\HTMLToMarkdown\Converter\HeaderConverter;
|
|
||||||
use League\HTMLToMarkdown\Converter\HorizontalRuleConverter;
|
|
||||||
use League\HTMLToMarkdown\Converter\ImageConverter;
|
|
||||||
use League\HTMLToMarkdown\Converter\LinkConverter;
|
|
||||||
use League\HTMLToMarkdown\Converter\ListBlockConverter;
|
|
||||||
use League\HTMLToMarkdown\Converter\ListItemConverter;
|
|
||||||
use League\HTMLToMarkdown\Converter\ParagraphConverter;
|
|
||||||
use League\HTMLToMarkdown\Converter\PreformattedConverter;
|
|
||||||
use League\HTMLToMarkdown\Converter\TextConverter;
|
|
||||||
|
|
||||||
final class Environment
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var Configuration
|
|
||||||
*/
|
|
||||||
protected $config;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var ConverterInterface[]
|
|
||||||
*/
|
|
||||||
protected $converters = array();
|
|
||||||
|
|
||||||
public function __construct(array $config = array())
|
|
||||||
{
|
|
||||||
$this->config = new Configuration($config);
|
|
||||||
$this->addConverter(new DefaultConverter());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Configuration
|
|
||||||
*/
|
|
||||||
public function getConfig()
|
|
||||||
{
|
|
||||||
return $this->config;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param ConverterInterface $converter
|
|
||||||
*/
|
|
||||||
public function addConverter(ConverterInterface $converter)
|
|
||||||
{
|
|
||||||
if ($converter instanceof ConfigurationAwareInterface) {
|
|
||||||
$converter->setConfig($this->config);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($converter->getSupportedTags() as $tag) {
|
|
||||||
$this->converters[$tag] = $converter;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $tag
|
|
||||||
*
|
|
||||||
* @return ConverterInterface
|
|
||||||
*/
|
|
||||||
public function getConverterByTag($tag)
|
|
||||||
{
|
|
||||||
if (isset($this->converters[$tag])) {
|
|
||||||
return $this->converters[$tag];
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->converters[DefaultConverter::DEFAULT_CONVERTER];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $config
|
|
||||||
*
|
|
||||||
* @return Environment
|
|
||||||
*/
|
|
||||||
public static function createDefaultEnvironment(array $config = array())
|
|
||||||
{
|
|
||||||
$environment = new static($config);
|
|
||||||
|
|
||||||
$environment->addConverter(new BlockquoteConverter());
|
|
||||||
$environment->addConverter(new CommentConverter());
|
|
||||||
$environment->addConverter(new DivConverter());
|
|
||||||
$environment->addConverter(new EmphasisConverter());
|
|
||||||
$environment->addConverter(new HardBreakConverter());
|
|
||||||
$environment->addConverter(new HeaderConverter());
|
|
||||||
$environment->addConverter(new HorizontalRuleConverter());
|
|
||||||
$environment->addConverter(new ImageConverter());
|
|
||||||
$environment->addConverter(new LinkConverter());
|
|
||||||
$environment->addConverter(new ListBlockConverter());
|
|
||||||
$environment->addConverter(new ListItemConverter());
|
|
||||||
$environment->addConverter(new ParagraphConverter());
|
|
||||||
$environment->addConverter(new PreformattedConverter());
|
|
||||||
$environment->addConverter(new TextConverter());
|
|
||||||
|
|
||||||
return $environment;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,194 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace League\HTMLToMarkdown;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class HtmlConverter
|
|
||||||
*
|
|
||||||
* A helper class to convert HTML to Markdown.
|
|
||||||
*
|
|
||||||
* @author Colin O'Dell <colinodell@gmail.com>
|
|
||||||
* @author Nick Cernis <nick@cern.is>
|
|
||||||
*
|
|
||||||
* @link https://github.com/thephpleague/html-to-markdown/ Latest version on GitHub.
|
|
||||||
*
|
|
||||||
* @license http://www.opensource.org/licenses/mit-license.php MIT
|
|
||||||
*/
|
|
||||||
class HtmlConverter
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var Environment
|
|
||||||
*/
|
|
||||||
protected $environment;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* @param array $options Configuration options
|
|
||||||
*/
|
|
||||||
public function __construct(array $options = array())
|
|
||||||
{
|
|
||||||
$defaults = array(
|
|
||||||
'header_style' => 'setext', // Set to 'atx' to output H1 and H2 headers as # Header1 and ## Header2
|
|
||||||
'suppress_errors' => true, // Set to false to show warnings when loading malformed HTML
|
|
||||||
'strip_tags' => false, // Set to true to strip tags that don't have markdown equivalents. N.B. Strips tags, not their content. Useful to clean MS Word HTML output.
|
|
||||||
'bold_style' => '**', // Set to '__' if you prefer the underlined style
|
|
||||||
'italic_style' => '*', // Set to '_' if you prefer the underlined style
|
|
||||||
'remove_nodes' => '', // space-separated list of dom nodes that should be removed. example: 'meta style script'
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->environment = Environment::createDefaultEnvironment($defaults);
|
|
||||||
|
|
||||||
$this->environment->getConfig()->merge($options);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Environment
|
|
||||||
*/
|
|
||||||
public function getEnvironment()
|
|
||||||
{
|
|
||||||
return $this->environment;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Configuration
|
|
||||||
*/
|
|
||||||
public function getConfig()
|
|
||||||
{
|
|
||||||
return $this->environment->getConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert
|
|
||||||
*
|
|
||||||
* Loads HTML and passes to getMarkdown()
|
|
||||||
*
|
|
||||||
* @param $html
|
|
||||||
*
|
|
||||||
* @return string The Markdown version of the html
|
|
||||||
*/
|
|
||||||
public function convert($html)
|
|
||||||
{
|
|
||||||
if (trim($html) === '') {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$document = $this->createDOMDocument($html);
|
|
||||||
|
|
||||||
// Work on the entire DOM tree (including head and body)
|
|
||||||
if (!($root = $document->getElementsByTagName('html')->item(0))) {
|
|
||||||
throw new \InvalidArgumentException('Invalid HTML was provided');
|
|
||||||
}
|
|
||||||
|
|
||||||
$rootElement = new Element($root);
|
|
||||||
$this->convertChildren($rootElement);
|
|
||||||
|
|
||||||
// Store the now-modified DOMDocument as a string
|
|
||||||
$markdown = $document->saveHTML();
|
|
||||||
|
|
||||||
$markdown = $this->sanitize($markdown);
|
|
||||||
|
|
||||||
return $markdown;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $html
|
|
||||||
*
|
|
||||||
* @return \DOMDocument
|
|
||||||
*/
|
|
||||||
private function createDOMDocument($html)
|
|
||||||
{
|
|
||||||
$document = new \DOMDocument();
|
|
||||||
|
|
||||||
if ($this->getConfig()->getOption('suppress_errors')) {
|
|
||||||
// Suppress conversion errors (from http://bit.ly/pCCRSX)
|
|
||||||
libxml_use_internal_errors(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hack to load utf-8 HTML (from http://bit.ly/pVDyCt)
|
|
||||||
$document->loadHTML('<?xml encoding="UTF-8">' . $html);
|
|
||||||
$document->encoding = 'UTF-8';
|
|
||||||
|
|
||||||
if ($this->getConfig()->getOption('suppress_errors')) {
|
|
||||||
libxml_clear_errors();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $document;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert Children
|
|
||||||
*
|
|
||||||
* Recursive function to drill into the DOM and convert each node into Markdown from the inside out.
|
|
||||||
*
|
|
||||||
* Finds children of each node and convert those to #text nodes containing their Markdown equivalent,
|
|
||||||
* starting with the innermost element and working up to the outermost element.
|
|
||||||
*
|
|
||||||
* @param ElementInterface $element
|
|
||||||
*/
|
|
||||||
private function convertChildren(ElementInterface $element)
|
|
||||||
{
|
|
||||||
// Don't convert HTML code inside <code> and <pre> blocks to Markdown - that should stay as HTML
|
|
||||||
if ($element->isDescendantOf(array('pre', 'code'))) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the node has children, convert those to Markdown first
|
|
||||||
if ($element->hasChildren()) {
|
|
||||||
foreach ($element->getChildren() as $child) {
|
|
||||||
$this->convertChildren($child);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now that child nodes have been converted, convert the original node
|
|
||||||
$markdown = $this->convertToMarkdown($element);
|
|
||||||
|
|
||||||
// Create a DOM text node containing the Markdown equivalent of the original node
|
|
||||||
|
|
||||||
// Replace the old $node e.g. '<h3>Title</h3>' with the new $markdown_node e.g. '### Title'
|
|
||||||
$element->setFinalMarkdown($markdown);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert to Markdown
|
|
||||||
*
|
|
||||||
* Converts an individual node into a #text node containing a string of its Markdown equivalent.
|
|
||||||
*
|
|
||||||
* Example: An <h3> node with text content of 'Title' becomes a text node with content of '### Title'
|
|
||||||
*
|
|
||||||
* @param ElementInterface $element
|
|
||||||
*
|
|
||||||
* @return string The converted HTML as Markdown
|
|
||||||
*/
|
|
||||||
protected function convertToMarkdown(ElementInterface $element)
|
|
||||||
{
|
|
||||||
$tag = $element->getTagName();
|
|
||||||
|
|
||||||
// Strip nodes named in remove_nodes
|
|
||||||
$tags_to_remove = explode(' ', $this->getConfig()->getOption('remove_nodes'));
|
|
||||||
if (in_array($tag, $tags_to_remove)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$converter = $this->environment->getConverterByTag($tag);
|
|
||||||
|
|
||||||
return $converter->convert($element);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $markdown
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected function sanitize($markdown)
|
|
||||||
{
|
|
||||||
$markdown = html_entity_decode($markdown, ENT_QUOTES, 'UTF-8');
|
|
||||||
$markdown = html_entity_decode($markdown, ENT_QUOTES, 'UTF-8'); // Double decode to cover cases like &nbsp; http://www.php.net/manual/en/function.htmlentities.php#99984
|
|
||||||
$markdown = preg_replace('/<!DOCTYPE [^>]+>/', '', $markdown); // Strip doctype declaration
|
|
||||||
$unwanted = array('<html>', '</html>', '<body>', '</body>', '<head>', '</head>', '<?xml encoding="UTF-8">', '
');
|
|
||||||
$markdown = str_replace($unwanted, '', $markdown); // Strip unwanted tags
|
|
||||||
$markdown = trim($markdown, "\n\r\0\x0B");
|
|
||||||
|
|
||||||
return $markdown;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,17 +0,0 @@
|
||||||
COPYRIGHT (c) 2015 mmk2410
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 3, 29 June 2007
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
@ -1,23 +0,0 @@
|
||||||
## buildpdf.sh
|
|
||||||
**buildpdf** is a small script for LaTeX users who want to generate a pdf from their LaTeX source code in regular periods.
|
|
||||||
|
|
||||||
### How to use
|
|
||||||
|
|
||||||
To use it download the script from GitLab and make it executable with
|
|
||||||
|
|
||||||
```
|
|
||||||
chmod +x buildpdf.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Then run it:
|
|
||||||
|
|
||||||
```
|
|
||||||
./buildpdf.sh filename [build amount] [time between builds in s]
|
|
||||||
```
|
|
||||||
|
|
||||||
You have to give a filename as an argument and you're able to set, how much builds you wanna create and how much time should be between these builds.
|
|
||||||
|
|
||||||
### Further information
|
|
||||||
|
|
||||||
- [Bash script for LaTeX users](https://mmk2410.org/2015/01/06/107/)
|
|
||||||
- [UPDATE: Bash script for LaTeX users](https://mmk2410.org/2015/01/09/update-bash-script-for-latex-users/)
|
|
|
@ -1,110 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# A script for automatically creating PDf files from a latex document
|
|
||||||
# You can set the amounts of builds and the time between these builds
|
|
||||||
# Usage: ./buildpdf.sh filename [build amount] [time between builds in s]
|
|
||||||
# Marcel Michael Kapfer (mmk2410)
|
|
||||||
# 6th January 2015 - 2017
|
|
||||||
# GNU GPL v3.0 -> Feel free to re-distribute it or fork it
|
|
||||||
|
|
||||||
print() {
|
|
||||||
|
|
||||||
local text="$1"
|
|
||||||
|
|
||||||
date "+[%F %T] $text"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
run() {
|
|
||||||
|
|
||||||
local filename="$1"
|
|
||||||
local number="$2"
|
|
||||||
|
|
||||||
print "Building..."
|
|
||||||
pdflatex "$filename" > /dev/null 2>&1
|
|
||||||
print "Build $number ready"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
build() {
|
|
||||||
|
|
||||||
local filename="$1"
|
|
||||||
local builds="$2"
|
|
||||||
local sleeptime="$3"
|
|
||||||
local i="1"
|
|
||||||
|
|
||||||
while [[ "$i" -le "$builds" ]]; do
|
|
||||||
|
|
||||||
run "$filename" "$i"
|
|
||||||
|
|
||||||
if [[ "$i" -lt "$builds" ]]; then
|
|
||||||
print "Waiting $sleeptime seconds - then build again"
|
|
||||||
sleep "$sleeptime"
|
|
||||||
else
|
|
||||||
print "Jobs done. Exiting now..."
|
|
||||||
fi
|
|
||||||
|
|
||||||
((++i))
|
|
||||||
|
|
||||||
done
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
build_infty() {
|
|
||||||
|
|
||||||
local filename="$1"
|
|
||||||
local builds="1"
|
|
||||||
local sleeptime="$2"
|
|
||||||
|
|
||||||
while : ; do
|
|
||||||
|
|
||||||
run "$filename" "$builds"
|
|
||||||
|
|
||||||
print "Waiting $sleeptime seconds - then build again"
|
|
||||||
sleep "$sleeptime"
|
|
||||||
|
|
||||||
((++builds))
|
|
||||||
|
|
||||||
done
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
main() {
|
|
||||||
|
|
||||||
if [[ -z "$1" || "$1" == "--help" || "$1" == "-h" ]]; then
|
|
||||||
cat <<EOF
|
|
||||||
Usage: buildpdf.sh filename [build amount] [sleep time]
|
|
||||||
|
|
||||||
Options:
|
|
||||||
build amount: how many times the pdf should be created.
|
|
||||||
Leave empty or set to '0' for infinity builds.
|
|
||||||
|
|
||||||
sleep time: time in seconds between the builds.
|
|
||||||
Leave empty will create the pdf every 120 seconds.
|
|
||||||
EOF
|
|
||||||
exit
|
|
||||||
else
|
|
||||||
filename="$1"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -z "$2" ]]; then
|
|
||||||
builds=0
|
|
||||||
else
|
|
||||||
builds="$2"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -z "$3" ]]; then
|
|
||||||
sleeptime=120
|
|
||||||
else
|
|
||||||
sleeptime="$3"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$builds" == 0 ]]; then
|
|
||||||
build_infty "$filename" "$sleeptime"
|
|
||||||
else
|
|
||||||
build "$filename" "$builds" "$sleeptime"
|
|
||||||
fi
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
main "$@"
|
|
|
@ -1,7 +0,0 @@
|
||||||
# This file allows you to configure the Dart analyzer.
|
|
||||||
#
|
|
||||||
# The commented part below is just for inspiration. Read the guide here:
|
|
||||||
# https://www.dartlang.org/guides/language/analysis-options
|
|
||||||
|
|
||||||
analyzer:
|
|
||||||
strong-mode: true
|
|
7
eclipse-version-scraping/.gitignore
vendored
7
eclipse-version-scraping/.gitignore
vendored
|
@ -1,7 +0,0 @@
|
||||||
# Files and directories created by pub
|
|
||||||
.packages
|
|
||||||
.pub/
|
|
||||||
packages
|
|
||||||
pubspec.lock
|
|
||||||
*.iml
|
|
||||||
.idea/
|
|
|
@ -1,16 +0,0 @@
|
||||||
# Eclipse Version Scraping
|
|
||||||
|
|
||||||
Since Eclipse does not provide a convenient (or I did not find one) way to get informed when a new version is released it is quite difficult to keep my unofficial packages up-to-date.
|
|
||||||
|
|
||||||
So I wrote this script to scrape the eclipse.org page and set it up as a cron job to get notified, one a new version of Eclipse releases.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
`dart bin/main.dart [options] recipient`
|
|
||||||
|
|
||||||
Where options are one of the following:
|
|
||||||
|
|
||||||
- `-h` or `--help`: prints a help and exits
|
|
||||||
- `-f` or `--file`: specify a file, `./version.txt` is used by default
|
|
||||||
|
|
||||||
The recipient is the person that gets mailed, if a new version is released.
|
|
|
@ -1,103 +0,0 @@
|
||||||
import 'dart:io';
|
|
||||||
|
|
||||||
import 'package:http/http.dart' as http;
|
|
||||||
import 'package:html/parser.dart' as parser;
|
|
||||||
import 'package:html/dom.dart';
|
|
||||||
|
|
||||||
/// Entry point of the script.
|
|
||||||
main(List<String> args) async {
|
|
||||||
|
|
||||||
String path = "./version.txt";
|
|
||||||
String recipient = "";
|
|
||||||
String eclipseUrl = "https://eclipse.org/downloads/eclipse-packages/";
|
|
||||||
String oldVersion = "";
|
|
||||||
|
|
||||||
/// Parse the given arguments.
|
|
||||||
if (args.length == 3) {
|
|
||||||
if (args[0] == "--file" || args[0] == "-f") {
|
|
||||||
path = args[1];
|
|
||||||
recipient = args[2];
|
|
||||||
} else {
|
|
||||||
help();
|
|
||||||
}
|
|
||||||
} else if (args.length == 1){
|
|
||||||
if (args[0] == "--help" || args[0] == "-h") {
|
|
||||||
help();
|
|
||||||
} else {
|
|
||||||
recipient = args[0];
|
|
||||||
}
|
|
||||||
} else if (args.length == 0) {
|
|
||||||
help();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!recipient.contains("@")) {
|
|
||||||
print("No correct mail address given.");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
http.Response response = await http.get(eclipseUrl);
|
|
||||||
|
|
||||||
if (response.body.trim().isEmpty) {
|
|
||||||
print("Website not available");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
Document document = parser.parse(response.body);
|
|
||||||
|
|
||||||
String version = document.getElementById("descriptionText").text;
|
|
||||||
|
|
||||||
if (version.trim().isEmpty) {
|
|
||||||
print("No version information available.");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!version.contains("(") || !version.contains(")")) {
|
|
||||||
print("Version format seems to have changed.");
|
|
||||||
print("Version string: $version");
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
version = version.split("(")[1].split(")")[0].trim();
|
|
||||||
|
|
||||||
File file = new File(path);
|
|
||||||
|
|
||||||
if (await file.exists()) {
|
|
||||||
oldVersion = await file.readAsString();
|
|
||||||
|
|
||||||
oldVersion = oldVersion.trim();
|
|
||||||
} else {
|
|
||||||
oldVersion = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (oldVersion == version) {
|
|
||||||
print("No version change");
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
file.writeAsString(version);
|
|
||||||
|
|
||||||
print("A new version is available!");
|
|
||||||
|
|
||||||
/// Send mail using the mail command.
|
|
||||||
await Process.run(
|
|
||||||
"mail",
|
|
||||||
["-s", "New Eclipse Version: $version", recipient],
|
|
||||||
runInShell: true
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Print the help text and exit the program.
|
|
||||||
help() {
|
|
||||||
print("""
|
|
||||||
Eclipse Version Scraping
|
|
||||||
2017 (c) Marcel Kapfer
|
|
||||||
Licensed under GNU GPL v3
|
|
||||||
|
|
||||||
dart bin/main.dart [options] recipient
|
|
||||||
|
|
||||||
-h | --help Print this help and exit
|
|
||||||
-f | --file File to use for saving the version.""");
|
|
||||||
|
|
||||||
exit(0);
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
name: eclipse_version_scraping
|
|
||||||
version: 0.1.1
|
|
||||||
description: Scrape the number of the latest version from the eclipse.org page.
|
|
||||||
dependencies:
|
|
||||||
html: ^0.13.1
|
|
||||||
http: ^0.11.3
|
|
|
@ -1,17 +0,0 @@
|
||||||
COPYRIGHT (c) 2015 mmk2410
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 3, 29 June 2007
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
@ -1,31 +0,0 @@
|
||||||
# intellij-hidpi.sh
|
|
||||||
|
|
||||||
This is another small script for enabling and disabling HiDPI support on IntelliJ IDEA without editing any config files.
|
|
||||||
|
|
||||||
**Since IntelliJ IDEA version 15 this script is no longer necessary because IntelliJ has builtin HiDPI support**
|
|
||||||
|
|
||||||
## How to use
|
|
||||||
|
|
||||||
Download it from GitLab. To make it runnable execute
|
|
||||||
|
|
||||||
~~~~~
|
|
||||||
chmod +x intellij-hidpi.sh
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
For some help run
|
|
||||||
|
|
||||||
~~~~~
|
|
||||||
./intellij-hidpi.sh -h
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
To enable HiDPI support
|
|
||||||
|
|
||||||
~~~~~
|
|
||||||
./intellij-hidpi.sh -e
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
To disable it
|
|
||||||
|
|
||||||
~~~~~
|
|
||||||
./intellij-hidpi.sh -d
|
|
||||||
~~~~~
|
|
|
@ -1,75 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# This is a small script for enabling and disabling HiDPI support on IntelliJ IDEA Community Edition on every Linux distribution where IntelliJ is installed in /usr/share/intellijidea-ce/. If the installation is somewhere else you have to change the variable IDEA_PATH.
|
|
||||||
# Marcel Michael Kapfer
|
|
||||||
# 27 May 2015
|
|
||||||
# GNU GPL v3.0 -> Feel free to re-distribute or fork it
|
|
||||||
|
|
||||||
## IntelliJ path
|
|
||||||
IDEA_PATH="/usr/share/intellijidea-ce/bin"
|
|
||||||
|
|
||||||
## Enable HiDPI
|
|
||||||
function enable_hidpi {
|
|
||||||
sudo echo "-Dhidpi=true" >> $IDEA_PATH/idea.vmoptions
|
|
||||||
sudo echo "-Dhidpi=true" >> $IDEA_PATH/idea64.vmoptions
|
|
||||||
echo "HiDPI enabled"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
## Disable HiDPI
|
|
||||||
function disable_hidpi {
|
|
||||||
idea=$(sed '/-Dhidpi=true/d' $IDEA_PATH/idea.vmoptions)
|
|
||||||
idea64=$(sed '/-Dhidpi=true/d' $IDEA_PATH/idea64.vmoptions)
|
|
||||||
sudo echo "$idea" > $IDEA_PATH/idea.vmoptions
|
|
||||||
sudo echo "$idea64" > $IDEA_PATH/idea64.vmoptions
|
|
||||||
echo "HiDPI disabled"
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
usage=$(
|
|
||||||
cat <<EOF
|
|
||||||
Usage:
|
|
||||||
|
|
||||||
Enable HiDPI support:
|
|
||||||
--enable
|
|
||||||
or
|
|
||||||
-e
|
|
||||||
|
|
||||||
Disabling HiDPI support:
|
|
||||||
--disable
|
|
||||||
or
|
|
||||||
-d
|
|
||||||
|
|
||||||
Help (prints this)
|
|
||||||
--help
|
|
||||||
or
|
|
||||||
-h
|
|
||||||
|
|
||||||
EOF
|
|
||||||
)
|
|
||||||
|
|
||||||
## Options
|
|
||||||
### Runns if no argument is given
|
|
||||||
if [[ -z "$1" ]]
|
|
||||||
then
|
|
||||||
echo
|
|
||||||
echo "$usage"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
### Runs if an argument is given
|
|
||||||
until [[ $1 == -- ]]; do
|
|
||||||
case $1 in
|
|
||||||
-e | --enable)
|
|
||||||
enable_hidpi
|
|
||||||
;;
|
|
||||||
-d | --disable)
|
|
||||||
disable_hidpi
|
|
||||||
;;
|
|
||||||
-h | --help)
|
|
||||||
echo "$usage"
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
|
@ -1,22 +0,0 @@
|
||||||
COPYRIGHT (c) 2015 mmk2410
|
|
||||||
|
|
||||||
MIT License
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
"Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
@ -1,32 +0,0 @@
|
||||||
# jekyll2rangitaki
|
|
||||||
|
|
||||||
A small script for converting Jekyll markdown blog posts to Rangitaki blog posts.
|
|
||||||
|
|
||||||
## How to use
|
|
||||||
|
|
||||||
You don"t have to install anything. Just run
|
|
||||||
|
|
||||||
```
|
|
||||||
ruby jekyll2rangitaki.rb
|
|
||||||
```
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
```
|
|
||||||
chmod +x jekyll2rangitaki.rb
|
|
||||||
./jekyll2rangitaki.rb
|
|
||||||
```
|
|
||||||
|
|
||||||
The converter will read all `.md` and `.markdown` in the directory `./in/`, so copy the blog posts, you want to convert into this directory, and it will then throw the converted files out into the directory `./out/`.
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
This small piece of code is licensed under MIT license.
|
|
||||||
|
|
||||||
## Contribute
|
|
||||||
|
|
||||||
1. Fork it
|
|
||||||
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
||||||
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
||||||
4. Push to the branch (`git push origin my-new-feature`)
|
|
||||||
5. Create New Pull Request
|
|
|
@ -1,9 +0,0 @@
|
||||||
---
|
|
||||||
layout: post
|
|
||||||
title: "Please Read!"
|
|
||||||
date: 2015-02-21 20:58:23
|
|
||||||
categories: jekyll update
|
|
||||||
---
|
|
||||||
|
|
||||||
#Hello all together
|
|
||||||
My name is Marcel Kapfer and I'm surprised that you are visiting this page! Because it isn't in use at the moment. My website is at marcel-kapfer.de and there you will find a link to my blog!
|
|
|
@ -1,25 +0,0 @@
|
||||||
---
|
|
||||||
layout: post
|
|
||||||
title: "Welcome to Jekyll!"
|
|
||||||
date: 2015-02-21 20:26:23
|
|
||||||
categories: jekyll update
|
|
||||||
---
|
|
||||||
You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated.
|
|
||||||
|
|
||||||
To add new posts, simply add a file in the `_posts` directory that follows the convention `YYYY-MM-DD-name-of-post.ext` and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works.
|
|
||||||
|
|
||||||
Jekyll also offers powerful support for code snippets:
|
|
||||||
|
|
||||||
{% highlight ruby %}
|
|
||||||
def print_hi(name)
|
|
||||||
puts "Hi, #{name}"
|
|
||||||
end
|
|
||||||
print_hi('Tom')
|
|
||||||
#=> prints 'Hi, Tom' to STDOUT.
|
|
||||||
{% endhighlight %}
|
|
||||||
|
|
||||||
Check out the [Jekyll docs][jekyll] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll’s GitHub repo][jekyll-gh]. If you have questions, you can ask them on [Jekyll’s dedicated Help repository][jekyll-help].
|
|
||||||
|
|
||||||
[jekyll]: http://jekyllrb.com
|
|
||||||
[jekyll-gh]: https://github.com/jekyll/jekyll
|
|
||||||
[jekyll-help]: https://github.com/jekyll/jekyll-help
|
|
|
@ -1,61 +0,0 @@
|
||||||
#!/usr/bin/ruby
|
|
||||||
require 'time'
|
|
||||||
if ARGV[0] == "-h" || ARGV[0] == "--help"
|
|
||||||
puts "\njekyll2rangitaki converter\n\n" \
|
|
||||||
"2015 (C) Marcel Kapfer (mmk2410)\n" \
|
|
||||||
"MIT License\n\n" \
|
|
||||||
"Version: 0.1.0\n" \
|
|
||||||
"Release Date: 03 November 2015\n\n" \
|
|
||||||
"Usage:\n" \
|
|
||||||
"Copy the jekyll files into an directory called\n" \
|
|
||||||
" ./in and run the script. The converted files \n" \
|
|
||||||
"are saved in ./out\n\n" \
|
|
||||||
"Options:\n" \
|
|
||||||
"-h || --help print the help and exit\n\n"
|
|
||||||
exit
|
|
||||||
end
|
|
||||||
if !File.directory?("./in/")
|
|
||||||
puts "No input directory"
|
|
||||||
exit
|
|
||||||
end
|
|
||||||
articles = Dir.entries('./in')
|
|
||||||
for article in articles
|
|
||||||
title = ""
|
|
||||||
date = ""
|
|
||||||
time = Time.new
|
|
||||||
tags = ""
|
|
||||||
text = ""
|
|
||||||
if article.length > 2 && (article.end_with?(".md") || article.end_with?(".markdown"))
|
|
||||||
file = File.open("./in/#{article}")
|
|
||||||
file.each do |line|
|
|
||||||
if line.start_with?("---")
|
|
||||||
next
|
|
||||||
elsif line.start_with?("layout")
|
|
||||||
next
|
|
||||||
elsif line.start_with?("title")
|
|
||||||
title = line[7...line.length].strip!
|
|
||||||
title = title.chomp("\"")[1...title.length]
|
|
||||||
elsif line.start_with?("date")
|
|
||||||
date = line[5...line.length].strip
|
|
||||||
time = Time.new(date[0...4],date[5...7],date[8...10],date[11...13],date[14...16],date[17...19])
|
|
||||||
elsif line.start_with?("categories")
|
|
||||||
tags = line[12...line.length].strip
|
|
||||||
tags[" "] = ", "
|
|
||||||
elsif line.start_with?("{% highlight") || line.start_with?("{% endhighlight")
|
|
||||||
text += "```\n"
|
|
||||||
else
|
|
||||||
text += line
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if !File.directory?("./out")
|
|
||||||
Dir.mkdir("./out")
|
|
||||||
end
|
|
||||||
article[".markdown"] = ".md"
|
|
||||||
post = File.new("./out/#{article}", "w")
|
|
||||||
post.puts "%TITLE: #{title}" if !title.empty?
|
|
||||||
post.puts "%DATE: #{time.strftime("%d %B %Y %H:%M")}" if time != nil
|
|
||||||
post.puts "%TAGS: #{tags}" if !tags.empty?
|
|
||||||
post.puts text if !text.empty?
|
|
||||||
post.close
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,6 +0,0 @@
|
||||||
%TITLE: Please Read!
|
|
||||||
%DATE: 21 February 2015 20:58
|
|
||||||
%TAGS: jekyll, update
|
|
||||||
|
|
||||||
#Hello all together
|
|
||||||
My name is Marcel Kapfer and I'm surprised that you are visiting this page! Because it isn't in use at the moment. My website is at marcel-kapfer.de and there you will find a link to my blog!
|
|
|
@ -1,22 +0,0 @@
|
||||||
%TITLE: Welcome to Jekyll!
|
|
||||||
%DATE: 21 February 2015 20:26
|
|
||||||
%TAGS: jekyll, update
|
|
||||||
You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated.
|
|
||||||
|
|
||||||
To add new posts, simply add a file in the `_posts` directory that follows the convention `YYYY-MM-DD-name-of-post.ext` and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works.
|
|
||||||
|
|
||||||
Jekyll also offers powerful support for code snippets:
|
|
||||||
|
|
||||||
```
|
|
||||||
def print_hi(name)
|
|
||||||
puts "Hi, #{name}"
|
|
||||||
end
|
|
||||||
print_hi('Tom')
|
|
||||||
#=> prints 'Hi, Tom' to STDOUT.
|
|
||||||
```
|
|
||||||
|
|
||||||
Check out the [Jekyll docs][jekyll] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll’s GitHub repo][jekyll-gh]. If you have questions, you can ask them on [Jekyll’s dedicated Help repository][jekyll-help].
|
|
||||||
|
|
||||||
[jekyll]: http://jekyllrb.com
|
|
||||||
[jekyll-gh]: https://github.com/jekyll/jekyll
|
|
||||||
[jekyll-help]: https://github.com/jekyll/jekyll-help
|
|
|
@ -1,22 +0,0 @@
|
||||||
COPYRIGHT (c) 2015 mmk2410
|
|
||||||
|
|
||||||
MIT License
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
"Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
@ -1,13 +0,0 @@
|
||||||
all:
|
|
||||||
|
|
||||||
install:
|
|
||||||
mkdir -p /opt/md2html/
|
|
||||||
mkdir -p /opt/md2html/libs/
|
|
||||||
mkdir -p /opt/md2html/src/
|
|
||||||
install libs/* /opt/md2html/libs/
|
|
||||||
install src/* /opt/md2html/src/
|
|
||||||
install md2html.php /usr/bin/md2html
|
|
||||||
|
|
||||||
remove:
|
|
||||||
rm -rf /opt/md2html
|
|
||||||
rm /usr/bin/md2html
|
|
|
@ -1,30 +0,0 @@
|
||||||
# md2html
|
|
||||||
|
|
||||||
md2html is a simple script that converts markdown files to html code and optionally saves it into a .txt or .html file. The library that powers the whole thing is [Parsedown](https://github.com/erusev/parsedown).
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
To use this script, install `php` and run the following command:
|
|
||||||
```
|
|
||||||
sudo make install
|
|
||||||
```
|
|
||||||
|
|
||||||
**You have to add /opt/md2html to your php.ini open_basedir !**
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
Print the help:
|
|
||||||
```
|
|
||||||
md2html --help
|
|
||||||
```
|
|
||||||
|
|
||||||
To just print out the HTML code of the given `.md` file run:
|
|
||||||
```
|
|
||||||
md2html text.md
|
|
||||||
```
|
|
||||||
|
|
||||||
To print the HTML code into a `.txt` or `.html` file run:
|
|
||||||
```
|
|
||||||
md2html text.md text.html
|
|
||||||
```
|
|
||||||
If you pass a `.html` file for the output it will automatically add a basic HTML5 structure.
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,76 +0,0 @@
|
||||||
#!/usr/bin/php
|
|
||||||
<?php
|
|
||||||
include '/opt/md2html/src/strings.php';
|
|
||||||
include '/opt/md2html/libs/Parsedown.php';
|
|
||||||
$parsedown = new Parsedown();
|
|
||||||
if(count($argv) == 1 || count($argv) > 3) {
|
|
||||||
echo "Arguments not possible.\n";
|
|
||||||
echo $usage;
|
|
||||||
} elseif (isset($argv[2])) {
|
|
||||||
if(substr_compare($argv[1], ".md", -3) == 0){
|
|
||||||
if(substr_compare($argv[2], ".txt", -4) == 0 ||
|
|
||||||
substr_compare($argv[2], ".html", -5) == 0) {
|
|
||||||
if(file_exists($argv[1])){
|
|
||||||
$handler = fopen($argv[1], "r");
|
|
||||||
$content = fread($handler, filesize($argv[1]));
|
|
||||||
fclose($handler);
|
|
||||||
$content = $parsedown
|
|
||||||
->setBreaksEnabled(true)
|
|
||||||
->text($content);
|
|
||||||
if(file_exists($argv[2])){
|
|
||||||
echo "The file $argv[2] already exists.\nDo you want to override it? (Y)es / (N)o ";
|
|
||||||
$answer = trim(fgets(STDIN));
|
|
||||||
if(in_array($answer, array("y","yes","Yes","YES","Y"))) {
|
|
||||||
$whandler = fopen($argv[2], "w+");
|
|
||||||
if(substr_compare($argv[2], ".html", -5) == 0){
|
|
||||||
$content = $htmlbegin . $content . $htmlend;
|
|
||||||
}
|
|
||||||
if(fwrite($whandler, $content)){
|
|
||||||
echo "File sucessfully written.";
|
|
||||||
} else {
|
|
||||||
echo "An error occured.";
|
|
||||||
}
|
|
||||||
fclose($whandler);
|
|
||||||
} else {
|
|
||||||
echo "File not changed.";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$whandler = fopen($argv[2], "x");
|
|
||||||
if(substr_compare($argv[2], ".html", -5) == 0){
|
|
||||||
$content = $htmlbegin . $content . $htmlend;
|
|
||||||
}
|
|
||||||
if(fwrite($whandler, $content)){
|
|
||||||
echo "HTML file sucessfully written.";
|
|
||||||
} else {
|
|
||||||
echo "An error occured.";
|
|
||||||
}
|
|
||||||
fclose($whandler);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
echo "The output file is neither a HTML file nor a TXT file.";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
echo "This is not a Markdown file!";
|
|
||||||
}
|
|
||||||
} elseif(isset($argv[1])){
|
|
||||||
if(in_array($argv[1], array("--help","-h","-?","--usage","-u"))) {
|
|
||||||
echo $usage;
|
|
||||||
} else {
|
|
||||||
if(substr_compare($argv[1], ".md", -3) == 0){
|
|
||||||
if(file_exists($argv[1])){
|
|
||||||
$handler = fopen($argv[1], "r");
|
|
||||||
$content = fread($handler, filesize($argv[1]));
|
|
||||||
fclose($handler);
|
|
||||||
echo $parsedown
|
|
||||||
->setBreaksEnabled(true)
|
|
||||||
->text($content);
|
|
||||||
} else {
|
|
||||||
echo "The given file doesn't exist.";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
echo "This is not a Markdown file!";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
echo "\n";
|
|
|
@ -1,41 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
$usage =
|
|
||||||
"
|
|
||||||
md2html converter
|
|
||||||
mmk2410 2015
|
|
||||||
MIT License
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
|
|
||||||
./md2html inputfile [outputfile]
|
|
||||||
|
|
||||||
If no output file is given, the converted code will printed in the console.
|
|
||||||
The input file must be a .md file and the outputfile a html or txt.
|
|
||||||
|
|
||||||
./md2html.php argument
|
|
||||||
|
|
||||||
Available arguments:
|
|
||||||
|
|
||||||
-h | --help
|
|
||||||
Prints this text
|
|
||||||
|
|
||||||
If no output file is given, the converted code will printed in the console.
|
|
||||||
";
|
|
||||||
|
|
||||||
$htmlbegin =
|
|
||||||
"
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset='utf-8'>
|
|
||||||
<title></title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
";
|
|
||||||
|
|
||||||
$htmlend =
|
|
||||||
"
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
";
|
|
|
@ -1,22 +0,0 @@
|
||||||
COPYRIGHT (c) 2015 mmk2410
|
|
||||||
|
|
||||||
MIT License
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
"Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
@ -1,31 +0,0 @@
|
||||||
# pblog2rangitaki
|
|
||||||
|
|
||||||
This is a small script which converts pBlog/Rangitaki 0.2.x XML files into Rangitaki blog posts
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
You don't need to install this script on your computer, it's enough to make it executable:
|
|
||||||
|
|
||||||
```
|
|
||||||
chmod +x pblog2rangitaki.php
|
|
||||||
```
|
|
||||||
|
|
||||||
Run it then:
|
|
||||||
|
|
||||||
```
|
|
||||||
./pblog2rangitaki.php posts.xml
|
|
||||||
```
|
|
||||||
|
|
||||||
Where `posts.xml` is your pBlog/Rangitaki 0.2 XML file.
|
|
||||||
|
|
||||||
The Rangitaki blog posts are saved in `articles/`
|
|
||||||
|
|
||||||
**The `<otherlinks>` tag is not supported.**
|
|
||||||
|
|
||||||
## HHVM
|
|
||||||
|
|
||||||
This script works also in HHVM. Just replace the first line with
|
|
||||||
|
|
||||||
```
|
|
||||||
#!/bin/hhvm
|
|
||||||
```
|
|
|
@ -1,85 +0,0 @@
|
||||||
#!/bin/php
|
|
||||||
<?php
|
|
||||||
// This is a php script for converting a pBlog / Rangitaki 0.2.x XML file into rangitaki blog posts
|
|
||||||
if(in_array($argv[1], array("-h", "--help", "--usage", "-?"))) {
|
|
||||||
help();
|
|
||||||
} else if (isset($argv[1])) {
|
|
||||||
$content = file_get_contents("$argv[1]");
|
|
||||||
$xml = new SimpleXMLElement($content);
|
|
||||||
foreach ($xml->post as $entry) {
|
|
||||||
// TITLE
|
|
||||||
$title = $entry->title;
|
|
||||||
|
|
||||||
// CONTENT
|
|
||||||
$content = $entry->content;
|
|
||||||
|
|
||||||
// Pubdate
|
|
||||||
$pubdate = $entry->pubdate;
|
|
||||||
date_default_timezone_set("UTC");
|
|
||||||
$pubdate = date("d F Y", strtotime($pubdate));
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// FILENAME
|
|
||||||
$date = $entry->pubdate;
|
|
||||||
$date = date("Y-m-d-H-i", strtotime($date));
|
|
||||||
$filetitle = str_replace(" ", "-", $title);
|
|
||||||
$filename = $date . "-" . $filetitle . ".md";
|
|
||||||
|
|
||||||
if(isset($entry->mainlink)){
|
|
||||||
$filecontent = <<<EOD
|
|
||||||
%TITLE: $title
|
|
||||||
%DATE: $pubdate
|
|
||||||
|
|
||||||
$content
|
|
||||||
|
|
||||||
[$entry->mainlink]($entry->mainurl)
|
|
||||||
EOD;
|
|
||||||
} else {
|
|
||||||
$filecontent = <<<EOD
|
|
||||||
%TITLE: $title
|
|
||||||
%DATE: $pubdate
|
|
||||||
|
|
||||||
$content
|
|
||||||
EOD;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make a output directory
|
|
||||||
if(!(file_exists("articles"))) {
|
|
||||||
mkdir("articles");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save the file
|
|
||||||
$handle = fopen("articles/$filename", "c");
|
|
||||||
fwrite($handle, $filecontent);
|
|
||||||
fclose($handle);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
help();
|
|
||||||
}
|
|
||||||
|
|
||||||
function help() {
|
|
||||||
$help = <<<EOD
|
|
||||||
|
|
||||||
blogger2rangitaki
|
|
||||||
|
|
||||||
A small PHP script which converts pBlog/Rangitaki 0.2.x XML files to Rangitaki blog posts.
|
|
||||||
|
|
||||||
COPYRIGHT © 2015 Rangitaki Project
|
|
||||||
|
|
||||||
MIT License
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
|
|
||||||
./pblog2rangitaki filename.xml
|
|
||||||
|
|
||||||
Where filename.xml is the pBlog XML file.
|
|
||||||
|
|
||||||
The articels are saved in articles/
|
|
||||||
|
|
||||||
The <otherlinks> tag are not supported.
|
|
||||||
|
|
||||||
EOD;
|
|
||||||
|
|
||||||
echo $help;
|
|
||||||
}
|
|
|
@ -1,22 +0,0 @@
|
||||||
COPYRIGHT (c) 2017 Marcel Kapfer
|
|
||||||
|
|
||||||
MIT License
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
"Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
@ -1,17 +0,0 @@
|
||||||
# SVN Log Count
|
|
||||||
|
|
||||||
This is a small script for printing the amount of commits in a SVN repository in sum and by year.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
Download script in an SVN repo, make it executable with
|
|
||||||
|
|
||||||
```
|
|
||||||
chmod +x svn-log-count.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
and execute it with
|
|
||||||
|
|
||||||
```
|
|
||||||
./svn-log-count.sh
|
|
||||||
```
|
|
|
@ -1,29 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
dates=$(svn log | grep "^r" | grep "|" | cut -d'|' -f3 | cut -d' ' -f2)
|
|
||||||
|
|
||||||
# get total amount of commits
|
|
||||||
|
|
||||||
echo "Sum: $(echo "$dates" | wc -l)"
|
|
||||||
|
|
||||||
# get first year
|
|
||||||
|
|
||||||
for curyear in $(echo "$dates" | cut -d'-' -f1); do
|
|
||||||
if [[ -z $year ]]; then
|
|
||||||
year=$curyear
|
|
||||||
fi
|
|
||||||
if [[ $curyear -lt $year ]]; then
|
|
||||||
year=$curyear
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "First Commit (Year): $year"
|
|
||||||
|
|
||||||
|
|
||||||
# get amount of commits per year
|
|
||||||
|
|
||||||
while [[ $year -le $(date +"%Y") ]]; do
|
|
||||||
echo "Sum for $year: $(echo "$dates" | grep "^$year" | wc -l)"
|
|
||||||
year=$((year+1))
|
|
||||||
done
|
|
||||||
|
|
Loading…
Reference in a new issue