diff --git a/negromate/web/builder.py b/negromate/web/builder.py
index 6ae61d5..6cfec32 100644
--- a/negromate/web/builder.py
+++ b/negromate/web/builder.py
@@ -4,7 +4,7 @@ import sys
from pathlib import Path
import subprocess
-from jinja2 import Environment, PackageLoader, select_autoescape
+from jinja2 import Environment, FileSystemLoader, select_autoescape
from jinja2.utils import Markup
import srt
@@ -43,14 +43,14 @@ class SongPage:
class Builder:
- def __init__(self, root_folder, libreto):
+ def __init__(self, root_folder, libreto, template_folder, static_folder):
self.root_folder = root_folder
self.libreto = libreto
- self.src_dir = Path(__file__).parent
- self.static_dir = self.src_dir / 'static'
+ self.static_folder = static_folder
+ self.template_folder = template_folder
self.env = Environment(
- loader=PackageLoader('negromate.web', 'templates'),
+ loader=FileSystemLoader(template_folder),
autoescape=select_autoescape(['html']),
)
self.env.filters['url'] = self.url
@@ -114,7 +114,7 @@ class Builder:
todo_context.update(global_context)
self.render('todo.html', todo, todo_context)
- template_file = self.src_dir / 'templates' / 'karaoke.ass'
+ template_file = self.template_folder / 'karaoke.ass'
update_karaoke_songs(songs, template_file)
static = self.root_folder / 'static'
@@ -125,17 +125,9 @@ class Builder:
subprocess.check_call([
'rsync',
'-ra',
- str(self.static_dir),
+ str(self.static_folder),
str(self.root_folder.absolute()),
])
libreto = self.root_folder / 'static/libreto/libreto.pdf'
copy(str(self.libreto.absolute()), str(libreto.absolute()))
-
-
-def main():
- builder = Builder(
- Path(sys.argv[1]),
- Path(sys.argv[2]),
- )
- builder.build()
diff --git a/negromate/web/commands/build.py b/negromate/web/commands/build.py
index c514b69..426295a 100644
--- a/negromate/web/commands/build.py
+++ b/negromate/web/commands/build.py
@@ -4,6 +4,10 @@ from ..builder import Builder
name = 'build'
help_text = 'Generate static website'
+initial_config = {
+ 'template_folder': '~/negro_mate/web/templates',
+ 'static_folder': '~/negro_mate/web/static',
+}
def options(parser, config, **kwargs):
@@ -17,11 +21,23 @@ def options(parser, config, **kwargs):
default=config['global']['lyrics_file'],
help="File with the lyrics of the songs, defaults to {}".format(
config['global']['lyrics_file']))
+ parser.add_argument(
+ '-t', '--template_folder', type=Path,
+ default=config['build']['template_folder'],
+ help="Folder with jinja2 templates, defaults to {}".format(
+ config['build']['template_folder']))
+ parser.add_argument(
+ '-S', '--static_folder', type=Path,
+ default=config['build']['static_folder'],
+ help="Folder with static content, defaults to {}".format(
+ config['build']['static_folder']))
def run(args, **kwargs):
builder = Builder(
- Path(args.song_folder).expanduser(),
- Path(args.lyrics_file).expanduser(),
+ root_folder=args.song_folder.expanduser(),
+ libreto=args.lyrics_file.expanduser(),
+ template_folder=args.template_folder.expanduser(),
+ static_folder=args.static_folder.expanduser(),
)
builder.build()
diff --git a/negromate/web/static/.gitignore b/negromate/web/static/.gitignore
deleted file mode 100644
index d5f19d8..0000000
--- a/negromate/web/static/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-node_modules
-package-lock.json
diff --git a/negromate/web/static/css/CyrBit.ttf b/negromate/web/static/css/CyrBit.ttf
deleted file mode 100644
index 88b15d9..0000000
Binary files a/negromate/web/static/css/CyrBit.ttf and /dev/null differ
diff --git a/negromate/web/static/css/cc-by-sa.png b/negromate/web/static/css/cc-by-sa.png
deleted file mode 100644
index e76aeff..0000000
Binary files a/negromate/web/static/css/cc-by-sa.png and /dev/null differ
diff --git a/negromate/web/static/css/main.css b/negromate/web/static/css/main.css
deleted file mode 100644
index 602f873..0000000
--- a/negromate/web/static/css/main.css
+++ /dev/null
@@ -1,118 +0,0 @@
-body {
- display: flex;
- flex-wrap: wrap;
- background-color: #232323;
- color: #aaa;
- font-family: "CyrBit";
- font-size: 20pt;
-}
-
-a {
- color: #aaa;
- text-decoration: none;
-}
-
-header#header {
- width:100%;
- display: inline-block;
-}
-
-footer {
- font-size: smaller;
- width: 100%;
-}
-
-table {
- width: 90%;
- border: 1px solid white;
- border-collapse: collapse;
- margin: 0 auto;
-}
-
-table td, table th {
- border: 1px solid white;
-}
-
-#menu {
- display: inline-block;
- flex: 1 10em;
-}
-
-#menu ul {
- list-style-type: none;
- padding: 0;
- border: 1px solid gray;
- border-radius: 0.5em;
-}
-
-#menu ul li {
- border-bottom: 1px solid gray;
- padding: 0.5em 1em;
-}
-
-#libreto, #playlist, #onion, #todo {
- border: 1px solid #aaa;
- border-radius: 0.5em;
- text-align: center;
-}
-
-#libreto img {
- width: 200px;
- margin-left: auto;
- margin-right: auto;
- display: block;
-}
-
-#content {
- display: inline-block;
- margin-left: 1em;
- flex: 10;
-}
-
-.songs {
- display: flex;
- flex-wrap: wrap;
-}
-
-.songs figure {
- flex: 0;
- border: 1px solid gray;
- text-align: center;
- padding: 0.5em;
- border-radius: 0.5em;
-}
-
-.songs figure figcaption {
- font-weight: bold;
-}
-
-video {
- width: 100%;
-}
-
-.lyrics {
- line-height: 1.2em;
-}
-
-#song-playlist #video-playlist {
- width: 100%;
-}
-
-.vjs-mouse.vjs-playlist {
- font-size: 15pt;
-}
-
-.vjs-mouse.vjs-playlist .vjs-playlist-item-list {
- display: flex;
- flex-wrap: wrap;
-}
-
-.vjs-playlist .vjs-playlist-item {
- flex: 0 200px;
-
-}
-
-.video-js .vjs-big-play-button {
- top: 50%;
- left: 50%;
-}
diff --git a/negromate/web/static/css/nm_icon.png b/negromate/web/static/css/nm_icon.png
deleted file mode 100644
index 6a8849e..0000000
Binary files a/negromate/web/static/css/nm_icon.png and /dev/null differ
diff --git a/negromate/web/static/js/libjass/.gitignore b/negromate/web/static/js/libjass/.gitignore
deleted file mode 100644
index cdfdf26..0000000
--- a/negromate/web/static/js/libjass/.gitignore
+++ /dev/null
@@ -1,14 +0,0 @@
-/build/doc.js
-/build/typescript/typescript.d.ts
-/build/typescript/*.js
-
-/dist/
-
-/lib/
-!/lib/libjass.css
-
-/node_modules/
-
-/npm-debug.log
-
-/src/version.ts
diff --git a/negromate/web/static/js/libjass/.travis.yml b/negromate/web/static/js/libjass/.travis.yml
deleted file mode 100644
index 33eb227..0000000
--- a/negromate/web/static/js/libjass/.travis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-language: node_js
-node_js:
- - "6"
- - "7"
-before_script:
- - "node ./build.js doc"
-sudo: false
diff --git a/negromate/web/static/js/libjass/CHANGELOG.md b/negromate/web/static/js/libjass/CHANGELOG.md
deleted file mode 100644
index 1fef252..0000000
--- a/negromate/web/static/js/libjass/CHANGELOG.md
+++ /dev/null
@@ -1,133 +0,0 @@
-### v0.11.0 - 2016/01/24
-- BREAKING CHANGE - WebRenderer.resize(width, height) used to have a broken implementation of letterboxing to move the subs div right or down. Now it's WebRenderer.resize(width, height, left, top) and expects the caller to calculate letterboxing itself and supply left and top accordingly. DefaultRenderer does it using the video resolution and users of WebRenderer can do the same.
-- BREAKING CHANGE - DefaultRenderer.resize() now ignores its parameters and always resizes to its video element's dimensions. It had already stopped resizing the video element when it was renamed from resizeVideo in v0.6.0, so it doesn't make sense to let it take a completely different width and height.
-- BREAKING CHANGE - Removed fullscreen support in DefaultRenderer. It started out as a hack using max z-index and works on even fewer browsers now. It probably didn't work for you anyway so it should be no big loss.
-- Implemented experimental support for \t
-- Added RendererSettings.fallbackFonts to set the fallback fonts for all styles. Defaults to 'Arial, Helvetica, sans-serif, "Segoe UI Symbol"'.
-- Better compatibility with loose ASS scripts - assume unnamed first section is Script Info, fall back to Default style for missing styles, recognize arbitrary-case property names, normalize asterisks in style names, etc.
-- Various font size improvements - faster calculation, fix for incorrect size when line-height is overridden by site CSS, fix for incorrect scaled sizes for letterboxed subs, fix for incorrect metrics for web fonts, etc. The last one requires that all web fonts be specified in RendererSettings.fontMap to be rendered accurately.
-- WebRenderer now supports using local() URLs in addition to url() in CSS font-face rules.
-- Added RendererSettings.useAttachedFonts. If true, TTF fonts attached to the script will be used in addition to fonts specified in RendererSettings.fontMap. This setting is false by default, and should only be enabled on trusted fonts since it uses a very naive base64 and TTF parser to extract the font names from the attachment. It also requires ES6 typed arrays - ArrayBuffer, DataView, Uint8Array, etc. in the environment.
-- Various pre-render, SVG filter and DOM perf improvements.
-- Fixed \fscx and \fscy to not scale shadows.
-- Fixed \fscx and \fscy to have optional values.
-- Fixed \fs+ and \fs- to have required values.
-- Fixed \r to use the target style's alpha values instead of 1.
-- Fixed \fad subs to not flash after the fade-out ends with low-resolution clocks.
-- Fixed outlines to not be darker than they should be.
-- Fixed styles to not ignore the ScaleX and ScaleY properties in the script.
-- Fixed lack of sufficient space between normal and italic text.
-- Fixed SVG filters to interpolate in sRGB space instead of RGB.
-- Fixed ASS parser to complain if a script doesn't have a Script Info section at all.
-- The promise returned from ASS.from*() is now properly rejected due to errors from loading the script, instead of just remaining unresolved forever.
-- Fixed SRT parser to swallow UTF-8 BOM just like the ASS parser.
-- Fixed all clocks to suppress redundant ticks if the current timestamp hasn't change from the last tick.
-- Fixed {AutoClock, VideoClock}.{setEnabled, toggle} methods to actually enable / disable the high-resolution timer.
-
-
-### v0.10.0 - 2015/05/05
-- Implemented libjass.renderers.AutoClock, a clock that automatically ticks and generates clock events according to the state of an external driver.
-- Implemented \k
-- libjass.{Set, Map, Promise} can now be set to null to force the use of the polyfills, even if it defaulted to a runtime-provided implementation.
-- Added ASS.fromReadableStream(), a function that can be used to parse ASS from a readable stream such as the response of window.fetch().
-- ASS.fromUrl() now tries to use window.fetch() if available instead of XMLHttpRequest.
-- Fixed constant pausing and playing on Firefox triggered by how slowly it updates video.currentTime (wasn't noticeable but still undesirable).
-- Fixed a dialogue's animation state not getting updated while seeking if the start and end times of the seek were within its start and end times.
-- Fixed wrapping mode 1 (end-of-line wrapping) to actually wrap.
-- Fixed parser to parse the time components of karaoke tags as centiseconds instead of seconds.
-- Fixed parser to swallow leading BOM, if any.
-- Fixed errors reported by webworker API were empty objects without message and stack properties.
-
-
-### v0.9.0 - 2014/11/27
-- BREAKING CHANGE - ASS.fromString() now returns a Promise of an ASS object, not an ASS object directly. The synchronous ASS parser used by ASS.fromString() is no more.
-- BACKWARD-COMPATIBLE CHANGE - WebRenderer constructor parameters order has changed from (ass, clock, settings, libjassSubsWrapper) to (ass, clock, libjassSubsWrapper, settings). The constructor will detect the old order and reorder accordingly.
-- Added ASS.fromStream and ASS.fromXhr that read a stream and an XMLHttpRequest object's response respectively and return (a Promise of) an ASS object. Both of these parse the script asynchronously.
-- Added RendererSettings.enableSvg that can be used to toggle the use of SVG filter effects for outlines and blur.
-- libjass.js now has an AMD wrapper so that it can be used with RequireJS, etc.
-- Settings parameter is now optional for WebRenderer and DefaultRenderer.
-- Added support for clock rates apart from 1 to clocks and renderers.
-- Added a parameter to libjass.createWorker to specify the path to libjass.js that will run in the worker.
-- Fixed Style and Dialogue constructors not setting defaults for missing properties.
-- Fixed color and alpha parser to support more formats.
-- Fixed SRT parser to replace all HTML tags it finds, instead of just the first one.
-- Fixed font size calculation to use the vertical scale instead of horizontal.
-- Fixed line-height on newlines.
-- Fixed missing perspective on X and Y rotations.
-
-
-### v0.8.0 - 2014/08/16
-- Added web worker support. libjass.parse can now be offloaded to a web worker.
-- Implemented \fs+ and \fs-
-- Added ASS.addEvent() to add dialogue lines to an ASS object.
-- Renamed ClockEvent.TimeUpdate to ClockEvent.Tick, and added ClockEvent.Stop
-- Clock.enable() and .disable() now return a boolean to indicate whether the function had any effect.
-- Added Clock.setEnabled() to force the enabled-state to the given value.
-- Renamed ManualClock.timeUpdate() to ManualClock.tick()
-- Moved WebRenderer.enable(), .disable() and .enabled to NullRenderer
-- Fixed not being able to parse tags with default values.
-- Fixed font preloader downloading the same font multiple times because it didn't filter for duplicates.
-- Fixed min-width value not taking separate left and right margins into account.
-- Fixed absolutely positioned subs were always left-aligned even if they had an alignment tag.
-- Fixed blur and outlines getting truncated.
-
-
-### v0.7.0 - 2014/05/15
-- Implemented \be
-- Split a new renderer, WebRenderer, off DefaultRenderer that doesn't rely on a video element.
-- All renderers now require a Clock to generate time events. VideoClock is a Clock backed by a video element, while ManualClock is a clock that can be used to generate arbitrary time events.
-
-
-### v0.6.0 - 2014/03/24
-- All script properties and style properties are now parsed and stored in the ASS and Style objects.
-- Basic SRT support, by passing in a libjass.Format argument to ASS.fromString()
-- \clip and \iclip now have their drawing instructions parsed as an array of libjass.parts.drawing.Instruction's instead of just a string.
-- Added DefaultRenderer.enable(), DefaultRenderer.disable() and DefaultRenderer.toggle() to change whether the renderer is displaying subtitles or not.
-- DefaultRenderer.resizeVideo is now called DefaultRenderer.resize. Now it only resizes the subtitle wrapper div, not the video element.
-- Replaced the 41ms setInterval-bsed timer with a requestAnimationFrame-based timer to reduce load on minimized or hidden browser tabs.
-- DefaultRenderer now renders dialogues in the correct order according to the script.
-- Fixed incorrect font sizes.
-- Replaced jake with gulp.
-
-
-### v0.5.0 - 2014/01/26
-- Removed preLoadFonts renderer setting. It was redundant with the actual fontMap setting since the presence or absence of that setting is enough to signal whether the user wants to preload fonts or not.
-- Multiple renderers can now be used on the same page without conflicting with each other.
-- Implemented \shad, \xshad, \yshad
-- Fixed ASS draw scale being used incorrectly.
-- ASS.resolutionX and ASS.resolutionY are now properties of ASS.properties, a ScriptProperties object.
-
-
-### v0.4.0 - 2013/12/27
-- All parts moved from the libjass.tags namespace to the libjass.parts namespace.
-- Replaced PEG.js parser with a hand-written one. This allows for parsing lines that are strictly invalid grammar but are parsed successfully by VSFilter or libass.
-- All ASS tags are now supported by the parser.
-- Removed the useHighResolutionTimer setting for DefaultRenderer. DefaultRenderer always uses the 41ms timer now.
-- Implemented \move
-- Implemented ASS draw
-- Fixed subs overflowing the video dimensions still being visible.
-- SVG filters are now used for outlines and blur.
-- Delay parsing of dialogue lines till they need to be pre-rendered. As a side-effect, all fonts in the font map are preloaded now, not just the ones used in the current script.
-
-
-### v0.3.0 - 2013/10/28
-- Moved libjass.DefaultRenderer to libjass.renderers.DefaultRenderer
-- Added libjass.renderers.NullRenderer, a renderer that doesn't render anything.
-- DefaultRenderer's fontMap setting is now a Map instead of an Object. It now supports more than one URL for each font name.
-- DefaultRenderer now generates the subtitle wrapper div itself.
-- DefaultRenderer now takes video letterboxing into account when resizing the subtitles.
-- DefaultRenderer has a new setting useHighResolutionTimer that makes it use a 41ms timer instead of video.timeUpdate's 250ms timer.
-- div IDs and CSS class names are now prefixed with "libjass-" to avoid collisions with other elements on the page.
-- All numeric CSS property values are now truncated to three decimal places.
-- Added ```jake watch``` that rebuilds and runs tests on changes to the source.
-- Added ```jake doc``` that builds API documentation.
-- Added Travis CI build.
-
-
-### v0.2.0 - 2013/09/11
-- Added libjass.DefaultRenderer, a class that handles initializing the layer div's, preloading fonts, and drawing Dialogues based on the current video time.
-- libjass.js can now be loaded in node. Only the parser can be used.
-- Tests can now be run with ```jake test``` or ```npm test``` using Mocha.
-
-### v0.1.0 - 2013/08/29
-- First npm release.
diff --git a/negromate/web/static/js/libjass/LICENSE b/negromate/web/static/js/libjass/LICENSE
deleted file mode 100644
index d645695..0000000
--- a/negromate/web/static/js/libjass/LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/negromate/web/static/js/libjass/README.md b/negromate/web/static/js/libjass/README.md
deleted file mode 100644
index 385b82b..0000000
--- a/negromate/web/static/js/libjass/README.md
+++ /dev/null
@@ -1,171 +0,0 @@
-[](https://travis-ci.org/Arnavion/libjass)
-
-libjass is a JavaScript library written in TypeScript to render ASS subs in the browser. [Check out the demo.](http://arnavion.github.io/libjass/demo/index.xhtml)
-
-
-### What's special about libjass?
-
-* libjass requires no tweaks to the ASS file from the original video.
-
-* libjass uses the browser's native CSS engine by converting the components of each line in the ASS script into a series of styled <div> and <span> elements. This allows all the layout and rendering to be handled by the browser instead of requiring complex and costly drawing and animation code. For example, libjass uses CSS3 animations to simulate tags such as \fad. While a canvas-drawing library would have to re-draw such a subtitle on the canvas for every frame of the video, libjass only renders it once and lets the browser render the fade effect.
-
-As a result, libjass is able to render subtitles with very low CPU usage. The downside to libjass's aproach is that it is hard (and potentially impossible) to map all effects possible in ASS (using \t, ASS draw) etc. into DOM elements. As of now, the subset of tags supported by libjass has no such problems.
-
-
-### I want to use libjass for my website. What do I need to do?
-
-You can install the latest release of libjass
-
-* using npm with `npm install libjass` and load with `var libjass = require("libjass");`
-* using bower with `bower install https://github.com/Arnavion/libjass/releases/download//libjass.zip`
-* using jspm with `jspm install github:Arnavion/libjass` and load with `import libjass from "Arnavion/libjass";`
-
-Inside the package, you will find libjass.js and libjass.css, which you need to load on your website with your video.
-
-Alternatively, you can build libjass from source by cloning this repository and running `npm install`. This will install the dependencies and run the build. libjass.js and libjass.css will be found in the lib/ directory.
-
-Only libjass.js and libjass.css are needed to use libjass on your website. The other files are only used during the build process and you don't need to deploy them to your website.
-
-
-### What are all these files?
-
-* The src/ directory contains the source of libjass. They are TypeScript files and get compiled into JavaScript for the browser using the TypeScript compiler.
-
-* build.js is the build script. The build command will use this script to build libjass.js. The build/ directory contains other files used for the build.
-
-* The tests/ directory contains unit and functional tests.
-
-* The lib/ directory contains libjass.js and libjass.css. You will need to deploy these to your website.
-
-
-### How do I use libjass?
-
-The API documentation is linked in the Links section below. Here's an overview:
-
-* The [ASS.fromUrl()](http://arnavion.github.io/libjass/api.xhtml#libjass.ASS.fromUrl) function takes in a URL to an ASS script and returns a promise that resolves to an [ASS](http://arnavion.github.io/libjass/api.xhtml#libjass.ASS) object. This ASS object represents the script properties, the line styles and dialogue lines in it. Alternatively, you can use [ASS.fromString()](http://arnavion.github.io/libjass/api.xhtml#libjass.ASS.fromString) to convert a string of the script contents into an ASS object.
-
-* Next, you initialize a renderer to render the subtitles. libjass ships with an easy-to-use renderer, the [DefaultRenderer](http://arnavion.github.io/libjass/api.xhtml#libjass.renderers.DefaultRenderer). It uses information from the ASS object to build up a series of div elements around the video tag. There is a wrapper (.libjass-subs) containing div's corresponding to the layers in the ASS script, and each layer has div's corresponding to the 9 alignment directions. libjass.css contains styles for these div's to render them at the correct location.
-
-* The renderer uses [window.requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window.requestAnimationFrame) as a source of timer ticks. In each tick, it determines the set of dialogues to be shown at the current video time, renders each of them as a div, and appendChild's the div into the appropriate layer+alignment div.
-
-* The renderer can be told to dynamically change the size of the subtitles based on user input by calling [WebRenderer.resize()](http://arnavion.github.io/libjass/api.xhtml#libjass.renderers.WebRenderer.resize)
-
-* Lastly, the renderer contains an implementation of preloading fonts before playing the video. It uses a map of font names to URLs - this map can be conveniently created from a CSS file containing @font-face rules using [RendererSettings.makeFontMapFromStyleElement()](http://arnavion.github.io/libjass/api.xhtml#libjass.renderers.RendererSettings.makeFontMapFromStyleElement)
-
-* For an example of using libjass, check out [the demo.](http://arnavion.github.io/libjass/demo/index.xhtml) It has comments explaining basic usage and pointers to some advanced usage.
-
-
-### What browser and JavaScript features does libjass need?
-
-* libjass uses some ES5 features like getters and setters (via Object.defineProperty), and assumptions like the behavior of parseInt with leading zeros. It cannot be used with an ES3 environment.
-
-* libjass will use ES6 Set, Map and Promise if they're available on the global object. If they're not present, it will use its own minimal internal implementations. If you have implementations of these that you would like libjass to use but don't want to register them on the global object, you can provide them to libjass specifically by setting the [libjass.Set](http://arnavion.github.io/libjass/api.xhtml#libjass.Set), [libjass.Map](http://arnavion.github.io/libjass/api.xhtml#libjass.Map) and [libjass.Promise](http://arnavion.github.io/libjass/api.xhtml#libjass.Promise) properties.
-
-* [AutoClock](http://arnavion.github.io/libjass/api.xhtml#libjass.renderers.AutoClock) and [VideoClock](http://arnavion.github.io/libjass/api.xhtml#libjass.renderers.VideoClock) use [window.requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame) to generate clock ticks.
-
-* [WebRenderer](http://arnavion.github.io/libjass/api.xhtml#libjass.renderers.WebRenderer) and [DefaultRenderer](http://arnavion.github.io/libjass/api.xhtml#libjass.renderers.DefaultRenderer) use [SVG filter effects for HTML](http://caniuse.com/#feat=svg-html) to render outlines and blur. This feature is not available on all browsers, so you can tell them to fall back to more widely available CSS methods by setting the [RendererSettings.enableSvg](http://arnavion.github.io/libjass/api.xhtml#libjass.renderers.RendererSettings.enableSvg) property to false.
-
-* WebRenderer and DefaultRenderer use [CSS3 animations](http://caniuse.com/#feat=css-animation) for effects like \mov and \fad.
-
-* Using fonts attached to the script requires [ES6 typed arrays](http://caniuse.com/#feat=typedarrays) (ArrayBuffer, DataView, Uint8Array, etc).
-
-
-### Can I use libjass in node?
-
-libjass's parser works in node. Entire scripts can be parsed via [ASS.fromString()](http://arnavion.github.io/libjass/api.xhtml#libjass.ASS.fromString)
-
-```javascript
-> var libjass = require("libjass")
-undefined
-> var ass; libjass.ASS.fromString(fs.readFileSync("mysubs.ass", "utf8")).then(function (result) { ass = result; })
-{}
-> ass.properties.resolutionX
-1280
-> ass.dialogues.length
-9
-> ass.dialogues[0].toString()
-'#0 [646.460-652.130] {\\fad(200,0)}Sapien rhoncus, suscipit posuere in nunc pellentesque'
-> var parts = ass.dialogues[0].parts
-undefined
-> parts.length
-2
-> parts[0] instanceof libjass.parts.Fade
-true
-> parts[0].toString()
-'Fade { start: 0.2, end: 0 }'
-```
-
-[libjass.parser.parse](http://arnavion.github.io/libjass/api.xhtml#libjass.parser.parse) parses the first parameter using the second parameter as the rule name. For example, the [dialogueParts](http://arnavion.github.io/libjass/api.xhtml#./parser/parse.ParserRun.parse_dialogueParts) rule can be used to get an array of [libjass.parts](http://arnavion.github.io/libjass/api.xhtml#libjass.parts) objects that represent the parts of an ASS dialogue line.
-
-```javascript
-> var parts = libjass.parser.parse("{\\an8}Are {\\i1}you{\\i0} the one who stole the clock?!", "dialogueParts")
-undefined
-> parts.join(" ")
-'Alignment { value: 8 } Text { value: Are } Italic { value: true } Text { value: you } Italic { value: false } Text { value: the one who stole the clock?! }'
-> parts.length
-6
-> parts[0].toString()
-'Alignment { value: 8 }'
-> parts[0] instanceof libjass.parts.Alignment
-true
-> parts[0].value
-8
-```
-
-The rule names are derived from the methods on the [ParserRun class](http://arnavion.github.io/libjass/api.xhtml#./parser/parse.ParserRun).
-
-See the tests, particularly the ones in tests/unit/miscellaneous.js, for examples.
-
-
-### Can I contribute?
-
-Yes! Feature requests, suggestions, bug reports and pull requests are welcome! I'm especially looking for details and edge-cases of the ASS syntax that libjass doesn't support.
-
-You can also join the IRC channel in the links section below and ask any questions.
-
-
-### Supported features
-
-* Styles: Italic, Bold, Underline, StrikeOut, FontName, FontSize, ScaleX, ScaleY, Spacing, PrimaryColor, OutlineColor, BackColor, Outline, Shadow, Alignment, MarginL, MarginR, MarginV
-* Tags: \i, \b, \u, \s, \bord, \xbord, \ybord, \shad, \xshad, \yshad, \be, \blur, \fn, \fs, \fscx, \fscy, \fsp, \frx, \fry, \frz, \fr, \fax, \fay, \c, \1c, \3c, \4c, \alpha, \1a, \3a, \4a, \an, \a, \k, \q, \r, \pos, \move, \fad, \fade, \t (experimental), \p
-* Custom fonts, using CSS web fonts.
-
-
-### Known issues
-
-* Unsupported tags: \fe, \2c, \2a, \K, \kf, \ko, \org, \clip, \iclip
-* \an4, \an5, \an6 aren't positioned correctly.
-* Smart line wrapping is not supported. Such lines are rendered as [wrapping style 1 (end-of-line wrapping).](http://docs.aegisub.org/3.0/ASS_Tags/#wrapstyle)
-* Lines with multiple rotations aren't rotated the same as VSFilter or libass. See [#14](https://github.com/Arnavion/libjass/issues/14)
-- Desktop renderers include borders when calculating space between adjacent lines. libjass doesn't.
-
-
-### Links
-
-* [GitHub](https://github.com/Arnavion/libjass/)
-* IRC channel - #libjass on irc.rizon.net
-* [API documentation](http://arnavion.github.io/libjass/api.xhtml)
-* [Aegisub's documentation on ASS](http://docs.aegisub.org/3.0/ASS_Tags/)
-
-
-### License
-
-```
-libjass
-
-https://github.com/Arnavion/libjass
-
-Copyright 2013 Arnav Singh
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-```
diff --git a/negromate/web/static/js/libjass/build.js b/negromate/web/static/js/libjass/build.js
deleted file mode 100644
index 2ec355c..0000000
--- a/negromate/web/static/js/libjass/build.js
+++ /dev/null
@@ -1,281 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var fs = require("fs");
-var path = require("path");
-var stream = require("stream");
-
-var async = require("async");
-
-var task = require("async-build");
-
-(function () {
- var _TypeScript = null;
- var _UglifyJS = null;
- var _npm = null;
-
- Object.defineProperties(global, {
- TypeScript: { get: function () { return _TypeScript || (_TypeScript = require("./build/typescript/index.js")); } },
- UglifyJS: { get: function () { return _UglifyJS || (_UglifyJS = require("./build/uglify.js")); } },
- npm: { get: function () { return _npm || (_npm = require("npm")); } },
- });
-})();
-
-task("build-tools", function (callback) {
- async.every(["./build/typescript/typescript.d.ts", "./build/typescript/index.js", "./build/doc.js"], fs.exists.bind(fs), function (allExist) {
- if (allExist) {
- callback();
- return;
- }
-
- var typescriptPath = path.join(require.resolve("typescript"), "..", "..");
-
- async.waterfall([
- async.parallel.bind(async, [
- fs.readFile.bind(fs, path.join(typescriptPath, "lib", "typescript.d.ts"), "utf8"),
- fs.readFile.bind(fs, "./build/typescript/extras.d.ts", "utf8")
- ]),
- function (results, callback) {
- var newDts = results[0] + "\n\n" + results[1];
- fs.writeFile("./build/typescript/typescript.d.ts", newDts, "utf8", callback);
- },
- function (callback) {
- npm.load(function () {
- npm.commands["run-script"](["build"], callback);
- });
- }
- ], callback);
- });
-});
-
-task("default", ["libjass.js", "libjass.min.js"]);
-
-task("version.ts", function (callback) {
- fs.exists("./src/version.ts", function (exists) {
- if (exists) {
- callback();
- return;
- }
-
- async.waterfall([
- fs.readFile.bind(fs, "./package.json"),
- function (buffer, callback) {
- try {
- var packageJson = JSON.parse(buffer);
- var versionString = packageJson.version;
- var versionParts = versionString.split(".").map(function (num) { return parseInt(num); });
- var versionFileContents =
- "/* tslint:disable */\n" +
- "\n" +
- "/**\n" +
- " * The version of libjass. An array like\n" +
- " *\n" +
- " * [\"0.12.0\", 0, 12, 0]\n" +
- " *\n" +
- " * @type {!Array.}\n" +
- " */\n" +
- "export const version = " + JSON.stringify([versionString].concat(versionParts)) + ";\n";
- callback(null, versionFileContents);
- }
- catch (ex) {
- callback(ex);
- }
- },
- function (contents, callback) {
- fs.writeFile("./src/version.ts", contents, "utf8", callback);
- }
- ], callback);
- });
-});
-
-task("libjass.js", ["build-tools", "version.ts"], function (callback) {
- fs.exists("./lib/libjass.js", function (exists) {
- if (exists) {
- callback();
- return;
- }
-
- callback(null, task.src("./src/tsconfig.json")
- .pipe(TypeScript.build("./src/index.ts", "libjass"))
- .pipe(UglifyJS.build("libjass", ["AttachmentType", "BorderStyle", "ClockEvent", "Format", "WorkerCommands", "WrappingStyle"]))
- .pipe(task.dest("./lib")));
- });
-});
-
-task("libjass.min.js", ["libjass.js"], function (callback) {
- fs.exists("./lib/libjass.min.js", function (exists) {
- if (exists) {
- callback();
- return;
- }
-
- callback(null, task.src(["./lib/libjass.js", "./lib/libjass.js.map"], { relativeTo: "./lib" })
- .pipe(UglifyJS.minify())
- .pipe(task.dest("./lib")));
- });
-});
-
-task("clean", task.clean(["./src/version.ts", "./lib/libjass.js", "./lib/libjass.js.map", "./lib/libjass.min.js", "./lib/libjass.min.js.map"]));
-
-task("watch", ["build-tools", "version.ts"], function (callback) {
- npm.load(function () {
- var testRunning = false;
- var rerunTest = false;
-
- var startTest = function () {
- npm.commands["run-script"](["test-lib"], function () {
- testRunning = false;
-
- if (rerunTest) {
- startTest();
- rerunTest = false;
- }
- });
-
- testRunning = true;
- };
-
- var runTest = function () {
- if (!testRunning) {
- startTest();
- }
- else {
- rerunTest = true;
- }
- };
-
- task.src("./src/tsconfig.json")
- .pipe(TypeScript.watch("./src/index.ts", "libjass"))
- .pipe(UglifyJS.watch("libjass", ["BorderStyle", "ClockEvent", "Format", "WorkerCommands", "WrappingStyle"]))
- .pipe(task.dest("./lib"))
- .pipe(new task.FileTransform(function (file) {
- if (file.path === "libjass.js") {
- runTest();
- }
- }));
-
- task.watch("./tests/unit/", runTest);
- });
-});
-
-task("test-lib", ["libjass.js"], function (callback) {
- npm.load(function () {
- npm.commands["run-script"](["test-lib"], callback);
- });
-});
-
-task("test-minified", ["libjass.min.js"], function (callback) {
- npm.load(function () {
- npm.commands["run-script"](["test-minified"], callback);
- });
-});
-
-// Start Selenium server with
-// java.exe -jar .\selenium-server-standalone-2.48.2.jar -Dwebdriver.ie.driver=IEDriverServer.exe -Dwebdriver.chrome.driver=chromedriver.exe
-task("test-browser", ["libjass.js"], function (callback) {
- npm.load(function () {
- npm.commands["run-script"](["test-browser"], callback);
- });
-});
-
-task("test", ["test-lib", "test-minified"]);
-
-task("demo", ["libjass.js"], function () {
- return task.src(["./lib/libjass.js", "./lib/libjass.js.map", "./lib/libjass.css"], { relativeTo: "./lib" }).pipe(task.dest("../libjass-gh-pages/demo/"));
-});
-
-task("doc", ["make-doc", "test-doc"]);
-
-task("make-doc", ["build-tools", "version.ts"], function () {
- var Doc = require("./build/doc.js");
-
- return task.src("./src/tsconfig.json")
- .pipe(Doc.build("./api.xhtml", "./src/index.ts", "libjass"))
- .pipe(task.dest("../libjass-gh-pages/"));
-});
-
-task("test-doc", ["make-doc", "libjass.js"], function (callback) {
- npm.load(function () {
- npm.commands["run-script"](["test-doc"], callback);
- });
-});
-
-task("dist", ["libjass.js", "libjass.min.js", "test", "test-browser", "demo", "doc"], function (callback) {
- var inputFiles = [
- "./README.md", "./CHANGELOG.md", "./LICENSE",
- "./lib/libjass.js", "./lib/libjass.js.map",
- "./lib/libjass.min.js", "./lib/libjass.min.js.map",
- "./lib/libjass.css"
- ];
-
- var files = Object.create(null);
- inputFiles.forEach(function (filename) {
- files["./dist/" + path.basename(filename)] = filename;
- });
-
- async.series([
- // Clean dist/
- task.clean(Object.keys(files).concat(["./dist/package.json"])),
-
- // Create dist/ if necessary
- function (callback) {
- fs.mkdir("./dist", function (err) {
- if (err && err.code !== "EEXIST") {
- callback(err);
- return;
- }
-
- callback();
- });
- },
-
- // Copy all files except package.json
- async.forEachOf.bind(async, files, function (inputFilename, outputFilename, callback) {
- async.waterfall([fs.readFile.bind(fs, inputFilename), fs.writeFile.bind(fs, outputFilename)], callback);
- }),
-
- // Copy package.json
- async.waterfall.bind(async, [
- fs.readFile.bind(fs, "./package.json"),
- function (data, callback) {
- try {
- var packageJson = JSON.parse(data);
- packageJson.devDependencies = undefined;
- packageJson.private = undefined;
- packageJson.scripts = undefined;
- packageJson.main = "libjass.js";
- }
- catch (ex) {
- callback(ex);
- return;
- }
-
- callback(null, new Buffer(JSON.stringify(packageJson, null, "\t")));
- },
- fs.writeFile.bind(fs, "./dist/package.json")
- ])
- ], callback);
-});
-
-task.runArgv(function (err) {
- if (err) {
- process.exit(1);
- }
-});
diff --git a/negromate/web/static/js/libjass/build/doc.ts b/negromate/web/static/js/libjass/build/doc.ts
deleted file mode 100644
index f5a1606..0000000
--- a/negromate/web/static/js/libjass/build/doc.ts
+++ /dev/null
@@ -1,884 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { FileTransform } from "async-build";
-
-import * as AST from "./typescript/ast";
-import { Compiler } from "./typescript/compiler";
-import { walk } from "./typescript/walker";
-
-function flatten(arr: T[][]): T[] {
- let result: T[] = [];
-
- for (const a of arr) {
- result = result.concat(a);
- }
-
- return result;
-}
-
-const sorter = (() => {
- function visibilitySorter(value1: { isPrivate?: boolean; isProtected?: boolean; }, value2: { isPrivate?: boolean; isProtected?: boolean; }) {
- if (value1.isPrivate === value2.isPrivate && value1.isProtected === value2.isProtected) {
- return 0;
- }
-
- if (value1.isPrivate) {
- return 1;
- }
-
- if (value2.isPrivate) {
- return -1;
- }
-
- if (value1.isProtected) {
- return 1;
- }
-
- if (value2.isProtected) {
- return -1;
- }
-
- return 0;
- }
-
- const types = [AST.Property, AST.Function, AST.Interface, AST.Class, AST.Enum];
- function typeSorter(value1: AST.ModuleMember | AST.NamespaceMember, value2: AST.ModuleMember | AST.NamespaceMember) {
- let type1Index = -1;
- let type2Index = -1;
-
- types.every((type, index) => {
- if (value1 instanceof type) {
- type1Index = index;
- }
- if (value2 instanceof type) {
- type2Index = index;
- }
- return (type1Index === -1) || (type2Index === -1);
- });
-
- return type1Index - type2Index;
- }
-
- function nameSorter(value1: { name: string }, value2: { name: string }) {
- return value1.name.localeCompare(value2.name);
- }
-
- const sorters: ((value1: AST.ModuleMember, value2: AST.ModuleMember) => number)[] = [visibilitySorter, typeSorter, nameSorter];
-
- return (value1: AST.ModuleMember, value2: AST.ModuleMember) => {
- for (const sorter of sorters) {
- const result = sorter(value1, value2);
-
- if (result !== 0) {
- return result;
- }
- }
-
- return 0;
- };
-})();
-
-function indenter(indent: number) {
- return (line: string) => ((line === "") ? line : (Array(indent + 1).join("\t") + line));
-}
-
-function sanitize(str: string) {
- return str.replace(/&/g, "&").replace(//g, ">");
-}
-
-function toVariableName(item: { name: string }) {
- // TODO: Handle non-letters (are both their toLowerCase() and toUpperCase())
-
- const name = item.name;
- let result = "";
-
- for (let i = 0; i < name.length; i++) {
- if (name[i] === name[i].toLowerCase()) {
- // This is lower case. Write it as lower case.
- result += name[i];
- }
-
- else {
- // This is upper case.
-
- if (i === 0) {
- // This is the first character. Write it as lower case.
- result += name[i].toLowerCase();
- }
-
- else if (name[i - 1] === name[i - 1].toUpperCase()) {
- // The previous character was upper case.
-
- if (i === name.length - 1) {
- // This is the last character. Write it as lower case.
- result += name[i].toLowerCase();
- }
- else if (name[i + 1] === name[i + 1].toLowerCase()) {
- // The next character is lower case so this is the start of a new word. Write this one as upper case.
- result += name[i];
- }
- else {
- // The next character is upper case. Write this one as lower case.
- result += name[i].toLowerCase();
- }
- }
-
- else {
- // Previous character was lower case so this is the start of a new word. Write this one as upper case.
- result += name[i];
- }
- }
- }
-
- return result;
-}
-
-function toUsageName(item: AST.Class | AST.Interface | AST.Function | AST.Property | AST.Enum): string {
- if (item.parent instanceof AST.Module) {
- return item.name;
- }
-
- if (item instanceof AST.Class || item instanceof AST.Interface || item instanceof AST.Enum) {
- if (item.isPrivate) {
- return item.name;
- }
-
- return item.fullName;
- }
-
- if (item.parent instanceof AST.Namespace) {
- if ((item as AST.CanBePrivate).isPrivate) {
- return item.name;
- }
-
- return item.fullName;
- }
-
- if ((item as AST.CanBeStatic).isStatic) {
- return toUsageName(item.parent as AST.Class | AST.Interface) + '.' + item.name;
- }
-
- return toVariableName(item.parent) + '.' + item.name;
-}
-
-function toId(item: { fullName?: string; name: string; }): string {
- return sanitize((item.fullName === undefined) ? item.name : item.fullName);
-}
-
-function toLink(item: AST.ModuleMember | AST.EnumMember | AST.TypeReference): string {
- let result = `${ sanitize(item.name) }`;
-
- if (AST.hasGenerics(item) && item.generics.length > 0) {
- const generics = item.generics as (string | AST.TypeReference | AST.IntrinsicTypeReference)[];
- result += sanitize(`.<${ generics.map(generic =>
- (generic instanceof AST.TypeReference || generic instanceof AST.IntrinsicTypeReference) ? generic.name : generic
- ).join(', ') }>`);
- }
-
- result += ' ';
-
- return result;
-}
-
-function writeDescription(text: string): string {
- let result = sanitize(text).replace(/\{@link ([^} ]+)\}/g, (substring, linkTarget) => `${ linkTarget } `);
-
- let inCodeBlock = false;
- result = result.split("\n").map(line => {
- if (line.substr(0, " ".length) === " ") {
- line = line.substr(" ".length);
-
- if (!inCodeBlock) {
- inCodeBlock = true;
- line = `${ line }`;
- }
- }
- else if (line.length > 0 && inCodeBlock) {
- inCodeBlock = false;
- line = `
${ line }`;
- }
- else if (line.length === 0 && !inCodeBlock) {
- line = "
";
- }
-
- return line;
- }).join("\n");
-
- if (inCodeBlock) {
- result += '';
- }
-
- result = `
${ result }
`.replace(/\s*<\/p>/g, "").replace(/
\s+/g, "
").replace(/\s+<\/p>/g, "
");
-
- if (result.substr("".length).indexOf("
") === -1) {
- result = result.substring("
".length, result.length - "
".length);
- }
-
- return result;
-}
-
-function writeParameters(parameters: AST.Parameter[]): string[] {
- if (parameters.length === 0) {
- return [];
- }
-
- return [
- '',
- ' '
- ].concat(flatten(parameters.map(parameter => {
- return [
- ` ${ sanitize(parameter.name) } `,
- ` ${ sanitize(parameter.type) } `,
- ` ${ writeDescription(parameter.description) } `
- ].concat(writeParameters(parameter.subParameters).map(indenter(2)));
- }))).concat([
- ' ',
- ' '
- ]);
-}
-
-function functionToHtml(func: AST.Function): string[] {
- return [
- ``,
- ` ${ toLink(func) } `,
- ' ',
- ` ${ writeDescription(func.description) }`,
- ' ',
- ` ${
- sanitize(
- `${ (func.returnType !== null) ? 'var result = ' : '' }${ toUsageName(func) }(${
- func.parameters.map(parameter => parameter.name).join(', ') });`
- ) }
`
- ].concat(writeParameters(func.parameters).map(indenter(1))).concat(
- (func.returnType === null) ? [] : [
- ' Returns ',
- ` ${ sanitize(func.returnType.type) } `,
- ` ${ writeDescription(func.returnType.description) } `
- ]
- ).concat([
- ' ',
- ''
- ]);
-}
-
-function interfaceToHtml(interfase: AST.Interface): string[] {
- const members: AST.InterfaceMember[] = [];
- Object.keys(interfase.members).forEach(memberName => members.push(interfase.members[memberName]));
-
- members.sort(sorter);
-
- return [
- ``,
- ` interface ${ toLink(interfase) }${ (interfase.baseTypes.length > 0) ? ` extends ${
- interfase.baseTypes.map(baseType => baseType instanceof AST.TypeReference ? toLink(baseType) : baseType.name).join(', ')
- }` : '' } `,
- ' ',
- ` ${ writeDescription(interfase.description) }`,
- ' ',
- ' '
- ].concat(flatten(members.map(member => {
- if (member instanceof AST.Property) {
- return propertyToHtml(member).map(indenter(2));
- }
- else if (member instanceof AST.Function) {
- return functionToHtml(member).map(indenter(2));
- }
- else {
- throw new Error(`Unrecognized member type: ${ (member as any).constructor.name }`);
- }
- }))).concat([
- ' ',
- ' ',
- ''
- ]);
-}
-
-function classToHtml(clazz: AST.Class): string[] {
- const members: AST.InterfaceMember[] = [];
- Object.keys(clazz.members).forEach(memberName => members.push(clazz.members[memberName]));
-
- members.sort(sorter);
-
- return [
- ``,
- ` class ${ toLink(clazz) }${
- (clazz.baseType !== null) ? ` extends ${ (clazz.baseType instanceof AST.TypeReference) ? toLink(clazz.baseType) : clazz.baseType.name }` : '' }${
- (clazz.interfaces.length > 0) ? ` implements ${ clazz.interfaces.map(interfase => interfase instanceof AST.TypeReference ? toLink(interfase) : interfase.name).join(', ') }` : ''} `,
- ' ',
- ` ${ writeDescription(clazz.description) }`,
- ' ',
- ` ${
- sanitize(
- `var ${ toVariableName(clazz) } = new ${ toUsageName(clazz) }(${
- clazz.parameters.map(parameter => parameter.name).join(', ') });`
- ) }
`
- ].concat(writeParameters(clazz.parameters).map(indenter(1))).concat([
- ' '
- ]).concat(flatten(members.map(member => {
- if (member instanceof AST.Property) {
- return propertyToHtml(member).map(indenter(2));
- }
- else if (member instanceof AST.Function) {
- return functionToHtml(member).map(indenter(2));
- }
- else {
- throw new Error(`Unrecognized member type: ${ (member as any).constructor.name }`);
- }
- }))).concat([
- ' ',
- ' ',
- ''
- ]);
-}
-
-function enumToHtml(enumType: AST.Enum): string[] {
- return [
- ``,
- ` enum ${ sanitize(enumType.name) } `,
- ' ',
- ` ${ writeDescription(enumType.description) }`,
- ' '
- ].concat([
- ' '
- ]).concat(flatten(enumType.members.map(member => [
- ` `,
- ` ${ toLink(member) } = ${ member.value } `,
- ' ',
- ` ${ writeDescription(member.description) }`,
- ' ',
- ' '
- ]))).concat([
- ' ',
- ' ',
- ''
- ]);
-}
-
-function propertyToHtml(property: AST.Property): string[] {
- return [
- ``,
- ` ${ toLink(property) } `
- ].concat((property.getter === null) ? [] : [
- ` Getter `,
- ' ',
- ` ${ writeDescription(property.getter.description) }`,
- ' ',
- ` ${ sanitize(`var result = ${ toUsageName(property) };`) }
`,
- ` ${ sanitize(property.getter.type) } `
- ]).concat((property.setter === null) ? [] : [
- ` Setter `,
- ' ',
- ` ${ writeDescription(property.setter.description) }`,
- ' ',
- ` ${ sanitize(`${ toUsageName(property) } = value;`) }
`
- ].concat(writeParameters([new AST.Parameter("value", "", property.setter.type)]).map(indenter(1)))).concat([
- ' ',
- ''
- ]);
-}
-
-export function build(outputFilePath: string, root: string, rootNamespaceName: string): FileTransform {
- const compiler = new Compiler();
-
- return new FileTransform(function (file): void {
- // Compile
- compiler.compile(file);
-
- // Walk
- const walkResult = walk(compiler, root, rootNamespaceName);
- const namespaces = walkResult.namespaces;
- const modules = walkResult.modules;
-
- // Make HTML
-
- const namespaceNames = Object.keys(namespaces)
- .filter(namespaceName => namespaceName.substr(0, rootNamespaceName.length) === rootNamespaceName)
- .sort((ns1, ns2) => ns1.localeCompare(ns2));
-
- const moduleNames = Object.keys(modules).sort((ns1, ns2) => ns1.localeCompare(ns2)).filter(moduleName => Object.keys(modules[moduleName].members).length > 0);
-
- this.push({
- path: outputFilePath,
- contents: Buffer.concat([new Buffer(
-`
-
-
- ${ rootNamespaceName } API Documentation
-
-
-
-
-
- Show private
-`
- )].concat(namespaceNames.map(namespaceName => {
- const namespace = namespaces[namespaceName];
-
- const namespaceMembers: AST.NamespaceMember[] = [];
- for (const memberName of Object.keys(namespace.members)) {
- namespaceMembers.push(namespace.members[memberName]);
- }
-
- namespaceMembers.sort(sorter);
-
- return Buffer.concat([new Buffer(
-`
- ${ sanitize(namespaceName) }
-
-
-
-`
- )]));
- })).concat(moduleNames.map(moduleName => {
- const module = modules[moduleName];
-
- const moduleMembers: AST.ModuleMemberWithoutReference[] = [];
- for (const memberName of Object.keys(module.members)) {
- const member = module.members[memberName];
- if ((member as AST.HasParent).parent === module) {
- moduleMembers.push(member as AST.ModuleMemberWithoutReference);
- }
- }
-
- if (moduleMembers.length === 0) {
- return new Buffer("");
- }
-
- moduleMembers.sort(sorter);
-
- return Buffer.concat([new Buffer(
-`
- ${ sanitize(moduleName) }
-
-
-
-`
- )]));
- })).concat([new Buffer(
-`
-
-
-`
- )]).concat(flatten(namespaceNames.map(namespaceName => {
- const namespace = namespaces[namespaceName];
-
- const namespaceMembers: AST.NamespaceMember[] = [];
- for (const memberName of Object.keys(namespace.members)) {
- namespaceMembers.push(namespace.members[memberName]);
- }
-
- namespaceMembers.sort(sorter);
-
- const properties = namespaceMembers.filter(member => member instanceof AST.Property) as AST.Property[];
- const functions = namespaceMembers.filter(member => member instanceof AST.Function) as AST.Function[];
- const interfaces = namespaceMembers.filter(member => member instanceof AST.Interface) as AST.Interface[];
- const classes = namespaceMembers.filter(member => member instanceof AST.Class) as AST.Class[];
- const enums = namespaceMembers.filter(member => member instanceof AST.Enum) as AST.Enum[];
-
- const result = [new Buffer(
-`
- Namespace ${ sanitize(namespaceName) }
-`
- )];
-
- if (properties.length > 0) {
- result.push(new Buffer(
-`
- Properties
-`
- ));
-
- for (const property of properties) {
- result.push(new Buffer(propertyToHtml(property).map(indenter(5)).join("\n")));
- }
-
- result.push(new Buffer(
-`
-`
- ));
- }
-
- if (functions.length > 0) {
- result.push(new Buffer(
-`
- Free functions
-`
- ));
-
- for (const func of functions) {
- result.push(new Buffer(functionToHtml(func).map(indenter(5)).join("\n")));
- }
-
- result.push(new Buffer(
-`
-`
- ));
- }
-
- if (interfaces.length > 0) {
- result.push(new Buffer(
-`
- Interfaces
-`
- ));
-
- for (const interfase of interfaces) {
- result.push(new Buffer(interfaceToHtml(interfase).map(indenter(5)).join("\n")));
- }
-
- result.push(new Buffer(
-`
-`
- ));
- }
-
- if (classes.length > 0) {
- result.push(new Buffer(
-`
- Classes
-`
- ));
-
- for (const clazz of classes) {
- result.push(new Buffer(classToHtml(clazz).map(indenter(5)).join("\n")));
- }
-
- result.push(new Buffer(
-`
-`
- ));
- }
-
- if (enums.length > 0) {
- result.push(new Buffer(
-`
- Enums
-`
- ));
-
- for (const enumType of enums) {
- result.push(new Buffer(enumToHtml(enumType).map(indenter(5)).join("\n")));
- }
-
- result.push(new Buffer(
-`
-`
- ));
- }
-
- result.push(new Buffer(
-`
-`
- ));
-
- return result;
- }))).concat(flatten(moduleNames.map(moduleName => {
- const module = modules[moduleName];
-
- const moduleMembers: AST.ModuleMember[] = [];
- for (const memberName of Object.keys(module.members)) {
- const member = module.members[memberName];
- if ((member as AST.HasParent).parent === module) {
- moduleMembers.push(member);
- }
- }
-
- if (moduleMembers.length === 0) {
- return [];
- }
-
- moduleMembers.sort(sorter);
-
- const properties = moduleMembers.filter(member => member instanceof AST.Property) as AST.Property[];
- const functions = moduleMembers.filter(member => member instanceof AST.Function) as AST.Function[];
- const interfaces = moduleMembers.filter(member => member instanceof AST.Interface) as AST.Interface[];
- const classes = moduleMembers.filter(member => member instanceof AST.Class) as AST.Class[];
- const enums = moduleMembers.filter(member => member instanceof AST.Enum) as AST.Enum[];
-
- const result = [new Buffer(
-`
- Module ${ sanitize(moduleName) }
-`
- )];
-
- if (properties.length > 0) {
- result.push(new Buffer(
-`
- Properties
-`
- ));
-
- for (const property of properties) {
- result.push(new Buffer(propertyToHtml(property).map(indenter(5)).join("\n")));
- }
-
- result.push(new Buffer(
-`
-`
- ));
- }
-
- if (functions.length > 0) {
- result.push(new Buffer(
-`
- Free functions
-`
- ));
-
- for (const func of functions) {
- result.push(new Buffer(functionToHtml(func).map(indenter(5)).join("\n")));
- }
-
- result.push(new Buffer(
-`
-`
- ));
- }
-
- if (interfaces.length > 0) {
- result.push(new Buffer(
-`
- Interfaces
-`
- ));
-
- for (const interfase of interfaces) {
- result.push(new Buffer(interfaceToHtml(interfase).map(indenter(5)).join("\n")));
- }
-
- result.push(new Buffer(
-`
-`
- ));
- }
-
- if (classes.length > 0) {
- result.push(new Buffer(
-`
- Classes
-`
- ));
-
- for (const clazz of classes) {
- result.push(new Buffer(classToHtml(clazz).map(indenter(5)).join("\n")));
- }
-
- result.push(new Buffer(
-`
-`
- ));
- }
-
- if (enums.length > 0) {
- result.push(new Buffer(
-`
- Enums
-`
- ));
-
- for (const enumType of enums) {
- result.push(new Buffer(enumToHtml(enumType).map(indenter(5)).join("\n")));
- }
-
- result.push(new Buffer(
-`
-`
- ));
- }
-
- result.push(new Buffer(
-`
-`
- ));
-
- return result;
- }))).concat([new Buffer(
-`
-
-
-`
- )]))
- });
- });
-}
diff --git a/negromate/web/static/js/libjass/build/node.d.ts b/negromate/web/static/js/libjass/build/node.d.ts
deleted file mode 100644
index ec700f5..0000000
--- a/negromate/web/static/js/libjass/build/node.d.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-// Type definitions for Node.js v0.12.0
-// Project: http://nodejs.org/
-// Definitions by: Microsoft TypeScript , DefinitelyTyped
-// Definitions: https://github.com/borisyankov/DefinitelyTyped
-
-declare var require: {
- resolve(id: string): string;
-};
-
-interface BufferConstructor {
- new (str: string): Buffer;
- prototype: Buffer;
- concat(list: Buffer[]): Buffer;
-}
-
-declare module "fs" {
- export function existsSync(filename: string): boolean;
- export function readFileSync(filename: string, options: { encoding: string }): string;
-}
-
-declare module "path" {
- export function basename(p: string, ext?: string): string;
- export function extname(p: string): string;
-}
diff --git a/negromate/web/static/js/libjass/build/tsconfig.json b/negromate/web/static/js/libjass/build/tsconfig.json
deleted file mode 100644
index 5394740..0000000
--- a/negromate/web/static/js/libjass/build/tsconfig.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "compilerOptions": {
- "forceConsistentCasingInFileNames": true,
- "noFallthroughCasesInSwitch": true,
- "noImplicitAny": true,
- "noImplicitReturns": true,
- "noImplicitThis": true,
- "noUnusedLocals": true,
- "noUnusedParameters": false,
- "strictNullChecks": false,
-
- "target": "es5",
- "module": "commonjs",
- "moduleResolution": "classic",
- "noImplicitUseStrict": false,
- "types": []
- },
-
- "files": [
- "./typescript/index.ts",
- "./doc.ts",
- "./node.d.ts",
- "./typescript/typescript.d.ts",
- "../node_modules/async-build/typings.d.ts"
- ]
-}
diff --git a/negromate/web/static/js/libjass/build/typescript/ast.ts b/negromate/web/static/js/libjass/build/typescript/ast.ts
deleted file mode 100644
index c90a89c..0000000
--- a/negromate/web/static/js/libjass/build/typescript/ast.ts
+++ /dev/null
@@ -1,204 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import ts = require("typescript");
-
-export class HasParent {
- public parent: HasParent = null;
-
- constructor(public name: string) { }
-
- get fullName(): string {
- if (this.parent === null) {
- return this.name;
- }
-
- const parent = this.parent;
- if (parent instanceof Namespace) {
- return parent.getMemberFullName(this);
- }
-
- return `${ this.parent.fullName }.${ this.name }`;
- }
-}
-
-export class Module extends HasParent {
- public parent: Module = null;
-
- public members: { [name: string]: ModuleMember } = Object.create(null);
-
- constructor(public fileName: string) {
- super(fileName);
- }
-}
-
-export type ModuleMember = Class | Interface | Function | Property | Enum | Reference;
-export type ModuleMemberWithoutReference = Class | Interface | Function | Property | Enum;
-
-export class Reference {
- constructor(public moduleName: string, public name: string, public isPrivate: boolean) { }
-}
-
-export class Namespace extends HasParent {
- public parent: Namespace = null;
-
- public members: { [name: string]: NamespaceMember } = Object.create(null);
-
- constructor(name: string) {
- super(name);
- }
-
- getMemberFullName(member: HasParent) {
- return `${ this.fullName }.${ member.name }`;
- }
-}
-
-export type NamespaceMember = Class | Interface | Function | Property | Enum;
-
-export class Class extends HasParent {
- public parent: Module | Namespace = null;
-
- public unresolvedBaseType: UnresolvedType | TypeReference | IntrinsicTypeReference;
- public baseType: TypeReference | IntrinsicTypeReference = null;
-
- public unresolvedInterfaces: (UnresolvedType | TypeReference | IntrinsicTypeReference)[];
- public interfaces: (TypeReference | IntrinsicTypeReference)[] = [];
-
- public members: { [name: string]: InterfaceMember } = Object.create(null);
-
- constructor(name: string, public astNode: ts.Node, public description: string, public generics: string[], public parameters: Parameter[], baseType: UnresolvedType | TypeReference | IntrinsicTypeReference, interfaces: (UnresolvedType | TypeReference | IntrinsicTypeReference)[], public isAbstract: boolean, public isPrivate: boolean) {
- super(name);
-
- this.unresolvedBaseType = baseType;
- this.unresolvedInterfaces = interfaces;
- }
-}
-
-export type InterfaceMember = Property | Function;
-
-export class Interface extends HasParent {
- public parent: Module | Namespace = null;
-
- public unresolvedBaseTypes: (UnresolvedType | TypeReference | IntrinsicTypeReference)[];
- public baseTypes: (TypeReference | IntrinsicTypeReference)[] = [];
-
- public members: { [name: string]: InterfaceMember } = Object.create(null);
-
- constructor(name: string, public astNode: ts.Node, public description: string, public generics: string[], baseTypes: (UnresolvedType | TypeReference | IntrinsicTypeReference)[], public isPrivate: boolean) {
- super(name);
-
- this.unresolvedBaseTypes = baseTypes;
- }
-}
-
-export class Function extends HasParent {
- public parent: Module | Namespace | Class | Interface = null;
-
- constructor(name: string, public astNode: ts.Node, public description: string, public generics: string[], public parameters: Parameter[], public returnType: ReturnType, public isAbstract: boolean, public isPrivate: boolean, public isProtected: boolean, public isStatic: boolean) {
- super(name);
- }
-}
-
-export class Property extends HasParent {
- public parent: Module | Namespace | Class | Interface = null;
-
- public getter: Getter = null;
- public setter: Setter = null;
-
- constructor(name: string) {
- super(name);
- }
-}
-
-export class Getter {
- constructor(public astNode: ts.Node, public description: string, public type: string, public isPrivate: boolean) { }
-}
-
-export class Setter {
- constructor(public astNode: ts.Node, public description: string, public type: string, public isPrivate: boolean) { }
-}
-
-export class Parameter {
- public subParameters: Parameter[] = [];
-
- constructor(public name: string, public description: string, public type: string) { }
-}
-
-export class ReturnType {
- constructor(public description: string, public type: string) { }
-}
-
-export class Enum extends HasParent {
- public parent: Module | Namespace = null;
-
- public members: EnumMember[] = [];
-
- constructor(name: string, public astNode: ts.Node, public description: string, public isPrivate: boolean) {
- super(name);
- }
-}
-
-export class EnumMember extends HasParent {
- public parent: Enum = null;
-
- constructor(name: string, public description: string, public value: number) {
- super(name);
- }
-}
-
-export class TypeReference {
- constructor(public type: NamespaceMember, public generics: (TypeReference | IntrinsicTypeReference)[]) { }
-
- get name(): string {
- return this.type.name;
- }
-
- get fullName(): string {
- return this.type.fullName;
- }
-}
-
-export class IntrinsicTypeReference {
- public fullName: string;
-
- constructor(public name: string) {
- this.fullName = name;
- }
-}
-
-export class UnresolvedType {
- constructor(public symbol: ts.Symbol, public generics: (UnresolvedType | IntrinsicTypeReference)[]) { }
-}
-
-export type HasStringGenerics = Class | Interface | Function;
-
-export function hasStringGenerics(item: NamespaceMember): item is HasStringGenerics {
- return (item as HasGenerics).generics !== undefined;
-}
-
-export type HasGenerics = HasStringGenerics | TypeReference;
-
-export function hasGenerics(item: ModuleMember | EnumMember | TypeReference): item is HasGenerics {
- return (item as HasGenerics).generics !== undefined;
-}
-
-export type CanBePrivate = Class | Interface | Function | Getter | Setter | Enum | Reference;
-export type CanBeProtected = Function;
-export type CanBeStatic = Function;
diff --git a/negromate/web/static/js/libjass/build/typescript/compiler.ts b/negromate/web/static/js/libjass/build/typescript/compiler.ts
deleted file mode 100644
index 86ff04c..0000000
--- a/negromate/web/static/js/libjass/build/typescript/compiler.ts
+++ /dev/null
@@ -1,308 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import path = require("path");
-import ts = require("typescript");
-
-import { File, FileTransform } from "async-build";
-
-import * as AST from "./ast";
-import { walk } from "./walker";
-
-export interface StreamingCompilerHost extends ts.CompilerHost {
- setOutputStream(outputStream: FileTransform): void;
-}
-
-function createCompilerHost(options: ts.CompilerOptions): StreamingCompilerHost {
- const host = ts.createCompilerHost(options) as StreamingCompilerHost;
-
- let _outputStream: FileTransform = null;
- host.setOutputStream = outputStream => _outputStream = outputStream;
-
- host.writeFile = (fileName, data, writeByteOrderMark, onError?, sourceFiles?): void => {
- _outputStream.push({
- path: fileName,
- contents: new Buffer(data)
- });
- };
-
- host.useCaseSensitiveFileNames = () => true;
-
- host.getNewLine = () => "\n";
-
- return host;
-}
-
-export class Compiler {
- private _projectRoot: string = null;
- private _host: StreamingCompilerHost;
- private _program: ts.Program = null;
-
- compile(projectConfigFile: File) {
- this._projectRoot = path.dirname(projectConfigFile.path);
-
- const projectConfig = ts.parseJsonConfigFileContent(JSON.parse(projectConfigFile.contents.toString()), ts.sys, this._projectRoot);
-
- this._host = createCompilerHost(projectConfig.options);
- this._program = ts.createProgram(projectConfig.fileNames, projectConfig.options, this._host);
-
- const syntacticDiagnostics = this._program.getSyntacticDiagnostics();
- if (syntacticDiagnostics.length > 0) {
- this._reportDiagnostics(syntacticDiagnostics);
- throw new Error("There were one or more syntactic diagnostics.");
- }
-
- const optionsDiagnostics = this._program.getOptionsDiagnostics();
- if (optionsDiagnostics.length > 0) {
- this._reportDiagnostics(optionsDiagnostics);
- throw new Error("There were one or more options diagnostics.");
- }
-
- const globalDiagnostics = this._program.getGlobalDiagnostics();
- if (globalDiagnostics.length > 0) {
- this._reportDiagnostics(globalDiagnostics);
- throw new Error("There were one or more global diagnostics.");
- }
-
- const semanticDiagnostics = this._program.getSemanticDiagnostics();
- if (semanticDiagnostics.length > 0) {
- this._reportDiagnostics(semanticDiagnostics);
- throw new Error("There were one or more semantic diagnostics.");
- }
- };
-
- writeFiles(outputStream: FileTransform) {
- this._host.setOutputStream(outputStream);
-
- const emitDiagnostics = this._program.emit().diagnostics;
- if (emitDiagnostics.length > 0) {
- this._reportDiagnostics(emitDiagnostics);
- throw new Error("There were one or more emit diagnostics.");
- }
- };
-
- get projectRoot(): string {
- return this._projectRoot;
- }
-
- get typeChecker(): ts.TypeChecker {
- return this._program.getTypeChecker();
- }
-
- get sourceFiles(): ts.SourceFile[] {
- return this._program.getSourceFiles();
- }
-
- private _reportDiagnostics(diagnostics: ts.Diagnostic[]) {
- for (const diagnostic of diagnostics) {
- let message = "";
-
- if (diagnostic.file) {
- const location = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start);
- message = `${ diagnostic.file.fileName }(${ location.line + 1 },${ location.character }): `;
- }
-
- message +=
- ts.DiagnosticCategory[diagnostic.category].toLowerCase() +
- ` TS${ diagnostic.code }: ` +
- ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n");
-
- console.error(message);
- }
- };
-}
-
-export function build(root: string, rootNamespaceName: string): FileTransform {
- const compiler = new Compiler();
-
- return new FileTransform(function (projectConfigFile): void {
- console.log("Compiling " + projectConfigFile.path + "...");
-
- compiler.compile(projectConfigFile);
-
- const walkResult = walk(compiler, root, rootNamespaceName);
- addJSDocComments(walkResult.modules);
-
- compiler.writeFiles(this);
-
- console.log("Compile succeeded.");
- });
-}
-
-function addJSDocComments(modules: { [name: string]: AST.Module }): void {
- function visitor(current: AST.Module | AST.ModuleMember | AST.InterfaceMember) {
- if (current instanceof AST.Module) {
- for (const memberName of Object.keys(current.members)) {
- visitor(current.members[memberName]);
- }
-
- return;
- }
-
- const newComments: string[] = [];
-
- if (current instanceof AST.Class) {
- newComments.push("@constructor");
-
- if (current.baseType !== null) {
- const baseType = current.baseType;
- newComments.push(
- "@extends {" +
- baseType.fullName + (
- (baseType instanceof AST.TypeReference && baseType.generics.length) > 0 ?
- (".<" + (baseType as AST.TypeReference).generics.map(generic => generic.fullName).join(", ") + ">") :
- ""
- ) +
- "}"
- );
- }
-
- if (current.interfaces.length > 0) {
- current.interfaces.forEach(interfase => {
- newComments.push(
- "@implements {" +
- interfase.fullName + (
- (interfase instanceof AST.TypeReference && interfase.generics.length > 0) ?
- (".<" + interfase.generics.map(generic => generic.fullName).join(", ") + ">") :
- ""
- ) +
- "}"
- );
- });
- }
-
- Object.keys(current.members).forEach(memberName => visitor(current.members[memberName]));
- }
- else if (current instanceof AST.Enum) {
- newComments.push("@enum");
- }
- else if (current instanceof AST.Reference) {
- return;
- }
-
- if (current.parent instanceof AST.Namespace) {
- newComments.push("@memberOf " + current.parent.fullName);
- }
-
- if (AST.hasStringGenerics(current) && current.generics.length > 0) {
- newComments.push("@template " + current.generics.join(", "));
- }
-
- if ((current as AST.CanBePrivate).isPrivate) {
- newComments.push("@private");
- }
-
- if ((current as AST.CanBeProtected).isProtected) {
- newComments.push("@protected");
- }
-
- if ((current as AST.CanBeStatic).isStatic) {
- newComments.push("@static");
- }
-
- if (newComments.length > 0) {
- if (current instanceof AST.Property) {
- const nodes: ts.Node[] = [];
- if (current.getter !== null) { nodes.push(current.getter.astNode); }
- if (current.setter !== null && nodes[0] !== current.setter.astNode) { nodes.push(current.setter.astNode); }
- for (const node of nodes) {
- (node as any)["typescript-new-comment"] = newComments;
- }
- }
- else {
- (current.astNode as any)["typescript-new-comment"] = newComments;
- }
- }
- }
-
- for (const moduleName of Object.keys(modules)) {
- visitor(modules[moduleName]);
- }
-}
-
-class FakeSourceFile {
- public text: string;
- public lineMap: number[];
-
- constructor(originalSourceFile: ts.SourceFile) {
- this.text = originalSourceFile.text;
- this.lineMap = ts.getLineStarts(originalSourceFile).slice();
- }
-
- addComment(originalComment: ts.CommentRange, newComments: string[]): ts.CommentRange & { sourceFile: FakeSourceFile } {
- var pos = this.text.length;
-
- this.text += "/**\n";
- this.lineMap.push(this.text.length);
-
- var originalCommentLines = this.text.substring(originalComment.pos, originalComment.end).split("\n");
- originalCommentLines.shift();
-
- originalCommentLines = originalCommentLines.map(line => line.replace(/^\s+/, " "));
-
- if (originalCommentLines.length > 1) {
- originalCommentLines.splice(originalCommentLines.length - 1, 0, " *");
- }
-
- for (const newComment of newComments) {
- originalCommentLines.splice(originalCommentLines.length - 1, 0, " * " + newComment);
- }
-
- for (const newCommentLine of originalCommentLines) {
- this.text += newCommentLine + "\n";
- this.lineMap.push(this.text.length);
- }
-
- var end = this.text.length;
-
- return { pos, end, hasTrailingNewLine: originalComment.hasTrailingNewLine, kind: ts.SyntaxKind.MultiLineCommentTrivia, sourceFile: this };
- }
-}
-
-var fakeSourceFiles: { [name: string]: FakeSourceFile } = Object.create(null);
-
-export const oldGetLeadingCommentRangesOfNodeFromText: typeof ts.getLeadingCommentRangesOfNodeFromText = ts.getLeadingCommentRangesOfNodeFromText.bind(ts);
-
-ts.getLeadingCommentRangesOfNodeFromText = (node: ts.Node, text: string) => {
- const originalComments = oldGetLeadingCommentRangesOfNodeFromText(node, text);
-
- if (originalComments !== undefined && (node)["typescript-new-comment"] !== undefined) {
- const sourceFileOfNode = ts.getSourceFileOfNode(node);
- let fakeSourceFile = fakeSourceFiles[sourceFileOfNode.fileName];
- if (fakeSourceFile === undefined) {
- fakeSourceFile = fakeSourceFiles[sourceFileOfNode.fileName] = new FakeSourceFile(sourceFileOfNode);
- }
-
- originalComments[originalComments.length - 1] = fakeSourceFile.addComment(originalComments[originalComments.length - 1], (node)["typescript-new-comment"]);
- }
-
- return originalComments;
-};
-
-var oldWriteCommentRange: typeof ts.writeCommentRange = ts.writeCommentRange.bind(ts);
-ts.writeCommentRange = (text: string, lineMap: number[], writer: ts.EmitTextWriter, comment: ts.CommentRange, newLine: string) => {
- if ((<{ sourceFile: ts.SourceFile }>comment).sourceFile) {
- const currentSourceFile = (<{ sourceFile: ts.SourceFile }>comment).sourceFile;
- text = currentSourceFile.text;
- lineMap = currentSourceFile.lineMap;
- }
-
- return oldWriteCommentRange(text, lineMap, writer, comment, newLine);
-};
diff --git a/negromate/web/static/js/libjass/build/typescript/extras.d.ts b/negromate/web/static/js/libjass/build/typescript/extras.d.ts
deleted file mode 100644
index acd6eb8..0000000
--- a/negromate/web/static/js/libjass/build/typescript/extras.d.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-declare namespace ts {
- interface EmitTextWriter { }
-
- interface IntrinsicType extends Type {
- intrinsicName: string;
- }
-
- interface SourceFile {
- lineMap: number[];
- }
-
- function forEachProperty(map: Map, callback: (value: T, key: string) => U): U;
- function getClassExtendsHeritageClauseElement(node: ClassLikeDeclaration | InterfaceDeclaration): ExpressionWithTypeArguments;
- function getClassImplementsHeritageClauseElements(node: ClassLikeDeclaration): ExpressionWithTypeArguments[];
- function getInterfaceBaseTypeNodes(node: InterfaceDeclaration): ExpressionWithTypeArguments[];
- function getLeadingCommentRangesOfNodeFromText(node: Node, text: string): CommentRange[];
- function getLineStarts(sourceFile: SourceFile): number[];
- function getSourceFileOfNode(node: Node): SourceFile;
- function getTextOfNode(node: Node, includeTrivia?: boolean): string;
- function normalizeSlashes(path: string): string;
- function writeCommentRange(text: string, lineMap: number[], writer: EmitTextWriter, comment: CommentRange, newLine: string): void;
-}
diff --git a/negromate/web/static/js/libjass/build/typescript/index.ts b/negromate/web/static/js/libjass/build/typescript/index.ts
deleted file mode 100644
index 4518681..0000000
--- a/negromate/web/static/js/libjass/build/typescript/index.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-export { build } from "./compiler";
diff --git a/negromate/web/static/js/libjass/build/typescript/walker.ts b/negromate/web/static/js/libjass/build/typescript/walker.ts
deleted file mode 100644
index 2b8943b..0000000
--- a/negromate/web/static/js/libjass/build/typescript/walker.ts
+++ /dev/null
@@ -1,888 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import path = require("path");
-import ts = require("typescript");
-
-import { Compiler, oldGetLeadingCommentRangesOfNodeFromText } from "./compiler";
-
-import * as AST from "./ast";
-
-function hasModifier(node: ts.Node, flags: ts.NodeFlags): boolean {
- return (node.flags & flags) !== 0;
-}
-
-interface JSDoc {
- description: string;
- isAbstract: boolean;
- parameters: { [name: string]: AST.Parameter };
- returnType: AST.ReturnType;
- typeAnnotation: string;
-}
-
-class WalkerScope {
- private _scopes: AST.HasParent[] = [];
-
- get current(): AST.HasParent {
- return (this._scopes.length > 0) ? this._scopes[this._scopes.length - 1] : null;
- }
-
- enter(scope: T): T {
- scope.parent = this.current;
- this._scopes.push(scope);
- return scope;
- }
-
- leave(): void {
- this._scopes.pop();
- }
-}
-
-class Walker {
- private _typeChecker: ts.TypeChecker;
- private _globalNS: AST.Namespace = new AST.Namespace("Global");
- private _scope: WalkerScope = new WalkerScope();
-
- private _currentSourceFile: ts.SourceFile;
-
- public modules: { [name: string]: AST.Module } = Object.create(null);
- public namespaces: { [name: string]: AST.Namespace } = Object.create(null);
-
- constructor(private _compiler: Compiler) {
- this._typeChecker = _compiler.typeChecker;
-
- this._globalNS.getMemberFullName = member => member.name;
- }
-
- walk(sourceFile: ts.SourceFile): void {
- const moduleName = this._moduleNameFromFileName(sourceFile.fileName);
-
- if (!(moduleName in this.modules)) {
- this.modules[moduleName] = new AST.Module(moduleName);
- }
-
- const module = this._scope.enter(this.modules[moduleName]);
- this._currentSourceFile = sourceFile;
-
- for (const statement of sourceFile.statements) {
- this._walk(statement, module);
- }
-
- this._scope.leave();
- }
-
- private _walk(node: ts.Node, parent: AST.Module): void {
- switch (node.kind) {
- case ts.SyntaxKind.VariableStatement:
- this._visitVariableStatement(node as ts.VariableStatement, parent);
- break;
-
- case ts.SyntaxKind.FunctionDeclaration:
- this._visitFunctionDeclaration(node as ts.FunctionDeclaration, parent);
- break;
-
- case ts.SyntaxKind.ClassDeclaration:
- this._visitClassDeclaration(node as ts.ClassDeclaration, parent);
- break;
-
- case ts.SyntaxKind.InterfaceDeclaration:
- this._visitInterfaceDeclaration(node as ts.InterfaceDeclaration, parent);
- break;
-
- case ts.SyntaxKind.EnumDeclaration:
- this._visitEnumDeclaration(node as ts.EnumDeclaration, parent);
- break;
-
- case ts.SyntaxKind.ImportDeclaration:
- this._visitImportDeclaration(node as ts.ImportDeclaration, parent);
- break;
-
- case ts.SyntaxKind.ExportDeclaration:
- this._visitExportDeclaration(node as ts.ExportDeclaration, parent);
- break;
-
- case ts.SyntaxKind.ExpressionStatement:
- case ts.SyntaxKind.ForOfStatement:
- case ts.SyntaxKind.IfStatement:
- case ts.SyntaxKind.TypeAliasDeclaration:
- break;
-
- default:
- console.error(node.kind, ts.SyntaxKind[node.kind], node);
- throw new Error("Unrecognized node.");
- }
- }
-
- private _walkClassMember(node: ts.Node, clazz: AST.Class): void {
- switch (node.kind) {
- case ts.SyntaxKind.PropertySignature:
- case ts.SyntaxKind.PropertyDeclaration:
- this._visitProperty(node as ts.PropertyDeclaration, clazz);
- break;
-
- case ts.SyntaxKind.MethodSignature:
- case ts.SyntaxKind.MethodDeclaration:
- this._visitMethod(node as ts.MethodDeclaration, clazz);
- break;
-
- case ts.SyntaxKind.GetAccessor:
- this._visitGetAccessor(node as ts.AccessorDeclaration, clazz);
- break;
-
- case ts.SyntaxKind.SetAccessor:
- this._visitSetAccessor(node as ts.AccessorDeclaration, clazz);
- break;
-
- case ts.SyntaxKind.TypeParameter:
- case ts.SyntaxKind.Parameter:
- case ts.SyntaxKind.Constructor:
- break;
-
- default:
- console.error(node.kind, ts.SyntaxKind[node.kind], node);
- throw new Error("Unrecognized node.");
- }
- }
-
- private _walkInterfaceMember(node: ts.Node, interfase: AST.Interface): void {
- switch (node.kind) {
- case ts.SyntaxKind.PropertySignature:
- case ts.SyntaxKind.PropertyDeclaration:
- this._visitProperty(node as ts.PropertyDeclaration, interfase);
- break;
-
- case ts.SyntaxKind.MethodSignature:
- case ts.SyntaxKind.MethodDeclaration:
- this._visitMethod(node as ts.MethodDeclaration, interfase);
- break;
-
- case ts.SyntaxKind.TypeParameter:
- case ts.SyntaxKind.CallSignature:
- case ts.SyntaxKind.ConstructSignature:
- case ts.SyntaxKind.IndexSignature:
- break;
-
- default:
- console.error(node.kind, ts.SyntaxKind[node.kind], node);
- throw new Error("Unrecognized node.");
- }
- }
-
- private _visitProperty(node: ts.PropertyDeclaration, parent: AST.Class | AST.Interface) {
- if (hasModifier(node, ts.NodeFlags.Private)) {
- return;
- }
-
- const jsDoc = this._parseJSDoc(node);
-
- if (jsDoc.typeAnnotation === null) {
- this._notifyIncorrectJsDoc(`Field ${ ts.getTextOfNode(node.name) } has no @type annotation.`);
- jsDoc.typeAnnotation = "*";
- }
-
- const property = this._scope.enter(new AST.Property(ts.getTextOfNode(node.name)));
- parent.members[property.name] = property;
- property.getter = new AST.Getter(node, jsDoc.description, jsDoc.typeAnnotation, false);
- property.setter = new AST.Setter(node, jsDoc.description, jsDoc.typeAnnotation, false);
- this._scope.leave();
- }
-
- private _visitMethod(node: ts.MethodDeclaration, parent: AST.Class | AST.Interface) {
- const jsDoc = this._parseJSDoc(node);
-
- const parameters = this._connectParameters(node.parameters, jsDoc.parameters,
- parameterName => `Could not find @param annotation for ${ parameterName } on method ${ ts.getTextOfNode(node.name) }`
- );
-
- if (jsDoc.returnType === null && (node.type === undefined || node.type.kind !== ts.SyntaxKind.VoidKeyword)) {
- this._notifyIncorrectJsDoc(`Missing @return annotation for method ${ ts.getTextOfNode(node.name) }`);
- jsDoc.returnType = new AST.ReturnType("", "*");
- }
-
- const isPrivate = hasModifier(node, ts.NodeFlags.Private);
- const isProtected = hasModifier(node, ts.NodeFlags.Protected);
- const isStatic = hasModifier(node, ts.NodeFlags.Static);
-
- const generics = this._getGenericsOfSignatureDeclaration(node);
-
- const method = this._scope.enter(new AST.Function(ts.getTextOfNode(node.name), node, jsDoc.description, generics, parameters, jsDoc.returnType, jsDoc.isAbstract, isPrivate, isProtected, isStatic));
- parent.members[method.name] = method;
- this._scope.leave();
- }
-
- private _visitGetAccessor(node: ts.AccessorDeclaration, clazz: AST.Class): void {
- const jsDoc = this._parseJSDoc(node);
-
- const name = ts.getTextOfNode(node.name);
-
- const isPrivate = hasModifier(node, ts.NodeFlags.Private);
-
- let property = clazz.members[name] as AST.Property;
- if (property === undefined) {
- this._scope.enter(property = new AST.Property(name));
-
- clazz.members[property.name] = property;
-
- this._scope.leave();
- }
-
- if (jsDoc.typeAnnotation === null) {
- this._notifyIncorrectJsDoc(`Getter ${ name } has no @type annotation.`);
- }
-
- property.getter = new AST.Getter(node, jsDoc.description, jsDoc.typeAnnotation, isPrivate);
- }
-
- private _visitSetAccessor(node: ts.AccessorDeclaration, clazz: AST.Class): void {
- const jsDoc = this._parseJSDoc(node);
-
- const name = ts.getTextOfNode(node.name);
-
- const isPrivate = hasModifier(node, ts.NodeFlags.Private);
-
- let property = clazz.members[name] as AST.Property;
- if (property === undefined) {
- this._scope.enter(property = new AST.Property(name));
-
- clazz.members[property.name] = property;
-
- this._scope.leave();
- }
-
- if (jsDoc.typeAnnotation === null) {
- this._notifyIncorrectJsDoc(`Setter ${ name } has no @type annotation.`);
- }
-
- property.setter = new AST.Setter(node, jsDoc.description, jsDoc.typeAnnotation, isPrivate);
- }
-
- private _visitVariableStatement(node: ts.VariableStatement, parent: AST.Module): void {
- if (node.declarationList.declarations.length > 1) {
- return;
- }
-
- const declaration = node.declarationList.declarations[0];
- if (hasModifier(declaration, ts.NodeFlags.Ambient)) {
- return;
- }
-
- const jsDoc = this._parseJSDoc(node);
- if (jsDoc.typeAnnotation === null) {
- return;
- }
-
- const property = this._scope.enter(new AST.Property(ts.getTextOfNode(declaration.name)));
- property.getter = new AST.Getter(node, jsDoc.description, jsDoc.typeAnnotation, false);
-
- parent.members[property.name] = property;
-
- this._scope.leave();
- }
-
- private _visitFunctionDeclaration(node: ts.FunctionDeclaration, parent: AST.Module): void {
- const jsDoc = this._parseJSDoc(node);
-
- const isPrivate = !hasModifier(node, ts.NodeFlags.Export);
-
- const generics = this._getGenericsOfSignatureDeclaration(node);
-
- const parameters = this._connectParameters(node.parameters, jsDoc.parameters,
- parameterName => `Could not find @param annotation for ${ parameterName } on function ${ node.name.text }`
- );
-
- if (node.type === undefined) {
- this._notifyIncorrectJsDoc(`Missing return type annotation for function ${ node.name.text }`);
- jsDoc.returnType = new AST.ReturnType("", "*");
- }
- else if (jsDoc.returnType === null && node.type.kind !== ts.SyntaxKind.VoidKeyword) {
- this._notifyIncorrectJsDoc(`Missing @return annotation for function ${ node.name.text }`);
- jsDoc.returnType = new AST.ReturnType("", "*");
- }
-
- const freeFunction = this._scope.enter(new AST.Function(node.name.text, node, jsDoc.description, generics, parameters, jsDoc.returnType, jsDoc.isAbstract, isPrivate, false, false));
-
- parent.members[freeFunction.name] = freeFunction;
-
- this._scope.leave();
- }
-
- private _visitClassDeclaration(node: ts.ClassDeclaration, parent: AST.Module): void {
- const jsDoc = this._parseJSDoc(node);
-
- const type = this._typeChecker.getTypeAtLocation(node) as ts.InterfaceType;
-
- const generics = this._getGenericsOfInterfaceType(type);
-
- const baseTypeHeritageClauseElement = ts.getClassExtendsHeritageClauseElement(node) || null;
- let baseType: AST.UnresolvedType = null;
- if (baseTypeHeritageClauseElement !== null) {
- baseType = new AST.UnresolvedType(
- this._typeChecker.getTypeAtLocation(baseTypeHeritageClauseElement).symbol,
- this._getGenericsOfTypeReferenceNode(baseTypeHeritageClauseElement, generics)
- );
- }
-
- const interfaces = (ts.getClassImplementsHeritageClauseElements(node) || []).map(type => new AST.UnresolvedType(
- this._typeChecker.getTypeAtLocation(type).symbol,
- this._getGenericsOfTypeReferenceNode(type, generics)
- ));
-
- const isPrivate = !hasModifier(node, ts.NodeFlags.Export);
-
- let parameters: AST.Parameter[] = [];
-
- if (type.symbol.members["__constructor"] !== undefined) {
- parameters = this._connectParameters((type.symbol.members["__constructor"].declarations[0] as ts.ConstructorDeclaration).parameters, jsDoc.parameters,
- parameterName => `Could not find @param annotation for ${ parameterName } on constructor in class ${ node.name.text }`
- );
- }
- else if (Object.keys(jsDoc.parameters).length > 0) {
- this._notifyIncorrectJsDoc("There are @param annotations on this class but it has no constructors.");
- }
-
- const clazz = this._scope.enter(new AST.Class(node.name.text, node, jsDoc.description, generics, parameters, baseType, interfaces, jsDoc.isAbstract, isPrivate));
-
- parent.members[clazz.name] = clazz;
-
- ts.forEachProperty(type.symbol.exports, symbol => {
- if (symbol.name === "prototype") {
- return;
- }
-
- for (const declaration of symbol.declarations) {
- this._walkClassMember(declaration, clazz);
- }
- });
-
- ts.forEachProperty(type.symbol.members, symbol => {
- for (const declaration of symbol.declarations) {
- this._walkClassMember(declaration, clazz);
- }
- });
-
- this._scope.leave();
- }
-
- private _visitInterfaceDeclaration(node: ts.InterfaceDeclaration, parent: AST.Module): void {
- const jsDoc = this._parseJSDoc(node);
-
- const type = this._typeChecker.getTypeAtLocation(node) as ts.InterfaceType;
-
- const generics = this._getGenericsOfInterfaceType(type);
-
- const baseTypes = (ts.getInterfaceBaseTypeNodes(node) || []).map(type => new AST.UnresolvedType(
- this._typeChecker.getTypeAtLocation(type).symbol,
- this._getGenericsOfTypeReferenceNode(type, generics)
- ));
-
- const existingInterfaceType = parent.members[node.name.text];
- if (existingInterfaceType !== undefined) {
- return;
- }
-
- const isPrivate = !hasModifier(node, ts.NodeFlags.Export);
-
- const interfase = this._scope.enter(new AST.Interface(node.name.text, node, jsDoc.description, generics, baseTypes, isPrivate));
- parent.members[interfase.name] = interfase;
-
- ts.forEachProperty(type.symbol.members, symbol => {
- for (const declaration of symbol.declarations) {
- this._walkInterfaceMember(declaration, interfase);
- }
- });
-
- this._scope.leave();
- }
-
- private _visitEnumDeclaration(node: ts.EnumDeclaration, parent: AST.Module): void {
- const jsDoc = this._parseJSDoc(node);
-
- const existingEnumType = parent.members[node.name.text];
- if (existingEnumType !== undefined) {
- return;
- }
-
- const isPrivate = !hasModifier(node, ts.NodeFlags.Export);
-
- const type = this._typeChecker.getTypeAtLocation(node);
-
- const enumType = this._scope.enter(new AST.Enum(node.name.text, node, jsDoc.description, isPrivate));
- parent.members[enumType.name] = enumType;
-
- ts.forEachProperty(type.symbol.exports, symbol => {
- this._visitEnumMember(symbol.declarations[0] as ts.EnumMember, enumType);
- });
-
- this._scope.leave();
- }
-
- private _visitEnumMember(node: ts.EnumMember, parent: AST.Enum): void {
- const jsDoc = this._parseJSDoc(node);
-
- const value = (node.initializer === undefined) ? null : parseInt((node.initializer as ts.LiteralExpression).text);
-
- const enumMember = this._scope.enter(new AST.EnumMember(ts.getTextOfNode(node.name), (jsDoc === null) ? "" : jsDoc.description, value));
-
- parent.members.push(enumMember);
-
- this._scope.leave();
- }
-
- private _visitImportDeclaration(node: ts.ImportDeclaration, parent: AST.Module): void {
- if (node.importClause === undefined) {
- // import "foo";
- return;
- }
-
- if (node.importClause.namedBindings === undefined) {
- throw new Error("Default import is not supported.");
- }
-
- const moduleName = this._resolve((node.moduleSpecifier as ts.LiteralExpression).text, parent);
-
- if ((node.importClause.namedBindings as ts.NamespaceImport).name !== undefined) {
- // import * as foo from "baz";
- parent.members[(node.importClause.namedBindings as ts.NamespaceImport).name.text] = new AST.Reference(moduleName, "*", true);
- }
- else if ((node.importClause.namedBindings as ts.NamedImports).elements !== undefined) {
- // import { foo, bar } from "baz";
- for (const element of (node.importClause.namedBindings as ts.NamedImports).elements) {
- const importedName = element.propertyName && element.propertyName.text || element.name.text;
- parent.members[element.name.text] = new AST.Reference(moduleName, importedName, true);
- }
- }
- else {
- throw new Error("Unrecognized import declaration syntax.");
- }
- }
-
- private _visitExportDeclaration(node: ts.ExportDeclaration, parent: AST.Module): void {
- if (node.moduleSpecifier !== undefined) {
- // export { foo } from "bar";
- const moduleName = this._resolve((node.moduleSpecifier as ts.LiteralExpression).text, parent);
- for (const element of node.exportClause.elements) {
- const importedName = element.propertyName && element.propertyName.text || element.name.text;
- parent.members[element.name.text] = new AST.Reference(moduleName, importedName, false);
- }
- }
- else {
- // export { foo };
- for (const element of node.exportClause.elements) {
- (parent.members[element.name.text] as AST.CanBePrivate).isPrivate = false;
- }
- }
- }
-
- private _resolve(relativeModuleName: string, currentModule: AST.Module): string {
- let result = ts.normalizeSlashes(path.join(currentModule.name, `../${ relativeModuleName }`));
-
- if (result[0] !== ".") {
- result = `./${ result }`;
- }
-
- return result;
- }
-
- private _parseJSDoc(node: ts.Node): JSDoc {
- let comments = oldGetLeadingCommentRangesOfNodeFromText(node, this._currentSourceFile.text);
-
- if (comments === undefined) {
- comments = [];
- }
-
- if (comments.length > 1) {
- comments = [comments[comments.length - 1]];
- }
-
- const comment =
- (comments.length === 0) ?
- "" :
- this._currentSourceFile.text.substring(comments[0].pos, comments[0].end);
-
- const commentStartIndex = comment.indexOf("/**");
- const commentEndIndex = comment.lastIndexOf("*/");
-
- const lines =
- (commentStartIndex === -1 || commentEndIndex === -1) ?
- [] :
- comment.substring(commentStartIndex + 2, commentEndIndex).split("\n").map(line => {
- const match = line.match(/^[ \t]*\* (.*)/);
- if (match === null) {
- return "";
- }
- return match[1];
- });
-
- let rootDescription = "";
-
- const parameters: { [name: string]: AST.Parameter } = Object.create(null);
-
- let typeAnnotation: string = null;
-
- let returnType: AST.ReturnType = null;
-
- let isAbstract = false;
-
- let lastRead: { description: string } = null;
-
- for (const line of lines) {
- const firstWordMatch = line.match(/^\s*(\S+)(\s*)/);
- const firstWord = (firstWordMatch !== null) ? firstWordMatch[1] : "";
- let remainingLine = (firstWordMatch !== null) ? line.substring(firstWordMatch[0].length) : "";
-
- if (firstWord[0] === "@") {
- lastRead = null;
- }
-
- switch (firstWord) {
- case "@abstract":
- isAbstract = true;
- break;
-
- case "@param": {
- let type: string;
- [type, remainingLine] = this._readType(remainingLine);
-
- const [, name, description] = remainingLine.match(/(\S+)\s*(.*)/);
-
- const subParameterMatch = name.match(/^(?:(.+)\.([^\.]+))|(?:(.+)\[("[^\[\]"]+")\])$/);
- if (subParameterMatch === null) {
- parameters[name] = lastRead = new AST.Parameter(name, description, type);
- }
- else {
- const parentName = subParameterMatch[1] || subParameterMatch[3];
- const childName = subParameterMatch[2] || subParameterMatch[4];
- const parentParameter = parameters[parentName];
- parentParameter.subParameters.push(lastRead = new AST.Parameter(childName, description, type));
- }
-
- break;
- }
-
- case "@return": {
- const [type, description] = this._readType(remainingLine);
-
- returnType = lastRead = new AST.ReturnType(description, type);
-
- break;
- }
-
- case "@type":
- [typeAnnotation] = this._readType(remainingLine);
- break;
-
- default:
- if (lastRead !== null) {
- lastRead.description += "\n" + line;
- }
- else {
- rootDescription += ((rootDescription.length > 0) ? "\n" : "") + line;
- }
- break;
- }
- }
-
- return {
- description: rootDescription,
- isAbstract: isAbstract,
- parameters: parameters,
- returnType: returnType,
- typeAnnotation: typeAnnotation,
- };
- }
-
- private _readType(remainingLine: string): [string, string] {
- if (remainingLine[0] !== "{") {
- return ["*", remainingLine];
- }
-
- let index = -1;
- let numberOfUnterminatedBraces = 0;
- for (let i = 0; i < remainingLine.length; i++) {
- if (remainingLine[i] === "{") {
- numberOfUnterminatedBraces++;
- }
- else if (remainingLine[i] === "}") {
- numberOfUnterminatedBraces--;
-
- if (numberOfUnterminatedBraces === 0) {
- index = i;
- break;
- }
- }
- }
-
- if (index === -1) {
- throw new Error("Unterminated type specifier.");
- }
-
- const type = remainingLine.substr(1, index - 1);
- remainingLine = remainingLine.substr(index + 1).replace(/^\s+/, "");
-
- return [type, remainingLine];
- }
-
- private _getGenericsOfSignatureDeclaration(signatureDeclaration: ts.SignatureDeclaration): string[] {
- if (signatureDeclaration.typeParameters === undefined) {
- return [];
- }
-
- return signatureDeclaration.typeParameters.map(typeParameter => typeParameter.name.text);
- }
-
- private _getGenericsOfTypeReferenceNode(typeReferenceNode: ts.ExpressionWithTypeArguments, intrinsicGenerics: string[]): (AST.UnresolvedType | AST.IntrinsicTypeReference)[] {
- if (typeReferenceNode.typeArguments === undefined) {
- return [];
- }
-
- const typeReference = this._typeChecker.getTypeAtLocation(typeReferenceNode) as ts.TypeReference;
-
- return typeReference.typeArguments.map(typeArgument => {
- if ((typeArgument as ts.IntrinsicType).intrinsicName !== undefined) {
- return new AST.IntrinsicTypeReference((typeArgument as ts.IntrinsicType).intrinsicName);
- }
-
- if (typeArgument.flags & ts.TypeFlags.TypeParameter) {
- if (intrinsicGenerics.indexOf(typeArgument.symbol.name) !== -1) {
- return new AST.IntrinsicTypeReference(typeArgument.symbol.name);
- }
-
- throw new Error(`Unbound type parameter ${ typeArgument.symbol.name }`);
- }
-
- return new AST.UnresolvedType(typeArgument.symbol, []);
- });
- }
-
- private _getGenericsOfInterfaceType(interfaceType: ts.InterfaceType): string[] {
- if (interfaceType.typeParameters === undefined) {
- return [];
- }
-
- return interfaceType.typeParameters.map(typeParameter => {
- return typeParameter.symbol.name;
- });
- }
-
- private _connectParameters(astParameters: ts.ParameterDeclaration[], jsDocParameters: { [name: string]: AST.Parameter }, onMissingMessageCallback: (parameterName: string) => string) {
- return astParameters.map(parameter => {
- let parameterName = (parameter.name as ts.Identifier).text;
- if (parameterName[0] === "_") {
- parameterName = parameterName.substr(1);
- }
-
- let jsDocParameter = jsDocParameters[parameterName];
-
- if (jsDocParameter === undefined) {
- this._notifyIncorrectJsDoc(onMissingMessageCallback.call(this, parameterName));
- jsDocParameter = new AST.Parameter(parameterName, "*", "");
- }
-
- return jsDocParameter;
- });
- }
-
- private _notifyIncorrectJsDoc(message: string): void {
- const fileName = path.basename(this._currentSourceFile.fileName);
- if (fileName === "lib.es5.d.ts" || fileName === "lib.dom.d.ts") {
- return;
- }
-
- throw new Error(`${ fileName }: ${ this._scope.current.fullName }: ${ message }`);
- }
-
- link(rootNamespaceName: string): void {
- for (const moduleName of Object.keys(this.modules)) {
- const module = this.modules[moduleName];
-
- for (const memberName of Object.keys(module.members)) {
- const member = module.members[memberName];
-
- if (member instanceof AST.Class) {
- if (member.unresolvedBaseType instanceof AST.UnresolvedType) {
- member.baseType = this._resolveTypeReference(member.unresolvedBaseType);
- }
- else {
- member.baseType = member.unresolvedBaseType;
- }
-
- member.interfaces = member.unresolvedInterfaces.map(interfase => {
- if (interfase instanceof AST.UnresolvedType) {
- return this._resolveTypeReference(interfase);
- }
-
- return interfase;
- });
- }
-
- else if (member instanceof AST.Interface) {
- member.baseTypes = member.unresolvedBaseTypes.map(baseType => {
- if (baseType instanceof AST.UnresolvedType) {
- return this._resolveTypeReference(baseType);
- }
-
- return baseType;
- });
- }
-
- else if (member instanceof AST.Enum) {
- let value = 0;
- for (const enumMember of member.members) {
- if (enumMember.value === null) {
- enumMember.value = value;
- }
- else {
- value = enumMember.value;
- }
-
- value++;
- }
- }
- }
- }
-
- this.namespaces[rootNamespaceName] = this._scope.enter(new AST.Namespace(rootNamespaceName));
- this._moduleToNamespace(this.modules["./index"]);
- this._scope.leave();
- }
-
- private _moduleToNamespace(module: AST.Module): void {
- for (const memberName of Object.keys(module.members)) {
- let member = module.members[memberName];
-
- if (member instanceof AST.Reference) {
- if (member.isPrivate) {
- continue;
- }
-
- if (member.name === "*") {
- const newNamespace = this._scope.enter(new AST.Namespace(memberName));
-
- const existingNamespace = this.namespaces[newNamespace.fullName];
- if (existingNamespace !== undefined) {
- this._scope.leave();
- this._scope.enter(existingNamespace);
- }
- else {
- this.namespaces[newNamespace.fullName] = newNamespace;
- }
-
- let referencedModuleName = member.moduleName;
- let referencedModule = this.modules[referencedModuleName];
- if (referencedModule === undefined && ((referencedModuleName + "/index") in this.modules)) {
- member.moduleName = referencedModuleName = referencedModuleName + "/index";
- referencedModule = this.modules[referencedModuleName];
- }
- this._moduleToNamespace(referencedModule);
-
- this._scope.leave();
- }
- else {
- while (member instanceof AST.Reference) {
- member = this.modules[member.moduleName].members[member.name];
- }
-
- this._scope.enter(member);
- this._scope.leave();
- (this._scope.current as AST.Namespace).members[member.name] = member;
- }
- }
- else if (!(member as AST.CanBePrivate).isPrivate) {
- this._scope.enter(member);
- this._scope.leave();
- (this._scope.current as AST.Namespace).members[member.name] = member;
- }
- }
- }
-
- private _resolveTypeReference(unresolvedType: AST.UnresolvedType): AST.TypeReference | AST.IntrinsicTypeReference {
- let node: ts.Node = unresolvedType.symbol.declarations[0];
- while (node.kind !== ts.SyntaxKind.SourceFile) {
- node = node.parent;
- }
-
- const sourceFile = node as ts.SourceFile;
-
- if (sourceFile.fileName.substr(-"globals.d.ts".length) === "globals.d.ts") {
- return new AST.IntrinsicTypeReference(unresolvedType.symbol.name);
- }
- else {
- const moduleName = this._moduleNameFromFileName(sourceFile.fileName);
- const module = this.modules[moduleName];
-
- let result = module.members[unresolvedType.symbol.name];
-
- if (result === undefined) {
- throw new Error(`Type ${unresolvedType.symbol.name} could not be resolved.`);
- }
-
- while (result instanceof AST.Reference) {
- result = this.modules[result.moduleName].members[result.name];
- }
-
- const resultGenerics = unresolvedType.generics.map(generic => {
- if (generic instanceof AST.UnresolvedType) {
- return this._resolveTypeReference(generic);
- }
-
- return generic;
- });
-
- return new AST.TypeReference(result, resultGenerics);
- }
- }
-
- private _moduleNameFromFileName(fileName: string): string {
- let result = ts.normalizeSlashes(path.relative(this._compiler.projectRoot, fileName));
-
- result = result.substr(0, result.length - ".ts".length);
-
- if (result[0] !== ".") {
- result = `./${ result }`;
- }
-
- return result;
- }
-}
-
-export function walk(compiler: Compiler, root: string, rootNamespaceName: string) {
- const sourceFiles = compiler.sourceFiles;
-
- const walker = new Walker(compiler);
-
- // Walk
- for (const sourceFile of sourceFiles) {
- if (
- path.basename(sourceFile.fileName) === "lib.es5.d.ts" ||
- path.basename(sourceFile.fileName) === "lib.dom.d.ts" ||
- sourceFile.fileName.substr(-"globals.d.ts".length) === "globals.d.ts"
- ) {
- continue;
- }
-
- walker.walk(sourceFile);
- }
-
- // Link base types and set enum member values if unspecified.
- walker.link(rootNamespaceName);
-
- // Return types
- return { namespaces: walker.namespaces, modules: walker.modules };
-}
diff --git a/negromate/web/static/js/libjass/build/uglify.js b/negromate/web/static/js/libjass/build/uglify.js
deleted file mode 100644
index 78e9cde..0000000
--- a/negromate/web/static/js/libjass/build/uglify.js
+++ /dev/null
@@ -1,447 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var fs = require("fs");
-var path = require("path");
-
-var UglifyJS = require("uglify-js");
-
-var FileTransform = require("async-build").FileTransform;
-
-var Run = (function () {
- function Run(outputLibraryName, unusedVarsToIgnore) {
- this._outputLibraryName = outputLibraryName;
- this._unusedVarsToIgnore = unusedVarsToIgnore;
-
- this._root = UglifyJS.parse(fs.readFileSync(path.resolve(__filename, "..", "umd-wrapper.js"), "utf8"));
-
- this._root.figure_out_scope({ screw_ie8: true });
-
- this._toInsert = null;
-
- this._rootSourceMap = null;
- }
-
- Run.prototype.addFile = function (file) {
- switch (path.extname(file.path)) {
- case ".js":
- try {
- this._toInsert = UglifyJS.parse(file.contents.toString(), {
- filename: path.basename(file.path),
- toplevel: null,
- }).body;
- }
- catch (ex) {
- if (ex instanceof UglifyJS.JS_Parse_Error) {
- throw new Error("UglifyJS parse error: " + ex.toString() + "\n");
- }
-
- throw ex;
- }
- break;
-
- case ".map":
- var rawSourceMap = JSON.parse(file.contents.toString());
-
- this._rootSourceMap = UglifyJS.SourceMap({
- file: this._outputLibraryName + ".js",
- root: "",
- orig: rawSourceMap,
- });
-
- var generator = this._rootSourceMap.get();
-
- rawSourceMap.sources.forEach(function (sourceRelativePath, index) {
- generator.setSourceContent(sourceRelativePath, rawSourceMap.sourcesContent[index]);
- });
-
- break;
- }
- };
-
- Run.prototype.build = function (outputStream) {
- var _this = this;
-
-
- // Splice in the TS output into the UMD wrapper.
- var insertionParent = this._root.body[0].body.args[1].body;
-
- this._toInsert.reverse();
- for (var i = this._toInsert.length - 1; i >= 0; i--) {
- var node = this._toInsert[i];
- if (node instanceof UglifyJS.AST_Var) {
- for (var j = 0; j < node.definitions.length; j++) {
- var definition = node.definitions[j];
- if (definition.name.name === "__extends" || definition.name.name === "__decorate") {
- definition.value = definition.value.right;
- }
- }
-
- insertionParent.splice(-1, 0, node);
- this._toInsert.splice(i, 1);
- }
- }
-
- insertionParent.splice.apply(insertionParent, [-1, 0].concat(this._toInsert));
-
-
- // Fixups
- for (var i = 0; i < this._toInsert.length; i++) {
- var node = this._toInsert[i];
- if (node instanceof UglifyJS.AST_Statement && node.body instanceof UglifyJS.AST_Call && node.body.expression.name === "define") {
- var defineCall = node.body;
-
- defineCall.expression.name = "def";
-
- if (defineCall.args[1].elements[0].value !== "require") {
- throw new Error("Expected first dep to be require");
- }
- defineCall.args[1].elements.shift();
- defineCall.args[2].argnames.shift();
-
- if (defineCall.args[1].elements[0].value !== "exports") {
- throw new Error("Expected second dep to be exports");
- }
- defineCall.args[1].elements.shift();
- defineCall.args[2].argnames.push(defineCall.args[2].argnames.shift());
- }
- }
-
-
- // Remove all license headers except the one from the UMD wrapper
- var firstLicenseHeader = null;
- this._root.walk(new UglifyJS.TreeWalker(function (node, descend) {
- if (node.start) {
- (node.start.comments_before || []).some(function (comment, i) {
- if (comment.value.indexOf("Copyright") !== -1) {
- if (firstLicenseHeader === null) {
- firstLicenseHeader = comment;
- }
- else if (comment !== firstLicenseHeader) {
- node.start.comments_before.splice(i, 1);
- }
-
- return true;
- }
-
- return false;
- });
- }
- }));
-
-
- // Fixup anonymous functions to print a space after "function"
- this._root.walk(new UglifyJS.TreeWalker(function (node, descend) {
- if (node instanceof UglifyJS.AST_Lambda && !node.name) {
- node.name = Object.create(UglifyJS.AST_Node.prototype);
- node.name.print = function () { };
- }
- }));
-
-
- // Fix alignment of multi-line block comments
- this._root.walk(new UglifyJS.TreeWalker(function (node, descend) {
- if (node.start && node.start.comments_before) {
- node.start.comments_before.forEach(function (comment) {
- if (comment.value.indexOf("Copyright") !== -1) {
- return;
- }
-
- var lines = comment.value.split("\n");
- if (lines.length < 2) {
- return;
- }
-
- var indent = " "; // 5 spaces
- for (var i = 0; i < comment.col; i++) {
- indent += " ";
- }
- lines[lines.length - 1] = lines[lines.length - 1].replace(/\s+$/, indent);
- comment.value = [lines[0]].concat(lines.slice(1).map(function (line) { return line.replace(/^\s+/, indent); })).join("\n");
- });
- }
- }));
-
-
- this._root.figure_out_scope({ screw_ie8: true });
-
-
- // Remove some things from the AST
- var nodesToRemove = [];
-
- // Set if there are any unused variables apart from the ones in unusedVarsToIgnore
- var haveUnusedVars = false;
-
- // Repeat because removing some declarations may make others unreferenced
- for (;;) {
- this._root.figure_out_scope({ screw_ie8: true });
-
- // Unreferenced variable and function declarations, and unreferenced terminal function arguments
- this._root.walk(new UglifyJS.TreeWalker(function (node, descend) {
- if (node instanceof UglifyJS.AST_SymbolDeclaration && node.unreferenced()) {
- if (node instanceof UglifyJS.AST_SymbolFunarg) {
- if (this.parent().argnames.indexOf(node) === this.parent().argnames.length - 1) {
- nodesToRemove.push({ node: node, parent: this.parent().argnames });
- }
- }
- else if (node instanceof UglifyJS.AST_SymbolVar) {
- if (_this._unusedVarsToIgnore.indexOf(node.name) !== -1) {
- nodesToRemove.push({ node: this.parent(), parent: this.parent(1).definitions });
- if (this.parent(1).definitions.length === 1) {
- nodesToRemove.push({ node: this.parent(1), parent: this.parent(2).body });
- }
- }
- else {
- haveUnusedVars = true;
- }
- }
- else if (node instanceof UglifyJS.AST_SymbolDefun) {
- nodesToRemove.push({ node: this.parent(), parent: this.parent(1).body });
- }
- }
- }));
-
- if (nodesToRemove.length === 0) {
- break;
- }
-
- nodesToRemove.forEach(function (tuple) {
- tuple.parent.splice(tuple.parent.indexOf(tuple.node), 1);
- });
-
- nodesToRemove = [];
- }
-
-
- // Move var statements at the end of blocks (generated by TS for rest parameters) to the start of the block.
- // This is needed to prevent unreachable-code warnings from UJS
- this._root.walk(new UglifyJS.TreeWalker(function (node, descend) {
- if (
- node instanceof UglifyJS.AST_Block &&
- node.body[node.body.length - 1] instanceof UglifyJS.AST_Var
- ) {
- node.body.unshift(node.body.pop());
- }
- }));
-
-
- // Split multiple vars per declaration into one var per declaration
- this._root.walk(new UglifyJS.TreeWalker(function (node, descend) {
- if (
- node instanceof UglifyJS.AST_Var &&
- node.definitions.length > 1 &&
- this.parent() instanceof UglifyJS.AST_Block
- ) {
- var parent = this.parent().body;
- parent.splice.apply(parent, [parent.indexOf(node), 1].concat(node.definitions.map(function (definition) {
- return new UglifyJS.AST_Var({ start: node.start, end: node.end, definitions: [definition] });
- })));
- }
- }));
-
-
- // Rename all function arguments that begin with _ to not have the _.
- // This converts the TypeScript syntax of declaring private members in the constructor declaration `function Color(private _red: number, ...)` to `function Color(red, ...)`
- // so that it matches the JSDoc (and looks nicer).
- this._root.walk(new UglifyJS.TreeWalker(function (node, descend) {
- if (
- node instanceof UglifyJS.AST_SymbolFunarg &&
- node.thedef.name[0] === "_" &&
- node.thedef.name[1] !== "_" &&
- node.thedef.name !== "_super" // Don't rename _super (used in TypeScript's inheritance shim) to super. super is a reserved word.
- ) {
- node.thedef.name = node.thedef.name.slice(1);
- }
- }));
-
-
- // Output
- var output = {
- source_map: this._rootSourceMap,
- ascii_only: true,
- beautify: true,
- comments: function (node, comment) {
- return comment.value.indexOf("tslint") === -1;
- },
- };
-
- var stream = UglifyJS.OutputStream(output);
- this._root.print(stream);
-
- outputStream.push({
- path: this._outputLibraryName + ".js",
- contents: Buffer.concat([new Buffer(stream.toString()), new Buffer("\n//# sourceMappingURL=" + this._outputLibraryName + ".js.map")])
- });
-
- outputStream.push({
- path: this._outputLibraryName + ".js.map",
- contents: new Buffer(this._rootSourceMap.get().toString())
- });
-
- // Print unused variables
- if (haveUnusedVars) {
- this._root.walk(new UglifyJS.TreeWalker(function (node, descend) {
- if (node instanceof UglifyJS.AST_SymbolVar && node.unreferenced()) {
- if (_this._unusedVarsToIgnore.indexOf(node.name) === -1) {
- console.warn("Unused variable %s at %s:%s:%s", node.name, node.start.file, node.start.line, node.start.col);
- }
- }
- }));
- }
- };
-
- return Run;
-})();
-
-module.exports = {
- build: function (outputLibraryName, unusedVarsToIgnore) {
- var run = new Run(outputLibraryName, unusedVarsToIgnore);
-
- return new FileTransform(function (file) {
- run.addFile(file);
- }, function () {
- run.build(this);
- });
- },
-
- watch: function (outputLibraryName, unusedVarsToIgnore) {
- var files = Object.create(null);
-
- return new FileTransform(function (file) {
- if (file.path !== "END") {
- files[file.path] = file;
- }
- else {
- var run = new Run(outputLibraryName, unusedVarsToIgnore);
- Object.keys(files).forEach(function (filename) {
- run.addFile(files[filename]);
- });
- run.build(this);
- }
- });
- },
-
- minify: function () {
- var codeFile = null;
- var sourceMapFile = null;
-
- return new FileTransform(function (file) {
- switch (path.extname(file.path)) {
- case ".js":
- codeFile = file;
- break;
- case ".map":
- sourceMapFile = file;
- break;
- }
-
- if (codeFile !== null && sourceMapFile !== null) {
- UglifyJS.base54.reset();
-
-
- // Parse
- var root = null;
- root = UglifyJS.parse(codeFile.contents.toString(), {
- filename: path.basename(codeFile.path),
- toplevel: root
- });
-
- root.figure_out_scope({ screw_ie8: true });
-
-
- // Warnings
- root.scope_warnings({
- func_arguments: false
- });
-
-
- // Compress
- var compressor = UglifyJS.Compressor({
- warnings: true,
- screw_ie8: true
- });
- root = root.transform(compressor);
-
-
- // Mangle
- root.figure_out_scope({ screw_ie8: true });
- root.compute_char_frequency();
- root.mangle_names({ screw_ie8: true });
- root = UglifyJS.mangle_properties(root, {
- regex: /^_/
- });
-
-
- // Output
- var firstLicenseHeaderFound = false; // To detect and preserve the first license header
-
- var output = {
- source_map: UglifyJS.SourceMap({
- file: path.basename(sourceMapFile.path),
- orig: sourceMapFile.contents.toString()
- }),
- ascii_only: true,
- comments: function (node, comment) {
- if (!firstLicenseHeaderFound && comment.value.indexOf("Copyright") !== -1) {
- firstLicenseHeaderFound = true;
-
- return true;
- }
-
- return false;
- },
- screw_ie8: true
- };
-
- var stream = UglifyJS.OutputStream(output);
- root.print(stream);
-
- codeFile.path = codeFile.path.replace(/\.js$/, ".min.js");
- sourceMapFile.path = sourceMapFile.path.replace(/\.js\.map$/, ".min.js.map");
-
- codeFile.contents = Buffer.concat([new Buffer(stream.toString()), new Buffer("\n//# sourceMappingURL="), new Buffer(sourceMapFile.path)]);
- this.push(codeFile);
-
- var inputSourceMapObject = JSON.parse(sourceMapFile.contents.toString());
- var outputSourceMapObject = output.source_map.get();
- outputSourceMapObject._sources.toArray().forEach(function (filename, i) {
- outputSourceMapObject.setSourceContent(filename, inputSourceMapObject.sourcesContent[i]);
- });
-
- sourceMapFile.contents = new Buffer(output.source_map.toString());
- this.push(sourceMapFile);
-
- codeFile = null;
- sourceMapFile = null;
- }
- });
- }
-};
-
-var originalSymbolUnreferenced = UglifyJS.AST_Symbol.prototype.unreferenced;
-
-// Workaround for https://github.com/mishoo/UglifyJS2/issues/789 - Nodes explicitly marked with ujs:unreferenced will not be warned for.
-UglifyJS.AST_Symbol.prototype.unreferenced = function () {
- if (this.start.comments_before.length > 0 && this.start.comments_before[0].value.trim() === "ujs:unreferenced") {
- return false;
- }
-
- return originalSymbolUnreferenced.call(this);
-};
diff --git a/negromate/web/static/js/libjass/build/umd-wrapper.js b/negromate/web/static/js/libjass/build/umd-wrapper.js
deleted file mode 100644
index 9bb3c8e..0000000
--- a/negromate/web/static/js/libjass/build/umd-wrapper.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * @license
- */
-
-(function (root, factory) {
- var global = this;
-
- if (typeof define === "function" && define.amd) {
- define([], function() {
- return factory(global);
- });
- }
- else if (typeof exports === "object" && typeof module === "object") {
- module.exports = factory(global);
- }
- else if (typeof exports === "object") {
- exports.libjass = factory(global);
- }
- else {
- root.libjass = factory(global);
- }
-})(this, function (global) {
- "use strict";
-
- var registeredModules = Object.create(null);
- var installedModules = Object.create(null);
-
- function def(moduleId, deps, body) {
- installedModules[moduleId] = { deps: deps, body: body, };
- }
-
- function req(moduleId) {
- if (moduleId in registeredModules) {
- return registeredModules[moduleId];
- }
-
- var exports = registeredModules[moduleId] = Object.create(null);
- var deps = installedModules[moduleId].deps.map(req);
- deps.push(exports);
-
- installedModules[moduleId].body.apply(null, deps);
-
- return exports;
- }
-
- return req("index");
-});
diff --git a/negromate/web/static/js/libjass/package.json b/negromate/web/static/js/libjass/package.json
deleted file mode 100644
index ff89065..0000000
--- a/negromate/web/static/js/libjass/package.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "name": "libjass",
- "version": "0.12.0",
- "description": "A library to render ASS subtitles on HTML5 video in the browser.",
- "keywords": [
- "browser",
- "html5",
- "subtitles"
- ],
- "homepage": "https://github.com/Arnavion/libjass",
- "bugs": "https://github.com/Arnavion/libjass/issues",
- "license": "Apache-2.0",
- "contributors": [
- {
- "name": "Arnav Singh",
- "email": "arnavion@gmail.com"
- }
- ],
- "repository": {
- "type": "git",
- "url": "https://github.com/Arnavion/libjass"
- },
- "main": "lib/libjass.js",
- "scripts": {
- "prepublish": "node ./build.js clean default",
- "build": "tsc -p ./build/tsconfig.json",
- "test": "node ./build.js test",
- "test-lib": "intern-client config=tests/intern reporters=Pretty",
- "test-minified": "intern-client config=tests/intern reporters=Pretty minified=true",
- "test-browser": "intern-runner config=tests/intern",
- "test-doc": "intern-client config=tests/intern-doc reporters=Pretty"
- },
- "devDependencies": {
- "async": "1.x >=1.4",
- "async-build": "0.3.1",
- "intern": "3.x >=3.2.0",
- "npm": "4.x",
- "pngjs": "3.x",
- "sax": "1.x",
- "typescript": "2.0.10",
- "uglify-js": "2.x >=2.4.24"
- },
- "private": true
-}
diff --git a/negromate/web/static/js/libjass/src/globals.d.ts b/negromate/web/static/js/libjass/src/globals.d.ts
deleted file mode 100644
index 1e5b1b5..0000000
--- a/negromate/web/static/js/libjass/src/globals.d.ts
+++ /dev/null
@@ -1,163 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-interface Array {
- filter(callbackfn: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S[];
-}
-
-interface WorkerGlobalScope {
- postMessage(message: any): void;
- addEventListener(type: string, listener: (message: any) => void, useCapture: boolean): void;
-}
-
-interface FontFace {
- family: string;
- load(): Promise;
-}
-
-interface FontFaceSet {
- add(fontFace: FontFace): FontFaceSet;
- forEach(callbackfn: (fontFace: FontFace, index: FontFace, set: FontFaceSet) => void, thisArg?: any): void;
-}
-
-interface Map {
- size: number;
- get(key: K): V | undefined;
- has(key: K): boolean;
- set(key: K, value: V): this;
- delete(key: K): boolean;
- clear(): void;
- forEach(callbackfn: (value: V, index: K, map: this) => void, thisArg?: any): void;
-}
-
-interface Node {
- cloneNode(deep?: boolean): this;
-}
-
-interface Promise extends Thenable {
- then(onFulfilled: (value: T) => Thenable, onRejected?: (reason: any) => U | Thenable): Promise;
- /* tslint:disable-next-line:unified-signatures */
- then(onFulfilled: (value: T) => U, onRejected?: (reason: any) => U | Thenable): Promise;
- catch(onRejected: (reason: any) => T | Thenable): Promise;
-}
-
-interface ReadableStream {
- getReader(): ReadableStreamReader;
-}
-
-interface ReadableStreamReader {
- read(): Promise<{ value: Uint8Array; done: boolean; }>;
-}
-
-interface Set {
- size: number;
- add(value: T): this;
- clear(): void;
- has(value: T): boolean;
- forEach(callbackfn: (value: T, index: T, set: this) => void, thisArg?: any): void;
-}
-
-interface SVGFEComponentTransferElement {
- appendChild(newChild: SVGFEFuncAElement): SVGFEFuncAElement;
- appendChild(newChild: SVGFEFuncBElement): SVGFEFuncBElement;
- appendChild(newChild: SVGFEFuncGElement): SVGFEFuncGElement;
- appendChild(newChild: SVGFEFuncRElement): SVGFEFuncRElement;
-}
-
-interface SVGFEMergeElement {
- appendChild(newChild: SVGFEMergeNodeElement): SVGFEMergeNodeElement;
-}
-
-interface TextDecoder {
- decode(input: ArrayBuffer | ArrayBufferView, options: { stream: boolean }): string;
-}
-
-interface Thenable {
- then: ThenableThen;
-}
-
-type ThenableThen = (this: Thenable, resolve: ((resolution: T | Thenable) => void) | undefined, reject: ((reason: any) => void) | undefined) => void;
-
-/**
- * The interface implemented by a communication channel to the other side.
- */
-interface WorkerCommunication {
- addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
- addEventListener(type: string, listener: EventListener, useCapture?: boolean): void;
- postMessage(message: any): void;
-}
-
-declare const exports: any;
-
-declare const global: (WorkerGlobalScope) & {
- FontFace?: {
- new (family: string, source: string): FontFace;
- };
-
- Map?: {
- new (iterable?: [K, V][]): Map;
- /* tslint:disable-next-line:member-ordering */
- prototype: Map | { forEach: undefined };
- };
-
- MutationObserver?: typeof MutationObserver;
-
- Promise?: {
- new (init: (resolve: (value: T | Thenable) => void, reject: (reason: any) => void) => void): Promise;
- /* tslint:disable-next-line:member-ordering */
- prototype: Promise;
- resolve(value: T | Thenable): Promise;
- reject(reason: any): Promise;
- all(values: (T | Thenable)[]): Promise;
- race(values: (T | Thenable)[]): Promise;
- };
-
- ReadableStream?: {
- prototype: ReadableStream | { getReader: undefined; };
- };
-
- Set?: {
- new (iterable?: T[]): Set;
- /* tslint:disable-next-line:member-ordering */
- prototype: Set | { forEach: undefined };
- };
-
- TextDecoder?: { new (encoding: string, options: { ignoreBOM: boolean }): TextDecoder };
-
- WebkitMutationObserver?: typeof MutationObserver;
-
- Worker?: typeof Worker,
-
- WorkerGlobalScope?: {
- prototype: WorkerGlobalScope;
- new (): WorkerGlobalScope;
- };
-
- document?: {
- currentScript?: HTMLScriptElement;
- fonts?: FontFaceSet;
- };
-
- fetch?(url: string): Promise<{ body: ReadableStream; ok?: boolean; status?: number; }>;
-
- process?: {
- nextTick?(callback: () => void): void;
- }
-};
diff --git a/negromate/web/static/js/libjass/src/index.ts b/negromate/web/static/js/libjass/src/index.ts
deleted file mode 100644
index 27f13b0..0000000
--- a/negromate/web/static/js/libjass/src/index.ts
+++ /dev/null
@@ -1,137 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import * as settings from "./settings";
-export { debugMode, verboseMode } from "./settings";
-
-import * as set from "./utility/set";
-export { Set } from "./utility/set";
-
-import * as map from "./utility/map";
-export { Map } from "./utility/map";
-
-import * as promise from "./utility/promise";
-export { Promise, DeferredPromise } from "./utility/promise";
-
-import * as webworker from "./webworker";
-export { webworker };
-
-import * as parts from "./parts";
-export { parts };
-
-import * as parser from "./parser";
-export { parser };
-
-import * as renderers from "./renderers";
-export { renderers };
-
-export { serialize, deserialize } from "./serialization";
-
-export { ASS } from "./types/ass";
-export { Attachment, AttachmentType } from "./types/attachment";
-export { Dialogue } from "./types/dialogue";
-export { ScriptProperties } from "./types/script-properties";
-export { Style } from "./types/style";
-
-export { BorderStyle, Format, WrappingStyle } from "./types/misc";
-
-export { version } from "./version";
-
-/**
- * Configures libjass with the given properties.
- *
- * @param {!*} newConfig
- * @param {?boolean} newConfig["debugMode"] When true, libjass logs some debug messages.
- * @param {?boolean} newConfig["verboseMode"] When true, libjass logs some more debug messages. This setting is independent of {@link libjass.debugMode}
- * @param {?function(new:Set, !Array.=)} newConfig["Set"] Sets the Set implementation used by libjass to the provided one. If null, {@link ./utility/set.SimpleSet} is used.
- * @param {?function(new:Map, !Array.>=)} newConfig["Map"] Sets the Map implementation used by libjass to the provided one. If null, {@link ./utility/map.SimpleMap} is used.
- * @param {?function(new:Promise)} newConfig["Promise"] Sets the Promise implementation used by libjass to the provided one. If null, {@link ./utility/promise.SimplePromise} is used.
- */
-export function configure(newConfig: {
- debugMode?: boolean,
- verboseMode?: boolean,
- Set?: typeof set.Set | null,
- Map?: typeof map.Map | null,
- Promise?: typeof promise.Promise | null,
-}): void {
- if (typeof newConfig.debugMode === "boolean") {
- settings.setDebugMode(newConfig.debugMode);
- }
-
- if (typeof newConfig.verboseMode === "boolean") {
- settings.setVerboseMode(newConfig.verboseMode);
- }
-
- if (typeof newConfig.Set === "function" || newConfig.Set === null) {
- set.setImplementation(newConfig.Set);
- }
-
- if (typeof newConfig.Map === "function" || newConfig.Map === null) {
- map.setImplementation(newConfig.Map);
- }
-
- if (typeof newConfig.Promise === "function" || newConfig.Promise === null) {
- promise.setImplementation(newConfig.Promise);
- }
-}
-
-// Getters below are to work around https://github.com/Microsoft/TypeScript/issues/6366
-
-Object.defineProperties(exports, {
- debugMode: {
- get: () => settings.debugMode,
- set: value => {
- console.warn("Setter `libjass.debugMode = value` has been deprecated. Use `libjass.configure({ debugMode: value })` instead.");
- settings.setDebugMode(value);
- },
- },
-
- verboseMode: {
- get: () => settings.verboseMode,
- set: value => {
- console.warn("Setter `libjass.verboseMode = value` has been deprecated. Use `libjass.configure({ verboseMode: value })` instead.");
- settings.setVerboseMode(value);
- },
- },
-
- Set: {
- get: () => set.Set,
- set: value => {
- console.warn("Setter `libjass.Set = value` has been deprecated. Use `libjass.configure({ Set: value })` instead.");
- set.setImplementation(value);
- },
- },
-
- Map: {
- get: () => map.Map,
- set: value => {
- console.warn("Setter `libjass.Map = value` has been deprecated. Use `libjass.configure({ Map: value })` instead.");
- map.setImplementation(value);
- },
- },
-
- Promise: {
- get: () => promise.Promise,
- set: value => {
- console.warn("Setter `libjass.Promise = value` has been deprecated. Use `libjass.configure({ Promise: value })` instead.");
- promise.setImplementation(value);
- },
- },
-});
diff --git a/negromate/web/static/js/libjass/src/parser/index.ts b/negromate/web/static/js/libjass/src/parser/index.ts
deleted file mode 100644
index c2ecadb..0000000
--- a/negromate/web/static/js/libjass/src/parser/index.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-export { parse } from "./parse";
-export { BrowserReadableStream, Stream, StringStream, XhrStream } from "./streams";
-export { StreamParser, SrtStreamParser } from "./stream-parsers";
diff --git a/negromate/web/static/js/libjass/src/parser/misc.ts b/negromate/web/static/js/libjass/src/parser/misc.ts
deleted file mode 100644
index cf475b2..0000000
--- a/negromate/web/static/js/libjass/src/parser/misc.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Property, TypedTemplate } from "../types/misc";
-
-import { Map } from "../utility/map";
-
-/**
- * Parses a line into a {@link ./types/misc.Property}.
- *
- * @param {string} line
- * @return {Property}
- */
-export function parseLineIntoProperty(line: string): Property | null {
- const colonPos = line.indexOf(":");
- if (colonPos === -1) {
- return null;
- }
-
- const name = line.substr(0, colonPos);
- const value = line.substr(colonPos + 1).replace(/^\s+/, "");
-
- return { name, value };
-}
-
-/**
- * Parses a line into a {@link ./types/misc.TypedTemplate} according to the given format specifier.
- *
- * @param {string} line
- * @param {!Array.} formatSpecifier
- * @return {TypedTemplate}
- */
-export function parseLineIntoTypedTemplate(line: string, formatSpecifier: string[]): TypedTemplate | null {
- const property = parseLineIntoProperty(line);
- if (property === null) {
- return null;
- }
-
- const value = property.value.split(",");
-
- if (value.length > formatSpecifier.length) {
- value[formatSpecifier.length - 1] = value.slice(formatSpecifier.length - 1).join(",");
- }
-
- const template = new Map();
- formatSpecifier.forEach((formatKey, index) => {
- template.set(formatKey, value[index]);
- });
-
- return { type: property.name, template };
-}
diff --git a/negromate/web/static/js/libjass/src/parser/parse.ts b/negromate/web/static/js/libjass/src/parser/parse.ts
deleted file mode 100644
index 1f61812..0000000
--- a/negromate/web/static/js/libjass/src/parser/parse.ts
+++ /dev/null
@@ -1,2094 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import * as parts from "../parts";
-
-import { debugMode } from "../settings";
-
-import { Map } from "../utility/map";
-
-const rules = new Map ParseNode>();
-
-/**
- * Parses a given string with the specified rule.
- *
- * @param {string} input The string to be parsed.
- * @param {string} rule The rule to parse the string with
- * @return {*} The value returned depends on the rule used.
- */
-export function parse(input: string, rule: string): any {
- /* tslint:disable-next-line:no-use-before-declare */
- const { result } = new ParserRun(input, rule);
-
- if (result === null || result.end !== input.length) {
- if (debugMode) {
- console.error("Parse failed. %s %s %o", rule, input, result);
- }
-
- throw new Error("Parse failed.");
- }
-
- return result.value;
-}
-
-/**
- * This class represents a single parse node. It has a start and end position, and an optional value object.
- *
- * @param {ParseNode} parent The parent of this parse node.
- * @param {*=null} value If provided, it is assigned as the value of the node.
- */
-class ParseNode {
- private _children: ParseNode[] = [];
-
- private _start: number;
- private _end: number;
- private _value: any;
-
- constructor(private _parent: ParseNode | null, value: any = null) {
- if (_parent !== null) {
- _parent.children.push(this);
- }
-
- this._start = ((_parent !== null) ? _parent.end : 0);
- this._end = this._start;
-
- this.value = value;
- }
-
- /**
- * The start position of this parse node.
- *
- * @type {number}
- */
- get start(): number {
- return this._start;
- }
-
- /**
- * The end position of this parse node.
- *
- * @type {number}
- */
- get end(): number {
- return this._end;
- }
-
- /**
- * @type {ParseNode}
- */
- get parent(): ParseNode | null {
- return this._parent;
- }
-
- /**
- * @type {!Array.}
- */
- get children(): ParseNode[] {
- return this._children;
- }
-
- /**
- * An optional object associated with this parse node.
- *
- * @type {*}
- */
- get value(): any {
- return this._value;
- }
-
- /**
- * An optional object associated with this parse node.
- *
- * If the value is a string, then the end property is updated to be the length of the string.
- *
- * @type {*}
- */
- set value(newValue: any) {
- this._value = newValue;
-
- if (this._value !== null && this._value.constructor === String && this._children.length === 0) {
- this._setEnd(this._start + (this._value as string).length);
- }
- }
-
- /**
- * Removes the last child of this node and updates the end position to be end position of the new last child.
- */
- pop(): void {
- this._children.splice(this._children.length - 1, 1);
-
- if (this._children.length > 0) {
- this._setEnd(this._children[this._children.length - 1].end);
- }
- else {
- this._setEnd(this.start);
- }
- }
-
- /**
- * Updates the end property of this node and its parent recursively to the root node.
- *
- * @param {number} newEnd
- */
- private _setEnd(newEnd: number): void {
- this._end = newEnd;
-
- if (this._parent !== null && this._parent.end !== this._end) {
- this._parent._setEnd(this._end);
- }
- }
-}
-
-/**
- * This class represents a single run of the parser.
- *
- * @param {string} input
- * @param {string} rule
- */
-class ParserRun {
- private _parseTree: ParseNode;
- private _result: ParseNode;
-
- constructor(private _input: string, rule: string) {
- const ruleFunction = rules.get(rule);
- if (ruleFunction === undefined) {
- throw new Error(`Could not find parser rule named ${ rule }`);
- }
-
- this._parseTree = new ParseNode(null);
-
- this._result = ruleFunction.call(this, this._parseTree);
- }
-
- /**
- * @type {ParseNode}
- */
- get result(): ParseNode | null {
- return this._result;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_dialogueParts(parent: ParseNode): ParseNode {
- const current = new ParseNode(parent);
-
- current.value = [];
-
- while (this._haveMore()) {
- const enclosedTagsNode = this.parse_enclosedTags(current);
-
- if (enclosedTagsNode !== null) {
- current.value.push(...enclosedTagsNode.value);
- }
-
- else {
- const whiteSpaceOrTextNode = this.parse_newline(current) || this.parse_soft_newline(current) || this.parse_hardspace(current) || this.parse_text(current);
-
- if (whiteSpaceOrTextNode.value instanceof parts.Text && current.value[current.value.length - 1] instanceof parts.Text) {
- // Merge consecutive text parts into one part
- const previousTextPart = current.value[current.value.length - 1] as parts.Text;
- current.value[current.value.length - 1] = new parts.Text(previousTextPart.value + (whiteSpaceOrTextNode.value as parts.Text).value);
- }
- else {
- current.value.push(whiteSpaceOrTextNode.value);
- }
- }
- }
-
- let inDrawingMode = false;
-
- current.value.forEach((part: parts.Part, i: number) => {
- if (part instanceof parts.DrawingMode) {
- inDrawingMode = part.scale !== 0;
- }
-
- else if (part instanceof parts.Text && inDrawingMode) {
- current.value[i] = new parts.DrawingInstructions(parse(part.value, "drawingInstructions") as parts.drawing.Instruction[]);
- }
- });
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_enclosedTags(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- current.value = [];
-
- if (this.read(current, "{") === null) {
- parent.pop();
- return null;
- }
-
- for (let next = this._peek(); this._haveMore() && next !== "}"; next = this._peek()) {
- let childNode: ParseNode | null = null;
-
- if (this.read(current, "\\") !== null) {
- childNode =
- this.parse_tag_alpha(current) ||
- this.parse_tag_iclip(current) ||
- this.parse_tag_xbord(current) ||
- this.parse_tag_ybord(current) ||
- this.parse_tag_xshad(current) ||
- this.parse_tag_yshad(current) ||
-
- this.parse_tag_blur(current) ||
- this.parse_tag_bord(current) ||
- this.parse_tag_clip(current) ||
- this.parse_tag_fade(current) ||
- this.parse_tag_fscx(current) ||
- this.parse_tag_fscy(current) ||
- this.parse_tag_move(current) ||
- this.parse_tag_shad(current) ||
-
- this.parse_tag_fad(current) ||
- this.parse_tag_fax(current) ||
- this.parse_tag_fay(current) ||
- this.parse_tag_frx(current) ||
- this.parse_tag_fry(current) ||
- this.parse_tag_frz(current) ||
- this.parse_tag_fsp(current) ||
- this.parse_tag_fsplus(current) ||
- this.parse_tag_fsminus(current) ||
- this.parse_tag_org(current) ||
- this.parse_tag_pbo(current) ||
- this.parse_tag_pos(current) ||
-
- this.parse_tag_an(current) ||
- this.parse_tag_be(current) ||
- this.parse_tag_fn(current) ||
- this.parse_tag_fr(current) ||
- this.parse_tag_fs(current) ||
- this.parse_tag_kf(current) ||
- this.parse_tag_ko(current) ||
- this.parse_tag_1a(current) ||
- this.parse_tag_1c(current) ||
- this.parse_tag_2a(current) ||
- this.parse_tag_2c(current) ||
- this.parse_tag_3a(current) ||
- this.parse_tag_3c(current) ||
- this.parse_tag_4a(current) ||
- this.parse_tag_4c(current) ||
-
- this.parse_tag_a(current) ||
- this.parse_tag_b(current) ||
- this.parse_tag_c(current) ||
- this.parse_tag_i(current) ||
- this.parse_tag_k(current) ||
- this.parse_tag_K(current) ||
- this.parse_tag_p(current) ||
- this.parse_tag_q(current) ||
- this.parse_tag_r(current) ||
- this.parse_tag_s(current) ||
- this.parse_tag_t(current) ||
- this.parse_tag_u(current);
-
- if (childNode === null) {
- current.pop(); // Unread backslash
- }
- }
-
- if (childNode === null) {
- childNode = this.parse_comment(current);
- }
-
- if (childNode.value instanceof parts.Comment && current.value[current.value.length - 1] instanceof parts.Comment) {
- // Merge consecutive comment parts into one part
- current.value[current.value.length - 1] =
- new parts.Comment(
- (current.value[current.value.length - 1] as parts.Comment).value +
- (childNode.value as parts.Comment).value,
- );
- }
- else {
- current.value.push(childNode.value);
- }
- }
-
- if (this.read(current, "}") === null) {
- parent.pop();
- return null;
- }
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_newline(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "\\N") === null) {
- parent.pop();
- return null;
- }
-
- current.value = new parts.NewLine();
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_soft_newline(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "\\n") === null) {
- parent.pop();
- return null;
- }
-
- current.value = new parts.SoftNewLine();
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_hardspace(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "\\h") === null) {
- parent.pop();
- return null;
- }
-
- current.value = new parts.Text("\u00A0");
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_text(parent: ParseNode): ParseNode {
- const value = this._peek();
-
- const current = new ParseNode(parent);
- const valueNode = new ParseNode(current, value);
-
- current.value = new parts.Text(valueNode.value);
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_comment(parent: ParseNode): ParseNode {
- const value = this._peek();
-
- const current = new ParseNode(parent);
- const valueNode = new ParseNode(current, value);
-
- current.value = new parts.Comment(valueNode.value);
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_a(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "a") === null) {
- parent.pop();
- return null;
- }
-
- let next = this._peek();
-
- switch (next) {
- case "1":
- const next2 = this._peek(2);
-
- switch (next2) {
- case "10":
- case "11":
- next = next2;
- break;
- }
-
- break;
-
- case "2":
- case "3":
- case "5":
- case "6":
- case "7":
- case "9":
- break;
-
- default:
- parent.pop();
- return null;
- }
-
- const valueNode = new ParseNode(current, next);
-
- let value: number = -1;
- switch ((valueNode.value)) {
- case "1":
- value = 1;
- break;
-
- case "2":
- value = 2;
- break;
-
- case "3":
- value = 3;
- break;
-
- case "5":
- value = 7;
- break;
-
- case "6":
- value = 8;
- break;
-
- case "7":
- value = 9;
- break;
-
- case "9":
- value = 4;
- break;
-
- case "10":
- value = 5;
- break;
-
- case "11":
- value = 6;
- break;
- }
-
- current.value = new parts.Alignment(value);
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_alpha(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_an(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "an") === null) {
- parent.pop();
- return null;
- }
-
- const next = this._peek();
-
- if (next < "1" || next > "9") {
- parent.pop();
- return null;
- }
-
- const valueNode = new ParseNode(current, next);
-
- current.value = new parts.Alignment(parseInt(valueNode.value));
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_b(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "b") === null) {
- parent.pop();
- return null;
- }
-
- let valueNode: ParseNode | null = null;
-
- let next = this._peek();
-
- if (next >= "1" && next <= "9") {
- next = this._peek(3);
- if (next.substr(1) === "00") {
- valueNode = new ParseNode(current, next);
- valueNode.value = parseInt(valueNode.value);
- }
- }
-
- if (valueNode === null) {
- valueNode = this.parse_enableDisable(current);
- }
-
- if (valueNode !== null) {
- current.value = new parts.Bold(valueNode.value);
- }
- else {
- current.value = new parts.Bold(null);
- }
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_be(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_blur(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_bord(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_c(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_clip(parent: ParseNode): ParseNode | null {
- return this._parse_tag_clip_or_iclip("clip", parent);
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_fad(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "fad") === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, "(") === null) {
- parent.pop();
- return null;
- }
-
- const startNode = this.parse_decimal(current);
- if (startNode === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
-
- const endNode = this.parse_decimal(current);
- if (endNode === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, ")") === null) {
- parent.pop();
- return null;
- }
-
- current.value = new parts.Fade(startNode.value / 1000, endNode.value / 1000);
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_fade(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "fade") === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, "(") === null) {
- parent.pop();
- return null;
- }
-
- const a1Node = this.parse_decimal(current);
- if (a1Node === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
-
- const a2Node = this.parse_decimal(current);
- if (a2Node === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
-
- const a3Node = this.parse_decimal(current);
- if (a3Node === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
-
- const t1Node = this.parse_decimal(current);
- if (t1Node === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
-
- const t2Node = this.parse_decimal(current);
- if (t2Node === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
-
- const t3Node = this.parse_decimal(current);
- if (t3Node === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
-
- const t4Node = this.parse_decimal(current);
- if (t4Node === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, ")") === null) {
- parent.pop();
- return null;
- }
-
- current.value =
- new parts.ComplexFade(
- 1 - a1Node.value / 255, 1 - a2Node.value / 255, 1 - a3Node.value / 255,
- t1Node.value / 1000, t2Node.value / 1000, t3Node.value / 1000, t4Node.value / 1000,
- );
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_fax(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_fay(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_fn(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "fn") === null) {
- parent.pop();
- return null;
- }
-
- const valueNode = new ParseNode(current, "");
-
- for (let next = this._peek(); this._haveMore() && next !== "\\" && next !== "}"; next = this._peek()) {
- valueNode.value += next;
- }
-
- if (valueNode.value.length > 0) {
- current.value = new parts.FontName(valueNode.value);
- }
- else {
- current.value = new parts.FontName(null);
- }
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_fr(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_frx(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_fry(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_frz(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_fs(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_fsplus(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "fs+") === null) {
- parent.pop();
- return null;
- }
-
- const valueNode = this.parse_decimal(current);
-
- if (valueNode === null) {
- parent.pop();
- return null;
- }
-
- current.value = new parts.FontSizePlus(valueNode.value / 10);
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_fsminus(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "fs-") === null) {
- parent.pop();
- return null;
- }
-
- const valueNode = this.parse_decimal(current);
-
- if (valueNode === null) {
- parent.pop();
- return null;
- }
-
- current.value = new parts.FontSizeMinus(valueNode.value / 10);
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_fscx(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "fscx") === null) {
- parent.pop();
- return null;
- }
-
- const valueNode = this.parse_decimal(current);
-
- if (valueNode !== null) {
- current.value = new parts.FontScaleX(valueNode.value / 100);
- }
- else {
- current.value = new parts.FontScaleX(null);
- }
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_fscy(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "fscy") === null) {
- parent.pop();
- return null;
- }
-
- const valueNode = this.parse_decimal(current);
-
- if (valueNode !== null) {
- current.value = new parts.FontScaleY(valueNode.value / 100);
- }
- else {
- current.value = new parts.FontScaleY(null);
- }
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_fsp(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_i(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_iclip(parent: ParseNode): ParseNode | null {
- return this._parse_tag_clip_or_iclip("iclip", parent);
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_k(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "k") === null) {
- parent.pop();
- return null;
- }
-
- const valueNode = this.parse_decimal(current);
-
- if (valueNode === null) {
- parent.pop();
- return null;
- }
-
- current.value = new parts.ColorKaraoke(valueNode.value / 100);
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_K(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "K") === null) {
- parent.pop();
- return null;
- }
-
- const valueNode = this.parse_decimal(current);
-
- if (valueNode === null) {
- parent.pop();
- return null;
- }
-
- current.value = new parts.SweepingColorKaraoke(valueNode.value / 100);
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_kf(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "kf") === null) {
- parent.pop();
- return null;
- }
-
- const valueNode = this.parse_decimal(current);
-
- if (valueNode === null) {
- parent.pop();
- return null;
- }
-
- current.value = new parts.SweepingColorKaraoke(valueNode.value / 100);
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_ko(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "ko") === null) {
- parent.pop();
- return null;
- }
-
- const valueNode = this.parse_decimal(current);
-
- if (valueNode === null) {
- parent.pop();
- return null;
- }
-
- current.value = new parts.OutlineKaraoke(valueNode.value / 100);
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_move(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "move") === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, "(") === null) {
- parent.pop();
- return null;
- }
-
- const x1Node = this.parse_decimal(current);
- if (x1Node === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
-
- const y1Node = this.parse_decimal(current);
- if (y1Node === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
-
- const x2Node = this.parse_decimal(current);
- if (x2Node === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
-
- const y2Node = this.parse_decimal(current);
- if (y2Node === null) {
- parent.pop();
- return null;
- }
-
- let t1Node: ParseNode | null = null;
- let t2Node: ParseNode | null = null;
-
- if (this.read(current, ",") !== null) {
- t1Node = this.parse_decimal(current);
- if (t1Node === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
-
- t2Node = this.parse_decimal(current);
- if (t2Node === null) {
- parent.pop();
- return null;
- }
- }
-
- if (this.read(current, ")") === null) {
- parent.pop();
- return null;
- }
-
- current.value = new parts.Move(
- x1Node.value, y1Node.value, x2Node.value, y2Node.value,
- (t1Node !== null) ? (t1Node.value / 1000) : null, (t2Node !== null) ? (t2Node.value / 1000) : null,
- );
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_org(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "org") === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, "(") === null) {
- parent.pop();
- return null;
- }
-
- const xNode = this.parse_decimal(current);
- if (xNode === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
-
- const yNode = this.parse_decimal(current);
- if (yNode === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, ")") === null) {
- parent.pop();
- return null;
- }
-
- current.value = new parts.RotationOrigin(xNode.value, yNode.value);
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_p(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_pbo(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_pos(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "pos") === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, "(") === null) {
- parent.pop();
- return null;
- }
-
- const xNode = this.parse_decimal(current);
- if (xNode === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
-
- const yNode = this.parse_decimal(current);
- if (yNode === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, ")") === null) {
- parent.pop();
- return null;
- }
-
- current.value = new parts.Position(xNode.value, yNode.value);
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_q(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "q") === null) {
- parent.pop();
- return null;
- }
-
- const next = this._peek();
-
- if (next < "0" || next > "3") {
- parent.pop();
- return null;
- }
-
- const valueNode = new ParseNode(current, next);
-
- current.value = new parts.WrappingStyle(parseInt(valueNode.value));
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_r(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "r") === null) {
- parent.pop();
- return null;
- }
-
- const valueNode = new ParseNode(current, "");
-
- for (let next = this._peek(); this._haveMore() && next !== "\\" && next !== "}"; next = this._peek()) {
- valueNode.value += next;
- }
-
- if (valueNode.value.length > 0) {
- current.value = new parts.Reset(valueNode.value);
- }
- else {
- current.value = new parts.Reset(null);
- }
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_s(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_shad(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_t(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, "t") === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, "(") === null) {
- parent.pop();
- return null;
- }
-
- let startNode: ParseNode | null = null;
- let endNode: ParseNode | null = null;
- let accelNode: ParseNode | null = null;
-
- const firstNode = this.parse_decimal(current);
- if (firstNode !== null) {
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
-
- const secondNode = this.parse_decimal(current);
- if (secondNode !== null) {
- startNode = firstNode;
- endNode = secondNode;
-
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
-
- const thirdNode = this.parse_decimal(current);
- if (thirdNode !== null) {
- accelNode = thirdNode;
-
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
- }
- }
- else {
- accelNode = firstNode;
-
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
- }
- }
-
- const transformTags: parts.Part[] = [];
-
- for (let next = this._peek(); this._haveMore() && next !== ")" && next !== "}"; next = this._peek()) {
- let childNode: ParseNode | null = null;
-
- if (this.read(current, "\\") !== null) {
- childNode =
- this.parse_tag_alpha(current) ||
- this.parse_tag_iclip(current) ||
- this.parse_tag_xbord(current) ||
- this.parse_tag_ybord(current) ||
- this.parse_tag_xshad(current) ||
- this.parse_tag_yshad(current) ||
-
- this.parse_tag_blur(current) ||
- this.parse_tag_bord(current) ||
- this.parse_tag_clip(current) ||
- this.parse_tag_fscx(current) ||
- this.parse_tag_fscy(current) ||
- this.parse_tag_shad(current) ||
-
- this.parse_tag_fax(current) ||
- this.parse_tag_fay(current) ||
- this.parse_tag_frx(current) ||
- this.parse_tag_fry(current) ||
- this.parse_tag_frz(current) ||
- this.parse_tag_fsp(current) ||
- this.parse_tag_fsplus(current) ||
- this.parse_tag_fsminus(current) ||
-
- this.parse_tag_be(current) ||
- this.parse_tag_fr(current) ||
- this.parse_tag_fs(current) ||
- this.parse_tag_1a(current) ||
- this.parse_tag_1c(current) ||
- this.parse_tag_2a(current) ||
- this.parse_tag_2c(current) ||
- this.parse_tag_3a(current) ||
- this.parse_tag_3c(current) ||
- this.parse_tag_4a(current) ||
- this.parse_tag_4c(current) ||
-
- this.parse_tag_c(current);
-
- if (childNode === null) {
- current.pop(); // Unread backslash
- }
- }
-
- if (childNode === null) {
- childNode = this.parse_comment(current);
- }
-
- if (childNode.value instanceof parts.Comment && transformTags[transformTags.length - 1] instanceof parts.Comment) {
- // Merge consecutive comment parts into one part
- transformTags[transformTags.length - 1] =
- new parts.Comment(
- (transformTags[transformTags.length - 1] as parts.Comment).value +
- (childNode.value as parts.Comment).value,
- );
- }
- else {
- transformTags.push(childNode.value);
- }
- }
-
- this.read(current, ")");
-
- current.value =
- new parts.Transform(
- (startNode !== null) ? (startNode.value / 1000) : null,
- (endNode !== null) ? (endNode.value / 1000) : null,
- (accelNode !== null) ? (accelNode.value / 1000) : null,
- transformTags,
- );
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_u(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_xbord(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_xshad(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_ybord(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_yshad(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_1a(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_1c(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_2a(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_2c(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_3a(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_3c(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_4a(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_tag_4c(_parent: ParseNode): ParseNode | null {
- throw new Error("unreachable");
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_drawingInstructions(parent: ParseNode): ParseNode {
- const current = new ParseNode(parent);
-
- let currentType: string | null = null;
- const numberParts: ParseNode[] = [];
-
- current.value = [];
-
- while (this._haveMore()) {
- while (this.read(current, " ") !== null) { }
- if (!this._haveMore()) {
- break;
- }
-
- if (currentType !== null) {
- const numberPart = this.parse_decimal(current);
- if (numberPart !== null) {
- numberParts.push(numberPart);
-
- if (currentType === "m" && numberParts.length === 2) {
- current.value.push(new parts.drawing.MoveInstruction(numberParts[0].value, numberParts[1].value));
- numberParts.splice(0, numberParts.length);
- }
- else if (currentType === "l" && numberParts.length === 2) {
- current.value.push(new parts.drawing.LineInstruction(numberParts[0].value, numberParts[1].value));
- numberParts.splice(0, numberParts.length);
- }
- else if (currentType === "b" && numberParts.length === 6) {
- current.value.push(new parts.drawing.CubicBezierCurveInstruction(
- numberParts[0].value, numberParts[1].value,
- numberParts[2].value, numberParts[3].value,
- numberParts[4].value, numberParts[5].value));
- numberParts.splice(0, numberParts.length);
- }
-
- continue;
- }
- }
-
- const typePart = this.parse_text(current);
- const newType = (typePart.value as parts.Text).value;
- switch (newType) {
- case "m":
- case "l":
- case "b":
- currentType = newType;
- numberParts.splice(0, numberParts.length);
- break;
- }
- }
-
- while (this.read(current, " ") !== null) { }
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_decimalInt32(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- const isNegative = this.read(current, "-") !== null;
-
- const numberNode = new ParseNode(current, "");
- for (let next = this._peek(); this._haveMore() && next >= "0" && next <= "9"; next = this._peek()) {
- numberNode.value += next;
- }
-
- if (numberNode.value.length === 0) {
- parent.pop();
- return null;
- }
-
- let value = parseInt(numberNode.value);
- if (value >= 0xFFFFFFFF) {
- value = 0xFFFFFFFF;
- }
- else if (isNegative) {
- value = -value;
- }
-
- current.value = value;
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_hexInt32(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- const isNegative = this.read(current, "-") !== null;
-
- const numberNode = new ParseNode(current, "");
- for (
- let next = this._peek();
- this._haveMore() && (
- (next >= "0" && next <= "9") ||
- (next >= "a" && next <= "f") ||
- (next >= "A" && next <= "F")
- );
- next = this._peek()) {
-
- numberNode.value += next;
- }
-
- if (numberNode.value.length === 0) {
- parent.pop();
- return null;
- }
-
- let value = parseInt(numberNode.value, 16);
- if (value >= 0xFFFFFFFF) {
- value = 0xFFFFFFFF;
- }
- else if (isNegative) {
- value = -value;
- }
-
- current.value = value;
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_decimalOrHexInt32(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- const valueNode =
- (this.read(current, "&H") !== null || this.read(current, "&h") !== null) ?
- this.parse_hexInt32(current) :
- this.parse_decimalInt32(current);
-
- if (valueNode === null) {
- parent.pop();
- return null;
- }
-
- current.value = valueNode.value;
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_decimal(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- const negative = (this.read(current, "-") !== null);
-
- const numericalPart = this.parse_unsignedDecimal(current);
-
- if (numericalPart === null) {
- parent.pop();
- return null;
- }
-
- current.value = numericalPart.value;
-
- if (negative) {
- current.value = -current.value;
- }
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_unsignedDecimal(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- const characteristicNode = new ParseNode(current, "");
-
- let mantissaNode: ParseNode | null = null;
-
- for (let next = this._peek(); this._haveMore() && next >= "0" && next <= "9"; next = this._peek()) {
- characteristicNode.value += next;
- }
-
- if (characteristicNode.value.length === 0) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, ".") !== null) {
- mantissaNode = new ParseNode(current, "");
-
- for (let next = this._peek(); this._haveMore() && next >= "0" && next <= "9"; next = this._peek()) {
- mantissaNode.value += next;
- }
-
- if (mantissaNode.value.length === 0) {
- parent.pop();
- return null;
- }
- }
-
- current.value = parseFloat((characteristicNode.value as string) + ((mantissaNode !== null) ? ("." + (mantissaNode.value as string)) : ""));
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_enableDisable(parent: ParseNode): ParseNode | null {
- const next = this._peek();
-
- if (next === "0" || next === "1") {
- const result = new ParseNode(parent, next);
- result.value = (result.value === "1");
-
- return result;
- }
-
- return null;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_color(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- while (this.read(current, "&") !== null || this.read(current, "H") !== null) { }
-
- const valueNode = this.parse_hexInt32(current);
- if (valueNode === null) {
- parent.pop();
- return null;
- }
-
- const value = valueNode.value;
-
- /* tslint:disable:no-bitwise */
-
- current.value = new parts.Color(
- value & 0xFF,
- (value >> 8) & 0xFF,
- (value >> 16) & 0xFF,
- );
-
- /* tslint:enable:no-bitwise */
-
- while (this.read(current, "&") !== null || this.read(current, "H") !== null) { }
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_alpha(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- while (this.read(current, "&") !== null || this.read(current, "H") !== null) { }
-
- const valueNode = this.parse_hexInt32(current);
- if (valueNode === null) {
- parent.pop();
- return null;
- }
-
- const value = valueNode.value;
-
- /* tslint:disable-next-line:no-bitwise */
- current.value = 1 - (value & 0xFF) / 0xFF;
-
- while (this.read(current, "&") !== null || this.read(current, "H") !== null) { }
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- parse_colorWithAlpha(parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- const valueNode = this.parse_decimalOrHexInt32(current);
- if (valueNode === null) {
- parent.pop();
- return null;
- }
-
- const value = valueNode.value;
-
- /* tslint:disable:no-bitwise */
-
- current.value = new parts.Color(
- value & 0xFF,
- (value >> 8) & 0xFF,
- (value >> 16) & 0xFF,
- 1 - ((value >> 24) & 0xFF) / 0xFF,
- );
-
- /* tslint:enable:no-bitwise */
-
- return current;
- }
-
- /**
- * @param {!ParseNode} parent
- * @param {string} next
- * @return {ParseNode}
- */
- read(parent: ParseNode, next: string): ParseNode | null {
- if (this._peek(next.length) !== next) {
- return null;
- }
-
- return new ParseNode(parent, next);
- }
-
- /**
- * @param {number=1} count
- * @return {string}
- */
- private _peek(count: number = 1): string {
- // Fastpath for count === 1. http://jsperf.com/substr-vs-indexer
- if (count === 1) { return this._input[this._parseTree.end]; }
-
- return this._input.substr(this._parseTree.end, count);
- }
-
- /**
- * @return {boolean}
- */
- private _haveMore(): boolean {
- return this._parseTree.end < this._input.length;
- }
-
- /**
- * @param {string} tagName One of "clip" and "iclip"
- * @param {!ParseNode} parent
- * @return {ParseNode}
- */
- private _parse_tag_clip_or_iclip(tagName: "clip" | "iclip", parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, tagName) === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, "(") === null) {
- parent.pop();
- return null;
- }
-
- let x1Node: ParseNode | null = null;
- let x2Node: ParseNode | null = null;
- let y1Node: ParseNode | null = null;
- let y2Node: ParseNode | null = null;
- let scaleNode: ParseNode | null = null;
- let commandsNode: ParseNode | null = null;
-
- const firstNode = this.parse_decimal(current);
-
- if (firstNode !== null) {
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
-
- const secondNode = this.parse_decimal(current);
-
- if (secondNode !== null) {
- x1Node = firstNode;
- y1Node = secondNode;
- }
- else {
- scaleNode = firstNode;
- }
- }
-
- if (x1Node !== null && y1Node !== null) {
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
-
- x2Node = this.parse_decimal(current);
- if (x2Node === null) {
- parent.pop();
- return null;
- }
-
- if (this.read(current, ",") === null) {
- parent.pop();
- return null;
- }
-
- y2Node = this.parse_decimal(current);
- if (y2Node === null) {
- parent.pop();
- return null;
- }
-
- current.value = new parts.RectangularClip(x1Node.value, y1Node.value, x2Node.value, y2Node.value, tagName === "clip");
- }
- else {
- commandsNode = new ParseNode(current, "");
-
- for (let next = this._peek(); this._haveMore() && next !== ")" && next !== "}"; next = this._peek()) {
- commandsNode.value += next;
- }
-
- current.value = new parts.VectorClip((scaleNode !== null) ? scaleNode.value : 1, parse(commandsNode.value, "drawingInstructions") as parts.drawing.Instruction[], tagName === "clip");
- }
-
- if (this.read(current, ")") === null) {
- parent.pop();
- return null;
- }
-
- return current;
- }
-}
-
-/**
- * Constructs a simple tag parser function and sets it on the prototype of the {@link ./parser/parse.ParserRun} class.
- *
- * @param {string} tagName The name of the tag to generate the parser function for
- * @param {function(new: !libjass.parts.Part, *)} tagConstructor The type of tag to be returned by the generated parser function
- * @param {function(!ParseNode): ParseNode} valueParser The parser for the tag's value
- * @param {boolean} required Whether the tag's value is required or optional
- */
-function makeTagParserFunction(
- tagName: string,
- tagConstructor: { new (value: any): parts.Part },
- valueParser: (current: ParseNode) => ParseNode | null,
- required: boolean,
-): void {
- (ParserRun.prototype as any)[`parse_tag_${ tagName }`] = function (this: ParserRun, parent: ParseNode): ParseNode | null {
- const current = new ParseNode(parent);
-
- if (this.read(current, tagName) === null) {
- parent.pop();
- return null;
- }
-
- const valueNode: ParseNode | null = valueParser.call(this, current);
-
- if (valueNode !== null) {
- current.value = new tagConstructor(valueNode.value);
- }
- else if (!required) {
- current.value = new tagConstructor(null);
- }
- else {
- parent.pop();
- return null;
- }
-
- return current;
- };
-}
-
-makeTagParserFunction("alpha", parts.Alpha, ParserRun.prototype.parse_alpha, false);
-makeTagParserFunction("be", parts.Blur, ParserRun.prototype.parse_decimal, false);
-makeTagParserFunction("blur", parts.GaussianBlur, ParserRun.prototype.parse_decimal, false);
-makeTagParserFunction("bord", parts.Border, ParserRun.prototype.parse_decimal, false);
-makeTagParserFunction("c", parts.PrimaryColor, ParserRun.prototype.parse_color, false);
-makeTagParserFunction("fax", parts.SkewX, ParserRun.prototype.parse_decimal, false);
-makeTagParserFunction("fay", parts.SkewY, ParserRun.prototype.parse_decimal, false);
-makeTagParserFunction("fr", parts.RotateZ, ParserRun.prototype.parse_decimal, false);
-makeTagParserFunction("frx", parts.RotateX, ParserRun.prototype.parse_decimal, false);
-makeTagParserFunction("fry", parts.RotateY, ParserRun.prototype.parse_decimal, false);
-makeTagParserFunction("frz", parts.RotateZ, ParserRun.prototype.parse_decimal, false);
-makeTagParserFunction("fs", parts.FontSize, ParserRun.prototype.parse_decimal, false);
-makeTagParserFunction("fsp", parts.LetterSpacing, ParserRun.prototype.parse_decimal, false);
-makeTagParserFunction("i", parts.Italic, ParserRun.prototype.parse_enableDisable, false);
-makeTagParserFunction("p", parts.DrawingMode, ParserRun.prototype.parse_decimal, true);
-makeTagParserFunction("pbo", parts.DrawingBaselineOffset, ParserRun.prototype.parse_decimal, true);
-makeTagParserFunction("s", parts.StrikeThrough, ParserRun.prototype.parse_enableDisable, false);
-makeTagParserFunction("shad", parts.Shadow, ParserRun.prototype.parse_decimal, false);
-makeTagParserFunction("u", parts.Underline, ParserRun.prototype.parse_enableDisable, false);
-makeTagParserFunction("xbord", parts.BorderX, ParserRun.prototype.parse_decimal, false);
-makeTagParserFunction("xshad", parts.ShadowX, ParserRun.prototype.parse_decimal, false);
-makeTagParserFunction("ybord", parts.BorderY, ParserRun.prototype.parse_decimal, false);
-makeTagParserFunction("yshad", parts.ShadowY, ParserRun.prototype.parse_decimal, false);
-makeTagParserFunction("1a", parts.PrimaryAlpha, ParserRun.prototype.parse_alpha, false);
-makeTagParserFunction("1c", parts.PrimaryColor, ParserRun.prototype.parse_color, false);
-makeTagParserFunction("2a", parts.SecondaryAlpha, ParserRun.prototype.parse_alpha, false);
-makeTagParserFunction("2c", parts.SecondaryColor, ParserRun.prototype.parse_color, false);
-makeTagParserFunction("3a", parts.OutlineAlpha, ParserRun.prototype.parse_alpha, false);
-makeTagParserFunction("3c", parts.OutlineColor, ParserRun.prototype.parse_color, false);
-makeTagParserFunction("4a", parts.ShadowAlpha, ParserRun.prototype.parse_alpha, false);
-makeTagParserFunction("4c", parts.ShadowColor, ParserRun.prototype.parse_color, false);
-
-for (const key of Object.keys(ParserRun.prototype)) {
- if (key.indexOf("parse_") === 0 && typeof (ParserRun.prototype as any)[key] === "function") {
- rules.set(key.substr("parse_".length), (ParserRun.prototype as any)[key]);
- }
-}
-
-import { Promise } from "../utility/promise";
-
-import { WorkerCommands } from "../webworker/commands";
-import { registerWorkerCommand } from "../webworker/misc";
-
-registerWorkerCommand(WorkerCommands.Parse, parameters => new Promise(resolve => {
- resolve(parse(parameters.input, parameters.rule));
-}));
diff --git a/negromate/web/static/js/libjass/src/parser/stream-parsers.ts b/negromate/web/static/js/libjass/src/parser/stream-parsers.ts
deleted file mode 100644
index 028c35a..0000000
--- a/negromate/web/static/js/libjass/src/parser/stream-parsers.ts
+++ /dev/null
@@ -1,438 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { debugMode } from "../settings";
-
-import { ASS } from "../types/ass";
-import { Attachment, AttachmentType } from "../types/attachment";
-import { Dialogue } from "../types/dialogue";
-import { Style } from "../types/style";
-
-import { Map } from "../utility/map";
-
-import { DeferredPromise } from "../utility/promise";
-
-import { parseLineIntoProperty } from "./misc";
-import { Stream } from "./streams";
-
-enum Section {
- ScriptInfo,
- Styles,
- Events,
- Fonts,
- Graphics,
- Other,
- EOF,
-}
-
-/**
- * A parser that parses an {@link libjass.ASS} object from a {@link libjass.parser.Stream}.
- *
- * @param {!libjass.parser.Stream} stream The {@link libjass.parser.Stream} to parse
- */
-export class StreamParser {
- private _ass: ASS = new ASS();
- private _minimalDeferred: DeferredPromise = new DeferredPromise();
- private _deferred: DeferredPromise = new DeferredPromise();
-
- private _shouldSwallowBom: boolean = true;
- private _currentSection: Section = Section.ScriptInfo;
- private _currentAttachment: Attachment | null = null;
-
- constructor(private _stream: Stream) {
- /* tslint:disable-next-line:no-floating-promises */
- this._stream.nextLine().then(line => this._onNextLine(line), reason => {
- this._minimalDeferred.reject(reason);
- this._deferred.reject(reason);
- });
- }
-
- /**
- * @type {!Promise.} A promise that will be resolved when the script properties of the ASS script have been parsed from the stream. Styles and events have not necessarily been
- * parsed at the point this promise becomes resolved.
- */
- get minimalASS(): Promise {
- return this._minimalDeferred.promise;
- }
-
- /**
- * @type {!Promise.} A promise that will be resolved when the entire stream has been parsed.
- */
- get ass(): Promise {
- return this._deferred.promise;
- }
-
- /**
- * @type {number}
- */
- private get currentSection(): Section {
- return this._currentSection;
- }
-
- /**
- * @type {number}
- */
- private set currentSection(value: Section) {
- if (this._currentAttachment !== null) {
- this._ass.addAttachment(this._currentAttachment);
- this._currentAttachment = null;
- }
-
- if (this._currentSection === Section.ScriptInfo && value !== Section.ScriptInfo) {
- // Exiting script info section
- this._minimalDeferred.resolve(this._ass);
- }
-
- if (value === Section.EOF) {
- const scriptProperties = this._ass.properties;
- /* tslint:disable-next-line:strict-type-predicates */
- if (scriptProperties.resolutionX === undefined || scriptProperties.resolutionY === undefined) {
- // Malformed script.
- this._minimalDeferred.reject("Malformed ASS script.");
- this._deferred.reject("Malformed ASS script.");
- }
- else {
- this._minimalDeferred.resolve(this._ass);
- this._deferred.resolve(this._ass);
- }
- }
-
- this._currentSection = value;
- }
-
- /**
- * @param {string} line
- */
- private _onNextLine(line: string | null): void {
- if (line === null) {
- this.currentSection = Section.EOF;
- return;
- }
-
- if (line[line.length - 1] === "\r") {
- line = line.substr(0, line.length - 1);
- }
-
- if (line.charCodeAt(0) === 0xfeff && this._shouldSwallowBom) {
- line = line.substr(1);
- }
-
- this._shouldSwallowBom = false;
-
- if (line === "") {
- // Ignore empty lines.
- }
-
- else if (line[0] === ";" && this._currentAttachment === null) {
- // Lines starting with ; are comments, unless reading an attachment.
- }
-
- else if (line === "[Script Info]") {
- this.currentSection = Section.ScriptInfo;
- }
- else if (line === "[V4+ Styles]" || line === "[V4 Styles]") {
- this.currentSection = Section.Styles;
- }
- else if (line === "[Events]") {
- this.currentSection = Section.Events;
- }
- else if (line === "[Fonts]") {
- this.currentSection = Section.Fonts;
- }
- else if (line === "[Graphics]") {
- this.currentSection = Section.Graphics;
- }
- else {
- if (this._currentAttachment === null && line[0] === "[" && line[line.length - 1] === "]") {
- /* This looks like the start of a new section. The section name is unrecognized if it is.
- * Since there's no current attachment being parsed it's definitely the start of a new section.
- * If an attachment is being parsed, this might be part of the attachment.
- */
- this.currentSection = Section.Other;
- }
-
- switch (this.currentSection) {
- case Section.ScriptInfo:
- const property = parseLineIntoProperty(line);
- if (property !== null) {
- switch (property.name) {
- case "PlayResX":
- this._ass.properties.resolutionX = parseInt(property.value);
- break;
- case "PlayResY":
- this._ass.properties.resolutionY = parseInt(property.value);
- break;
- case "WrapStyle":
- this._ass.properties.wrappingStyle = parseInt(property.value);
- break;
- case "ScaledBorderAndShadow":
- this._ass.properties.scaleBorderAndShadow = (property.value === "yes");
- break;
- }
- }
- break;
-
- case Section.Styles:
- if (this._ass.stylesFormatSpecifier === null) {
- const property = parseLineIntoProperty(line);
- if (property !== null && property.name === "Format") {
- this._ass.stylesFormatSpecifier = property.value.split(",").map(str => str.trim());
- }
- else {
- // Ignore any non-format lines
- }
- }
- else {
- try {
- this._ass.addStyle(line);
- }
- catch (ex) {
- if (debugMode) {
- console.error(`Could not parse style from line ${ line } - ${ ex.stack || ex }`);
- }
- }
- }
- break;
-
- case Section.Events:
- if (this._ass.dialoguesFormatSpecifier === null) {
- const property = parseLineIntoProperty(line);
- if (property !== null && property.name === "Format") {
- this._ass.dialoguesFormatSpecifier = property.value.split(",").map(str => str.trim());
- }
- else {
- // Ignore any non-format lines
- }
- }
- else {
- try {
- this._ass.addEvent(line);
- }
- catch (ex) {
- if (debugMode) {
- console.error(`Could not parse event from line ${ line } - ${ ex.stack || ex }`);
- }
- }
- }
- break;
-
- case Section.Fonts:
- case Section.Graphics:
- const startOfNewAttachmentRegex = (this.currentSection === Section.Fonts) ? /^fontname:(.+)/ : /^filename:(.+)/;
- const startOfNewAttachment = startOfNewAttachmentRegex.exec(line);
-
- if (startOfNewAttachment !== null) {
- // Start of new attachment
-
- if (this._currentAttachment !== null) {
- this._ass.addAttachment(this._currentAttachment);
- this._currentAttachment = null;
- }
-
- this._currentAttachment = new Attachment(startOfNewAttachment[1].trim(), (this.currentSection === Section.Fonts) ? AttachmentType.Font : AttachmentType.Graphic);
- }
- else if (this._currentAttachment !== null) {
- try {
- this._currentAttachment.contents += uuencodedToBase64(line);
- }
- catch (ex) {
- if (debugMode) {
- console.error(`Encountered error while reading font ${ this._currentAttachment.filename }: %o`, ex);
- }
-
- this._currentAttachment = null;
- }
- }
- else {
- // Ignore.
- }
- break;
-
- case Section.Other:
- // Ignore other sections.
- break;
-
- default:
- throw new Error(`Unhandled state ${ this.currentSection }`);
- }
- }
-
- /* tslint:disable-next-line:no-floating-promises */
- this._stream.nextLine().then(line => this._onNextLine(line), reason => {
- this._minimalDeferred.reject(reason);
- this._deferred.reject(reason);
- });
- }
-}
-
-/**
- * A parser that parses an {@link libjass.ASS} object from a {@link libjass.parser.Stream} of an SRT script.
- *
- * @param {!libjass.parser.Stream} stream The {@link libjass.parser.Stream} to parse
- */
-export class SrtStreamParser {
- private _ass: ASS = new ASS();
- private _deferred: DeferredPromise = new DeferredPromise();
-
- private _shouldSwallowBom: boolean = true;
-
- private _currentDialogueNumber: string | null = null;
- private _currentDialogueStart: string | null = null;
- private _currentDialogueEnd: string | null = null;
- private _currentDialogueText: string | null = null;
-
- constructor(private _stream: Stream) {
- /* tslint:disable-next-line:no-floating-promises */
- this._stream.nextLine().then(line => this._onNextLine(line), reason => {
- this._deferred.reject(reason);
- });
-
- this._ass.properties.resolutionX = 1280;
- this._ass.properties.resolutionY = 720;
- this._ass.properties.wrappingStyle = 1;
- this._ass.properties.scaleBorderAndShadow = true;
-
- const newStyle = new Style(new Map([["Name", "Default"], ["FontSize", "36"]]));
- this._ass.styles.set(newStyle.name, newStyle);
- }
-
- /**
- * @type {!Promise.} A promise that will be resolved when the entire stream has been parsed.
- */
- get ass(): Promise {
- return this._deferred.promise;
- }
-
- /**
- * @param {string} line
- */
- private _onNextLine(line: string | null): void {
- if (line === null) {
- if (this._currentDialogueNumber !== null && this._currentDialogueStart !== null && this._currentDialogueEnd !== null && this._currentDialogueText !== null) {
- this._ass.dialogues.push(new Dialogue(new Map([
- ["Style", "Default"],
- ["Start", this._currentDialogueStart],
- ["End", this._currentDialogueEnd],
- ["Text", this._currentDialogueText],
- ]), this._ass));
- }
-
- this._deferred.resolve(this._ass);
- return;
- }
-
- if (line[line.length - 1] === "\r") {
- line = line.substr(0, line.length - 1);
- }
-
- if (line.charCodeAt(0) === 0xfeff && this._shouldSwallowBom) {
- line = line.substr(1);
- }
-
- this._shouldSwallowBom = false;
-
- if (line === "") {
- if (this._currentDialogueNumber !== null && this._currentDialogueStart !== null && this._currentDialogueEnd !== null && this._currentDialogueText !== null) {
- this._ass.dialogues.push(new Dialogue(new Map([
- ["Style", "Default"],
- ["Start", this._currentDialogueStart],
- ["End", this._currentDialogueEnd],
- ["Text", this._currentDialogueText],
- ]), this._ass));
- }
-
- this._currentDialogueNumber = this._currentDialogueStart = this._currentDialogueEnd = this._currentDialogueText = null;
- }
- else {
- if (this._currentDialogueNumber === null) {
- if (/^\d+$/.test(line)) {
- this._currentDialogueNumber = line;
- }
- }
- else if (this._currentDialogueStart === null && this._currentDialogueEnd === null) {
- const match = /^(\d\d:\d\d:\d\d,\d\d\d) --> (\d\d:\d\d:\d\d,\d\d\d)/.exec(line);
- if (match !== null) {
- this._currentDialogueStart = match[1].replace(",", ".");
- this._currentDialogueEnd = match[2].replace(",", ".");
- }
- }
- else {
- line = line
- .replace(//g, "{\\b1}").replace(/\{b\}/g, "{\\b1}")
- .replace(/<\/b>/g, "{\\b0}").replace(/\{\/b\}/g, "{\\b0}")
- .replace(//g, "{\\i1}").replace(/\{i\}/g, "{\\i1}")
- .replace(/<\/i>/g, "{\\i0}").replace(/\{\/i\}/g, "{\\i0}")
- .replace(//g, "{\\u1}").replace(/\{u\}/g, "{\\u1}")
- .replace(/<\/u>/g, "{\\u0}").replace(/\{\/u\}/g, "{\\u0}")
- .replace(
- //g,
- (/* ujs:unreferenced */ _substring: string, red: string, green: string, blue: string) => `{\c&H${ blue }${ green }${ red }&}`,
- ).replace(/<\/font>/g, "{\\c}");
-
- if (this._currentDialogueText !== null) {
- this._currentDialogueText += "\\N" + line;
- }
- else {
- this._currentDialogueText = line;
- }
- }
- }
-
- /* tslint:disable-next-line:no-floating-promises */
- this._stream.nextLine().then(line => this._onNextLine(line), reason => {
- this._deferred.reject(reason);
- });
- }
-}
-
-/**
- * Converts a uuencoded string to a base64 string.
- *
- * @param {string} str
- * @return {string}
- */
-function uuencodedToBase64(str: string): string {
- let result = "";
-
- for (let i = 0; i < str.length; i++) {
- const charCode = str.charCodeAt(i) - 33;
-
- if (charCode < 0 || charCode > 63) {
- throw new Error(`Out-of-range character code ${ charCode } at index ${ i } in string ${ str }`);
- }
- if (charCode < 26) {
- result += String.fromCharCode("A".charCodeAt(0) + charCode);
- }
- else if (charCode < 52) {
- result += String.fromCharCode("a".charCodeAt(0) + charCode - 26);
- }
- else if (charCode < 62) {
- result += String.fromCharCode("0".charCodeAt(0) + charCode - 52);
- }
- else if (charCode === 62) {
- result += "+";
- }
- else {
- result += "/";
- }
- }
-
- return result;
-}
diff --git a/negromate/web/static/js/libjass/src/parser/streams.ts b/negromate/web/static/js/libjass/src/parser/streams.ts
deleted file mode 100644
index 3c2aa43..0000000
--- a/negromate/web/static/js/libjass/src/parser/streams.ts
+++ /dev/null
@@ -1,251 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { DeferredPromise, Promise } from "../utility/promise";
-
-/**
- * An interface for a stream.
- */
-export interface Stream {
- /**
- * @return {!Promise.} A promise that will be resolved with the next line, or null if the stream is exhausted.
- */
- nextLine(): Promise;
-}
-
-/**
- * A {@link libjass.parser.Stream} that reads from a string in memory.
- *
- * @param {string} str The string
- */
-export class StringStream implements Stream {
- private _readTill: number = 0;
-
- constructor(private _str: string) { }
-
- /**
- * @return {!Promise.} A promise that will be resolved with the next line, or null if the string has been completely read.
- */
- nextLine(): Promise {
- let result: Promise;
-
- if (this._readTill < this._str.length) {
- const nextNewLinePos = this._str.indexOf("\n", this._readTill);
- if (nextNewLinePos !== -1) {
- result = Promise.resolve(this._str.substring(this._readTill, nextNewLinePos));
- this._readTill = nextNewLinePos + 1;
- }
- else {
- result = Promise.resolve(this._str.substr(this._readTill));
- this._readTill = this._str.length;
- }
- }
- else {
- result = Promise.resolve(null);
- }
-
- return result;
- }
-}
-
-/**
- * A {@link libjass.parser.Stream} that reads from an XMLHttpRequest object.
- *
- * @param {!XMLHttpRequest} xhr The XMLHttpRequest object. Make sure to not call .open() on this object before passing it in here,
- * since event handlers cannot be registered after open() has been called.
- */
-export class XhrStream implements Stream {
- private _readTill: number = 0;
- private _pendingDeferred: DeferredPromise | null = null;
- private _failedError: ErrorEvent | null = null;
-
- constructor(private _xhr: XMLHttpRequest) {
- _xhr.addEventListener("progress", () => this._onXhrProgress(), false);
- _xhr.addEventListener("load", () => this._onXhrLoad(), false);
- _xhr.addEventListener("error", event => this._onXhrError(event), false);
- }
-
- /**
- * @return {!Promise.} A promise that will be resolved with the next line, or null if the stream is exhausted.
- */
- nextLine(): Promise {
- if (this._pendingDeferred !== null) {
- throw new Error("XhrStream only supports one pending unfulfilled read at a time.");
- }
-
- const deferred = this._pendingDeferred = new DeferredPromise();
-
- this._tryResolveNextLine();
-
- return deferred.promise;
- }
-
- /**
- */
- private _onXhrProgress(): void {
- if (this._pendingDeferred === null) {
- return;
- }
-
- if (this._xhr.readyState === XMLHttpRequest.DONE) {
- /* Suppress resolving next line here. Let the "load" or "error" event handlers do it.
- *
- * This is required because a failed XHR fires the progress event with readyState === DONE before it fires the error event.
- * This would confuse _tryResolveNextLine() into thinking the request succeeded with no data if it was called here.
- */
- return;
- }
-
- this._tryResolveNextLine();
- }
-
- /**
- */
- private _onXhrLoad(): void {
- if (this._pendingDeferred === null) {
- return;
- }
-
- this._tryResolveNextLine();
- }
-
- /**
- * @param {!ErrorEvent} event
- */
- private _onXhrError(event: ErrorEvent): void {
- this._failedError = event;
-
- if (this._pendingDeferred === null) {
- return;
- }
-
- this._tryResolveNextLine();
- }
-
- /**
- */
- private _tryResolveNextLine(): void {
- if (this._failedError !== null) {
- this._pendingDeferred!.reject(this._failedError);
- return;
- }
-
- const response = this._xhr.responseText;
-
- const nextNewLinePos = response.indexOf("\n", this._readTill);
- if (nextNewLinePos !== -1) {
- this._pendingDeferred!.resolve(response.substring(this._readTill, nextNewLinePos));
- this._readTill = nextNewLinePos + 1;
- this._pendingDeferred = null;
- }
-
- else if (this._xhr.readyState === XMLHttpRequest.DONE) {
- // No more data. This is the last line.
- if (this._readTill < response.length) {
- this._pendingDeferred!.resolve(response.substr(this._readTill));
- this._readTill = response.length;
- }
- else {
- this._pendingDeferred!.resolve(null);
- }
-
- this._pendingDeferred = null;
- }
- }
-}
-
-/**
- * A {@link libjass.parser.Stream} that reads from a ReadableStream object.
- *
- * @param {!ReadableStream} stream
- * @param {string} encoding
- */
-export class BrowserReadableStream implements Stream {
- /**
- * @return {boolean} Whether BrowserReadableStream is supported in this environment.
- */
- static isSupported(): boolean {
- return (
- global.ReadableStream !== undefined &&
- typeof global.ReadableStream.prototype.getReader === "function" &&
- typeof global.TextDecoder === "function"
- );
- }
-
- private _reader: ReadableStreamReader;
- private _decoder: TextDecoder;
- private _buffer: string = "";
- private _pendingDeferred: DeferredPromise | null = null;
-
- constructor(stream: ReadableStream, encoding: string) {
- this._reader = stream.getReader();
- this._decoder = new global.TextDecoder!(encoding, { ignoreBOM: true });
- }
-
- /**
- * @return {!Promise.} A promise that will be resolved with the next line, or null if the stream is exhausted.
- */
- nextLine(): Promise {
- if (this._pendingDeferred !== null) {
- throw new Error("BrowserReadableStream only supports one pending unfulfilled read at a time.");
- }
-
- const deferred = this._pendingDeferred = new DeferredPromise();
-
- this._tryResolveNextLine();
-
- return deferred.promise;
- }
-
- /**
- */
- private _tryResolveNextLine(): void {
- const nextNewLinePos = this._buffer.indexOf("\n");
- if (nextNewLinePos !== -1) {
- this._pendingDeferred!.resolve(this._buffer.substr(0, nextNewLinePos));
- this._buffer = this._buffer.substr(nextNewLinePos + 1);
- this._pendingDeferred = null;
- }
-
- else {
- /* tslint:disable-next-line:no-floating-promises */
- this._reader.read().then(next => {
- const { value, done } = next;
-
- if (!done) {
- this._buffer += this._decoder.decode(value, { stream: true });
- this._tryResolveNextLine();
- }
- else {
- // No more data.
- if (this._buffer.length === 0) {
- this._pendingDeferred!.resolve(null);
- }
- else {
- this._pendingDeferred!.resolve(this._buffer);
- this._buffer = "";
- }
-
- this._pendingDeferred = null;
- }
- });
- }
- }
-}
diff --git a/negromate/web/static/js/libjass/src/parser/ttf.ts b/negromate/web/static/js/libjass/src/parser/ttf.ts
deleted file mode 100644
index fdd8d8c..0000000
--- a/negromate/web/static/js/libjass/src/parser/ttf.ts
+++ /dev/null
@@ -1,228 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Attachment } from "../types/attachment";
-
-import { Map } from "../utility/map";
-import { Set } from "../utility/set";
-
-type DataReader = { dataView: DataView; position: number; };
-
-enum DataType {
- Char,
- Uint16,
- Uint32,
-}
-
-type StructMemberDefinition = { type: DataType; field: string; };
-
-const fieldDecorators = new Map void>();
-
-@struct
-class OffsetTable {
- /** @type {function(!{ dataView: DataView, position: number }): OffsetTable} */
- static read: (reader: DataReader) => OffsetTable;
-
- /** @type {number} */ @field(DataType.Uint16) majorVersion: number;
- /** @type {number} */ @field(DataType.Uint16) minorVersion: number;
- /** @type {number} */ @field(DataType.Uint16) numTables: number;
- /** @type {number} */ @field(DataType.Uint16) searchRange: number;
- /** @type {number} */ @field(DataType.Uint16) entrySelector: number;
- /** @type {number} */ @field(DataType.Uint16) rangeShift: number;
-}
-
-@struct
-class TableRecord {
- /** @type {function(!{ dataView: DataView, position: number }): TableRecord} */
- static read: (reader: DataReader) => TableRecord;
-
- /** @type {string} */ @field(DataType.Char) c1: string;
- /** @type {string} */ @field(DataType.Char) c2: string;
- /** @type {string} */ @field(DataType.Char) c3: string;
- /** @type {string} */ @field(DataType.Char) c4: string;
- /** @type {number} */ @field(DataType.Uint32) checksum: number;
- /** @type {number} */ @field(DataType.Uint32) offset: number;
- /** @type {number} */ @field(DataType.Uint32) length: number;
-}
-
-@struct
-class NameTableHeader {
- /** @type {function(!{ dataView: DataView, position: number }): NameTableHeader} */
- static read: (reader: DataReader) => NameTableHeader;
-
- /** @type {number} */ @field(DataType.Uint16) formatSelector: number;
- /** @type {number} */ @field(DataType.Uint16) count: number;
- /** @type {number} */ @field(DataType.Uint16) stringOffset: number;
-}
-
-@struct
-class NameRecord {
- /** @type {function(!{ dataView: DataView, position: number }): NameRecord} */
- static read: (reader: DataReader) => NameRecord;
-
- /** @type {number} */ @field(DataType.Uint16) platformId: number;
- /** @type {number} */ @field(DataType.Uint16) encodingId: number;
- /** @type {number} */ @field(DataType.Uint16) languageId: number;
- /** @type {number} */ @field(DataType.Uint16) nameId: number;
- /** @type {number} */ @field(DataType.Uint16) length: number;
- /** @type {number} */ @field(DataType.Uint16) offset: number;
-}
-
-/**
- * Gets all the font names from the given font attachment.
- *
- * @param {!libjass.Attachment} attachment
- * @return {!libjass.Set.}
- */
-export function getTtfNames(attachment: Attachment): Set {
- const decoded = atob(attachment.contents);
-
- const bytes = new Uint8Array(new ArrayBuffer(decoded.length));
-
- for (let i = 0; i < decoded.length; i++) {
- bytes[i] = decoded.charCodeAt(i);
- }
-
- const reader = { dataView: new DataView(bytes.buffer), position: 0 };
-
- const offsetTable = OffsetTable.read(reader);
- let nameTableRecord: TableRecord | null = null;
- for (let i = 0; i < offsetTable.numTables; i++) {
- const tableRecord = TableRecord.read(reader);
- if (tableRecord.c1 + tableRecord.c2 + tableRecord.c3 + tableRecord.c4 === "name") {
- nameTableRecord = tableRecord;
- break;
- }
- }
- if (nameTableRecord === null) {
- throw new Error('Could not find "name" table record.');
- }
-
- reader.position = nameTableRecord.offset;
- const nameTableHeader = NameTableHeader.read(reader);
-
- const result = new Set();
- for (let i = 0; i < nameTableHeader.count; i++) {
- const nameRecord = NameRecord.read(reader);
-
- switch (nameRecord.nameId) {
- case 1:
- case 4:
- case 6:
- const recordOffset = nameTableRecord.offset + nameTableHeader.stringOffset + nameRecord.offset;
- const nameBytes = bytes.subarray(recordOffset, recordOffset + nameRecord.length);
-
- switch (nameRecord.platformId) {
- case 1: {
- let name = "";
-
- /* tslint:disable-next-line:prefer-for-of */
- for (let j = 0; j < nameBytes.length; j++) {
- name += String.fromCharCode(nameBytes[j]);
- }
-
- result.add(name);
-
- break;
- }
-
- case 3: {
- let name = "";
-
- for (let j = 0; j < nameBytes.length; j += 2) {
- /* tslint:disable-next-line:no-bitwise */
- name += String.fromCharCode((nameBytes[j] << 8) + nameBytes[j + 1]);
- }
-
- result.add(name);
-
- break;
- }
- }
-
- break;
-
- default:
- break;
- }
- }
-
- return result;
-}
-
-/**
- * @param {!function(new(): T)} clazz
- * @return {!function(new(): T)}
- */
-function struct(clazz: { new (): T; read(reader: DataReader): T; }): { new (): T; read(reader: DataReader): T; } {
- const fields: StructMemberDefinition[] = (clazz as any).__fields;
-
- clazz.read = (reader: DataReader) => {
- const result: any = new clazz();
-
- for (const field of fields) {
- let value: any;
- switch (field.type) {
- case DataType.Char:
- value = String.fromCharCode(reader.dataView.getInt8(reader.position));
- reader.position += 1;
- break;
-
- case DataType.Uint16:
- value = reader.dataView.getUint16(reader.position);
- reader.position += 2;
- break;
-
- case DataType.Uint32:
- value = reader.dataView.getUint32(reader.position);
- reader.position += 4;
- break;
- }
-
- result[field.field] = value;
- }
-
- return result;
- };
-
- return clazz;
-}
-
-/**
- * @param {number} type
- * @return {function(T, string)}
- */
-function field(type: DataType): (proto: T, field: string) => void {
- let existingDecorator = fieldDecorators.get(type);
- if (existingDecorator === undefined) {
- existingDecorator = (proto: T, field: string) => {
- const ctor: { __fields?: StructMemberDefinition[] } = proto.constructor;
- if (ctor.__fields === undefined) {
- ctor.__fields = [];
- }
-
- ctor.__fields.push({ type, field });
- };
-
- fieldDecorators.set(type, existingDecorator);
- }
-
- return existingDecorator;
-}
diff --git a/negromate/web/static/js/libjass/src/parts/drawing.ts b/negromate/web/static/js/libjass/src/parts/drawing.ts
deleted file mode 100644
index 62bb2e7..0000000
--- a/negromate/web/static/js/libjass/src/parts/drawing.ts
+++ /dev/null
@@ -1,148 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * The base interface of the drawing instructions.
- */
-export interface Instruction { }
-
-/**
- * An instruction to move to a particular position.
- *
- * @param {number} x
- * @param {number} y
- */
-export class MoveInstruction implements Instruction {
- constructor(private _x: number, private _y: number) { }
-
- /**
- * The X position of this move instruction.
- *
- * @type {number}
- */
- get x(): number {
- return this._x;
- }
-
- /**
- * The Y position of this move instruction.
- *
- * @type {number}
- */
- get y(): number {
- return this._y;
- }
-}
-
-/**
- * An instruction to draw a line to a particular position.
- *
- * @param {number} x
- * @param {number} y
- */
-export class LineInstruction implements Instruction {
- constructor(private _x: number, private _y: number) { }
-
- /**
- * The X position of this line instruction.
- *
- * @type {number}
- */
- get x(): number {
- return this._x;
- }
-
- /**
- * The Y position of this line instruction.
- *
- * @type {number}
- */
- get y(): number {
- return this._y;
- }
-}
-
-/**
- * An instruction to draw a cubic bezier curve to a particular position, with two given control points.
- *
- * @param {number} x1
- * @param {number} y1
- * @param {number} x2
- * @param {number} y2
- * @param {number} x3
- * @param {number} y3
- */
-export class CubicBezierCurveInstruction implements Instruction {
- constructor(private _x1: number, private _y1: number, private _x2: number, private _y2: number, private _x3: number, private _y3: number) { }
-
- /**
- * The X position of the first control point of this cubic bezier curve instruction.
- *
- * @type {number}
- */
- get x1(): number {
- return this._x1;
- }
-
- /**
- * The Y position of the first control point of this cubic bezier curve instruction.
- *
- * @type {number}
- */
- get y1(): number {
- return this._y1;
- }
-
- /**
- * The X position of the second control point of this cubic bezier curve instruction.
- *
- * @type {number}
- */
- get x2(): number {
- return this._x2;
- }
-
- /**
- * The Y position of the second control point of this cubic bezier curve instruction.
- *
- * @type {number}
- */
- get y2(): number {
- return this._y2;
- }
-
- /**
- * The ending X position of this cubic bezier curve instruction.
- *
- * @type {number}
- */
- get x3(): number {
- return this._x3;
- }
-
- /**
- * The ending Y position of this cubic bezier curve instruction.
- *
- * @type {number}
- */
- get y3(): number {
- return this._y3;
- }
-}
diff --git a/negromate/web/static/js/libjass/src/parts/index.ts b/negromate/web/static/js/libjass/src/parts/index.ts
deleted file mode 100644
index c226024..0000000
--- a/negromate/web/static/js/libjass/src/parts/index.ts
+++ /dev/null
@@ -1,1326 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { WrappingStyle as WrappingStyleType } from "../types/misc";
-
-import * as drawing from "./drawing";
-export { drawing };
-
-/**
- * Represents a CSS color with red, green, blue and alpha components.
- *
- * Instances of this class are immutable.
- *
- * @param {number} red
- * @param {number} green
- * @param {number} blue
- * @param {number=1} alpha
- */
-export class Color {
- constructor(private _red: number, private _green: number, private _blue: number, private _alpha: number = 1) { }
-
- /**
- * The red component of this color as a number between 0 and 255.
- *
- * @type {number}
- */
- get red(): number {
- return this._red;
- }
-
- /**
- * The green component of this color as a number between 0 and 255.
- *
- * @type {number}
- */
- get green(): number {
- return this._green;
- }
-
- /**
- * The blue component of this color as a number between 0 and 255.
- *
- * @type {number}
- */
- get blue(): number {
- return this._blue;
- }
-
- /**
- * The alpha component of this color as a number between 0 and 1, where 0 means transparent and 1 means opaque.
- *
- * @type {number}
- */
- get alpha(): number {
- return this._alpha;
- }
-
- /**
- * @param {?number} value The new alpha. If null, the existing alpha is used.
- * @return {!libjass.parts.Color} Returns a new Color instance with the same color but the provided alpha.
- */
- withAlpha(value: number): Color {
- return new Color(this._red, this._green, this._blue, value);
- }
-
- /**
- * @return {string} The CSS representation "rgba(...)" of this color.
- */
- toString(): string {
- return `rgba(${ this._red }, ${ this._green }, ${ this._blue }, ${ this._alpha.toFixed(3) })`;
- }
-
- /**
- * Returns a new Color by interpolating the current color to the final color by the given progression.
- *
- * @param {!libjass.parts.Color} final
- * @param {number} progression
- * @return {!libjass.parts.Color}
- */
- interpolate(final: Color, progression: number): Color {
- return new Color(
- this._red + progression * (final.red - this._red),
- this._green + progression * (final.green - this._green),
- this._blue + progression * (final.blue - this._blue),
- this._alpha + progression * (final.alpha - this._alpha),
- );
- }
-}
-
-/**
- * The base interface of the ASS tag classes.
- */
-export interface Part { }
-
-/**
- * A comment, i.e., any text enclosed in {} that is not understood as an ASS tag.
- *
- * @param {string} value The text of this comment
- */
-export class Comment {
- constructor(private _value: string) { }
-
- /**
- * The value of this comment.
- *
- * @type {string}
- */
- get value(): string {
- return this._value;
- }
-}
-
-/**
- * A block of text, i.e., any text not enclosed in {}. Also includes \h.
- *
- * @param {string} value The content of this block of text
- */
-export class Text {
- constructor(private _value: string) { }
-
- /**
- * The value of this text part.
- *
- * @type {string}
- */
- get value(): string {
- return this._value;
- }
-
- /**
- * @return {string}
- */
- toString(): string {
- return `Text { value: ${ this._value.replace(/\u00A0/g, "\\h") } }`;
- }
-}
-
-/**
- * A newline character \N.
- */
-export class NewLine {
-}
-
-/**
- * A soft newline character \n.
- */
-export class SoftNewLine {
-}
-
-/**
- * An italic tag {\i}
- *
- * @param {?boolean} value {\i1} -> true, {\i0} -> false, {\i} -> null
- */
-export class Italic {
- constructor(private _value: boolean | null) { }
-
- /**
- * The value of this italic tag.
- *
- * @type {?boolean}
- */
- get value(): boolean | null {
- return this._value;
- }
-}
-
-/**
- * A bold tag {\b}
- *
- * @param {?boolean|?number} value {\b1} -> true, {\b0} -> false, {\b###} -> weight of the bold (number), {\b} -> null
- */
-export class Bold {
- constructor(private _value: boolean | number | null) { }
-
- /**
- * The value of this bold tag.
- *
- * @type {?boolean|?number}
- */
- get value(): boolean | number | null {
- return this._value;
- }
-}
-
-/**
- * An underline tag {\u}
- *
- * @param {?boolean} value {\u1} -> true, {\u0} -> false, {\u} -> null
- */
-export class Underline {
- constructor(private _value: boolean | null) { }
-
- /**
- * The value of this underline tag.
- *
- * @type {?boolean}
- */
- get value(): boolean | null {
- return this._value;
- }
-}
-
-/**
- * A strike-through tag {\s}
- *
- * @param {?boolean} value {\s1} -> true, {\s0} -> false, {\s} -> null
- */
-export class StrikeThrough {
- constructor(private _value: boolean | null) { }
-
- /**
- * The value of this strike-through tag.
- *
- * @type {?boolean}
- */
- get value(): boolean | null {
- return this._value;
- }
-}
-
-/**
- * A border tag {\bord}
- *
- * @param {?number} value {\bord###} -> width (number), {\bord} -> null
- */
-export class Border {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this border tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * A horizontal border tag {\xbord}
- *
- * @param {?number} value {\xbord###} -> width (number), {\xbord} -> null
- */
-export class BorderX {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this horizontal border tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * A vertical border tag {\ybord}
- *
- * @param {?number} value {\ybord###} -> height (number), {\ybord} -> null
- */
-export class BorderY {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this vertical border tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * A shadow tag {\shad}
- *
- * @param {?number} value {\shad###} -> depth (number), {\shad} -> null
- */
-export class Shadow {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this shadow tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * A horizontal shadow tag {\xshad}
- *
- * @param {?number} value {\xshad###} -> depth (number), {\xshad} -> null
- */
-export class ShadowX {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this horizontal shadow tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * A vertical shadow tag {\yshad}
- *
- * @param {?number} value {\yshad###} -> depth (number), {\yshad} -> null
- */
-export class ShadowY {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this vertical shadow tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * A blur tag {\be}
- *
- * @param {?number} value {\be###} -> strength (number), {\be} -> null
- */
-export class Blur {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this blur tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * A Gaussian blur tag {\blur}
- *
- * @param {?number} value {\blur###} -> strength (number), {\blur} -> null
- */
-export class GaussianBlur {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this Gaussian blur tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * A font name tag {\fn}
- *
- * @param {?string} value {\fn###} -> name (string), {\fn} -> null
- */
-export class FontName {
- constructor(private _value: string | null) { }
-
- /**
- * The value of this font name tag.
- *
- * @type {?string}
- */
- get value(): string | null {
- return this._value;
- }
-}
-
-/**
- * A font size tag {\fs}
- *
- * @param {?number} value {\fs###} -> size (number), {\fs} -> null
- */
-export class FontSize {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this font size tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * A font size increase tag {\fs+}
- *
- * @param {number} value {\fs+###} -> relative difference (number, percentage)
- */
-export class FontSizePlus {
- constructor(private _value: number) { }
-
- /**
- * The value of this font size increase tag.
- *
- * @type {number}
- */
- get value(): number {
- return this._value;
- }
-}
-
-/**
- * A font size decrease tag {\fs-}
- *
- * @param {number} value {\fs-###} -> relative difference (number, percentage)
- */
-export class FontSizeMinus {
- constructor(private _value: number) { }
-
- /**
- * The value of this font size decrease tag.
- *
- * @type {number}
- */
- get value(): number {
- return this._value;
- }
-}
-
-/**
- * A horizontal font scaling tag {\fscx}
- *
- * @param {?number} value {\fscx###} -> scale (number), {\fscx} -> null
- */
-export class FontScaleX {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this horizontal font scaling tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * A vertical font scaling tag {\fscy}
- *
- * @param {?number} value {\fscy###} -> scale (number), {\fscy} -> null
- */
-export class FontScaleY {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this vertical font scaling tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * A letter-spacing tag {\fsp}
- *
- * @param {?number} value {\fsp###} -> spacing (number), {\fsp} -> null
- */
-export class LetterSpacing {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this letter-spacing tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * An X-axis rotation tag {\frx}
- *
- * @param {?number} value {\frx###} -> angle (number), {\frx} -> null
- */
-export class RotateX {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this X-axis rotation tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * A Y-axis rotation tag {\fry}
- *
- * @param {?number} value {\fry###} -> angle (number), {\fry} -> null
- */
-export class RotateY {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this Y-axis rotation tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * A Z-axis rotation tag {\fr} or {\frz}
- *
- * @param {?number} value {\frz###} -> angle (number), {\frz} -> null
- */
-export class RotateZ {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this Z-axis rotation tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * An X-axis shearing tag {\fax}
- *
- * @param {?number} value {\fax###} -> angle (number), {\fax} -> null
- */
-export class SkewX {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this X-axis shearing tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * A Y-axis shearing tag {\fay}
- *
- * @param {?number} value {\fay###} -> angle (number), {\fay} -> null
- */
-export class SkewY {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this Y-axis shearing tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * A primary color tag {\c} or {\1c}
- *
- * @param {libjass.parts.Color} value {\1c###} -> color (Color), {\1c} -> null
- */
-export class PrimaryColor {
- constructor(private _value: Color | null) { }
-
- /**
- * The value of this primary color tag.
- *
- * @type {libjass.parts.Color}
- */
- get value(): Color | null {
- return this._value;
- }
-}
-
-/**
- * A secondary color tag {\2c}
- *
- * @param {libjass.parts.Color} value {\2c###} -> color (Color), {\2c} -> null
- */
-export class SecondaryColor {
- constructor(private _value: Color | null) { }
-
- /**
- * The value of this secondary color tag.
- *
- * @type {libjass.parts.Color}
- */
- get value(): Color | null {
- return this._value;
- }
-}
-
-/**
- * An outline color tag {\3c}
- *
- * @param {libjass.parts.Color} value {\3c###} -> color (Color), {\3c} -> null
- */
-export class OutlineColor {
- constructor(private _value: Color | null) { }
-
- /**
- * The value of this outline color tag.
- *
- * @type {libjass.parts.Color}
- */
- get value(): Color | null {
- return this._value;
- }
-}
-
-/**
- * A shadow color tag {\4c}
- *
- * @param {libjass.parts.Color} value {\4c###} -> color (Color), {\4c} -> null
- */
-export class ShadowColor {
- constructor(private _value: Color | null) { }
-
- /**
- * The value of this shadow color tag.
- *
- * @type {libjass.parts.Color}
- */
- get value(): Color | null {
- return this._value;
- }
-}
-
-/**
- * An alpha tag {\alpha}
- *
- * @param {?number} value {\alpha###} -> alpha (number), {\alpha} -> null
- */
-export class Alpha {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this alpha tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * A primary alpha tag {\1a}
- *
- * @param {?number} value {\1a###} -> alpha (number), {\1a} -> null
- */
-export class PrimaryAlpha {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this primary alpha tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * A secondary alpha tag {\2a}
- *
- * @param {?number} value {\2a###} -> alpha (number), {\2a} -> null
- */
-export class SecondaryAlpha {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this secondary alpha tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * An outline alpha tag {\3a}
- *
- * @param {?number} value {\3a###} -> alpha (number), {\3a} -> null
- */
-export class OutlineAlpha {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this outline alpha tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * A shadow alpha tag {\4a}
- *
- * @param {?number} value {\4a###} -> alpha (number), {\4a} -> null
- */
-export class ShadowAlpha {
- constructor(private _value: number | null) { }
-
- /**
- * The value of this shadow alpha tag.
- *
- * @type {?number}
- */
- get value(): number | null {
- return this._value;
- }
-}
-
-/**
- * An alignment tag {\an} or {\a}
- *
- * @param {number} value {\an###} -> alignment (number)
- */
-export class Alignment {
- constructor(private _value: number) { }
-
- /**
- * The value of this alignment tag.
- *
- * @type {number}
- */
- get value(): number {
- return this._value;
- }
-}
-
-/**
- * A color karaoke tag {\k}
- *
- * @param {number} duration {\k###} -> duration (number)
- */
-export class ColorKaraoke {
- constructor(private _duration: number) { }
-
- /**
- * The duration of this color karaoke tag.
- *
- * @type {number}
- */
- get duration(): number {
- return this._duration;
- }
-}
-
-/**
- * A sweeping color karaoke tag {\K} or {\kf}
- *
- * @param {number} duration {\kf###} -> duration (number)
- */
-export class SweepingColorKaraoke {
- constructor(private _duration: number) { }
-
- /**
- * The duration of this sweeping color karaoke tag.
- *
- * @type {number}
- */
- get duration(): number {
- return this._duration;
- }
-}
-
-/**
- * An outline karaoke tag {\ko}
- *
- * @param {number} duration {\ko###} -> duration (number)
- */
-export class OutlineKaraoke {
- constructor(private _duration: number) { }
-
- /**
- * The duration of this outline karaoke tag.
- *
- * @type {number}
- */
- get duration(): number {
- return this._duration;
- }
-}
-
-/**
- * A wrapping style tag {\q}
- *
- * @param {number} value {\q###} -> style (number)
- */
-export class WrappingStyle {
- constructor(private _value: WrappingStyleType) { }
-
- /**
- * The value of this wrapping style tag.
- *
- * @type {number}
- */
- get value(): WrappingStyleType {
- return this._value;
- }
-}
-
-/**
- * A style reset tag {\r}
- *
- * @param {?string} value {\r###} -> style name (string), {\r} -> null
- */
-export class Reset {
- constructor(private _value: string | null) { }
-
- /**
- * The value of this style reset tag.
- *
- * @type {?string}
- */
- get value(): string | null {
- return this._value;
- }
-}
-
-/**
- * A position tag {\pos}
- *
- * @param {number} x
- * @param {number} y
- */
-export class Position {
- constructor(private _x: number, private _y: number) { }
-
- /**
- * The x value of this position tag.
- *
- * @type {number}
- */
- get x(): number {
- return this._x;
- }
-
- /**
- * The y value of this position tag.
- *
- * @type {number}
- */
- get y(): number {
- return this._y;
- }
-}
-
-/**
- * A movement tag {\move}
- *
- * @param {number} x1
- * @param {number} y1
- * @param {number} x2
- * @param {number} y2
- * @param {?number} t1
- * @param {?number} t2
- */
-export class Move {
- constructor(private _x1: number, private _y1: number, private _x2: number, private _y2: number, private _t1: number | null, private _t2: number | null) { }
-
- /**
- * The starting x value of this move tag.
- *
- * @type {number}
- */
- get x1(): number {
- return this._x1;
- }
-
- /**
- * The starting y value of this move tag.
- *
- * @type {number}
- */
- get y1(): number {
- return this._y1;
- }
-
- /**
- * The ending x value of this move tag.
- *
- * @type {number}
- */
- get x2(): number {
- return this._x2;
- }
-
- /**
- * The ending y value of this move tag.
- *
- * @type {number}
- */
- get y2(): number {
- return this._y2;
- }
-
- /**
- * The start time of this move tag.
- *
- * @type {?number}
- */
- get t1(): number | null {
- return this._t1;
- }
-
- /**
- * The end time value of this move tag.
- *
- * @type {?number}
- */
- get t2(): number | null {
- return this._t2;
- }
-}
-
-/**
- * A rotation origin tag {\org}
- *
- * @param {number} x
- * @param {number} y
- */
-export class RotationOrigin {
- constructor(private _x: number, private _y: number) { }
-
- /**
- * The x value of this rotation origin tag.
- *
- * @type {number}
- */
- get x(): number {
- return this._x;
- }
-
- /**
- * The y value of this rotation origin tag.
- *
- * @type {number}
- */
- get y(): number {
- return this._y;
- }
-}
-
-/**
- * A simple fade tag {\fad}
- *
- * @param {number} start
- * @param {number} end
- */
-export class Fade {
- constructor(private _start: number, private _end: number) { }
-
- /**
- * The start time of this fade tag.
- *
- * @type {number}
- */
- get start(): number {
- return this._start;
- }
-
- /**
- * The end time of this fade tag.
- *
- * @type {number}
- */
- get end(): number {
- return this._end;
- }
-}
-
-/**
- * A complex fade tag {\fade}
- *
- * @param {number} a1
- * @param {number} a2
- * @param {number} a3
- * @param {number} t1
- * @param {number} t2
- * @param {number} t3
- * @param {number} t4
- */
-export class ComplexFade {
- constructor(
- private _a1: number, private _a2: number, private _a3: number,
- private _t1: number, private _t2: number, private _t3: number, private _t4: number,
- ) { }
-
- /**
- * The alpha value of this complex fade tag at time t2.
- *
- * @type {number}
- */
- get a1(): number {
- return this._a1;
- }
-
- /**
- * The alpha value of this complex fade tag at time t3.
- *
- * @type {number}
- */
- get a2(): number {
- return this._a2;
- }
-
- /**
- * The alpha value of this complex fade tag at time t4.
- *
- * @type {number}
- */
- get a3(): number {
- return this._a3;
- }
-
- /**
- * The starting time of this complex fade tag.
- *
- * @type {number}
- */
- get t1(): number {
- return this._t1;
- }
-
- /**
- * The first intermediate time of this complex fade tag.
- *
- * @type {number}
- */
- get t2(): number {
- return this._t2;
- }
-
- /**
- * The second intermediate time of this complex fade tag.
- *
- * @type {number}
- */
- get t3(): number {
- return this._t3;
- }
-
- /**
- * The ending time of this complex fade tag.
- *
- * @type {number}
- */
- get t4(): number {
- return this._t4;
- }
-}
-
-/**
- * A transform tag {\t}
- *
- * @param {?number} start
- * @param {?number} end
- * @param {?number} accel
- * @param {!Array.} tags
- */
-export class Transform {
- constructor(private _start: number | null, private _end: number | null, private _accel: number | null, private _tags: Part[]) { }
-
- /**
- * The starting time of this transform tag.
- *
- * @type {?number}
- */
- get start(): number | null {
- return this._start;
- }
-
- /**
- * The ending time of this transform tag.
- *
- * @type {?number}
- */
- get end(): number | null {
- return this._end;
- }
-
- /**
- * The acceleration of this transform tag.
- *
- * @type {?number}
- */
- get accel(): number | null {
- return this._accel;
- }
-
- /**
- * The tags animated by this transform tag.
- *
- * @type {!Array.}
- */
- get tags(): Part[] {
- return this._tags;
- }
-}
-
-/**
- * A rectangular clip tag {\clip} or {\iclip}
- *
- * @param {number} x1
- * @param {number} y1
- * @param {number} x2
- * @param {number} y2
- * @param {boolean} inside
- */
-export class RectangularClip {
- constructor(private _x1: number, private _y1: number, private _x2: number, private _y2: number, private _inside: boolean) { }
-
- /**
- * The X coordinate of the starting position of this rectangular clip tag.
- *
- * @type {number}
- */
- get x1(): number {
- return this._x1;
- }
-
- /**
- * The Y coordinate of the starting position of this rectangular clip tag.
- *
- * @type {number}
- */
- get y1(): number {
- return this._y1;
- }
-
- /**
- * The X coordinate of the ending position of this rectangular clip tag.
- *
- * @type {number}
- */
- get x2(): number {
- return this._x2;
- }
-
- /**
- * The Y coordinate of the ending position of this rectangular clip tag.
- *
- * @type {number}
- */
- get y2(): number {
- return this._y2;
- }
-
- /**
- * Whether this rectangular clip tag clips the region it encloses or the region it excludes.
- *
- * @type {boolean}
- */
- get inside(): boolean {
- return this._inside;
- }
-}
-
-/**
- * A vector clip tag {\clip} or {\iclip}
- *
- * @param {number} scale
- * @param {!Array.} instructions
- * @param {boolean} inside
- */
-export class VectorClip {
- constructor(private _scale: number, private _instructions: drawing.Instruction[], private _inside: boolean) { }
-
- /**
- * The scale of this vector clip tag.
- *
- * @type {number}
- */
- get scale(): number {
- return this._scale;
- }
-
- /**
- * The clip commands of this vector clip tag.
- *
- * @type {string}
- */
- get instructions(): drawing.Instruction[] {
- return this._instructions;
- }
-
- /**
- * Whether this vector clip tag clips the region it encloses or the region it excludes.
- *
- * @type {boolean}
- */
- get inside(): boolean {
- return this._inside;
- }
-}
-
-/**
- * A drawing mode tag {\p}
- *
- * @param {number} scale
- */
-export class DrawingMode {
- constructor(private _scale: number) { }
-
- /**
- * The scale of this drawing mode tag.
- *
- * @type {number}
- */
- get scale(): number {
- return this._scale;
- }
-}
-
-/**
- * A drawing mode baseline offset tag {\pbo}
- *
- * @param {number} value
- */
-export class DrawingBaselineOffset {
- constructor(private _value: number) { }
-
- /**
- * The value of this drawing mode baseline offset tag.
- *
- * @type {number}
- */
- get value(): number {
- return this._value;
- }
-}
-
-/**
- * A pseudo-part representing text interpreted as drawing instructions
- *
- * @param {!Array.} instructions
- */
-export class DrawingInstructions {
- constructor(private _instructions: drawing.Instruction[]) { }
-
- /**
- * The instructions contained in this drawing instructions part.
- *
- * @type {!Array.}
- */
- get instructions(): drawing.Instruction[] {
- return this._instructions;
- }
-}
-
-const addToString = function (ctor: Function, ctorName: string): void {
- if (!ctor.prototype.hasOwnProperty("toString")) {
- const propertyNames = Object.getOwnPropertyNames(ctor.prototype).filter(property => property !== "constructor");
-
- ctor.prototype.toString = function (this: any): string {
- return `${ ctorName } { ${ propertyNames.map(name => `${ name }: ${ this[name] }`).join(", ") }${ (propertyNames.length > 0) ? " " : "" }}`;
- };
- }
-};
-
-import { registerClass } from "../serialization";
-
-for (const key of Object.keys(exports)) {
- const value: any = exports[key];
- if (value instanceof Function) {
- addToString(value, key);
- registerClass(value);
- }
-}
-
-for (const key of Object.keys(drawing)) {
- const value: any = (drawing as any)[key];
- if (value instanceof Function) {
- addToString(value, `Drawing${ key }`);
- registerClass(value);
- }
-}
diff --git a/negromate/web/static/js/libjass/src/renderers/clocks/auto.ts b/negromate/web/static/js/libjass/src/renderers/clocks/auto.ts
deleted file mode 100644
index b5d7eee..0000000
--- a/negromate/web/static/js/libjass/src/renderers/clocks/auto.ts
+++ /dev/null
@@ -1,252 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { debugMode } from "../../settings";
-
-import { Clock, ClockEvent } from "./base";
-import { ManualClock } from "./manual";
-
-/**
- * An implementation of {@link libjass.renderers.Clock} that automatically ticks and generates {@link libjass.renderers.ClockEvent}s according to the state of an external driver.
- *
- * For example, if you're using libjass to render subtitles on a canvas with your own video controls, these video controls will function as the driver to this AutoClock.
- * It would call {@link libjass.renderers.AutoClock.play}, {@link libjass.renderers.AutoClock.pause}, etc. when the user pressed the corresponding video controls.
- *
- * The difference from ManualClock is that AutoClock does not require the driver to call something like {@link libjass.renderers.ManualClock.tick}. Instead it keeps its
- * own time with a high-resolution requestAnimationFrame-based timer.
- *
- * If using libjass with a element, consider using {@link libjass.renderers.VideoClock} that uses the video element as a driver.
- *
- * @param {function():number} getCurrentTime A callback that will be invoked to get the current time of the external driver.
- * @param {number} autoPauseAfter If two calls to getCurrentTime are more than autoPauseAfter milliseconds apart but return the same time, then the external driver will be
- * considered to have paused.
- */
-export class AutoClock implements Clock {
- private _manualClock: ManualClock = new ManualClock();
-
- private _nextAnimationFrameRequestId: number | null = null;
-
- private _lastKnownExternalTime: number | null = null;
- private _lastKnownExternalTimeObtainedAt: number = 0;
-
- constructor(private _getCurrentTime: () => number, private _autoPauseAfter: number) { }
-
- /**
- * Tells the clock to start generating ticks.
- */
- play(): void {
- if (!this._manualClock.enabled) {
- return;
- }
-
- this._startTicking();
-
- this._manualClock.play();
- }
-
- /**
- * Tells the clock to pause.
- */
- pause(): void {
- if (!this._manualClock.enabled) {
- return;
- }
-
- if (this._nextAnimationFrameRequestId === null) {
- if (debugMode) {
- console.warn("AutoClock.pause: Abnormal state detected. AutoClock._nextAnimationFrameRequestId should not have been null.");
- }
-
- return;
- }
-
- this._stopTicking();
-
- this._manualClock.pause();
- }
-
- /**
- * Tells the clock that the external driver is seeking.
- */
- seeking(): void {
- this._manualClock.seek(this._getCurrentTime());
- }
-
- // Clock members
-
- /**
- * @type {number}
- */
- get currentTime(): number {
- return this._manualClock.currentTime;
- }
-
- /**
- * @type {boolean}
- */
- get enabled(): boolean {
- return this._manualClock.enabled;
- }
-
- /**
- * @type {boolean}
- */
- get paused(): boolean {
- return this._manualClock.paused;
- }
-
- /**
- * Gets the rate of the clock - how fast the clock ticks compared to real time.
- *
- * @type {number}
- */
- get rate(): number {
- return this._manualClock.rate;
- }
-
- /**
- * Sets the rate of the clock - how fast the clock ticks compared to real time.
- *
- * @param {number} rate The new rate of the clock.
- */
- setRate(rate: number): void {
- this._manualClock.setRate(rate);
- }
-
- /**
- * Enable the clock.
- *
- * @return {boolean} True if the clock is now enabled, false if it was already enabled.
- */
- enable(): boolean {
- if (!this._manualClock.enable()) {
- return false;
- }
-
- this._startTicking();
-
- return true;
- }
-
- /**
- * Disable the clock.
- *
- * @return {boolean} True if the clock is now disabled, false if it was already disabled.
- */
- disable(): boolean {
- if (!this._manualClock.disable()) {
- return false;
- }
-
- this._stopTicking();
-
- return true;
- }
-
- /**
- * Toggle the clock.
- */
- toggle(): void {
- if (this._manualClock.enabled) {
- this.disable();
- }
- else {
- this.enable();
- }
- }
-
- /**
- * Enable or disable the clock.
- *
- * @param {boolean} enabled If true, the clock is enabled, otherwise it's disabled.
- * @return {boolean} True if the clock is now in the given state, false if it was already in that state.
- */
- setEnabled(enabled: boolean): boolean {
- if (enabled) {
- return this.enable();
- }
- else {
- return this.disable();
- }
- }
-
- /**
- * @param {number} type
- * @param {!Function} listener
- */
- addEventListener(type: ClockEvent, listener: Function): void {
- this._manualClock.addEventListener(type, listener);
- }
-
- /**
- * @param {number} timeStamp
- */
- private _onTimerTick(timeStamp: number): void {
- if (!this._manualClock.enabled) {
- if (debugMode) {
- console.warn("AutoClock._onTimerTick: Called when disabled.");
- }
-
- return;
- }
-
- const currentTime = this._manualClock.currentTime;
- const currentExternalTime = this._getCurrentTime();
-
- if (!this._manualClock.paused) {
- if (this._lastKnownExternalTime !== null && currentExternalTime === this._lastKnownExternalTime) {
- if (timeStamp - this._lastKnownExternalTimeObtainedAt > this._autoPauseAfter) {
- this._lastKnownExternalTimeObtainedAt = 0;
- this._manualClock.seek(currentExternalTime);
- }
- else {
- this._manualClock.tick((timeStamp - this._lastKnownExternalTimeObtainedAt) / 1000 * this._manualClock.rate + this._lastKnownExternalTime);
- }
- }
- else {
- this._lastKnownExternalTime = currentExternalTime;
- this._lastKnownExternalTimeObtainedAt = timeStamp;
- this._manualClock.tick(currentExternalTime);
- }
- }
- else {
- if (currentTime !== currentExternalTime) {
- this._lastKnownExternalTime = currentExternalTime;
- this._lastKnownExternalTimeObtainedAt = timeStamp;
- this._manualClock.tick(currentExternalTime);
- }
- }
-
- this._nextAnimationFrameRequestId = requestAnimationFrame(timeStamp => this._onTimerTick(timeStamp));
- }
-
- private _startTicking(): void {
- if (this._nextAnimationFrameRequestId === null) {
- this._nextAnimationFrameRequestId = requestAnimationFrame(timeStamp => this._onTimerTick(timeStamp));
- }
- }
-
- private _stopTicking(): void {
- if (this._nextAnimationFrameRequestId !== null) {
- cancelAnimationFrame(this._nextAnimationFrameRequestId);
- this._nextAnimationFrameRequestId = null;
- }
- }
-}
diff --git a/negromate/web/static/js/libjass/src/renderers/clocks/base.ts b/negromate/web/static/js/libjass/src/renderers/clocks/base.ts
deleted file mode 100644
index de7be5e..0000000
--- a/negromate/web/static/js/libjass/src/renderers/clocks/base.ts
+++ /dev/null
@@ -1,135 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * A mixin class that represents an event source.
- */
-export class EventSource {
- /**
- * A map from event type to an array of all the listeners registered for that event type.
- *
- * @type {!Map.>}
- */
- _eventListeners: Map;
-
- /**
- * Add a listener for the given event.
- *
- * @param {!T} type The type of event to attach the listener for
- * @param {!Function} listener The listener
- */
- addEventListener(type: T, listener: Function): void {
- let listeners = this._eventListeners.get(type);
-
- if (listeners === undefined) {
- this._eventListeners.set(type, listeners = []);
- }
-
- listeners.push(listener);
- }
-
- /**
- * Calls all listeners registered for the given event type.
- *
- * @param {!T} type The type of event to dispatch
- * @param {!Array.<*>} args Arguments for the listeners of the event
- */
- _dispatchEvent(type: T, args: Object[]): void {
- const listeners = this._eventListeners.get(type);
- if (listeners !== undefined) {
- for (const listener of listeners) {
- listener.apply(this, args);
- }
- }
- }
-}
-
-/**
- * The type of clock event.
- */
-export enum ClockEvent {
- Play,
- Tick,
- Pause,
- Stop,
- RateChange,
-}
-
-/**
- * The clock interface. A clock is used by a renderer as a source of {@link libjass.renderers.ClockEvent}s.
- */
-export interface Clock {
- /**
- * @type {number}
- */
- currentTime: number;
-
- /**
- * @type {boolean}
- */
- enabled: boolean;
-
- /**
- * @type {boolean}
- */
- paused: boolean;
-
- /**
- * Gets the rate of the clock - how fast the clock ticks compared to real time.
- *
- * @type {number}
- */
- rate: number;
-
- /**
- * Enable the clock.
- *
- * @return {boolean} True if the clock is now enabled, false if it was already enabled.
- */
- enable(): boolean;
-
- /**
- * Disable the clock.
- *
- * @return {boolean} True if the clock is now disabled, false if it was already disabled.
- */
- disable(): boolean;
-
- /**
- * Toggle the clock.
- */
- toggle(): void;
-
- /**
- * Enable or disable the clock.
- *
- * @param {boolean} enabled If true, the clock is enabled, otherwise it's disabled.
- * @return {boolean} True if the clock is now in the given state, false if it was already in that state.
- */
- setEnabled(enabled: boolean): boolean;
-
- // EventSource members
-
- /**
- * @param {number} type
- * @param {!Function} listener
- */
- addEventListener(type: ClockEvent, listener: Function): void;
-}
diff --git a/negromate/web/static/js/libjass/src/renderers/clocks/manual.ts b/negromate/web/static/js/libjass/src/renderers/clocks/manual.ts
deleted file mode 100644
index 77ae9c7..0000000
--- a/negromate/web/static/js/libjass/src/renderers/clocks/manual.ts
+++ /dev/null
@@ -1,250 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Map } from "../../utility/map";
-import { mixin } from "../../utility/mixin";
-
-import { Clock, ClockEvent, EventSource } from "./base";
-
-/**
- * An implementation of {@link libjass.renderers.Clock} that allows user script to manually trigger {@link libjass.renderers.ClockEvent}s.
- */
-export class ManualClock implements Clock, EventSource {
- private _currentTime: number = -1;
- private _rate: number = 1;
-
- private _enabled: boolean = true;
- private _paused: boolean = true;
-
- /**
- * Trigger a {@link libjass.renderers.ClockEvent.Play}
- */
- play(): void {
- if (!this._enabled) {
- return;
- }
-
- if (!this._paused) {
- return;
- }
-
- this._paused = false;
-
- this._dispatchEvent(ClockEvent.Play, []);
- }
-
- /**
- * Trigger a {@link libjass.renderers.ClockEvent.Tick} with the given time.
- *
- * @param {number} currentTime
- */
- tick(currentTime: number): void {
- if (!this._enabled) {
- return;
- }
-
- if (this._currentTime === currentTime) {
- return;
- }
-
- this.play();
-
- this._currentTime = currentTime;
- this._dispatchEvent(ClockEvent.Tick, []);
- }
-
- /**
- * Seek to the given time. Unlike {@link libjass.renderers.ManualClock.tick} this is used to represent a discontinuous jump, such as the user seeking
- * via the video element's position bar.
- *
- * @param {number} time
- */
- seek(time: number): void {
- if (!this._enabled) {
- return;
- }
-
- this.pause();
-
- if (this._currentTime === time) {
- return;
- }
-
- this.stop();
-
- this.tick(time);
-
- this.pause();
- }
-
- /**
- * Trigger a {@link libjass.renderers.ClockEvent.Pause}
- */
- pause(): void {
- if (!this._enabled) {
- return;
- }
-
- if (this._paused) {
- return;
- }
-
- this._paused = true;
-
- this._dispatchEvent(ClockEvent.Pause, []);
- }
-
- /**
- * Trigger a {@link libjass.renderers.ClockEvent.Stop}
- */
- stop(): void {
- this._dispatchEvent(ClockEvent.Stop, []);
- }
-
- // Clock members
-
- /**
- * @type {number}
- */
- get currentTime(): number {
- return this._currentTime;
- }
-
- /**
- * @type {boolean}
- */
- get enabled(): boolean {
- return this._enabled;
- }
-
- /**
- * @type {boolean}
- */
- get paused(): boolean {
- return this._paused;
- }
-
- /**
- * Gets the rate of the clock - how fast the clock ticks compared to real time.
- *
- * @type {number}
- */
- get rate(): number {
- return this._rate;
- }
-
- /**
- * Sets the rate of the clock - how fast the clock ticks compared to real time.
- *
- * @param {number} rate The new rate of the clock.
- */
- setRate(rate: number): void {
- if (this._rate === rate) {
- return;
- }
-
- this._rate = rate;
-
- this._dispatchEvent(ClockEvent.RateChange, []);
- }
-
- /**
- * Enable the clock.
- *
- * @return {boolean} True if the clock is now enabled, false if it was already enabled.
- */
- enable(): boolean {
- if (this._enabled) {
- return false;
- }
-
- this._enabled = true;
-
- return true;
- }
-
- /**
- * Disable the clock.
- *
- * @return {boolean} True if the clock is now disabled, false if it was already disabled.
- */
- disable(): boolean {
- if (!this._enabled) {
- return false;
- }
-
- this.pause();
-
- this.stop();
-
- this._enabled = false;
-
- return true;
- }
-
- /**
- * Toggle the clock.
- */
- toggle(): void {
- if (this._enabled) {
- this.disable();
- }
- else {
- this.enable();
- }
- }
-
- /**
- * Enable or disable the clock.
- *
- * @param {boolean} enabled If true, the clock is enabled, otherwise it's disabled.
- * @return {boolean} True if the clock is now in the given state, false if it was already in that state.
- */
- setEnabled(enabled: boolean): boolean {
- if (enabled) {
- return this.enable();
- }
- else {
- return this.disable();
- }
- }
-
- /* tslint:disable:member-ordering */
-
- // EventSource members
-
- /**
- * @type {!Map.>}
- */
- _eventListeners: Map = new Map();
-
- /**
- * @type {function(number, !Function)}
- */
- addEventListener: (type: ClockEvent, listener: Function) => void;
-
- /**
- * @type {function(number, Array.<*>)}
- */
- _dispatchEvent: (type: ClockEvent, args: Object[]) => void;
-
- /* tslint:enable:member-ordering */
-}
-mixin(ManualClock, [EventSource]);
diff --git a/negromate/web/static/js/libjass/src/renderers/clocks/video.ts b/negromate/web/static/js/libjass/src/renderers/clocks/video.ts
deleted file mode 100644
index 9b59ff6..0000000
--- a/negromate/web/static/js/libjass/src/renderers/clocks/video.ts
+++ /dev/null
@@ -1,122 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { AutoClock } from "./auto";
-import { Clock, ClockEvent } from "./base";
-
-/**
- * An implementation of libjass.renderers.Clock that generates {@link libjass.renderers.ClockEvent}s according to the state of a element.
- *
- * @param {!HTMLVideoElement} video
- */
-export class VideoClock implements Clock {
- private _autoClock: AutoClock;
-
- constructor(video: HTMLVideoElement) {
- this._autoClock = new AutoClock(() => video.currentTime, 100);
- video.addEventListener("playing", () => this._autoClock.play(), false);
- video.addEventListener("pause", () => this._autoClock.pause(), false);
- video.addEventListener("seeking", () => this._autoClock.seeking(), false);
- video.addEventListener("ratechange", () => this._autoClock.setRate(video.playbackRate), false);
- }
-
- /**
- * @type {number}
- */
- get currentTime(): number {
- return this._autoClock.currentTime;
- }
-
- /**
- * @type {boolean}
- */
- get enabled(): boolean {
- return this._autoClock.enabled;
- }
-
- /**
- * @type {boolean}
- */
- get paused(): boolean {
- return this._autoClock.paused;
- }
-
- /**
- * Gets the rate of the clock - how fast the clock ticks compared to real time.
- *
- * @type {number}
- */
- get rate(): number {
- return this._autoClock.rate;
- }
-
- /**
- * Enable the clock.
- *
- * @return {boolean} True if the clock is now enabled, false if it was already enabled.
- */
- enable(): boolean {
- return this._autoClock.enable();
- }
-
- /**
- * Disable the clock.
- *
- * @return {boolean} True if the clock is now disabled, false if it was already disabled.
- */
- disable(): boolean {
- return this._autoClock.disable();
- }
-
- /**
- * Toggle the clock.
- */
- toggle(): void {
- if (this._autoClock.enabled) {
- this.disable();
- }
- else {
- this.enable();
- }
- }
-
- /**
- * Enable or disable the clock.
- *
- * @param {boolean} enabled If true, the clock is enabled, otherwise it's disabled.
- * @return {boolean} True if the clock is now in the given state, false if it was already in that state.
- */
- setEnabled(enabled: boolean): boolean {
- if (enabled) {
- return this.enable();
- }
- else {
- return this.disable();
- }
- }
-
- /**
- * @param {number} type
- * @param {!Function} listener
- */
- addEventListener(type: ClockEvent, listener: Function): void {
- this._autoClock.addEventListener(type, listener);
- }
-}
diff --git a/negromate/web/static/js/libjass/src/renderers/default.ts b/negromate/web/static/js/libjass/src/renderers/default.ts
deleted file mode 100644
index c96f92f..0000000
--- a/negromate/web/static/js/libjass/src/renderers/default.ts
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { VideoClock } from "./clocks/video";
-import { RendererSettings } from "./settings";
-import { WebRenderer } from "./web/renderer";
-
-import { ASS } from "../types/ass";
-
-/**
- * A default renderer implementation.
- *
- * @param {!HTMLVideoElement} video
- * @param {!libjass.ASS} ass
- * @param {libjass.renderers.RendererSettings} settings
- */
-export class DefaultRenderer extends WebRenderer {
- constructor(private _video: HTMLVideoElement, ass: ASS, settings?: RendererSettings) {
- super(ass, new VideoClock(_video), document.createElement("div"), settings);
-
- this._video.parentElement!.replaceChild(this.libjassSubsWrapper, this._video);
- this.libjassSubsWrapper.insertBefore(this._video, this.libjassSubsWrapper.firstElementChild);
- }
-
- /**
- * Resize the subtitles to the dimensions of the video element.
- *
- * This method accounts for letterboxing if the video element's size is not the same ratio as the video resolution.
- */
- resize(): void {
- // Handle letterboxing around the video. If the width or height are greater than the video can be, then consider that dead space.
-
- const videoWidth = this._video.videoWidth;
- const videoHeight = this._video.videoHeight;
- const videoOffsetWidth = this._video.offsetWidth;
- const videoOffsetHeight = this._video.offsetHeight;
-
- const ratio = Math.min(videoOffsetWidth / videoWidth, videoOffsetHeight / videoHeight);
- const subsWrapperWidth = videoWidth * ratio;
- const subsWrapperHeight = videoHeight * ratio;
- const subsWrapperLeft = (videoOffsetWidth - subsWrapperWidth) / 2;
- const subsWrapperTop = (videoOffsetHeight - subsWrapperHeight) / 2;
-
- super.resize(subsWrapperWidth, subsWrapperHeight, subsWrapperLeft, subsWrapperTop);
- }
-
- /**
- * @deprecated
- */
- resizeVideo(): void {
- console.warn("`DefaultRenderer.resizeVideo(width, height)` has been deprecated. Use `DefaultRenderer.resize()` instead.");
- this.resize();
- }
-
- protected _ready(): void {
- this.resize();
-
- super._ready();
- }
-}
diff --git a/negromate/web/static/js/libjass/src/renderers/index.ts b/negromate/web/static/js/libjass/src/renderers/index.ts
deleted file mode 100644
index 1050eb9..0000000
--- a/negromate/web/static/js/libjass/src/renderers/index.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-export { Clock, ClockEvent, EventSource } from "./clocks/base";
-export { AutoClock } from "./clocks/auto";
-export { ManualClock } from "./clocks/manual";
-export { VideoClock } from "./clocks/video";
-
-export { DefaultRenderer } from "./default";
-export { NullRenderer } from "./null";
-export { WebRenderer } from "./web/renderer";
-export { RendererSettings } from "./settings";
diff --git a/negromate/web/static/js/libjass/src/renderers/null.ts b/negromate/web/static/js/libjass/src/renderers/null.ts
deleted file mode 100644
index 822293d..0000000
--- a/negromate/web/static/js/libjass/src/renderers/null.ts
+++ /dev/null
@@ -1,208 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { debugMode, verboseMode } from "../settings";
-
-import { ASS } from "../types/ass";
-import { Dialogue } from "../types/dialogue";
-
-import { Clock, ClockEvent } from "./clocks/base";
-
-import { RendererSettings } from "./settings";
-
-/**
- * A renderer implementation that doesn't output anything.
- *
- * @param {!libjass.ASS} ass
- * @param {!libjass.renderers.Clock} clock
- * @param {libjass.renderers.RendererSettings} settings
- */
-export class NullRenderer {
- private static _lastRendererId: number = -1;
-
- private _id: number;
-
- private _settings: RendererSettings;
-
- constructor(private _ass: ASS, private _clock: Clock, settings?: RendererSettings) {
- this._id = ++NullRenderer._lastRendererId;
-
- this._settings = RendererSettings.from(settings);
-
- this._clock.addEventListener(ClockEvent.Play, () => this._onClockPlay());
- this._clock.addEventListener(ClockEvent.Tick, () => this._onClockTick());
- this._clock.addEventListener(ClockEvent.Pause, () => this._onClockPause());
- this._clock.addEventListener(ClockEvent.Stop, () => this._onClockStop());
- this._clock.addEventListener(ClockEvent.RateChange, () => this._onClockRateChange());
- }
-
- /**
- * The unique ID of this renderer. Auto-generated.
- *
- * @type {number}
- */
- get id(): number {
- return this._id;
- }
-
- /**
- * @type {!libjass.ASS}
- */
- get ass(): ASS {
- return this._ass;
- }
-
- /**
- * @type {!libjass.renderers.Clock}
- */
- get clock(): Clock {
- return this._clock;
- }
-
- /**
- * @type {!libjass.renderers.RendererSettings}
- */
- get settings(): RendererSettings {
- return this._settings;
- }
-
- /**
- * Pre-render a dialogue. This is a no-op for this type.
- *
- * @param {!libjass.Dialogue} dialogue
- */
- preRender(_dialogue: Dialogue): void { }
-
- /**
- * Draw a dialogue. This is a no-op for this type.
- *
- * @param {!libjass.Dialogue} dialogue
- */
- draw(_dialogue: Dialogue): void { }
-
- /**
- * Enable the renderer.
- *
- * @return {boolean} True if the renderer is now enabled, false if it was already enabled.
- */
- enable(): boolean {
- return this._clock.enable();
- }
-
- /**
- * Disable the renderer.
- *
- * @return {boolean} True if the renderer is now disabled, false if it was already disabled.
- */
- disable(): boolean {
- return this._clock.disable();
- }
-
- /**
- * Toggle the renderer.
- */
- toggle(): void {
- this._clock.toggle();
- }
-
- /**
- * Enable or disable the renderer.
- *
- * @param {boolean} enabled If true, the renderer is enabled, otherwise it's disabled.
- * @return {boolean} True if the renderer is now in the given state, false if it was already in that state.
- */
- setEnabled(enabled: boolean): boolean {
- return this._clock.setEnabled(enabled);
- }
-
- /**
- * @type {boolean}
- */
- get enabled(): boolean {
- return this._clock.enabled;
- }
-
- /**
- * Runs when the clock is enabled, or starts playing, or is resumed from pause.
- */
- protected _onClockPlay(): void {
- if (verboseMode) {
- console.log("NullRenderer._onClockPlay");
- }
- }
-
- /**
- * Runs when the clock's current time changed. This might be a result of either regular playback or seeking.
- */
- protected _onClockTick(): void {
- const currentTime = this._clock.currentTime;
-
- if (verboseMode) {
- console.log(`NullRenderer._onClockTick: currentTime = ${ currentTime }`);
- }
-
- for (const dialogue of this._ass.dialogues) {
- try {
- if (dialogue.end > currentTime) {
- if (dialogue.start <= currentTime) {
- // This dialogue is visible right now. Draw it.
- this.draw(dialogue);
- }
- else if (dialogue.start <= (currentTime + this._settings.preRenderTime)) {
- // This dialogue will be visible soon. Pre-render it.
- this.preRender(dialogue);
- }
- }
- }
- catch (ex) {
- if (debugMode) {
- console.error(`Rendering dialogue ${ dialogue.id } failed.`, ex);
- }
- }
- }
- }
-
- /**
- * Runs when the clock is paused.
- */
- protected _onClockPause(): void {
- if (verboseMode) {
- console.log("NullRenderer._onClockPause");
- }
- }
-
- /**
- * Runs when the clock is disabled.
- */
- protected _onClockStop(): void {
- if (verboseMode) {
- console.log("NullRenderer._onClockStop");
- }
- }
-
- /**
- * Runs when the clock changes its rate.
- */
- protected _onClockRateChange(): void {
- if (verboseMode) {
- console.log("NullRenderer._onClockRateChange");
- }
- }
-}
diff --git a/negromate/web/static/js/libjass/src/renderers/settings.ts b/negromate/web/static/js/libjass/src/renderers/settings.ts
deleted file mode 100644
index 04b74c6..0000000
--- a/negromate/web/static/js/libjass/src/renderers/settings.ts
+++ /dev/null
@@ -1,240 +0,0 @@
-/**
- * libjass
- *
- * https://github.com/Arnavion/libjass
- *
- * Copyright 2013 Arnav Singh
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { debugMode } from "../settings";
-import { Map } from "../utility/map";
-
-/**
- * Settings for the renderer.
- */
-export class RendererSettings {
- /**
- * A convenience method to create a font map from a
-
-
-
- Previous
- Next
-
-
-
-
-
-
-