Original code upload
Cette révision appartient à :
Parent
4a6c448cfe
révision
9f58535ce5
4 fichiers modifiés avec 564 ajouts et 0 suppressions
551
FhtagnGenerator.php
Fichier normal
551
FhtagnGenerator.php
Fichier normal
|
@ -0,0 +1,551 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>Cthuvian Ipsum Generator</title>
|
||||
<link rel="shortcut icon" href="images/cthicon.ico" />
|
||||
<script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div style="text-align:center">
|
||||
<h1>Cthuvian Ipsum Generator
|
||||
<g:plusone count="false"></g:plusone>
|
||||
</h1>
|
||||
</div>
|
||||
|
||||
<!-- Tables are the best thing in html ever -->
|
||||
<div>
|
||||
<table style="width:100%;" border="0">
|
||||
<tr>
|
||||
<td style="width:33%">
|
||||
|
||||
<form action="FhtagnGenerator.php">
|
||||
<table>
|
||||
|
||||
<tr>
|
||||
<td>Word count:</td>
|
||||
|
||||
<?php
|
||||
$iCount = $_GET['count'];
|
||||
|
||||
if(empty($iCount) || !is_numeric($iCount)) $iCount = '500';
|
||||
if($iCount > 333333) $iCount = '333333';
|
||||
if($iCount < 1) $iCount = '1';
|
||||
|
||||
?>
|
||||
|
||||
<td><input id="count" name="count" type="text" value="<?php echo $iCount;?>"></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Format: </td>
|
||||
<td>
|
||||
<select id="format" name="format">
|
||||
<?php
|
||||
$iFormat = $_GET['format'];
|
||||
$formats = array('text', 'plain', 'html');
|
||||
if(empty($iFormat) || !in_array($iFormat, $formats)) $iFormat = 'text';
|
||||
|
||||
echo '<option value="html"' . ($iFormat == 'html' ? ' selected' : '') . '>html</option>';
|
||||
echo '<option value="text"' . ($iFormat == 'text' ? ' selected' : '') . '>text</option>';
|
||||
echo '<option value="plain"' . ($iFormat == 'plain' ? ' selected' : '') . '>plain</option>';
|
||||
?>
|
||||
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Fixed first sentence:</td>
|
||||
<td>
|
||||
|
||||
<?php
|
||||
$iFhtagn = $_GET['fhtagn'];
|
||||
|
||||
if(empty($iFhtagn) || !checkBool($iFhtagn)) $iFhtagn = true;
|
||||
|
||||
echo '<input type="radio" id="fhtagn" name="fhtagn" value="yes"' . ($iFhtagn ? ' checked': '') . '>Yes';
|
||||
echo '<input type="radio" id="fhtagn" name="fhtagn" value="no"' . (!$iFhtagn ? ' checked': '') . '>No';
|
||||
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><input type="submit" value="Generate"/>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
</form>
|
||||
|
||||
</td>
|
||||
|
||||
|
||||
<td style="text-align:center; width:33%">
|
||||
|
||||
|
||||
<img src="images/cthulhu.png" style="align:center;"/>
|
||||
|
||||
</td>
|
||||
|
||||
<td style="width:33%">
|
||||
A lorem ipsun generator based on <a href="http://www.hplovecraft.com/">H.P.Lovecraft's</a> <a href="http://en.wikipedia.org/wiki/Cthulhu_Mythos">Cthulhu Mythos</a><br/>
|
||||
Code based on <a href="http://tinsology.net/">Mathew Tinsley's</a> <a href="http://tinsology.net/scripts/php-lorem-ipsum-generator/">PHP Lorem Ipsum</a><br/>
|
||||
Wordlist from <a href="http://www.yog-sothoth.com/threads/8683-The-Complete-CTHUVIAN-ENGLISH-DICTIONARY">Cthuvian / English dictionary</a> at <a href="http://www.yog-sothoth.com">www.yog-sothoth.com</a> <a href="http://www.yog-sothoth.com/forum.php">forums</a><br/>
|
||||
Source code at <a href="https://github.com/ken-tzu/Cthuvian-Ipsum-Generator/">Github</a><br/>.
|
||||
Why lorem ipsum when you can Cthulhu fhtagn?
|
||||
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
if(!empty($_GET['count']))
|
||||
{
|
||||
$generator = new FhtagnGenerator();
|
||||
|
||||
echo '<tr><td colspan="3" style="height:70%;"><textarea rows=25 style="width:100%;">' .
|
||||
$generator->getContent($iCount, $iFormat, $iFhtagn) .
|
||||
'</textarea></td></tr>';
|
||||
}
|
||||
|
||||
function checkBool(&$iFhtagn)
|
||||
{
|
||||
if($iFhtagn == 'yes')
|
||||
{
|
||||
$iFhtagn = true;
|
||||
return true;
|
||||
}
|
||||
else if($iFhtagn == 'no')
|
||||
{
|
||||
$iFhtagn = false;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
<div style="text-align:center">
|
||||
by <a href="mailto:akkadian+cthuvian@gmail.com">ephemer</a>
|
||||
</div>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
<?php
|
||||
class FhtagnGenerator {
|
||||
/**
|
||||
* Copyright (c) 2009, Mathew Tinsley (tinsley@tinsology.net)
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the organization nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY MATHEW TINSLEY ''AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
private $words, $wordsPerParagraph, $wordsPerSentence, $prefix, $suffix, $start;
|
||||
|
||||
function __construct($wordsPer = 100)
|
||||
{
|
||||
$this->wordsPerParagraph = $wordsPer;
|
||||
$this->wordsPerSentence = 24.460;
|
||||
$this->start = array(
|
||||
'Ph\'nglui',
|
||||
'mglw\'nafh',
|
||||
'Cthulhu',
|
||||
'R\'lyeh',
|
||||
'wgah\'nagl',
|
||||
'fhtagn.');
|
||||
|
||||
$this->words = array(
|
||||
'Cthulhu',
|
||||
'R\'lyeh',
|
||||
'Dagon',
|
||||
'Hastur',
|
||||
'Yoggoth',
|
||||
'Nyarlathotep',
|
||||
'Shub-Niggurath',
|
||||
'Tsathoggua',
|
||||
'Azathoth',
|
||||
'Chaugnar Faugn',
|
||||
'ah',
|
||||
'\'ai',
|
||||
'athg',
|
||||
'\'bthnk',
|
||||
'bug',
|
||||
'ch\'',
|
||||
'chtenff',
|
||||
'ebunma',
|
||||
'ee',
|
||||
'ehye',
|
||||
'ep',
|
||||
'\'fhalma',
|
||||
'fhtagn',
|
||||
'fm\'latgh',
|
||||
'ftaghu',
|
||||
'geb',
|
||||
'gnaiih',
|
||||
'gof\'nn',
|
||||
'goka',
|
||||
'gotha',
|
||||
'grah\'n',
|
||||
'hafh\'drn',
|
||||
'hai',
|
||||
'hlirgh',
|
||||
'hrii',
|
||||
'hupadgh',
|
||||
'ilyaa',
|
||||
'k\'yarnak',
|
||||
'kadishtu',
|
||||
'kn\'a',
|
||||
'li\'hee',
|
||||
'llll',
|
||||
'lloig',
|
||||
'lw\'nafh',
|
||||
'mg',
|
||||
'mnahn\'',
|
||||
'n\'gha',
|
||||
'n\'ghft',
|
||||
'nglui',
|
||||
'nilgh\'ri',
|
||||
'nog',
|
||||
'nw',
|
||||
'ooboshu',
|
||||
'orr\'e',
|
||||
'phlegeth',
|
||||
'r\'luh',
|
||||
'ron',
|
||||
's\'uhn',
|
||||
'sgn\'wahl',
|
||||
'shagg',
|
||||
'shogg',
|
||||
'shtunggli',
|
||||
'shugg',
|
||||
'sll\'ha',
|
||||
'stell\'bsna',
|
||||
'syha\'h',
|
||||
'tharanak',
|
||||
'throd',
|
||||
'uaaah',
|
||||
'uh\'e',
|
||||
'uln',
|
||||
'vulgtlagln',
|
||||
'vulgtm',
|
||||
'wgah\'n',
|
||||
'y\'hah',
|
||||
'ya',
|
||||
'zhro');
|
||||
|
||||
$this->prefix = array(
|
||||
'c',
|
||||
'f\'',
|
||||
'h\'',
|
||||
'na',
|
||||
'nafl',
|
||||
'ng',
|
||||
'nnn',
|
||||
'ph\'',
|
||||
'y-');
|
||||
|
||||
$this->suffix = array(
|
||||
'agl',
|
||||
'nyth',
|
||||
'og',
|
||||
'or',
|
||||
'oth',
|
||||
'yar');
|
||||
}
|
||||
|
||||
function getContent($count, $format = 'html', $fhtagn = true)
|
||||
{
|
||||
$format = strtolower($format);
|
||||
|
||||
if($count <= 0)
|
||||
return '';
|
||||
|
||||
switch($format)
|
||||
{
|
||||
case 'text':
|
||||
return $this->getText($count, $fhtagn);
|
||||
case 'plain':
|
||||
return $this->getPlain($count, $fhtagn);
|
||||
default:
|
||||
return $this->getHTML($count, $fhtagn);
|
||||
}
|
||||
}
|
||||
|
||||
private function getWords(&$arr, $count, $fhtagn)
|
||||
{
|
||||
$i = 0;
|
||||
|
||||
if($fhtagn)
|
||||
{
|
||||
$j = 0;
|
||||
for($j; $j < count($this->start); $j++)
|
||||
{
|
||||
$arr[$j] = $this->start[$j];
|
||||
}
|
||||
$i = count($this->start);
|
||||
}
|
||||
|
||||
for($i; $i < $count; $i++)
|
||||
{
|
||||
$index = array_rand($this->words);
|
||||
$word = $this->words[$index];
|
||||
|
||||
//echo $index . '=>' . $word . '<br />';
|
||||
|
||||
if($i > 0 && $arr[$i - 1] == $word)
|
||||
$i--;
|
||||
else
|
||||
{
|
||||
if(mt_rand(0,99) > 79)
|
||||
$word = $this->prefix[array_rand($this->prefix)] . $word;
|
||||
else if(mt_rand(0,99) > 89)
|
||||
$word .= $this->suffix[array_rand($this->suffix)];
|
||||
|
||||
if($fhtagn && $i == count($this->start)) $word = ucfirst($word);
|
||||
|
||||
$arr[$i] = $word;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function getPlain($count, $fhtagn, $returnStr = true)
|
||||
{
|
||||
$words = array();
|
||||
$this->getWords($words, $count, $fhtagn);
|
||||
//print_r($words);
|
||||
|
||||
$delta = $count;
|
||||
$curr = 0;
|
||||
$sentences = array();
|
||||
while($delta > 0)
|
||||
{
|
||||
$senSize = $this->gaussianSentence();
|
||||
//echo $curr . '<br />';
|
||||
if(($delta - $senSize) < 4)
|
||||
$senSize = $delta;
|
||||
|
||||
$delta -= $senSize;
|
||||
|
||||
$sentence = array();
|
||||
for($i = $curr; $i < ($curr + $senSize); $i++)
|
||||
$sentence[] = $words[$i];
|
||||
|
||||
$this->punctuate($sentence);
|
||||
$curr = $curr + $senSize;
|
||||
$sentences[] = $sentence;
|
||||
}
|
||||
|
||||
if($returnStr)
|
||||
{
|
||||
$output = '';
|
||||
foreach($sentences as $s)
|
||||
foreach($s as $w)
|
||||
$output .= $w . ' ';
|
||||
|
||||
return $output;
|
||||
}
|
||||
else
|
||||
return $sentences;
|
||||
}
|
||||
|
||||
private function getText($count, $fhtagn)
|
||||
{
|
||||
$sentences = $this->getPlain($count, $fhtagn, false);
|
||||
$paragraphs = $this->getParagraphArr($sentences);
|
||||
|
||||
$paragraphStr = array();
|
||||
foreach($paragraphs as $p)
|
||||
{
|
||||
$paragraphStr[] = $this->paragraphToString($p);
|
||||
}
|
||||
|
||||
$paragraphStr[0] = "\t" . $paragraphStr[0];
|
||||
return implode("\n\n\t", $paragraphStr);
|
||||
}
|
||||
|
||||
private function getParagraphArr($sentences)
|
||||
{
|
||||
$wordsPer = $this->wordsPerParagraph;
|
||||
$sentenceAvg = $this->wordsPerSentence;
|
||||
$total = count($sentences);
|
||||
|
||||
$paragraphs = array();
|
||||
$pCount = 0;
|
||||
$currCount = 0;
|
||||
$curr = array();
|
||||
|
||||
for($i = 0; $i < $total; $i++)
|
||||
{
|
||||
$s = $sentences[$i];
|
||||
$currCount += count($s);
|
||||
$curr[] = $s;
|
||||
if($currCount >= ($wordsPer - round($sentenceAvg / 2.00)) || $i == $total - 1)
|
||||
{
|
||||
$currCount = 0;
|
||||
$paragraphs[] = $curr;
|
||||
$curr = array();
|
||||
//print_r($paragraphs);
|
||||
}
|
||||
//print_r($paragraphs);
|
||||
}
|
||||
|
||||
return $paragraphs;
|
||||
}
|
||||
|
||||
private function getHTML($count, $fhtagn)
|
||||
{
|
||||
$sentences = $this->getPlain($count, $fhtagn, false);
|
||||
$paragraphs = $this->getParagraphArr($sentences);
|
||||
//print_r($paragraphs);
|
||||
|
||||
$paragraphStr = array();
|
||||
foreach($paragraphs as $p)
|
||||
{
|
||||
$paragraphStr[] = "<p>\n" . $this->paragraphToString($p, true) . '</p>';
|
||||
}
|
||||
|
||||
//add new lines for the sake of clean code
|
||||
return implode("\n", $paragraphStr);
|
||||
}
|
||||
|
||||
private function paragraphToString($paragraph, $htmlCleanCode = false)
|
||||
{
|
||||
$paragraphStr = '';
|
||||
foreach($paragraph as $sentence)
|
||||
{
|
||||
foreach($sentence as $word)
|
||||
$paragraphStr .= $word . ' ';
|
||||
|
||||
if($htmlCleanCode)
|
||||
$paragraphStr .= "\n";
|
||||
}
|
||||
return $paragraphStr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Inserts commas and periods in the given
|
||||
* word array.
|
||||
*/
|
||||
private function punctuate(& $sentence)
|
||||
{
|
||||
$count = count($sentence);
|
||||
$sentence[$count - 1] = $sentence[$count - 1] . '.';
|
||||
$sentence[0] = ucfirst($sentence[0]);
|
||||
|
||||
if($count < 4)
|
||||
return $sentence;
|
||||
|
||||
$commas = $this->numberOfCommas($count);
|
||||
|
||||
for($i = 1; $i <= $commas; $i++)
|
||||
{
|
||||
$index = (int) round($i * $count / ($commas + 1));
|
||||
|
||||
if($index < ($count - 1) && $index > 0)
|
||||
{
|
||||
$sentence[$index] = $sentence[$index] . ',';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Determines the number of commas for a
|
||||
* sentence of the given length. Average and
|
||||
* standard deviation are determined superficially
|
||||
*/
|
||||
private function numberOfCommas($len)
|
||||
{
|
||||
$avg = (float) log($len, 6);
|
||||
$stdDev = (float) $avg / 6.000;
|
||||
|
||||
return (int) round($this->gauss_ms($avg, $stdDev));
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns a number on a gaussian distribution
|
||||
* based on the average word length of an english
|
||||
* sentence.
|
||||
* Statistics Source:
|
||||
* http://hearle.nahoo.net/Academic/Maths/Sentence.html
|
||||
* Average: 24.46
|
||||
* Standard Deviation: 5.08
|
||||
*/
|
||||
private function gaussianSentence()
|
||||
{
|
||||
$avg = (float) 24.460;
|
||||
$stdDev = (float) 5.080;
|
||||
|
||||
return (int) round($this->gauss_ms($avg, $stdDev));
|
||||
}
|
||||
|
||||
/*
|
||||
* The following three functions are used to
|
||||
* compute numbers with a guassian distrobution
|
||||
* Source:
|
||||
* http://us.php.net/manual/en/function.rand.php#53784
|
||||
*/
|
||||
private function gauss()
|
||||
{ // N(0,1)
|
||||
// returns random number with normal distribution:
|
||||
// mean=0
|
||||
// std dev=1
|
||||
|
||||
// auxilary vars
|
||||
$x=$this->random_0_1();
|
||||
$y=$this->random_0_1();
|
||||
|
||||
// two independent variables with normal distribution N(0,1)
|
||||
$u=sqrt(-2*log($x))*cos(2*pi()*$y);
|
||||
$v=sqrt(-2*log($x))*sin(2*pi()*$y);
|
||||
|
||||
// i will return only one, couse only one needed
|
||||
return $u;
|
||||
}
|
||||
|
||||
private function gauss_ms($m=0.0,$s=1.0)
|
||||
{
|
||||
return $this->gauss()*$s+$m;
|
||||
}
|
||||
|
||||
private function random_0_1()
|
||||
{
|
||||
return (float)rand()/(float)getrandmax();
|
||||
}
|
||||
} // class
|
||||
?>
|
||||
|
||||
|
||||
|
||||
|
||||
|
13
README.md
13
README.md
|
@ -1,2 +1,15 @@
|
|||
# Cthuvian-Ipsum-Generator
|
||||
Cthuvian Ipsum Generator
|
||||
A lorem ipsun generator based on [H.P. Lovecraft's](https://www.hplovecraft.com/) [Cthulhu Mythos](https://en.wikipedia.org/wiki/Cthulhu_Mythos)
|
||||
|
||||
## History
|
||||
Way back in 2010, I wanted to try out this PHP thing, and ended up doing a [page](https://ephemer.kapsi.fi/FhtagnGenerator.php) for generating lorem ipsum placeholder text in Cthuvian (also called R'lyehian), the fictional language from H.P. Lovecraft's writings.
|
||||
|
||||
I used some resources which seem to no longer exist on the internet:
|
||||
+ PHP Lorem Ipsum generator by Mathew Tinsley, originally found at [http://tinsology.net/scripts/php-lorem-ipsum-generator/](http://tinsology.net/scripts/php-lorem-ipsum-generator/)
|
||||
+ Improved wordlist (with prefixes and suffixes) from Cthuvian / English dictionary, originally found at [http://www.yog-sothoth.com/threads/8683-The-Complete-CTHUVIAN-ENGLISH-DICTIONARY](http://www.yog-sothoth.com/threads/8683-The-Complete-CTHUVIAN-ENGLISH-DICTIONARY)
|
||||
|
||||
The code is put here "as was" for historical accuracy and is outdated and horrible in many ways, but hey, it still works, as seen on the [original page](https://ephemer.kapsi.fi/FhtagnGenerator.php). Maybe I'll make a modern version of it. Probably I won't.
|
||||
|
||||
## License
|
||||
[MIT](https://choosealicense.com/licenses/mit/)
|
BIN
images/cthicon.ico
Fichier normal
BIN
images/cthicon.ico
Fichier normal
Fichier binaire non affiché.
Après Largeur: | Hauteur: | Taille: 1,4 Kio |
BIN
images/cthulhu.png
Fichier normal
BIN
images/cthulhu.png
Fichier normal
Fichier binaire non affiché.
Après Largeur: | Hauteur: | Taille: 16 Kio |
Chargement…
Référencer dans un nouveau ticket