") == 0) return true; if(substr_count($line, "<") != substr_count($line, ">")) { return false; } return true; } // Retrieve transcript for this strip from the database, modifying the strip object. function gettranscript(&$strip) { global $dbConnection; $result = $dbConnection->executeQuery('SELECT strip FROM transcript WHERE strip = ?', array($strip->id)); if($result) { $output = ''; /* #this gets me the highest panel number that has a transcript # panels beyond that either lack speech or don't exist # either way, I care not Might be able to exchange this loop of getOne()s for a getAll() call. */ $numPanels = $dbConnection->fetchColumn('SELECT MAX(panel) FROM transcript WHERE strip = ?', array($strip->id)); if( $numPanels ) { for($i = 1; $i <= $numPanels; $i++) { $result = $dbConnection->executeQuery('SELECT speaker, speech FROM transcript WHERE transcript.strip = ? AND panel = ? ORDER BY line', array($strip->id, $i)) or mtdie("There was an error fetching the panel count in the transcript for $strip->id, panel $i. " . $dbConnection->errorCode(), 'SQL Error'); if(!$result) continue; $output.= "\nnewpanel\n"; while($row = $result->fetch(PDO::FETCH_NUM)) { if(strlen($row[0]) < 1) continue; $output.= $row[0]; if($row[1] !== '') $output.= ":: ".$row[1]; $output.= "\n"; } } } } $strip->transcript = $output; return $output; } // Parse submitted transcript from strip object, and insert it into the database. function savetranscript( &$strip ) { global $dbConnection; $info = ''; $dbConnection->beginTransaction(); //remove any old transcript data - it's being replaced $dbConnection->executeUpdate('DELETE FROM transcript WHERE transcript.strip = ?', array($strip->id))); if( $strip->transcript_posted ) { $inserter = 'INSERT INTO transcript (strip, panel, line, speaker, speech, search) VALUES (?, ?, ?, ?, ?, ?)'; $inserter_types = array(PDO::PARAM_INT, PDO::PARAM_INT, PDO::PARAM_INT, PDO::PARAM_STR, PDO::PARAM_STR, PDO::PARAM_STR); if(strpos($strip->transcript_posted, 'Panel <$n>') !== FALSE) { # This is probably a scrivener script $panels = explode('Panel <$n>', $strip->transcript_posted); $panels = array_map('trim', $panels); $numPanels = count($panels); for($i = 0; $i < $numPanels; $i++) { $lines = explode("\n", $panels[$i]); $lines = array_map('trim', $lines); # Initialize speaker controls $speaker = null; $has_spoken = true; for($j = 0; $j < count($lines); $j++) { $inserter_values = array(); if(strpos($lines[$j], '(') === 0) { # Line is a note, add it as a comment $inserter_values = array($strip->id, $i, $j, '#', $lines[$j], ''); } elseif(strpos($lines[$j], '[') === 0 || strlen($lines[$j]) == 0) { # Line is an annotation or blank, do nothing continue; } elseif(strpos($lines[$j], 'nospeaking:') === 0) { # Line contains a list of nonspeaking characters array_splice($lines, $j, 1, array_map('_nospeaker', explode(',', substr($lines[$j], 11)))); $speaker = trim(substr($lines[$j], 11)); $inserter_values = array($strip->id, $i, $j, $speaker, '', ''); } elseif($i > 0 && $lines[$j] == strtoupper($lines[$j])) { # Line designates a new speaker, note speaker # Handle speakers who did not say anything if(null !== $speaker && !$has_spoken) $inserter_values = array($strip->id, $i, $j, $speaker, '', ''); $speaker = ucfirst(strtolower($lines[$j])); $has_spoken = false; } elseif(null !== $speaker) { # Line is speech, match with speaker and add if(!bracketbalance($lines[$j])) $info .= "
Warning: Open brackets do not match close brackets in panel $i for speaker ".htmlentities($speaker).'
'; $search = preg_replace( '/[[:punct:]]|(?<=\s)\s+/', ' ', strtolower($lines[$j]) ); $inserter_values = array($strip->id, $i, $j, $speaker, $lines[$j], $search); $has_spoken = true; } else { # Line is unrecognized, add it as a comment $inserter_values = array($strip->id, $i, $j, '#', $lines[$j], ''); } if( $inserter_values && false === $dbConnection->executeUpdate($insert_sql, $inserter_values, $inserter_types) ) { $dbConnection->rollback(); mtdie ($dbConnection->errorCode(), 'Error inserting transcript.'); } } if(null !== $speaker && !$has_spoken) { $inserter_values = array($strip->id, $i, $j, $speaker, '', ''); if( false === $dbConnection->executeUpdate($insert_sql, $inserter_values, $inserter_types) ) { $dbConnection->rollback(); mtdie ($dbConnection->errorCode(), 'Error inserting transcript.'); } } } } else { # Assume that this is a Kalium style transcript $panels = explode('newpanel', $strip->transcript_posted); $numPanels = count($panels); foreach($panels as $currPanel) $currPanel = trim($currPanel); for($i = 1; $i < $numPanels; $i++) { $lines = explode("\n", $panels[$i]); $numLines = count($lines); foreach($lines as $currLine) $currLine = trim($currLine); for($j = 1; $j < $numLines; $j++) { $spoken = explode("::", $lines[$j]); // Distinguish between speaker and speech $spoken[0] = trim($spoken[0]); // Strip excess whitespace $spoken[1] = trim($spoken[1]); if(strlen($spoken[0]) < 1) continue; // Disregard null $spoken[2] = preg_replace('/[[:punct:]]|(?<=\s)\s+/', ' ', strtolower($spoken[1]) ); // Make searchable text if(!bracketbalance($spoken[1])) $info .= "Warning: Open brackets do not match close brackets in panel $i for speaker ".htmlentities($spoken[0]).'
'; $inserter_values = array($strip->id, $i, $j, $spoken[0], $spoken[1], $spoken[2]); if( false === $dbConnection->executeUpdate($insert_sql, $inserter_values, $inserter_types) ) { $dbConnection->rollback(); mtdie ($dbConnection->errorCode(), 'Error inserting transcript.'); } } } } } $dbConnection->commit(); return $info; } function _nospeaker($name) { return "nospeaking: $name"; } ?>