You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.3 KiB
Plaintext
85 lines
2.3 KiB
Plaintext
13 years ago
|
#!/usr/bin/env php
|
||
|
<?php
|
||
|
|
||
|
$identifiers = new SPDXLicenseIdentifiersOnline;
|
||
|
$printer = new JsonPrinter;
|
||
|
$printer->printStringArray($identifiers->getStrings());
|
||
|
|
||
|
/**
|
||
|
* SPDX Identifier List from the registry.
|
||
|
*/
|
||
|
class SPDXLicenseIdentifiersOnline
|
||
|
{
|
||
|
const REGISTRY = 'http://www.spdx.org/licenses/';
|
||
|
const EXPRESSION = '//*[@typeof="spdx:License"]/code[@property="spdx:licenseId"]/text()';
|
||
|
|
||
|
private $identifiers;
|
||
|
|
||
|
/**
|
||
12 years ago
|
* @return array
|
||
13 years ago
|
*/
|
||
|
public function getStrings()
|
||
|
{
|
||
|
if ($this->identifiers) {
|
||
|
return $this->identifiers;
|
||
|
}
|
||
|
$this->identifiers = $this->importNodesFromURL(
|
||
|
self::REGISTRY,
|
||
|
self::EXPRESSION
|
||
|
);
|
||
|
|
||
|
return $this->identifiers;
|
||
|
}
|
||
|
|
||
|
private function importNodesFromURL($url, $expressionTextNodes)
|
||
|
{
|
||
|
$doc = new DOMDocument();
|
||
|
$doc->loadHTMLFile($url);
|
||
|
$xp = new DOMXPath($doc);
|
||
|
$codes = $xp->query($expressionTextNodes);
|
||
|
if (!$codes) {
|
||
|
throw new \Exception(sprintf('XPath query failed: %s', $expressionTextNodes));
|
||
|
}
|
||
|
if ($codes->length < 20) {
|
||
|
throw new \Exception('Obtaining the license table failed, there can not be less than 20 identifiers.');
|
||
|
}
|
||
|
$identifiers = array();
|
||
|
foreach ($codes as $code) {
|
||
|
$identifiers[] = $code->nodeValue;
|
||
|
}
|
||
|
|
||
|
return $identifiers;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Print an array the way this script needs it.
|
||
|
*/
|
||
|
class JsonPrinter
|
||
|
{
|
||
|
/**
|
||
|
*
|
||
12 years ago
|
* @param array $array
|
||
13 years ago
|
*/
|
||
|
public function printStringArray(array $array)
|
||
|
{
|
||
|
$lines = array('');
|
||
|
$line = &$lines[0];
|
||
|
$last = count($array) - 1;
|
||
|
foreach ($array as $item => $code) {
|
||
|
$code = sprintf('"%s"%s', $code, $item === $last ? '' : ', ');
|
||
|
$length = strlen($line) + strlen($code) - 1;
|
||
|
if ($length > 76) {
|
||
|
$line = rtrim($line);
|
||
|
unset($line);
|
||
|
$lines[] = $code;
|
||
|
$line = &$lines[count($lines) - 1];
|
||
|
} else {
|
||
|
$line .= $code;
|
||
|
}
|
||
|
}
|
||
|
$json = sprintf("[%s]", implode("\n ", $lines));
|
||
|
$json = str_replace(array("[\"", "\"]"), array("[\n \"", "\"\n]"), $json);
|
||
|
echo $json;
|
||
|
}
|
||
|
}
|