$value) {
$one_character = pack("L", $value);
$result .= iconv("UTF-32", "UTF-8", $one_character);
}
return $result;
}
function convertUnicode($str) {
$s = preg_replace('/\\\u(.{4})/i', '&#x$1;', $str);
return html_entity_decode($s, ENT_NOQUOTES, 'UTF-8');
}
if ($argc < 3) {
die("Need to supply directory of flash cards");
}
$lessonDir = $argv[1];
$destDir = $argv[2];
if (!is_dir($lessonDir)) {
die("Directory [" . $lessonDir . "] is invalid");
}
if (!is_dir($destDir)) {
mkdir($destDir);
}
echo "Source directory: [" . $lessonDir . "]" . PHP_EOL;
echo "Destination directory: [" . $destDir . "]" . PHP_EOL;
$dirArray = array();
$myDirectory = opendir($argv[1]);
$dbFile = $destDir . '/lessons.db';
if (file_exists($dbFile))
unlink($dbFile);
try {
$dbh = new PDO('sqlite:' . $dbFile);
} catch (PDOException $e) {
echo $e->getMessage();
die();
}
$dbh->exec('CREATE TABLE IF NOT EXISTS android_metadata ("locale" TEXT DEFAULT "en_US")');
$dbh->exec('INSERT INTO android_metadata VALUES ("en_US")');
$dbh->exec('CREATE TABLE IF NOT EXISTS lesson_set (_id INTEGER PRIMARY KEY, name VARCHAR(255))');
while ($entryName = readdir($myDirectory)) {
if (!preg_match('/^\./', $entryName) && is_dir($lessonDir . '/' . $entryName)) {
$dirArray[] = $entryName;
$dbh->exec('INSERT INTO lesson_set VALUES (null, "' . $entryName . '")');
}
}
$dbh = null;
closedir($myDirectory);
echo "Found " . count($dirArray) . " lessonsets: " . json_encode($dirArray) . PHP_EOL;
$pids = array();
$parent_pid = getmypid();
for ($i = 0; $i < count($dirArray); $i++) {
if (getmypid() == $parent_pid) {
$pids[] = pcntl_fork();
}
}
if (getmypid() == $parent_pid) {
while (count($pids) > 0) {
$pid = pcntl_waitpid(-1, $status);
foreach ($pids as $key => $tpid) {
if ($pid == $tpid)
unset($pids[$key]);
}
}
echo "All children exited" . PHP_EOL;
$pids = array();
} else {
$pdata = array();
$lessonSetDir = $dirArray[count($pids) - 1];
$dbFile = $destDir . '/' . $lessonSetDir . '.db';
if (file_exists($dbFile))
unlink($dbFile);
try {
$dbh = new PDO('sqlite:' . $dbFile);
} catch (PDOException $e) {
echo $e->getMessage();
die();
}
$dbh->exec('CREATE TABLE IF NOT EXISTS android_metadata ("locale" TEXT DEFAULT "en_US")');
$dbh->exec('INSERT INTO android_metadata VALUES ("en_US")');
$dbh->exec('CREATE TABLE IF NOT EXISTS lesson (_id INTEGER PRIMARY KEY, name VARCHAR(255), font VARCHAR(255))');
$dbh->exec('CREATE TABLE IF NOT EXISTS card (_id INTEGER PRIMARY KEY, lesson_id INTEGER, front TEXT, back TEXT)');
$lessons = array();
$myDirectory = opendir($lessonDir . '/' . $lessonSetDir);
$lid = 1;
$totwords = 0;
while ($cardfile = readdir($myDirectory)) {
if (!preg_match('/^\./', $entryName) && is_file($lessonDir . '/' . $lessonSetDir . '/' . $cardfile)) {
$lessons[] = $cardfile;
$lesson_data = @parse_ini_file($lessonDir . '/' . $lessonSetDir . '/' . $cardfile, false, INI_SCANNER_RAW);
if (!is_array($lesson_data)) {
echo $lessonDir . '/' . $lessonSetDir . '/' . $cardfile . ' failed to parse' . PHP_EOL;
continue;
}
$lesson = preg_replace('/\.flash/i', '', $cardfile);
if (array_key_exists('lessonFont', $lesson_data)) {
$dbh->exec('INSERT INTO lesson VALUES (null, "' . $lesson . '", "' . $lesson_data['lessonFont'] . '")');
} else {
echo $lessonDir . '/' . $lessonSetDir . '/' . $cardfile . ' has no font specified ' . PHP_EOL;
}
$cardCount = $lesson_data['wordCount'];
$totwords += $cardCount;
for ($i = 0; $i < $cardCount; $i++) {
$front = convertUnicode($lesson_data['word' . $i]);
$back = $lesson_data['answers' . $i];
$dbh->exec('INSERT INTO card VALUES (null, ' . $lid . ', "' . $front . '", "' . $back . '")');
}
$lid++;
echo $lessonDir . '/' . $lessonSetDir . '/' . $cardfile . ': processed ' . $cardCount . ' words' . PHP_EOL;
}
}
echo $dbFile . ': processed ' . $lid . ' lessons and ' . $totwords . ' words' . PHP_EOL;
closedir($myDirectory);
exit(0);
}