49078292b4
Previously the Parser class had an internal function to parse the character stream into separate lines. This functionality was separated out into its own class, LineReader, in order to make this functionality available to clients too. Change-Id: Ic5a1b0b73d7a253cf21cb6b4804b4941fd69c8ab
163 lines
4.9 KiB
C++
163 lines
4.9 KiB
C++
// Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
|
//
|
|
// Use of this source code is governed by a BSD-style license
|
|
// that can be found in the LICENSE file in the root of the source
|
|
// tree. An additional intellectual property rights grant can be found
|
|
// in the file PATENTS. All contributing project authors may
|
|
// be found in the AUTHORS file in the root of the source tree.
|
|
|
|
#ifndef WEBVTTPARSER_H_ // NOLINT
|
|
#define WEBVTTPARSER_H_
|
|
|
|
#include <list>
|
|
#include <string>
|
|
|
|
namespace libwebvtt {
|
|
|
|
class Reader {
|
|
public:
|
|
// Fetch a character from the stream. Return
|
|
// negative if error, positive if end-of-stream,
|
|
// and 0 if a character is available.
|
|
virtual int GetChar(char* c) = 0;
|
|
|
|
protected:
|
|
virtual ~Reader();
|
|
};
|
|
|
|
class LineReader : protected Reader {
|
|
public:
|
|
// Consume a line of text from the stream, stripping off
|
|
// the line terminator characters. Returns negative if error,
|
|
// 0 on success, and positive at end-of-stream.
|
|
int GetLine(std::string* line);
|
|
|
|
protected:
|
|
virtual ~LineReader();
|
|
|
|
// Puts a character back into the stream.
|
|
virtual void UngetChar(char c) = 0;
|
|
};
|
|
|
|
// As measured in thousandths of a second,
|
|
// e.g. a duration of 1 equals 0.001 seconds,
|
|
// and a duration of 1000 equals 1 second.
|
|
typedef long long presentation_t; // NOLINT
|
|
|
|
struct Time {
|
|
int hours;
|
|
int minutes;
|
|
int seconds;
|
|
int milliseconds;
|
|
|
|
bool operator==(const Time& rhs) const;
|
|
bool operator<(const Time& rhs) const;
|
|
bool operator>(const Time& rhs) const;
|
|
bool operator<=(const Time& rhs) const;
|
|
bool operator>=(const Time& rhs) const;
|
|
|
|
presentation_t presentation() const;
|
|
Time& presentation(presentation_t);
|
|
|
|
Time& operator+=(presentation_t);
|
|
Time operator+(presentation_t) const;
|
|
|
|
Time& operator-=(presentation_t);
|
|
presentation_t operator-(const Time&) const;
|
|
};
|
|
|
|
struct Setting {
|
|
std::string name;
|
|
std::string value;
|
|
};
|
|
|
|
struct Cue {
|
|
std::string identifier;
|
|
|
|
Time start_time;
|
|
Time stop_time;
|
|
|
|
typedef std::list<Setting> settings_t;
|
|
settings_t settings;
|
|
|
|
typedef std::list<std::string> payload_t;
|
|
payload_t payload;
|
|
};
|
|
|
|
class Parser : private LineReader {
|
|
public:
|
|
explicit Parser(Reader* r);
|
|
virtual ~Parser();
|
|
|
|
// Pre-parse enough of the stream to determine whether
|
|
// this is really a WEBVTT file. Returns 0 on success,
|
|
// negative if error.
|
|
int Init();
|
|
|
|
// Parse the next WebVTT cue from the stream. Returns 0 if
|
|
// an entire cue was parsed, negative if error, and positive
|
|
// at end-of-stream.
|
|
int Parse(Cue* cue);
|
|
|
|
private:
|
|
// Returns the next character in the stream, using the look-back character
|
|
// if present (as per Reader::GetChar).
|
|
virtual int GetChar(char* c);
|
|
|
|
// Puts a character back into the stream (as per LineReader::UngetChar).
|
|
virtual void UngetChar(char c);
|
|
|
|
// Check for presence of a UTF-8 BOM in the stream. Returns
|
|
// negative if error, 0 on success, and positive at end-of-stream.
|
|
int ParseBOM();
|
|
|
|
// Parse the distinguished "cue timings" line, which includes the start
|
|
// and stop times and settings. Argument |line| contains the complete
|
|
// line of text (as returned by ParseLine()), which the function is free
|
|
// to modify as it sees fit, to facilitate scanning. Argument |arrow_pos|
|
|
// is the offset of the arrow token ("-->"), which indicates that this is
|
|
// the timings line. Returns negative if error, 0 on success.
|
|
//
|
|
static int ParseTimingsLine(std::string* line,
|
|
std::string::size_type arrow_pos,
|
|
Time* start_time,
|
|
Time* stop_time,
|
|
Cue::settings_t* settings);
|
|
|
|
// Parse a single time specifier (from the timings line), starting
|
|
// at the given offset; lexical scanning stops when a NUL character
|
|
// is detected. The function modifies offset |off| by the number of
|
|
// characters consumed. Returns negative if error, 0 on success.
|
|
//
|
|
static int ParseTime(const std::string& line,
|
|
std::string::size_type* off,
|
|
Time* time);
|
|
|
|
// Parse the cue settings from the timings line, starting at the
|
|
// given offset. Returns negative if error, 0 on success.
|
|
//
|
|
static int ParseSettings(const std::string& line,
|
|
std::string::size_type off,
|
|
Cue::settings_t* settings);
|
|
|
|
// Parse a non-negative integer from the characters in |line| beginning
|
|
// at offset |off|. The function increments |off| by the number
|
|
// of characters consumed. Returns the value, or negative if error.
|
|
//
|
|
static int ParseNumber(const std::string& line,
|
|
std::string::size_type* off);
|
|
|
|
Reader* const reader_;
|
|
|
|
// Provides one character's worth of look-back, to facilitate scanning.
|
|
int unget_;
|
|
|
|
// Disable copy ctor and copy assign for Parser.
|
|
Parser(const Parser&);
|
|
Parser& operator=(const Parser&);
|
|
};
|
|
|
|
} // namespace libwebvtt
|
|
|
|
#endif // WEBVTTPARSER_H_ // NOLINT
|