// 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 #include 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 settings_t; settings_t settings; typedef std::list 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