chromium/chromium-103.0.5060.53-upda...

1701 lines
68 KiB
Diff

diff -up chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.c.12 chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.c
--- chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.c.12 2022-06-28 12:50:10.167324583 +0000
+++ chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.c 2021-11-14 19:50:55.000000000 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright 2011 - 2015
+ * Copyright 2011 - 2021
* Andr\xe9 Malo or his licensors, as applicable
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,21 +18,21 @@
#include "cext.h"
EXT_INIT_FUNC;
-#define RJSMIN_DULL_BIT (1 << 0)
-#define RJSMIN_PRE_REGEX_BIT (1 << 1)
-#define RJSMIN_REGEX_DULL_BIT (1 << 2)
-#define RJSMIN_REGEX_CC_DULL_BIT (1 << 3)
-#define RJSMIN_ID_LIT_BIT (1 << 4)
-#define RJSMIN_ID_LIT_O_BIT (1 << 5)
-#define RJSMIN_ID_LIT_C_BIT (1 << 6)
-#define RJSMIN_STRING_DULL_BIT (1 << 7)
-#define RJSMIN_SPACE_BIT (1 << 8)
-#define RJSMIN_POST_REGEX_OFF_BIT (1 << 9)
+#define RJSMIN_DULL_BIT (1 << 0)
+#define RJSMIN_PRE_REGEX_BIT (1 << 1)
+#define RJSMIN_REGEX_DULL_BIT (1 << 2)
+#define RJSMIN_REGEX_CC_DULL_BIT (1 << 3)
+#define RJSMIN_ID_LIT_BIT (1 << 4)
+#define RJSMIN_ID_LIT_O_BIT (1 << 5)
+#define RJSMIN_ID_LIT_C_BIT (1 << 6)
+#define RJSMIN_STRING_DULL_BIT (1 << 7)
+#define RJSMIN_SPACE_BIT (1 << 8)
+#define RJSMIN_POST_REGEX_OFF_BIT (1 << 9)
+#define RJSMIN_A_Z_BIT (1 << 10)
-#ifdef EXT3
-typedef Py_UNICODE rchar;
-#else
typedef unsigned char rchar;
+#ifdef U
+#undef U
#endif
#define U(c) ((rchar)(c))
@@ -66,66 +66,120 @@ typedef unsigned char rchar;
#define RJSMIN_IS_PRE_REGEX_1(c) ((U(c) <= 127) && \
(rjsmin_charmask[U(c) & 0x7F] & RJSMIN_PRE_REGEX_BIT))
+#define RJSMIN_IS_A_Z(c) ((U(c) <= 127) && \
+ (rjsmin_charmask[U(c) & 0x7F] & RJSMIN_A_Z_BIT))
+
static const unsigned short rjsmin_charmask[128] = {
- 396, 396, 396, 396, 396, 396, 396, 396,
- 396, 396, 2, 396, 396, 2, 396, 396,
- 396, 396, 396, 396, 396, 396, 396, 396,
- 396, 396, 396, 396, 396, 396, 396, 396,
- 396, 687, 588, 653, 765, 653, 143, 588,
- 687, 205, 653, 237, 143, 237, 141, 648,
- 765, 765, 765, 765, 765, 765, 765, 765,
- 765, 765, 143, 143, 653, 143, 653, 143,
- 653, 765, 765, 765, 765, 765, 765, 765,
- 765, 765, 765, 765, 765, 765, 765, 765,
- 765, 765, 765, 765, 765, 765, 765, 765,
- 765, 765, 765, 683, 513, 197, 653, 765,
- 653, 765, 765, 765, 765, 765, 765, 765,
- 765, 765, 765, 765, 765, 765, 765, 765,
- 765, 765, 765, 765, 765, 765, 765, 765,
- 765, 765, 765, 687, 143, 207, 653, 765
+ 396, 396, 396, 396, 396, 396, 396, 396,
+ 396, 396, 2, 396, 396, 2, 396, 396,
+ 396, 396, 396, 396, 396, 396, 396, 396,
+ 396, 396, 396, 396, 396, 396, 396, 396,
+ 396, 687, 588, 653, 765, 653, 143, 588,
+ 687, 205, 655, 239, 143, 239, 141, 648,
+ 765, 765, 765, 765, 765, 765, 765, 765,
+ 765, 765, 143, 143, 653, 143, 653, 143,
+ 653, 765, 765, 765, 765, 765, 765, 765,
+ 765, 765, 765, 765, 765, 765, 765, 765,
+ 765, 765, 765, 765, 765, 765, 765, 765,
+ 765, 765, 765, 683, 513, 197, 653, 765,
+ 588, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
+ 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
+ 1789, 1789, 1789, 1789, 1789, 1789, 1789, 1789,
+ 1789, 1789, 1789, 687, 143, 207, 653, 765
};
+
static Py_ssize_t
rjsmin(const rchar *source, rchar *target, Py_ssize_t length,
int keep_bang_comments)
{
- const rchar *reset, *pcreset = NULL, *pctoken = NULL, *xtarget,
- *sentinel = source + length;
- rchar *tstart = target;
- int post_regex = 0;
- rchar c, quote, spaced = U(' ');
+ const rchar
+ *sentinel = source + length, /* never hit this pointer (source buf) */
+ *reset, /* reset pointer (source buf) */
+ *pcreset = NULL, /* pre-comment reset pointer (source buf) */
+ *pctoken = NULL, /* pre-comment token pointer (target buf)
+ * Pointing to before the last kept comment, if any */
+ *rsreset = NULL, /* regex-with-method reset pointer (source buf) */
+ *xtarget; /* pre-regex-2 target pointer */
+
+ rchar *tstart = target, /* Target start pointer for reference */
+ *rtreset = NULL; /* regex-with-method reset pointer (target buf) */
+
+ int rsdot, /* seen dot after regex-with-method pattern? */
+ post_regex = 0;
+ rchar c, quote,
+ spaced = U(' '); /* the last seen kind of space (nl taking prio),
+ * init with ' ' */
+ /* main loop */
while (source < sentinel) {
c = *source++;
+
if (RJSMIN_IS_DULL(c)) {
if (post_regex) post_regex = 0;
if (pctoken) pctoken = NULL;
if (spaced == U('\n')) spaced = U(' ');
+ if (rsreset) {
+ /* both a-z and . are covered by "dull" */
+ if (!rsdot) {
+ if (c != U('.')) {
+ /* reset regex-with-method to the starting slash */
+ source = rsreset;
+ target = rtreset;
+ rsreset = NULL;
+ continue; /* main loop */
+ }
+ /* Found a dot after possible regex, looking for a-z now */
+ rsdot = 1;
+ }
+ else if (!RJSMIN_IS_A_Z(c)) {
+ /* reset regex-with-method to the starting slash */
+ source = rsreset;
+ target = rtreset;
+ rsreset = NULL;
+ continue; /* main loop */
+ }
+ else {
+ /* Successfull finish the regex-with-method match */
+ rsreset = NULL;
+ }
+ }
*target++ = c;
- continue;
+ continue; /* main loop */
}
+
switch (c) {
/* String */
- case U('\''): case U('"'):
+ case U('\''): case U('"'): case U('`'):
if (post_regex) post_regex = 0;
if (pctoken) pctoken = NULL;
if (spaced == U('\n')) spaced = U(' ');
+ if (rsreset) {
+ /* reset regex-with-method to the starting slash */
+ source = rsreset;
+ target = rtreset;
+ rsreset = NULL;
+ continue; /* main loop */
+ }
reset = source;
*target++ = quote = c;
+
+ /* string loop */
while (source < sentinel) {
c = *source++;
*target++ = c;
if (RJSMIN_IS_STRING_DULL(c))
- continue;
+ continue; /* string loop */
+
switch (c) {
- case U('\''): case U('"'):
+ case U('\''): case U('"'): case U('`'):
if (c == quote)
- goto cont;
- continue;
+ goto cont; /* main loop */
+ continue; /* string loop */
case U('\\'):
if (source < sentinel) {
c = *source++;
@@ -134,13 +188,18 @@ rjsmin(const rchar *source, rchar *targe
&& *source == U('\n'))
*target++ = *source++;
}
- continue;
+ continue; /* string loop */
+ case U('\r'): case U('\n'):
+ if (quote != U('`'))
+ break; /* string reset */
+ continue; /* string loop */
}
- break;
+ break; /* string reset */
}
+ /* string reset */
target -= source - reset;
source = reset;
- continue;
+ continue; /* main loop */
/* Comment or Regex or something else entirely */
case U('/'):
@@ -148,6 +207,13 @@ rjsmin(const rchar *source, rchar *targe
if (post_regex) post_regex = 0;
if (pctoken) pctoken = NULL;
if (spaced == U('\n')) spaced = U(' ');
+ if (rsreset) {
+ /* reset regex-with-method to the starting slash */
+ source = rsreset;
+ target = rtreset;
+ rsreset = NULL;
+ continue; /* main loop */
+ }
*target++ = c;
}
@@ -157,7 +223,19 @@ rjsmin(const rchar *source, rchar *targe
case U('*'): case U('/'):
goto skip_or_copy_ws;
+ /* Regex or slash */
default:
+ if (rsreset) {
+ /* reset regex-with-method to the starting slash */
+ if (post_regex) post_regex = 0;
+ if (pctoken) pctoken = NULL;
+ if (spaced == U('\n')) spaced = U(' ');
+ source = rsreset;
+ target = rtreset;
+ rsreset = NULL;
+ continue; /* main loop */
+ }
+
xtarget = NULL;
if ( target == tstart
|| RJSMIN_IS_PRE_REGEX_1(*((pctoken ? pctoken : target)
@@ -176,99 +254,148 @@ rjsmin(const rchar *source, rchar *targe
|| !RJSMIN_IS_ID_LITERAL(*(xtarget - 7))
)
)) {
-
- /* Regex */
+ /* nothing to do here, continuing down below
+ * We could unset rsreset here, but we know it already
+ * is. */
+ ;
+ }
+ else if (*((pctoken ? pctoken : target) - 1) == U(')')) {
+ xtarget = NULL;
+ rsreset = source;
+ rtreset = target + 1;
+ rsdot = 0;
+ }
+ else {
+ /* Just a slash */
if (post_regex) post_regex = 0;
if (pctoken) pctoken = NULL;
+ if (spaced == U('\n')) spaced = U(' ');
- reset = source;
- if (spaced == U('\n')) {
- spaced = U(' ');
- if (xtarget)
- *target++ = U('\n');
- }
+ *target++ = c;
+ continue; /* main loop */
+ }
- *target++ = U('/');
- while (source < sentinel) {
- c = *source++;
- *target++ = c;
- if (RJSMIN_IS_REGEX_DULL(c))
- continue;
- switch (c) {
- case U('/'):
- post_regex = 1;
- goto cont;
- case U('\\'):
- if (source < sentinel) {
- c = *source++;
- *target++ = c;
- if (c == U('\r') || c == U('\n'))
- break;
- }
- continue;
- case U('['):
- while (source < sentinel) {
- c = *source++;
- *target++ = c;
- if (RJSMIN_IS_REGEX_CC_DULL(c))
- continue;
- switch (c) {
- case U('\\'):
- if (source < sentinel) {
- c = *source++;
- *target++ = c;
- if (c == U('\r') || c == U('\n'))
- break;
- }
- continue;
- case U(']'):
- goto cont_regex;
+ if (post_regex) post_regex = 0;
+ if (pctoken) pctoken = NULL;
+
+ reset = source;
+ if (spaced == U('\n')) {
+ spaced = U(' ');
+ if (xtarget)
+ *target++ = U('\n');
+ }
+
+ *target++ = U('/');
+
+ /* regex loop */
+ while (source < sentinel) {
+ c = *source++;
+ *target++ = c;
+
+ if (RJSMIN_IS_REGEX_DULL(c))
+ continue; /* regex loop */
+
+ switch (c) {
+ case U('/'):
+ while (source < sentinel
+ && RJSMIN_IS_A_Z(*source))
+ *target++ = *source++;
+ post_regex = !rsreset;
+ /* This check is supposed to make it faster.
+ * It doesn't. It slows it down. I wonder why...
+ */
+ /*
+ * if (!post_regex
+ * && source < sentinel - 1
+ * && *source == U('.')
+ * && RJSMIN_IS_A_Z(*(source + 1)))
+ * rsreset = NULL;
+ */
+
+ goto cont; /* main loop */
+
+ case U('\\'):
+ if (source < sentinel) {
+ c = *source++;
+ *target++ = c;
+ if (c == U('\r') || c == U('\n'))
+ break; /* regex reset */
+ }
+ continue; /* regex loop */
+
+ case U('['):
+ /* regex CC loop */
+ while (source < sentinel) {
+ c = *source++;
+ *target++ = c;
+
+ if (RJSMIN_IS_REGEX_CC_DULL(c))
+ continue; /* regex CC loop */
+
+ switch (c) {
+ case U('\\'):
+ if (source < sentinel) {
+ c = *source++;
+ *target++ = c;
+ if (c == U('\r') || c == U('\n'))
+ break; /* regex reset */
}
+ continue; /* regex CC loop */
+
+ case U(']'):
+ goto cont_regex; /* regex loop */
}
- break;
}
- break;
- cont_regex:
- continue;
+ break; /* regex reset */
+
}
- target -= source - reset;
- source = reset;
- }
- else {
- /* Just a slash */
- if (post_regex) post_regex = 0;
- if (pctoken) pctoken = NULL;
- if (spaced == U('\n')) spaced = U(' ');
+ break; /* regex reset */
- *target++ = c;
+ cont_regex:
+ continue; /* regex loop */
}
- continue;
+
+ /* regex reset */
+ target -= source - reset;
+ source = reset;
+ rsreset = NULL;
+ continue; /* main loop */
}
}
- continue;
+ continue; /* main loop */ /* LCOV_EXCL_LINE */
/* Whitespace */
default:
skip_or_copy_ws:
+ /* remember if we've seen a newline, start with: no */
quote = U(' ');
--source;
+
+ /* space loop */
while (source < sentinel) {
c = *source++;
if (RJSMIN_IS_SPACE(c))
- continue;
+ continue; /* space loop */
+
switch (c) {
case U('\r'): case U('\n'):
quote = U('\n');
- continue;
+ continue; /* space loop */
+
+ /* Can only be a comment at this point
+ * (or ending prematurely) */
case U('/'):
if (source < sentinel) {
switch (*source) {
+
+ /* multiline comment */
case U('*'):
reset = source++;
/* copy bang comment, if requested */
if ( keep_bang_comments && source < sentinel
&& *source == U('!')) {
if (!pctoken) {
+ /* Backtracking if ending prematurely */
pctoken = target;
pcreset = reset;
}
@@ -276,6 +403,8 @@ rjsmin(const rchar *source, rchar *targe
*target++ = U('/');
*target++ = U('*');
*target++ = *source++;
+
+ /* comment loop */
while (source < sentinel) {
c = *source++;
*target++ = c;
@@ -283,20 +412,21 @@ rjsmin(const rchar *source, rchar *targe
&& *source == U('/')) {
*target++ = *source++;
reset = NULL;
- break;
+ break; /* continue space loop */
}
}
if (!reset)
- continue;
+ continue; /* space loop */
+ /* comment reset */
target -= source - reset;
source = reset;
if (pcreset == reset) {
pctoken = NULL;
pcreset = NULL;
}
-
}
+
/* strip regular comment */
else {
while (source < sentinel) {
@@ -305,41 +435,52 @@ rjsmin(const rchar *source, rchar *targe
&& *source == U('/')) {
++source;
reset = NULL;
- break;
+ break; /* continue space loop */
}
}
if (!reset)
- continue;
+ continue; /* space loop */
+
+ /* comment reset: fallback to slash */
source = reset;
*target++ = U('/');
}
- goto cont;
+ goto cont; /* main loop */
+
+ /* single line comment */
case U('/'):
++source;
+
+ /* single line comment loop */
while (source < sentinel) {
c = *source++;
switch (c) {
case U('\n'):
- break;
+ break; /* continue space loop */
+
case U('\r'):
if (source < sentinel
&& *source == U('\n'))
++source;
- break;
+ break; /* continue space loop */
+
default:
- continue;
+ continue; /* single line comment loop */
}
- break;
+ break; /* continue space loop */
}
quote = U('\n');
- continue;
+ continue; /* space loop */
}
}
}
+
+ /* No more spacy character found */
--source;
- break;
+ break; /* end space loop */
}
+ /* Copy a space if needed */
if ((tstart < (pctoken ? pctoken : target) && source < sentinel)
&& ((quote == U('\n')
&& ((RJSMIN_IS_ID_LITERAL_CLOSE(*((pctoken ?
@@ -363,8 +504,9 @@ rjsmin(const rchar *source, rchar *targe
pcreset = NULL;
spaced = quote;
}
+
cont:
- continue;
+ continue; /* main loop */
}
return (Py_ssize_t)(target - tstart);
}
@@ -385,15 +527,15 @@ substitution regex.\n\
:Note: This is a hand crafted C implementation built on the regex\n\
semantics.\n\
\n\
-:Parameters:\n\
- `script` : ``str``\n\
+Parameters:\n\
+ script (str):\n\
Script to minify\n\
\n\
- `keep_bang_comments` : ``bool``\n\
+ keep_bang_comments (bool):\n\
Keep comments starting with an exclamation mark? (``/*!...*/``)\n\
\n\
-:Return: Minified script\n\
-:Rtype: ``str``");
+Returns:\n\
+ str: Minified script");
static PyObject *
rjsmin_jsmin(PyObject *self, PyObject *args, PyObject *kwds)
@@ -404,15 +546,15 @@ rjsmin_jsmin(PyObject *self, PyObject *a
int keep_bang_comments;
#ifdef EXT2
int uni;
-#define UOBJ "O"
#endif
#ifdef EXT3
-#define UOBJ "U"
+ int bytes;
+ rchar *bytescript;
#endif
- if (!PyArg_ParseTupleAndKeywords(args, kwds, UOBJ "|O", kwlist,
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O", kwlist,
&script, &keep_bang_comments_))
- return NULL;
+ LCOV_EXCL_LINE_RETURN(NULL);
if (!keep_bang_comments_)
keep_bang_comments = 0;
@@ -425,28 +567,27 @@ rjsmin_jsmin(PyObject *self, PyObject *a
#ifdef EXT2
if (PyUnicode_Check(script)) {
if (!(script = PyUnicode_AsUTF8String(script)))
- return NULL;
+ LCOV_EXCL_LINE_RETURN(NULL);
uni = 1;
}
+ else if (!PyString_Check(script)) {
+ PyErr_SetString(PyExc_TypeError, "Unexpected type");
+ return NULL;
+ }
else {
if (!(script = PyObject_Str(script)))
- return NULL;
+ LCOV_EXCL_LINE_RETURN(NULL);
uni = 0;
}
-#endif
-
-#ifdef EXT3
- Py_INCREF(script);
-#define PyString_GET_SIZE PyUnicode_GET_SIZE
-#define PyString_AS_STRING PyUnicode_AS_UNICODE
-#define _PyString_Resize PyUnicode_Resize
-#define PyString_FromStringAndSize PyUnicode_FromUnicode
-#endif
-
slength = PyString_GET_SIZE(script);
+
if (!(result = PyString_FromStringAndSize(NULL, slength))) {
+ LCOV_EXCL_START
+
Py_DECREF(script);
return NULL;
+
+ LCOV_EXCL_STOP
}
Py_BEGIN_ALLOW_THREADS
length = rjsmin((rchar *)PyString_AS_STRING(script),
@@ -456,30 +597,97 @@ rjsmin_jsmin(PyObject *self, PyObject *a
Py_DECREF(script);
if (length < 0) {
+ LCOV_EXCL_START
+
Py_DECREF(result);
return NULL;
+
+ LCOV_EXCL_STOP
}
if (length != slength && _PyString_Resize(&result, length) == -1)
- return NULL;
+ LCOV_EXCL_LINE_RETURN(NULL);
-#ifdef EXT2
if (uni) {
script = PyUnicode_DecodeUTF8(PyString_AS_STRING(result),
PyString_GET_SIZE(result), "strict");
Py_DECREF(result);
- if (!script)
- return NULL;
- result = script;
+ return script;
}
-#endif
+
return result;
+
+#else /* EXT3 */
+
+ if (PyUnicode_Check(script)) {
+ bytes = 0;
+ script = PyUnicode_AsUTF8String(script);
+ bytescript = (rchar *)PyBytes_AS_STRING(script);
+ slength = PyBytes_GET_SIZE(script);
+ }
+ else if (PyBytes_Check(script)) {
+ bytes = 1;
+ Py_INCREF(script);
+ bytescript = (rchar *)PyBytes_AS_STRING(script);
+ slength = PyBytes_GET_SIZE(script);
+ }
+ else if (PyByteArray_Check(script)) {
+ bytes = 2;
+ Py_INCREF(script);
+ bytescript = (rchar *)PyByteArray_AS_STRING(script);
+ slength = PyByteArray_GET_SIZE(script);
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError, "Unexpected type");
+ return NULL;
+ }
+
+ if (!(result = PyBytes_FromStringAndSize(NULL, slength))) {
+ LCOV_EXCL_START
+
+ Py_DECREF(script);
+ return NULL;
+
+ LCOV_EXCL_STOP
+ }
+ Py_BEGIN_ALLOW_THREADS
+ length = rjsmin(bytescript, (rchar *)PyBytes_AS_STRING(result),
+ slength, keep_bang_comments);
+ Py_END_ALLOW_THREADS
+
+ Py_DECREF(script);
+ if (length < 0) {
+ LCOV_EXCL_START
+
+ Py_DECREF(result);
+ return NULL;
+
+ LCOV_EXCL_STOP
+ }
+
+ if (!bytes) {
+ script = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(result), length,
+ "strict");
+ Py_DECREF(result);
+ return script;
+ }
+ if (bytes == 1) {
+ if (length != slength) {
+ _PyBytes_Resize(&result, length);
+ }
+ return result;
+ }
+ /* bytes == 2: bytearray */
+ script = PyByteArray_FromStringAndSize(PyBytes_AS_STRING(result), length);
+ Py_DECREF(result);
+ return script;
+#endif
}
/* ------------------------ BEGIN MODULE DEFINITION ------------------------ */
EXT_METHODS = {
{"jsmin",
- (PyCFunction)rjsmin_jsmin, METH_VARARGS | METH_KEYWORDS,
+ EXT_CFUNC(rjsmin_jsmin), METH_VARARGS | METH_KEYWORDS,
rjsmin_jsmin__doc__},
{NULL} /* Sentinel */
@@ -499,10 +707,10 @@ EXT_INIT_FUNC {
/* Create the module and populate stuff */
if (!(m = EXT_CREATE(&EXT_DEFINE_VAR)))
- EXT_INIT_ERROR(NULL);
+ EXT_INIT_ERROR(LCOV_EXCL_LINE(NULL));
EXT_ADD_UNICODE(m, "__author__", "Andr\xe9 Malo", "latin-1");
- EXT_ADD_STRING(m, "__docformat__", "restructuredtext en");
+ EXT_ADD_STRING(m, "__version__", STRINGIFY(EXT_VERSION));
EXT_INIT_RETURN(m);
}
diff -up chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.py.12 chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.py
--- chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.py.12 2022-07-01 20:33:39.317727375 +0000
+++ chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/rjsmin.py 2021-11-14 20:24:16.000000000 +0000
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: ascii -*-
-r"""
+u"""
=====================
Javascript Minifier
=====================
@@ -11,7 +11,7 @@ The minifier is based on the semantics o
:Copyright:
- Copyright 2011 - 2015
+ Copyright 2011 - 2021
Andr\xe9 Malo or his licensors, as applicable
:License:
@@ -39,9 +39,11 @@ same results as the original ``jsmin.c``
- Newline characters are not allowed inside string and regex literals, except
for line continuations in string literals (ECMA-5).
- "return /regex/" is recognized correctly.
+- More characters are allowed before regexes.
- Line terminators after regex literals are handled more sensibly
- "+ +" and "- -" sequences are not collapsed to '++' or '--'
- Newlines before ! operators are removed more sensibly
+- (Unnested) template literals are supported (ECMA-6)
- Comments starting with an exclamation mark (``!``) can be kept optionally
- rJSmin does not handle streams, but only complete strings. (However, the
module provides a "streamy" interface).
@@ -56,20 +58,17 @@ file for details.
rjsmin.c is a reimplementation of rjsmin.py in C and speeds it up even more.
-Both python 2 and python 3 are supported.
+Supported python versions are 2.7 and 3.6+.
.. _jsmin.c by Douglas Crockford:
http://www.crockford.com/javascript/jsmin.c
"""
-if __doc__:
- # pylint: disable = redefined-builtin
- __doc__ = __doc__.encode('ascii').decode('unicode_escape')
-__author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape')
-__docformat__ = "restructuredtext en"
+__author__ = u"Andr\xe9 Malo"
__license__ = "Apache License, Version 2.0"
-__version__ = '1.0.12'
+__version__ = '1.2.0'
__all__ = ['jsmin']
+import functools as _ft
import re as _re
@@ -80,13 +79,13 @@ def _make_jsmin(python_only=False):
.. _jsmin.c by Douglas Crockford:
http://www.crockford.com/javascript/jsmin.c
- :Parameters:
- `python_only` : ``bool``
+ Parameters:
+ python_only (bool):
Use only the python variant. If true, the c extension is not even
tried to be loaded.
- :Return: Minifier
- :Rtype: ``callable``
+ Returns:
+ callable: Minifier
"""
# pylint: disable = unused-variable
# pylint: disable = too-many-locals
@@ -97,7 +96,10 @@ def _make_jsmin(python_only=False):
except ImportError:
pass
else:
- return _rjsmin.jsmin
+ # Ensure that the C version is in sync
+ # https://github.com/ndparker/rjsmin/issues/11
+ if getattr(_rjsmin, '__version__', None) == __version__:
+ return _rjsmin.jsmin
try:
xrange
except NameError:
@@ -110,15 +112,16 @@ def _make_jsmin(python_only=False):
space_comment_nobang = r'(?:/\*(?!!)[^*]*\*+(?:[^/*][^*]*\*+)*/)'
bang_comment = r'(?:/\*![^*]*\*+(?:[^/*][^*]*\*+)*/)'
- string1 = \
- r'(?:\047[^\047\\\r\n]*(?:\\(?:[^\r\n]|\r?\n|\r)[^\047\\\r\n]*)*\047)'
+ string1 = r"(?:'[^'\\\r\n]*(?:\\(?:[^\r\n]|\r?\n|\r)[^'\\\r\n]*)*')"
+ string1 = string1.replace("'", r'\047') # portability
string2 = r'(?:"[^"\\\r\n]*(?:\\(?:[^\r\n]|\r?\n|\r)[^"\\\r\n]*)*")'
- string3 = r'(?:`(?:[^`\\]|\\.)*`)'
+ string3 = r'(?:`[^`\\]*(?:\\(?:[^\r\n]|\r?\n|\r)[^`\\]*)*`)'
+ string3 = string3.replace('`', r'\140') # portability
strings = r'(?:%s|%s|%s)' % (string1, string2, string3)
charclass = r'(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\])'
nospecial = r'[^/\\\[\r\n]'
- regex = r'(?:/(?![\r\n/*])%s*(?:(?:\\[^\r\n]|%s)%s*)*/)' % (
+ regex = r'(?:/(?![\r\n/*])%s*(?:(?:\\[^\r\n]|%s)%s*)*/[a-z]*)' % (
nospecial, charclass, nospecial
)
space = r'(?:%s|%s)' % (space_chars, space_comment)
@@ -154,7 +157,7 @@ def _make_jsmin(python_only=False):
) for first, last in result]) # noqa
return _re.sub(
- r'([\000-\040\047])', # \047 for better portability
+ r"([\000-\040'`])", # ' and ` for better portability
lambda m: '\\%03o' % ord(m.group(1)), (
sequentize(result)
.replace('\\', '\\\\')
@@ -180,42 +183,48 @@ def _make_jsmin(python_only=False):
return r'[%s]' % fix_charclass(result)
not_id_literal = not_id_literal_(r'[a-zA-Z0-9_$]')
- preregex1 = r'[(,=:\[!&|?{};\r\n]'
+ preregex1 = r'[(,=:\[!&|?{};\r\n+*-]'
preregex2 = r'%(not_id_literal)sreturn' % locals()
id_literal = id_literal_(r'[a-zA-Z0-9_$]')
id_literal_open = id_literal_(r'[a-zA-Z0-9_${\[(!+-]')
- id_literal_close = id_literal_(r'[a-zA-Z0-9_$}\])"\047+-]')
+ id_literal_close = id_literal_(r'[a-zA-Z0-9_$}\])"\047\140+-]')
post_regex_off = id_literal_(r'[^\000-\040}\])?:|,;.&=+-]')
- dull = r'[^\047"`/\000-\040]'
+ dull = r'[^\047"\140/\000-\040]'
space_sub_simple = _re.compile((
- # noqa pylint: disable = bad-continuation
+ # noqa pylint: disable = bad-option-value, bad-continuation
r'(%(dull)s+)' # 0
r'|(%(strings)s%(dull)s*)' # 1
- r'|(?<=%(preregex1)s)'
+ r'|(?<=[)])'
r'%(space)s*(?:%(newline)s%(space)s*)*'
r'(%(regex)s)' # 2
- r'(%(space)s*(?:%(newline)s%(space)s*)+' # 3
+ r'(?=%(space)s*(?:%(newline)s%(space)s*)*'
+ r'\.'
+ r'%(space)s*(?:%(newline)s%(space)s*)*[a-z])'
+ r'|(?<=%(preregex1)s)'
+ r'%(space)s*(?:%(newline)s%(space)s*)*'
+ r'(%(regex)s)' # 3
+ r'(%(space)s*(?:%(newline)s%(space)s*)+' # 4
r'(?=%(post_regex_off)s))?'
r'|(?<=%(preregex2)s)'
- r'%(space)s*(?:(%(newline)s)%(space)s*)*' # 4
- r'(%(regex)s)' # 5
- r'(%(space)s*(?:%(newline)s%(space)s*)+' # 6
+ r'%(space)s*(?:(%(newline)s)%(space)s*)*' # 5
+ r'(%(regex)s)' # 6
+ r'(%(space)s*(?:%(newline)s%(space)s*)+' # 7
r'(?=%(post_regex_off)s))?'
r'|(?<=%(id_literal_close)s)'
- r'%(space)s*(?:(%(newline)s)%(space)s*)+' # 7
+ r'%(space)s*(?:(%(newline)s)%(space)s*)+' # 8
r'(?=%(id_literal_open)s)'
- r'|(?<=%(id_literal)s)(%(space)s)+(?=%(id_literal)s)' # 8
- r'|(?<=\+)(%(space)s)+(?=\+)' # 9
- r'|(?<=-)(%(space)s)+(?=-)' # 10
+ r'|(?<=%(id_literal)s)(%(space)s)+(?=%(id_literal)s)' # 9
+ r'|(?<=\+)(%(space)s)+(?=\+)' # 10
+ r'|(?<=-)(%(space)s)+(?=-)' # 11
r'|%(space)s+'
r'|(?:%(newline)s%(space)s*)+'
) % locals()).sub
- # print space_sub_simple.__self__.pattern
+ # print(space_sub_simple.__self__.pattern)
def space_subber_simple(match):
""" Substitution callback """
@@ -227,48 +236,56 @@ def _make_jsmin(python_only=False):
elif groups[1]:
return groups[1]
elif groups[2]:
- if groups[3]:
- return groups[2] + '\n'
return groups[2]
- elif groups[5]:
+ elif groups[3]:
+ if groups[4]:
+ return groups[3] + '\n'
+ return groups[3]
+ elif groups[6]:
return "%s%s%s" % (
- groups[4] and '\n' or '',
- groups[5],
- groups[6] and '\n' or '',
+ groups[5] and '\n' or '',
+ groups[6],
+ groups[7] and '\n' or '',
)
- elif groups[7]:
+ elif groups[8]:
return '\n'
- elif groups[8] or groups[9] or groups[10]:
+ elif groups[9] or groups[10] or groups[11]:
return ' '
else:
return ''
space_sub_banged = _re.compile((
- # noqa pylint: disable = bad-continuation
+ # noqa pylint: disable = bad-option-value, bad-continuation
r'(%(dull)s+)' # 0
r'|(%(strings)s%(dull)s*)' # 1
- r'|(?<=%(preregex1)s)'
+ r'|(?<=[)])'
r'(%(space)s*(?:%(newline)s%(space)s*)*)' # 2
r'(%(regex)s)' # 3
- r'(%(space)s*(?:%(newline)s%(space)s*)+' # 4
+ r'(?=%(space)s*(?:%(newline)s%(space)s*)*'
+ r'\.'
+ r'%(space)s*(?:%(newline)s%(space)s*)*[a-z])'
+ r'|(?<=%(preregex1)s)'
+ r'(%(space)s*(?:%(newline)s%(space)s*)*)' # 4
+ r'(%(regex)s)' # 5
+ r'(%(space)s*(?:%(newline)s%(space)s*)+' # 6
r'(?=%(post_regex_off)s))?'
r'|(?<=%(preregex2)s)'
- r'(%(space)s*(?:(%(newline)s)%(space)s*)*)' # 5, 6
- r'(%(regex)s)' # 7
- r'(%(space)s*(?:%(newline)s%(space)s*)+' # 8
+ r'(%(space)s*(?:(%(newline)s)%(space)s*)*)' # 7, 8
+ r'(%(regex)s)' # 9
+ r'(%(space)s*(?:%(newline)s%(space)s*)+' # 10
r'(?=%(post_regex_off)s))?'
r'|(?<=%(id_literal_close)s)'
- r'(%(space)s*(?:%(newline)s%(space)s*)+)' # 9
+ r'(%(space)s*(?:%(newline)s%(space)s*)+)' # 11
r'(?=%(id_literal_open)s)'
- r'|(?<=%(id_literal)s)(%(space)s+)(?=%(id_literal)s)' # 10
- r'|(?<=\+)(%(space)s+)(?=\+)' # 11
- r'|(?<=-)(%(space)s+)(?=-)' # 12
- r'|(%(space)s+)' # 13
- r'|((?:%(newline)s%(space)s*)+)' # 14
+ r'|(?<=%(id_literal)s)(%(space)s+)(?=%(id_literal)s)' # 12
+ r'|(?<=\+)(%(space)s+)(?=\+)' # 13
+ r'|(?<=-)(%(space)s+)(?=-)' # 14
+ r'|(%(space)s+)' # 15
+ r'|((?:%(newline)s%(space)s*)+)' # 16
) % locals()).sub
- # print space_sub_banged.__self__.pattern
+ # print(space_sub_banged.__self__.pattern)
keep = _re.compile((
r'%(space_chars)s+|%(space_comment_nobang)s+|%(newline)s+'
@@ -276,7 +293,7 @@ def _make_jsmin(python_only=False):
) % locals()).sub
keeper = lambda m: m.groups()[0] or ''
- # print keep.__self__.pattern
+ # print(keep.__self__.pattern)
def space_subber_banged(match):
""" Substitution callback """
@@ -288,26 +305,34 @@ def _make_jsmin(python_only=False):
elif groups[1]:
return groups[1]
elif groups[3]:
- return "%s%s%s%s" % (
+ return "%s%s" % (
keep(keeper, groups[2]),
groups[3],
- keep(keeper, groups[4] or ''),
- groups[4] and '\n' or '',
)
- elif groups[7]:
- return "%s%s%s%s%s" % (
- keep(keeper, groups[5]),
+ elif groups[5]:
+ return "%s%s%s%s" % (
+ keep(keeper, groups[4]),
+ groups[5],
+ keep(keeper, groups[6] or ''),
groups[6] and '\n' or '',
- groups[7],
- keep(keeper, groups[8] or ''),
- groups[8] and '\n' or '',
)
elif groups[9]:
- return keep(keeper, groups[9]) + '\n'
- elif groups[10] or groups[11] or groups[12]:
- return keep(keeper, groups[10] or groups[11] or groups[12]) or ' '
+ return "%s%s%s%s%s" % (
+ keep(keeper, groups[7]),
+ groups[8] and '\n' or '',
+ groups[9],
+ keep(keeper, groups[10] or ''),
+ groups[10] and '\n' or '',
+ )
+ elif groups[11]:
+ return keep(keeper, groups[11]) + '\n'
+ elif groups[12] or groups[13] or groups[14]:
+ return keep(keeper, groups[12] or groups[13] or groups[14]) or ' '
else:
- return keep(keeper, groups[13] or groups[14])
+ return keep(keeper, groups[15] or groups[16])
+
+ banged = _ft.partial(space_sub_banged, space_subber_banged)
+ simple = _ft.partial(space_sub_simple, space_subber_simple)
def jsmin(script, keep_bang_comments=False):
r"""
@@ -320,32 +345,51 @@ def _make_jsmin(python_only=False):
.. _jsmin.c by Douglas Crockford:
http://www.crockford.com/javascript/jsmin.c
- :Parameters:
- `script` : ``str``
+ Parameters:
+ script (str):
Script to minify
- `keep_bang_comments` : ``bool``
+ keep_bang_comments (bool):
Keep comments starting with an exclamation mark? (``/*!...*/``)
- :Return: Minified script
- :Rtype: ``str``
+ Returns:
+ str: Minified script
"""
# pylint: disable = redefined-outer-name
- if keep_bang_comments:
- return space_sub_banged(
- space_subber_banged, '\n%s\n' % script
- ).strip()
- else:
- return space_sub_simple(
- space_subber_simple, '\n%s\n' % script
- ).strip()
+ is_bytes, script = _as_str(script)
+ script = (banged if keep_bang_comments else simple)(
+ '\n%s\n' % script
+ ).strip()
+ if is_bytes:
+ script = script.encode('latin-1')
+ if is_bytes == 2:
+ script = bytearray(script)
+ return script
return jsmin
jsmin = _make_jsmin()
+def _as_str(script):
+ """ Make sure the script is a text string """
+ is_bytes = False
+ if str is bytes:
+ if not isinstance(script, basestring): # noqa pylint: disable = undefined-variable
+ raise TypeError("Unexpected type")
+ elif isinstance(script, bytes):
+ is_bytes = True
+ script = script.decode('latin-1')
+ elif isinstance(script, bytearray):
+ is_bytes = 2
+ script = script.decode('latin-1')
+ elif not isinstance(script, str):
+ raise TypeError("Unexpected type")
+
+ return is_bytes, script
+
+
def jsmin_for_posers(script, keep_bang_comments=False):
r"""
Minify javascript based on `jsmin.c by Douglas Crockford`_\.
@@ -361,49 +405,61 @@ def jsmin_for_posers(script, keep_bang_c
utilizes the resulting regexes. It's here for fun and may
vanish any time. Use the `jsmin` function instead.
- :Parameters:
- `script` : ``str``
+ Parameters:
+ script (str):
Script to minify
- `keep_bang_comments` : ``bool``
+ keep_bang_comments (bool):
Keep comments starting with an exclamation mark? (``/*!...*/``)
- :Return: Minified script
- :Rtype: ``str``
+ Returns:
+ str: Minified script
"""
if not keep_bang_comments:
rex = (
- r'([^\047"/\000-\040]+)|((?:(?:\047[^\047\\\r\n]*(?:\\(?:[^\r\n]'
- r'|\r?\n|\r)[^\047\\\r\n]*)*\047)|(?:"[^"\\\r\n]*(?:\\(?:[^\r\n]'
- r'|\r?\n|\r)[^"\\\r\n]*)*"))[^\047"/\000-\040]*)|(?<=[(,=:\[!&|?'
- r'{};\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*'
- r'][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\0'
- r'14\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)*((?:/(?![\r'
- r'\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^\r'
- r'\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/))((?:[\000-\011\013\014'
+ r'([^\047"\140/\000-\040]+)|((?:(?:\047[^\047\\\r\n]*(?:\\(?:[^'
+ r'\r\n]|\r?\n|\r)[^\047\\\r\n]*)*\047)|(?:"[^"\\\r\n]*(?:\\(?:[^'
+ r'\r\n]|\r?\n|\r)[^"\\\r\n]*)*")|(?:\140[^\140\\]*(?:\\(?:[^\r\n'
+ r']|\r?\n|\r)[^\140\\]*)*\140))[^\047"\140/\000-\040]*)|(?<=[)])'
+ r'(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+'
+ r')*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\0'
+ r'40]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)*((?:/(?![\r\n/*])[^/'
+ r'\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]'
+ r'\r\n]*)*\]))[^/\\\[\r\n]*)*/[a-z]*))(?=(?:[\000-\011\013\014\0'
+ r'16-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^\r\n'
+ r']*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^'
+ r'/*][^*]*\*+)*/))*)*\.(?:[\000-\011\013\014\016-\040]|(?:/\*[^*'
+ r']*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\00'
+ r'0-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)'
+ r'*[a-z])|(?<=[(,=:\[!&|?{};\r\n+*-])(?:[\000-\011\013\014\016-'
+ r'\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)'
+ r'?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*]'
+ r'[^*]*\*+)*/))*)*((?:/(?![\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|'
+ r'(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*'
+ r'/[a-z]*))((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/'
+ r'*][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013'
+ r'\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000'
+ r'-\040&)+,.:;=?\]|}-]))?|(?<=[\000-#%-,./:-@\[-^\140{-~-]return'
+ r')(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*'
+ r'+)*/))*(?:((?:(?://[^\r\n]*)?[\r\n]))(?:[\000-\011\013\014\016'
+ r'-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)*((?:/(?![\r\n/*])'
+ r'[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^'
+ r'\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/[a-z]*))((?:[\000-\011\013\014'
r'\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^\r'
r'\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:'
- r'[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&)+,.:;=?\]|}-]))?|(?<=[\00'
- r'0-#%-,./:-@\[-^`{-~-]return)(?:[\000-\011\013\014\016-\040]|(?'
- r':/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:((?:(?://[^\r\n]*)?[\r\n]'
- r'))(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*'
- r'\*+)*/))*)*((?:/(?![\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\['
- r'[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/))(('
- r'?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)'
- r'*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\04'
- r'0]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&)+,.:;'
- r'=?\]|}-]))?|(?<=[^\000-!#%&(*,./:-@\[\\^`{|~])(?:[\000-\011\01'
- r'3\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:((?:(?:'
- r'//[^\r\n]*)?[\r\n]))(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]'
- r'*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040"#%-\047)*,./:-@\\-^'
- r'`|-~])|(?<=[^\000-#%-,./:-@\[-^`{-~-])((?:[\000-\011\013\014\0'
- r'16-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=[^\000-#%-,./'
- r':-@\[-^`{-~-])|(?<=\+)((?:[\000-\011\013\014\016-\040]|(?:/\*['
- r'^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=\+)|(?<=-)((?:[\000-\011\013'
- r'\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=-)|(?:['
- r'\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)'
- r')+|(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]'
- r'|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+'
+ r'[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&)+,.:;=?\]|}-]))?|(?<=[^\0'
+ r'00-!#%&(*,./:-@\[\\^{|~])(?:[\000-\011\013\014\016-\040]|(?:/'
+ r'\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:((?:(?://[^\r\n]*)?[\r\n]))'
+ r'(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+'
+ r')*/))*)+(?=[^\000-\040"#%-\047)*,./:-@\\-^\140|-~])|(?<=[^\000'
+ r'-#%-,./:-@\[-^\140{-~-])((?:[\000-\011\013\014\016-\040]|(?:/'
+ r'\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=[^\000-#%-,./:-@\[-^\140{-'
+ r'~-])|(?<=\+)((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:'
+ r'[^/*][^*]*\*+)*/)))+(?=\+)|(?<=-)((?:[\000-\011\013\014\016-\0'
+ r'40]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=-)|(?:[\000-\011\0'
+ r'13\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+|(?:(?:(?'
+ r'://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]'
+ r'*\*+(?:[^/*][^*]*\*+)*/))*)+'
)
def subber(match):
@@ -412,59 +468,72 @@ def jsmin_for_posers(script, keep_bang_c
return (
groups[0] or
groups[1] or
- (groups[3] and (groups[2] + '\n')) or
groups[2] or
- (groups[5] and "%s%s%s" % (
- groups[4] and '\n' or '',
- groups[5],
- groups[6] and '\n' or '',
+ (groups[4] and (groups[3] + '\n')) or
+ groups[3] or
+ (groups[6] and "%s%s%s" % (
+ groups[5] and '\n' or '',
+ groups[6],
+ groups[7] and '\n' or '',
)) or
- (groups[7] and '\n') or
- (groups[8] and ' ') or
+ (groups[8] and '\n') or
(groups[9] and ' ') or
(groups[10] and ' ') or
+ (groups[11] and ' ') or
''
)
else:
rex = (
- r'([^\047"/\000-\040]+)|((?:(?:\047[^\047\\\r\n]*(?:\\(?:[^\r\n]'
- r'|\r?\n|\r)[^\047\\\r\n]*)*\047)|(?:"[^"\\\r\n]*(?:\\(?:[^\r\n]'
- r'|\r?\n|\r)[^"\\\r\n]*)*"))[^\047"/\000-\040]*)|(?<=[(,=:\[!&|?'
- r'{};\r\n])((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/'
- r'*][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013'
- r'\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)*)((?:/(?!'
- r'[\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^'
- r'\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/))((?:[\000-\011\013\01'
- r'4\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^'
+ r'([^\047"\140/\000-\040]+)|((?:(?:\047[^\047\\\r\n]*(?:\\(?:[^'
+ r'\r\n]|\r?\n|\r)[^\047\\\r\n]*)*\047)|(?:"[^"\\\r\n]*(?:\\(?:[^'
+ r'\r\n]|\r?\n|\r)[^"\\\r\n]*)*")|(?:\140[^\140\\]*(?:\\(?:[^\r\n'
+ r']|\r?\n|\r)[^\140\\]*)*\140))[^\047"\140/\000-\040]*)|(?<=[)])'
+ r'((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*'
+ r'+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-'
+ r'\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)*)((?:/(?![\r\n/*])'
+ r'[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^'
+ r'\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/[a-z]*))(?=(?:[\000-\011\013\0'
+ r'14\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^'
r'\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+('
- r'?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&)+,.:;=?\]|}-]))?|(?<=['
- r'\000-#%-,./:-@\[-^`{-~-]return)((?:[\000-\011\013\014\016-\040'
- r']|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:((?:(?://[^\r\n]*)?['
- r'\r\n]))(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*]['
- r'^*]*\*+)*/))*)*)((?:/(?![\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|'
- r'(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*'
- r'/))((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]'
- r'*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\01'
- r'6-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&)'
- r'+,.:;=?\]|}-]))?|(?<=[^\000-!#%&(*,./:-@\[\\^`{|~])((?:[\000-'
- r'\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:'
- r'(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/'
- r'\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+)(?=[^\000-\040"#%-\047)*,./'
- r':-@\\-^`|-~])|(?<=[^\000-#%-,./:-@\[-^`{-~-])((?:[\000-\011\01'
- r'3\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+)(?=[^\000'
- r'-#%-,./:-@\[-^`{-~-])|(?<=\+)((?:[\000-\011\013\014\016-\040]|'
- r'(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+)(?=\+)|(?<=-)((?:[\000-\0'
- r'11\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+)(?=-'
- r')|((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*'
- r'\*+)*/))+)|((?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014'
- r'\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+)'
+ r'?:[^/*][^*]*\*+)*/))*)*\.(?:[\000-\011\013\014\016-\040]|(?:/'
+ r'\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?'
+ r':[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*'
+ r'/))*)*[a-z])|(?<=[(,=:\[!&|?{};\r\n+*-])((?:[\000-\011\013\014'
+ r'\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^\r'
+ r'\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:'
+ r'[^/*][^*]*\*+)*/))*)*)((?:/(?![\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^'
+ r'\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r'
+ r'\n]*)*/[a-z]*))((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+'
+ r'(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\01'
+ r'1\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+(?=['
+ r'^\000-\040&)+,.:;=?\]|}-]))?|(?<=[\000-#%-,./:-@\[-^\140{-~-]r'
+ r'eturn)((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*]['
+ r'^*]*\*+)*/))*(?:((?:(?://[^\r\n]*)?[\r\n]))(?:[\000-\011\013\0'
+ r'14\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)*)((?:/(?!['
+ r'\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^'
+ r'\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/[a-z]*))((?:[\000-\011'
+ r'\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:('
+ r'?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*'
+ r']*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&)+,.:;=?\]|}-]))?|'
+ r'(?<=[^\000-!#%&(*,./:-@\[\\^{|~])((?:[\000-\011\013\014\016-\0'
+ r'40]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)?['
+ r'\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^'
+ r'*]*\*+)*/))*)+)(?=[^\000-\040"#%-\047)*,./:-@\\-^\140|-~])|(?<'
+ r'=[^\000-#%-,./:-@\[-^\140{-~-])((?:[\000-\011\013\014\016-\040'
+ r']|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+)(?=[^\000-#%-,./:-@\[-^'
+ r'\140{-~-])|(?<=\+)((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*'
+ r'\*+(?:[^/*][^*]*\*+)*/))+)(?=\+)|(?<=-)((?:[\000-\011\013\014'
+ r'\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+)(?=-)|((?:[\00'
+ r'0-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+)'
+ r'|((?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|'
+ r'(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+)'
)
- keep = _re.compile((
+ keep = _re.compile(
r'[\000-\011\013\014\016-\040]+|(?:/\*(?!!)[^*]*\*+(?:[^/*][^*]*'
r'\*+)*/)+|(?:(?://[^\r\n]*)?[\r\n])+|((?:/\*![^*]*\*+(?:[^/*][^'
r'*]*\*+)*/)+)'
- ) % locals()).sub
+ ).sub
keeper = lambda m: m.groups()[0] or ''
def subber(match):
@@ -473,27 +542,37 @@ def jsmin_for_posers(script, keep_bang_c
return (
groups[0] or
groups[1] or
- (groups[3] and "%s%s%s%s" % (
+ groups[3] and "%s%s" % (
keep(keeper, groups[2]),
groups[3],
- keep(keeper, groups[4] or ''),
- groups[4] and '\n' or '',
- )) or
- (groups[7] and "%s%s%s%s%s" % (
- keep(keeper, groups[5]),
+ ) or
+ groups[5] and "%s%s%s%s" % (
+ keep(keeper, groups[4]),
+ groups[5],
+ keep(keeper, groups[6] or ''),
groups[6] and '\n' or '',
- groups[7],
- keep(keeper, groups[8] or ''),
+ ) or
+ groups[9] and "%s%s%s%s%s" % (
+ keep(keeper, groups[7]),
groups[8] and '\n' or '',
- )) or
- (groups[9] and keep(keeper, groups[9] + '\n')) or
- (groups[10] and keep(keeper, groups[10]) or ' ') or
- (groups[11] and keep(keeper, groups[11]) or ' ') or
- (groups[12] and keep(keeper, groups[12]) or ' ') or
- keep(keeper, groups[13] or groups[14])
+ groups[9],
+ keep(keeper, groups[10] or ''),
+ groups[10] and '\n' or '',
+ ) or
+ groups[11] and (keep(keeper, groups[11]) + '\n') or
+ groups[12] and (keep(keeper, groups[12]) or ' ') or
+ groups[13] and (keep(keeper, groups[13]) or ' ') or
+ groups[14] and (keep(keeper, groups[14]) or ' ') or
+ keep(keeper, groups[15] or groups[16])
)
- return _re.sub(rex, subber, '\n%s\n' % script).strip()
+ is_bytes, script = _as_str(script)
+ script = _re.sub(rex, subber, '\n%s\n' % script).strip()
+ if is_bytes:
+ script = script.encode('latin-1')
+ if is_bytes == 2:
+ script = bytearray(script)
+ return script
if __name__ == '__main__':
diff -up chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/setup.py.12 chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/setup.py
--- chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/setup.py.12 2022-06-28 12:50:10.171324444 +0000
+++ chromium-103.0.5060.53/third_party/catapult/common/py_vulcanize/third_party/rjsmin/setup.py 2021-11-05 17:03:12.000000000 +0000
@@ -1,41 +1,264 @@
#!/usr/bin/env python
# -*- coding: ascii -*-
-#
-# Copyright 2006 - 2013
-# Andr\xe9 Malo or his licensors, as applicable
-#
-# 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.
+u"""
+:Copyright:
+ Copyright 2011 - 2021
+ Andr\xe9 Malo or his licensors, as applicable
+
+:License:
+
+ 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.
+
+===========================================
+ rJSmin - A Javascript Minifier For Python
+===========================================
+
+rJSmin - A Javascript Minifier For Python.
+"""
+from __future__ import print_function
+__author__ = u"Andr\xe9 Malo"
+__docformat__ = "restructuredtext en"
+
+import os as _os
+import posixpath as _posixpath
import sys as _sys
-from _setup import run
+# pylint: disable = no-name-in-module, import-error, raise-missing-from
+import setuptools as _setuptools
+
+# pylint: disable = invalid-name
+
+
+def _doc(filename):
+ """ Read docs file """
+ # pylint: disable = unspecified-encoding
+ args = {} if str is bytes else dict(encoding='utf-8')
+ try:
+ with open(_os.path.join('docs', filename), **args) as fp:
+ return fp.read()
+ except IOError:
+ return None
+
+
+def _lines(multiline):
+ """ Split multiline string into single line % empty and comments """
+ return [line for line in (
+ line.strip() for line in multiline.splitlines(False)
+ ) if line and not line.startswith('#')]
+
+
+package = dict(
+ name='rjsmin',
+ top='.',
+ pathname='.',
+ provides=_doc('PROVIDES'),
+ desc=_doc('SUMMARY').strip(),
+ longdesc=_doc('DESCRIPTION'),
+ author=__author__,
+ email='nd@perlig.de',
+ license="Apache License, Version 2.0",
+ keywords=_lines(_doc('KEYWORDS')),
+ url='http://opensource.perlig.de/rjsmin/',
+ classifiers=_lines(_doc('CLASSIFIERS') or ''),
+
+ packages=False,
+ py_modules=['rjsmin'],
+ version_file='rjsmin.py',
+ install_requires=[],
+)
+
+
+class BuildFailed(Exception):
+ """ The build has failed """
+
+
+from distutils.command import build_ext as _build_ext # pylint: disable = wrong-import-order
+from distutils import errors as _errors # pylint: disable = wrong-import-order
+class build_ext(_build_ext.build_ext): # pylint: disable = no-init
+ """ Improved extension building code """
+
+ def run(self):
+ """ Unify exception """
+ try:
+ _build_ext.build_ext.run(self)
+ except _errors.DistutilsPlatformError:
+ raise BuildFailed()
+
+
+ def build_extension(self, ext):
+ """
+ Build C extension - with extended functionality
-def setup(args=None, _manifest=0):
- """ Main setup function """
- from _setup.ext import Extension
+ The following features are added here:
- if 'java' in _sys.platform.lower():
- # no c extension for jython
- ext = None
+ - The macros ``EXT_PACKAGE`` and ``EXT_MODULE`` will be filled (or
+ unset) depending on the extensions name, but only if they are not
+ already defined.
+
+ - "." is added to the include directories (for cext.h)
+
+ :Parameters:
+ `ext` : `Extension`
+ The extension to build
+
+ :Return: whatever ``distutils.command.build_ext.build_ext`` returns
+ :Rtype: any
+ """
+ # handle name macros
+ macros = dict(ext.define_macros or ())
+ tup = ext.name.split('.')
+ if len(tup) == 1:
+ pkg, mod = None, tup[0]
+ else:
+ pkg, mod = '.'.join(tup[:-1]), tup[-1]
+ if pkg is not None and 'EXT_PACKAGE' not in macros:
+ ext.define_macros.append(('EXT_PACKAGE', pkg))
+ if 'EXT_MODULE' not in macros:
+ ext.define_macros.append(('EXT_MODULE', mod))
+ if pkg is None:
+ macros = dict(ext.undef_macros or ())
+ if 'EXT_PACKAGE' not in macros:
+ ext.undef_macros.append('EXT_PACKAGE')
+
+ import pprint; pprint.pprint(ext.__dict__)
+ try:
+ return _build_ext.build_ext.build_extension(self, ext)
+ except (_errors.CCompilerError, _errors.DistutilsExecError,
+ _errors.DistutilsPlatformError, IOError, ValueError):
+ raise BuildFailed()
+
+
+class Extension(_setuptools.Extension):
+ """ improved functionality """
+
+ def __init__(self, *args, **kwargs):
+ """ Initialization """
+ version = kwargs.pop('version')
+ self.depends = []
+ if 'depends' in kwargs:
+ self.depends = kwargs['depends']
+ _setuptools.Extension.__init__(self, *args, **kwargs)
+ self.define_macros.append(('EXT_VERSION', version))
+
+ # add include path
+ included = '.'
+ if included not in self.include_dirs:
+ self.include_dirs.append(included)
+
+ # add cext.h to the dependencies
+ cext_h = _posixpath.normpath(_posixpath.join(included, 'cext.h'))
+ for item in self.depends:
+ if _posixpath.normpath(item) == cext_h:
+ break
+ else:
+ self.depends.append(cext_h)
+
+
+EXTENSIONS = lambda v: [Extension('_rjsmin', ["rjsmin.c"], version=v)]
+
+
+def do_setup(cext):
+ """ Main """
+ # pylint: disable = too-many-branches
+ # pylint: disable = unspecified-encoding
+
+ args = {} if str is bytes else dict(encoding='utf-8')
+ version_file = '%s/%s' % (package['pathname'],
+ package.get('version_file', '__init__.py'))
+ with open(version_file, **args) as fp:
+ for line in fp: # pylint: disable = redefined-outer-name
+ if line.startswith('__version__'):
+ version = line.split('=', 1)[1].strip()
+ if version.startswith(("'", '"')):
+ version = version[1:-1].strip()
+ break
+ else:
+ raise RuntimeError("Version not found")
+
+ kwargs = {}
+
+ if not cext or 'java' in _sys.platform.lower():
+ extensions = []
else:
- ext=[Extension('_rjsmin', sources=['rjsmin.c'])]
+ extensions = EXTENSIONS(version)
+
+ if extensions:
+ if 'build_ext' in globals():
+ kwargs.setdefault('cmdclass', {})['build_ext'] = build_ext
+ kwargs['ext_modules'] = extensions
+
+ cflags = None
+ if _os.environ.get('CFLAGS') is None:
+ from distutils import ccompiler as _ccompiler
+
+ compiler = _ccompiler.get_default_compiler()
+ try:
+ with open("debug.%s.cflags" % compiler) as fp:
+ cflags = ' '.join([
+ line for line in (line.strip() for line in fp)
+ if line and not line.startswith('#')
+ ]).split() or None
+ except IOError:
+ pass
+
+ if cflags:
+ gcov = 'coverage' in ' '.join(cflags)
+ for ext in extensions:
+ # pylint: disable = attribute-defined-outside-init
+ ext.extra_compile_args = \
+ getattr(ext, 'extra_compile_args', []) + cflags
+ if gcov:
+ ext.libraries.append('gcov')
+
+
+ if package.get('packages', True):
+ kwargs['packages'] = [package['top']] + [
+ '%s.%s' % (package['top'], item)
+ for item in
+ _setuptools.find_packages(package['pathname'])
+ ]
+ if package.get('py_modules'):
+ kwargs['py_modules'] = package['py_modules']
- return run(script_args=args, ext=ext, manifest_only=_manifest)
+ _setuptools.setup(
+ name=package['name'],
+ author=package['author'],
+ author_email=package['email'],
+ license=package['license'],
+ classifiers=package['classifiers'],
+ description=package['desc'],
+ long_description=package['longdesc'],
+ url=package['url'],
+ install_requires=package['install_requires'],
+ version=version,
+ zip_safe=False,
+ **kwargs
+ )
-def manifest():
- """ Create List of packaged files """
- return setup((), _manifest=1)
+def setup():
+ """ Run setup """
+ try:
+ do_setup(True)
+ except BuildFailed:
+ env = 'SETUP_CEXT_REQUIRED'
+ if _os.environ.get(env, '') not in ('', '0'):
+ raise
+ print("C extension build failed - building python only version now. "
+ "Set '%s' environment variable to '1' to make it fail."
+ % (env,), file=_sys.stderr)
+ do_setup(False)
if __name__ == '__main__':