You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1701 lines
68 KiB
1701 lines
68 KiB
2 years ago
|
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__':
|