This commit is contained in:
Christophe HENRY 2021-03-05 22:38:43 +01:00
parent 4de4f45b84
commit bf7a2ec379
3 changed files with 188 additions and 69 deletions

2
TODO
View File

@ -3,6 +3,7 @@
* manage 404: Display better errors.
* alt texts on pre and quote?
* a way to get the source of a page, using urlrewriting
* options to activate the text decoration
* HTML caching: Nginx tries the html, if not found use this script to build it
* any error on one read line logs and goes to the next line, resetting modes
* configuration: Fetch configuration in current dir, tries parents.
@ -19,3 +20,4 @@
* Be able to navigate (custom the links) when using htmgen.php?url=…
* Text localisation
* Search all cases where a narrow no-break space would apply
* Manage logging (cache refresh, debug)

View File

@ -73,8 +73,9 @@ $mode = null;
$mode_textAttributes = true;
foreach ($fileLines as $line) {
$reDoCount = 0;
$mode_textAttributes_temp = false;
while (true) {
if ($reDoCount>1) die("Too many loops");
if ($reDoCount>2) die("Too many loops: ".$mode);
$reDoCount += 1;
$line1 = substr($line, 0, 1); // $line can be modified
$line2 = substr($line, 0, 2); // in the meantime.
@ -82,6 +83,16 @@ foreach ($fileLines as $line) {
if (is_null($mode)) {
if (empty($line)) {
echo "<p>&nbsp;</p>\n";
} elseif ('^^^' == $line3) {
$mode_textAttributes = !$mode_textAttributes;
} elseif ('^' == $line1) {
if (preg_match("/^\^\s*(.*)$/", $line, $parts)) {
$line = $parts[1];
$mode_textAttributes_temp = true;
} else {
$mode = "raw";
}
continue;
} elseif ("#" == $line1) {
preg_match("/^(#{1,3})\s*(.*)/", $line, $sharps);
$h_level = strlen($sharps[1]);
@ -93,18 +104,20 @@ foreach ($fileLines as $line) {
case 3: echo "<h3>".$text."</h3>\n"; break;
}
} elseif ("=>" == $line2) {
preg_match("/^=>\s*([^\s]+)(\s+(.*))?$/", $line, $linkParts);
$url_link = $linkParts[1];
$url_label = @$linkParts[2];
if (empty(trim($url_label))) {
$url_label = $url_link;
if (preg_match("/^=>\s*([^\s]+)(?:\s+(.*))?$/", $line, $linkParts)) {
$url_link = $linkParts[1];
$url_label = @$linkParts[2];
if (empty(trim($url_label))) {
$url_label = $url_link;
} else {
// the label is humain-made, apply formatting
htmlPrepare($url_label);
}
echo "<p><a href='".$url_link."'>".$url_label."</a></p>\n";
} else {
// the label is humain-made, apply formatting
htmlPrepare($url_label);
$mode = "raw";
continue;
}
echo "<p><a href='".$url_link."'>".$url_label."</a></p>\n";
} elseif ('"""' == $line3) {
$mode_textAttributes = !$mode_textAttributes;
} elseif ("```" == $line3) {
$mode="pre";
echo "<pre>\n";
@ -117,56 +130,66 @@ foreach ($fileLines as $line) {
echo "<p>&nbsp;</p>\n";
else
htmlPrepare($quote);
if ($mode_textAttributes) addTextAttributes($line);
if ($mode_textAttributes xor $mode_textAttributes_temp) addTextAttributes($line);
echo "<p>".$quote."</p>\n";
} elseif ("*" == $line1 && "**" != $line2) {
$mode = "ul";
} elseif ("* " == $line2) {
echo "<ul>\n";
$mode = "ul";
continue;
} else {
$mode = "raw";
continue;
}
} else {
if ("raw"==$mode) {
htmlPrepare($line);
if ($mode_textAttributes) addTextAttributes($line);
if ($mode_textAttributes xor $mode_textAttributes_temp) addTextAttributes($line);
if (empty($line)) $line = "&nbsp;";
echo "<p>$line</p>\n";
}
} elseif ("pre"==$mode) {
if ("```" == $line3) {
$mode=null;
echo "</pre>\n";
} else {
htmlPrepare($line);
echo $line."\n";
}
} elseif ("quote"==$mode) {
if (">" == $line1) {
preg_match("/^>\s*(.*)$/", $line, $quoteParts);
$quote = $quoteParts[1];
if (empty($quote))
echo "<p>&nbsp;</p>\n";
else
htmlPrepare($quote);
echo "<p>".$quote."</p>\n";
} else {
$mode=null;
echo "</blockquote>\n";
continue;
}
} elseif ("ul"==$mode) {
if ("*" == $line1 && "**" != $line2) {
preg_match("/^\*\s*(.*)$/", $line, $ulParts);
$li = $ulParts[1];
if (empty($li))
echo "<li>&nbsp;\n";
else
htmlPrepare($li);
addTextAttributes($li);
echo "<li>".$li."\n";
} else {
$mode = null;
echo "</ul>\n";
continue;
} elseif ("pre"==$mode) {
if ("```" == $line3) {
echo "</pre>\n";
$mode = null;
} else {
htmlPrepare($line);
echo $line."\n";
}
} elseif ("quote"==$mode) {
if (">" == $line1) {
preg_match("/^>\s*(.*)$/", $line, $quoteParts);
$quote = $quoteParts[1];
if (empty($quote))
echo "<p>&nbsp;</p>\n";
else
htmlPrepare($quote);
echo "<p>".$quote."</p>\n";
} else {
echo "</blockquote>\n";
$mode = null;
continue;
}
} elseif ("ul"==$mode) {
if ("* " == $line2) {
preg_match("/^\*\s*(.*)$/", $line, $ulParts);
$li = $ulParts[1];
if (empty($li)) {
echo "<li>&nbsp;\n";
} else {
htmlPrepare($li);
if ($mode_textAttributes xor $mode_textAttributes_temp) addTextAttributes($line);
echo "<li>".$li."\n";
}
} else {
echo "</ul>\n";
$mode = null;
continue;
}
} else {
die("Unexpected mode: $mode!");
}
}
break;
break; // exits the while(true) as no continue occured
}
}
$body = ob_get_contents();

View File

@ -1,19 +1,117 @@
# Test page
* puce
=> lien1
=> lien2
```
The text as it is in the source code, in a preformatted block.
```
The text as it is rendered, of course the following examples will have identical preformatted content and rendered content.
```
* single line
```
* single line
```
* line one
* line two
```
* line one
* line two
```
*incorrect list because there's no space right after the star.
```
*incorrect list because there's no space right after the star.
```
Below, a line with just one star, must be rendered as is.
*
```
Below, a line with just one star, must be rendered as is.
*
```
Below, a line with one star and one space, must be a single <li>
*
```
Below, a line with one star and one space, must be a single <li>
*
```
Below, a line with one star and two spaces, must be a single <li>
*
```
Below, a line with one star and two spaces, must be a single <li>
*
```
Below, two lines with one star, must be single <li>
*
*
```
Below, two lines with one star, must be single <li>
*
*
```
# h1
## h2
### h3
#### h4 (Should be read as h3)
```
# h1
## h2
### h3
#### h4 (Should be read as h3)
Four spaces between the quotes " "
```
Four spaces between the quotes " ", shrinked in HTML
```
Four spaces between the quotes " ", shrinked in HTML
** Text using <b>.
```
^^^
Plain text link: https://website.com/
^^^
```
^^^
Plain text link: https://website.com/
^^^
//Text using <i>.
~~Text using <del>.
__Text using <u>.
```
Link with double slash: http://truc
```
Link with double slash: http://truc
Text having words in **bold**, //italic//, ~~deleted~~, __underlined__.
And some other mixed: **//bold italic// ~~bold deleted~~** //~~**italic deleted bold.
```
^ Link inside a single non-decorated line: http://truc
```
^ Link inside a single non-decorated line: http://truc
```
Below this line, just "=>" will be ignored and displayed as is.
=>
```
Below this line, just "=> " will be ignored and displayed as is.
=>
```
=> gemini://somesite
```
=> gemini://somesite
```
=> gemini://somesite label of the website
```
=> gemini://somesite label of the website
Du **gras**…
Encore du **gras** !
__This line starts with two _ and none at the end.
The formatting stays in the physical line.
@ -77,16 +175,12 @@ At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praese
>
>
# Unordered list
Below, four lines. The first and last won't have a star at the beginning.
Line without * at the beginning
* line one
*line two
Line without * at the beginning
* another first line
*another second line
*single line
** Text using <b>.
//Text using <i>.
~~Text using <del>.
__Text using <u>.
Text having words in **bold**, //italic//, ~~deleted~~, __underlined__.
And some other mixed: **//bold italic// ~~bold deleted~~** //~~**italic deleted bold.