diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 3d66009..9df625f 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -5,9 +5,6 @@ on: push: branches: - main # Or the branch you use for documentation - pull_request: - paths: - - "docs/**" # Only trigger if there are changes in the documentation folder jobs: build-docs: diff --git a/README.md b/README.md index f74c804..82524ed 100755 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ Simple, fast, and extension-free parser for eXeLearning project files - Extract text content from XML - Detect file version - Extract entire .elp file contents +- Retrieve full metadata tree - No external extensions required - Lightweight and easy to use (less than 4 KB footprint library) - Compatible with PHP 8.0 to PHP 8.5 @@ -98,6 +99,12 @@ $data = $parser->toArray(); // JSON serialization $jsonData = json_encode($parser); + +// Export directly to a JSON file +$parser->exportJson('path/to/output.json'); + +// Retrieve full metadata as array +$meta = $parser->getMetadata(); ``` ## Error Handling diff --git a/docs/api.md b/docs/api.md index 9cd837c..b35bcab 100644 --- a/docs/api.md +++ b/docs/api.md @@ -100,6 +100,23 @@ JSON serialization method implementing JsonSerializable interface. - **Returns:** mixed - Data to be JSON serialized +#### `exportJson(?string $destinationPath = null): string` + +Export parsed data to JSON. If a destination path is provided, the JSON will be written to that file. + +- **Parameters:** + - `$destinationPath` (string|null): Optional file path for the JSON output +- **Throws:** `Exception` if the JSON cannot be written +- **Returns:** string - JSON representation of the parsed data + +#### `getMetadata(): array` + +Return a detailed metadata array containing Package, Dublin Core, LOM and LOM-ES +information together with the page tree. + +- **Throws:** `Exception` if the XML cannot be parsed +- **Returns:** array - Metadata and content structure + #### `extract(string $destinationPath): void` Extract contents of an ELP file to a specified directory. diff --git a/docs/index.md b/docs/index.md index adea4ff..8355f28 100644 --- a/docs/index.md +++ b/docs/index.md @@ -6,6 +6,7 @@ ELP Parser is a PHP library designed to parse and extract content from ELP (eXe - Parse ELP files (both version 2 and 3 supported) - Extract metadata like title, description, author, etc. +- Retrieve a complete metadata tree - Access learning resource information - Extract package contents to a specified directory - JSON serialization support @@ -133,6 +134,17 @@ $data = $parser->toArray(); $json = json_encode($parser); ``` +#### Exporting to a JSON file + +You can directly export the parsed data to a JSON file using `exportJson()`: + +```php +$parser->exportJson('path/to/output.json'); + +// Obtain a metadata tree +$meta = $parser->getMetadata(); +``` + ### Version Compatibility The library supports both version 2 and version 3 of ELP files. The parsing process automatically detects the version and handles the content appropriately. diff --git a/src/ElpParser.php b/src/ElpParser.php index ee3b44f..1aa2d3f 100644 --- a/src/ElpParser.php +++ b/src/ElpParser.php @@ -478,6 +478,256 @@ public function jsonSerialize(): mixed return $this->toArray(); } + /** + * Export parsed data as JSON string or file + * + * If a destination path is provided, the JSON string will be written to the + * given file. The method returns the JSON representation in any case. + * + * @param string|null $destinationPath Optional path to save the JSON file + * + * @throws Exception If the file cannot be written + * @return string JSON representation of the parsed ELP data + */ + public function exportJson(?string $destinationPath = null): string + { + $json = json_encode($this, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); + + if ($json === false) { + throw new Exception('Failed to encode JSON: ' . json_last_error_msg()); + } + + if ($destinationPath !== null) { + if (file_put_contents($destinationPath, $json) === false) { + throw new Exception('Unable to write JSON file.'); + } + } + + return $json; + } + + /** + * Get detailed metadata and content structure as an array + * + * This method parses the underlying XML to build a rich metadata + * representation including package information, Dublin Core data, + * LOM and LOM-ES schemas as well as a simplified page tree. + * + * @throws Exception If the XML content cannot be parsed + * @return array Metadata and content information + */ + public function getMetadata(): array + { + $zip = new ZipArchive(); + if ($zip->open($this->filePath) !== true) { + throw new Exception('Unable to open the ZIP file.'); + } + + $contentFile = $this->version === 2 ? 'contentv3.xml' : 'content.xml'; + $xmlContent = $zip->getFromName($contentFile); + $zip->close(); + + if ($xmlContent === false) { + throw new Exception('Failed to read XML content.'); + } + + libxml_use_internal_errors(true); + $xml = simplexml_load_string($xmlContent); + if ($xml === false) { + throw new Exception('XML Parsing error'); + } + + $data = $this->parseElement($xml->dictionary); + + $meta = [ + [ + 'schema' => 'Package', + 'content' => [ + 'title' => $data['_title'] ?? '', + 'author' => $data['_author'] ?? '', + 'language' => $data['_lang'] ?? '', + 'description' => $data['_description'] ?? '', + 'license' => $data['license'] ?? '', + 'classification' => '', + ], + ], + ]; + + if (isset($data['dublinCore'])) { + $dc = $data['dublinCore']; + $meta[] = [ + 'schema' => 'Dublin core', + 'content' => [ + 'title' => $dc['title'] ?? '', + 'author' => $dc['creator'] ?? '', + 'language' => $dc['language'] ?? '', + 'description' => $dc['description'] ?? '', + 'license' => [ 'rights' => $dc['rights'] ?? '' ], + 'classification' => [ 'source' => $dc['source'] ?? '', 'taxon_path' => [] ], + ], + ]; + } + + if (isset($data['lom'])) { + $lom = $data['lom']; + $meta[] = [ + 'schema' => 'LOM v1.0', + 'content' => [ + 'title' => $lom['general']['title']['string'] ?? [], + 'author' => $lom['lifeCycle']['contribute']['entity'] ?? [], + 'language' => $lom['general']['language'] ?? [], + 'description' => $lom['general']['description'] ?? [], + 'rights' => $lom['rights'] ?? [], + 'classification' => $lom['classification'] ?? [], + ], + ]; + } + + if (isset($data['lomEs'])) { + $lomEs = $data['lomEs']; + $meta[] = [ + 'schema' => 'LOM-ES v1.0', + 'content' => [ + 'title' => $lomEs['general']['title']['string'] ?? [], + 'author' => $lomEs['lifeCycle']['contribute']['entity']['name'] ?? ($lomEs['lifeCycle']['contribute']['entity'] ?? ''), + 'language' => $lomEs['general']['language'] ?? [], + 'description' => $lomEs['general']['description'] ?? [], + 'rights' => $lomEs['rights'] ?? [], + 'classification' => $lomEs['classification'] ?? [], + ], + ]; + } + + $pages = []; + if (isset($data['_nodeIdDict']['0'])) { + $this->collectPages($data['_nodeIdDict']['0'], 0, $pages); + } + + return [ + 'metadata' => $meta, + 'content' => [ + 'file' => basename($this->filePath), + 'pages' => $pages, + ], + ]; + } + + /** + * Recursively parse a dictionary structure + * + * @param SimpleXMLElement $element XML element + * + * @return mixed Parsed data + */ + protected function parseElement(SimpleXMLElement $element): mixed + { + $name = $element->getName(); + + switch ($name) { + case 'unicode': + case 'string': + return (string) $element['value']; + case 'int': + return (int) $element['value']; + case 'bool': + return ((string) $element['value']) === '1'; + case 'list': + $list = []; + foreach ($element->children() as $child) { + $list[] = $this->parseElement($child); + } + return $list; + case 'dictionary': + $dict = []; + $key = null; + foreach ($element->children() as $child) { + $cname = $child->getName(); + if (($cname === 'string' || $cname === 'unicode') && (string) $child['role'] === 'key') { + $key = (string) $child['value']; + } elseif ($key !== null) { + $dict[$key] = $this->parseElement($child); + $key = null; + } + } + return $dict; + case 'instance': + return $this->parseElement($element->dictionary); + case 'none': + return null; + case 'reference': + return ['ref' => (string) $element['key']]; + default: + return null; + } + } + + /** + * Collect page data recursively + * + * @param array $node Node information + * @param int $level Current depth level + * @param array $pages Accumulated pages + * + * @return void + */ + protected function collectPages(array $node, int $level, array &$pages): void + { + $title = $node['_title'] ?? ''; + $filename = $level === 0 ? 'index.html' : $this->slug($title) . '.html'; + + $idevices = []; + if (isset($node['idevices']) && is_array($node['idevices'])) { + foreach ($node['idevices'] as $idevice) { + $html = ''; + if (isset($idevice['fields']) && is_array($idevice['fields'])) { + foreach ($idevice['fields'] as $field) { + if (isset($field['content_w_resourcePaths'])) { + $html = $field['content_w_resourcePaths']; + break; + } + } + } + $idevices[] = [ + 'id' => $idevice['_id'] ?? '', + 'type' => $idevice['_iDeviceDir'] ?? ($idevice['class_'] ?? ''), + 'title' => $idevice['_title'] ?? '', + 'text' => trim(strip_tags($html)), + 'html_code' => $html, + ]; + } + } + + $pages[] = [ + 'filename' => $filename, + 'pagename' => $title, + 'level' => $level, + 'idevices' => $idevices, + ]; + + if (isset($node['children']) && is_array($node['children'])) { + foreach ($node['children'] as $child) { + if (is_array($child)) { + $this->collectPages($child, $level + 1, $pages); + } + } + } + } + + /** + * Create a filename-friendly slug from a string + * + * @param string $text Input text + * + * @return string Slug + */ + protected function slug(string $text): string + { + $slug = removeAccents($text); + $slug = strtolower($slug); + $slug = preg_replace('/[^a-z0-9]+/', '_', $slug); + return trim($slug, '_'); + } + /** * Extract contents of an ELP file to a specified directory * @@ -502,3 +752,143 @@ public function extract(string $destinationPath): void $zip->close(); } } + +/** + * Remove accents from a string using WordPress\' implementation. + * + * This function is copied from WordPress 6.8.1 and retains its original + * copyright notice. + * + * @param string $text Text that might have accent characters. + * @param string $locale Optional. The locale to use for accent removal. + * + * @return string Filtered string with replaced characters. + * + * @author WordPress contributors + * @license GPL-2.0-or-later + * @see https://github.com/WordPress/wordpress-develop/blob/6.8.1/src/wp-includes/formatting.php + */ +function removeAccents(string $text, string $locale = ''): string +{ + if (!preg_match('/[\x80-\xff]/', $text)) { + return $text; + } + + if (seemsUtf8($text)) { + if (function_exists('normalizer_is_normalized') && function_exists('normalizer_normalize')) { + if (!normalizer_is_normalized($text)) { + $text = normalizer_normalize($text); + } + } + + $chars = [ + 'ª' => 'a', 'º' => 'o', 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', + 'Ä' => 'A', 'Å' => 'A', 'Æ' => 'AE', 'Ç' => 'C', 'È' => 'E', 'É' => 'E', + 'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', + 'Ð' => 'D', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', + 'Ö' => 'O', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ý' => 'Y', + 'Þ' => 'TH', 'ß' => 's', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', + 'ä' => 'a', 'å' => 'a', 'æ' => 'ae', 'ç' => 'c', 'è' => 'e', 'é' => 'e', + 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', + 'ð' => 'd', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', + 'ö' => 'o', 'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u', + 'ý' => 'y', 'þ' => 'th', 'ÿ' => 'y', 'Ø' => 'O', 'Ā' => 'A', 'ā' => 'a', + 'Ă' => 'A', 'ă' => 'a', 'Ą' => 'A', 'ą' => 'a', 'Ć' => 'C', 'ć' => 'c', + 'Ĉ' => 'C', 'ĉ' => 'c', 'Ċ' => 'C', 'ċ' => 'c', 'Č' => 'C', 'č' => 'c', + 'Ď' => 'D', 'ď' => 'd', 'Đ' => 'D', 'đ' => 'd', 'Ē' => 'E', 'ē' => 'e', + 'Ĕ' => 'E', 'ĕ' => 'e', 'Ė' => 'E', 'ė' => 'e', 'Ę' => 'E', 'ę' => 'e', + 'Ě' => 'E', 'ě' => 'e', 'Ĝ' => 'G', 'ĝ' => 'g', 'Ğ' => 'G', 'ğ' => 'g', + 'Ġ' => 'G', 'ġ' => 'g', 'Ģ' => 'G', 'ģ' => 'g', 'Ĥ' => 'H', 'ĥ' => 'h', + 'Ħ' => 'H', 'ħ' => 'h', 'Ĩ' => 'I', 'ĩ' => 'i', 'Ī' => 'I', 'ī' => 'i', + 'Ĭ' => 'I', 'ĭ' => 'i', 'Į' => 'I', 'į' => 'i', 'İ' => 'I', 'ı' => 'i', + 'IJ' => 'IJ','ij' => 'ij','Ĵ' => 'J', 'ĵ' => 'j', 'Ķ' => 'K', 'ķ' => 'k', + 'ĸ' => 'k', 'Ĺ' => 'L', 'ĺ' => 'l', 'Ļ' => 'L', 'ļ' => 'l', 'Ľ' => 'L', + 'ľ' => 'l', 'Ŀ' => 'L', 'ŀ' => 'l', 'Ł' => 'L', 'ł' => 'l', 'Ń' => 'N', + 'ń' => 'n', 'Ņ' => 'N', 'ņ' => 'n', 'Ň' => 'N', 'ň' => 'n', 'ʼn' => 'n', + 'Ŋ' => 'N', 'ŋ' => 'n', 'Ō' => 'O', 'ō' => 'o', 'Ŏ' => 'O', 'ŏ' => 'o', + 'Ő' => 'O', 'ő' => 'o', 'Œ' => 'OE','œ' => 'oe','Ŕ' => 'R', 'ŕ' => 'r', + 'Ŗ' => 'R', 'ŗ' => 'r', 'Ř' => 'R', 'ř' => 'r', 'Ś' => 'S', 'ś' => 's', + 'Ŝ' => 'S', 'ŝ' => 's', 'Ş' => 'S', 'ş' => 's', 'Š' => 'S', 'š' => 's', + 'Ţ' => 'T', 'ţ' => 't', 'Ť' => 'T', 'ť' => 't', 'Ŧ' => 'T', 'ŧ' => 't', + 'Ũ' => 'U', 'ũ' => 'u', 'Ū' => 'U', 'ū' => 'u', 'Ŭ' => 'U', 'ŭ' => 'u', + 'Ů' => 'U', 'ů' => 'u', 'Ű' => 'U', 'ű' => 'u', 'Ų' => 'U', 'ų' => 'u', + 'Ŵ' => 'W', 'ŵ' => 'w', 'Ŷ' => 'Y', 'ŷ' => 'y', 'Ÿ' => 'Y', 'Ź' => 'Z', + 'ź' => 'z', 'Ż' => 'Z', 'ż' => 'z', 'Ž' => 'Z', 'ž' => 'z', 'ſ' => 's', + 'Ə' => 'E', 'ǝ' => 'e', 'Ș' => 'S', 'ș' => 's', 'Ț' => 'T', 'ț' => 't', + '€' => 'E', '£' => '', 'Ơ' => 'O', 'ơ' => 'o', 'Ư' => 'U', 'ư' => 'u', + 'Ầ' => 'A', 'ầ' => 'a', 'Ằ' => 'A', 'ằ' => 'a', 'Ề' => 'E', 'ề' => 'e', + 'Ồ' => 'O', 'ồ' => 'o', 'Ờ' => 'O', 'ờ' => 'o', 'Ừ' => 'U', 'ừ' => 'u', + 'Ỳ' => 'Y', 'ỳ' => 'y', 'Ả' => 'A', 'ả' => 'a', 'Ẩ' => 'A', 'ẩ' => 'a', + 'Ẳ' => 'A', 'ẳ' => 'a', 'Ể' => 'E', 'ể' => 'e', 'Ỏ' => 'O', 'ỏ' => 'o', + 'Ổ' => 'O', 'ổ' => 'o', 'Ở' => 'O', 'ở' => 'o', 'Ủ' => 'U', 'ủ' => 'u', + 'Ử' => 'U', 'ử' => 'u', 'Ỷ' => 'Y', 'ỷ' => 'y', 'Ẫ' => 'A', 'ẫ' => 'a', + 'Ậ' => 'A', 'ậ' => 'a', 'Ắ' => 'A', 'ắ' => 'a', 'Ế' => 'E', 'ế' => 'e', + 'Ố' => 'O', 'ố' => 'o', 'Ớ' => 'O', 'ớ' => 'o', 'Ứ' => 'U', 'ứ' => 'u', + 'Ạ' => 'A', 'ạ' => 'a', 'Ậ' => 'A', 'ậ' => 'a', 'Ặ' => 'A', 'ặ' => 'a', + 'Ẹ' => 'E', 'ẹ' => 'e', 'Ệ' => 'E', 'ệ' => 'e', 'Ỉ' => 'I', 'ỉ' => 'i', + 'Ị' => 'I', 'ị' => 'i', 'Ọ' => 'O', 'ọ' => 'o', 'Ợ' => 'O', 'ợ' => 'o', + 'Ụ' => 'U', 'ụ' => 'u', 'Ỵ' => 'Y', 'ỵ' => 'y', 'Ỹ' => 'Y', 'ỹ' => 'y', + 'Ấ' => 'A', 'ấ' => 'a', 'Ắ' => 'A', 'ắ' => 'a', 'Ế' => 'E', 'ế' => 'e', + 'Ố' => 'O', 'ố' => 'o', 'Ớ' => 'O', 'ớ' => 'o', 'Ứ' => 'U', 'ứ' => 'u', + ]; + + if ('de_DE' === $locale || 'de_DE_formal' === $locale + || 'de_CH' === $locale || 'de_CH_informal' === $locale + || 'de_AT' === $locale + ) { + $chars['Ä'] = 'Ae'; + $chars['ä'] = 'ae'; + $chars['Ö'] = 'Oe'; + $chars['ö'] = 'oe'; + $chars['Ü'] = 'Ue'; + $chars['ü'] = 'ue'; + $chars['ß'] = 'ss'; + } elseif ('da_DK' === $locale) { + $chars['Æ'] = 'Ae'; + $chars['æ'] = 'ae'; + $chars['Ø'] = 'Oe'; + $chars['ø'] = 'oe'; + $chars['Å'] = 'Aa'; + $chars['å'] = 'aa'; + } elseif ('ca' === $locale) { + $chars['l·l'] = 'll'; + } elseif ('sr_RS' === $locale || 'bs_BA' === $locale) { + $chars['Đ'] = 'DJ'; + $chars['đ'] = 'dj'; + } + + return strtr($text, $chars); + } + + $chars = []; + $chars['in'] = "\x80\x83\x8a\x8e\x9a\x9e" + . "\x9f\xa2\xa5\xb5\xc0\xc1\xc2" + . "\xc3\xc4\xc5\xc7\xc8\xc9\xca" + . "\xcb\xcc\xcd\xce\xcf\xd1\xd2" + . "\xd3\xd4\xd5\xd6\xd8\xd9\xda" + . "\xdb\xdc\xdd\xe0\xe1\xe2\xe3" + . "\xe4\xe5\xe7\xe8\xe9\xea\xeb" + . "\xec\xed\xee\xef\xf1\xf2\xf3" + . "\xf4\xf5\xf6\xf8\xf9\xfa\xfb" + . "\xfc\xfd\xff"; + + $chars['out'] = 'EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy'; + + $text = strtr($text, $chars['in'], $chars['out']); + + $double_chars['in'] = ["\x8c", "\x9c", "\xc6", "\xd0", "\xde", "\xdf", "\xe6", "\xf0", "\xfe"]; + $double_chars['out'] = ['OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th']; + return str_replace($double_chars['in'], $double_chars['out'], $text); +} + +/** + * Determine if a string is valid UTF-8. + * + * @param string $str Input string. + * + * @return bool True if the string is valid UTF-8. + */ +function seemsUtf8(string $str): bool +{ + return mb_detect_encoding($str, 'UTF-8', true) !== false; +} diff --git a/tests/Fixtures/04_La_Ilustracion.elp b/tests/Fixtures/04_La_Ilustracion.elp new file mode 100644 index 0000000..069a17a Binary files /dev/null and b/tests/Fixtures/04_La_Ilustracion.elp differ diff --git a/tests/Fixtures/04_La_Ilustracion.expected.json b/tests/Fixtures/04_La_Ilustracion.expected.json new file mode 100644 index 0000000..713fa17 --- /dev/null +++ b/tests/Fixtures/04_La_Ilustracion.expected.json @@ -0,0 +1,10 @@ +{ + "version": 2, + "title": "La Ilustración", + "description": "Este recurso está dirigido al alumnado de 4º de ESO y se inserta dentro del itinerario \"El Antiguo Régimen\". Está diseñado para tener una duración de, aproximadamente, una sesión, y el objetivo principal es mostrar ampliamente las principales características de la Ilustración.", + "author": "Víctor Gómez Muñiz", + "license": "creative commons: attribution - share alike 4.0", + "language": "es", + "learningResourceType": "", + "strings": [] +} diff --git a/tests/Fixtures/04_La_Ilustracion.json b/tests/Fixtures/04_La_Ilustracion.json new file mode 100644 index 0000000..8f7520a --- /dev/null +++ b/tests/Fixtures/04_La_Ilustracion.json @@ -0,0 +1,218 @@ +{ + + "metadata": [ + { + "schema": "Package", + "content": { + "title": "La Ilustración", + "author": "Víctor Gómez Muñiz", + "language": "es", + "description": "Este recurso está dirigido al alumnado de 4º de ESO y se inserta dentro del itinerario \"El Antiguo Régimen\". Está diseñado para tener una duración de, aproximadamente, una sesión, y el objetivo principal es mostrar ampliamente las principales características de la Ilustración.", + "license": "creative commons: attribution - share alike 4.0", + "classification": "" + } + }, + { + "schema": "Dublin core", + "content": { + "title": "La Ilustración", + "author": "Víctor Gómez Muñiz", + "language": "es", + "description": "Este recurso que se presenta está dirigido al alumnado de 4º de ESO y se inserta dentro del itinerario \"El Antiguo Régimen\". Está diseñado para tener una duración de, aproximadamente, una sesión, y el objetivo principal es mostrar ampliamente las principales características de la Ilustración.", + "license": { + "rights": "" + }, + "classification": { + "source": "", + "taxon_path": [] + } + } + }, + { + "schema": "LOM v1.0", + "content": { + "title": [ + { + "text": "La Ilustración", + "language": "es" + } + ], + "author": [ + { + "name": "Víctor Gómez Muñiz", + "role": "author" + } + ], + "language": [ + { + "language": "es" + } + ], + "description": [ + { + "text": "Este recurso que se presenta está dirigido al alumnado de 4º de ESO y se inserta dentro del itinerario \"El Antiguo Régimen\". Está diseñado para tener una duración de, aproximadamente, una sesión, y el objetivo principal es mostrar ampliamente las principales características de la Ilustración.", + "language": "es" + }, + { + "text": "Este recurso está dirigido al alumnado de 4º de ESO y se inserta dentro del itinerario \"El Antiguo Régimen\". Está diseñado para tener una duración de, aproximadamente, una sesión, y el objetivo principal es mostrar ampliamente las principales características de la Ilustración.", + "language": "es" + } + ], + "rights": { + "copyright": "yes" + }, + "classification": { + "source": "", + "taxon_path": [] + } + } + }, + { + "schema": "LOM-ES v1.0", + "content": { + "title": [ + { + "text": "La Ilustración", + "language": "es" + } + ], + "author": "Víctor Gómez Muñiz", + "language": [ + { + "language": "es" + } + ], + "description": [ + { + "text": "Este recurso que se presenta está dirigido al alumnado de 4º de ESO y se inserta dentro del itinerario \"El Antiguo Régimen\". Está diseñado para tener una duración de, aproximadamente, una sesión, y el objetivo principal es mostrar ampliamente las principales características de la Ilustración.", + "language": "es" + } + ], + "rights": { + "copyright": "creative commons: attribution - share alike 4.0", + "access": { + "access_type": "universal", + "description": "Default", + "language": "en" + } + }, + "classification": [ + { + "purpose": "discipline", + "taxon_path": [ + { + "source": "arbol_curricular_LOE_2006_es", + "taxon_path": [ + { + "text": "Educación Secundaria Obligatoria", + "language": "es", + "id": "3" + }, + { + "text": "Cuarto curso", + "language": "es", + "id": "3.4" + }, + { + "text": "Ciencias Sociales, Geografía e Historia", + "language": "es", + "id": "3.4.3" + } + ] + } + ] + }, + { + "purpose": "educational level", + "taxon_path": [ + { + "source": "nivel_educativ", + "taxon_path": [ + { + "text": "Educación Secundaria Obligatoria", + "language": "es", + "id": "4" + }, + { + "text": "Cuarto curso", + "language": "es", + "id": "4.4" + } + ] + } + ] + } + + ] + } + } + ], + + + "content": { + "file": "04_La_Ilustracion.elp", + "pages": [ + { + "filename": "index.html", + "pagename": "La Ilustración", + "level": 0, + "idevices": [ + { + "id": "[Si hay un id que se pueda utilizar para identificar el iDevice, se puede incluir aquí]", + "type": "textIdevice", + "title": "Introducción", + "text": "Introducción\n\nEste recurso está dirigido al alumnado de 4º de ESO y se inserta dentro del itinerario \"El Antiguo Régimen\". Está diseñado para tener una duración de, aproximadamente, una sesión, y el objetivo principal es mostrar ampliamente las principales características de la Ilustración, un movimiento cultural del siglo XVIII que pretendía acabar con la ignorancia y superstición popular a través de la razón y de la educación\n\nLas actividades contenidas en este recurso están creadas para que el alumnado consolide los conocimientos sobre los principales rasgos e ideas ilustradas, los principales pensadores ilustrados y de la Enciclopedia. Cada apartado constará de una parte teórica, como un test o un rosco interactivo, y posteriormente diversas actividades prácticas para realizar en el aula, como el Whatsapp ilustrado. Estos ejercicios tendrán su evaluación a través de una rúbrica en la que se especifica el peso de cada una de ellas.\n\nWikimedia Commons/Anicet Charles Gabriel Lemonnier. Salón de Madame Geoffrin (Dominio público)", + "html_code": "

Este recurso está dirigido al alumnado de 4º de ESO y se inserta dentro del itinerario \"El Antiguo Régimen\". Está diseñado para tener una duración de, aproximadamente, una sesión, y el objetivo principal es mostrar ampliamente las principales características de la Ilustración, un movimiento cultural del siglo XVIII que pretendía acabar con la ignorancia y superstición popular a través de la razón y de la educación

Las actividades contenidas en este recurso están creadas para que el alumnado consolide los conocimientos sobre los principales rasgos e ideas ilustradas, los principales pensadores ilustrados y de la Enciclopedia. Cada apartado constará de una parte teórica, como un test o un rosco interactivo, y posteriormente diversas actividades prácticas para realizar en el aula, como el Whatsapp ilustrado. Estos ejercicios tendrán su evaluación a través de una rúbrica en la que se especifica el peso de cada una de ellas.

\"Salón
Wikimedia Commons/Anicet Charles Gabriel Lemonnier. Salón de Madame Geoffrin (Dominio público)
" + } + ] + }, + { + "filename": "elementos_curriculares.html", + "pagename": "Elementos curriculares", + "level": 1, + "idevices": [ + { + "id": "[Si hay un id que se pueda utilizar para identificar el iDevice, se puede incluir aquí]", + "type": "textIdevice", + "title": "", + "text": "Objetivos\n\nEnumerar los principios clásicos de la Ilustración y asimilar su influencia en el pensamiento político. \nConocer a los principales pensadores ilustrados.\nReconocer la importancia de la Enciclopedia como obra clave de la Ilustración.\n\n\nContenidos\n\nEl pensamiento ilustrado\nLa Enciclopedia\nSociedad y economía en el Siglo de las Luces\n\n\nCriterios de Evaluación\n\nBloque 1. El siglo XVIII en Europa hasta 1789\nCriterio 1\n\nConocer el alcance de la Ilustración como nuevo movimiento cultural y social en Europa y América.\n\n\nEstándares de Aprendizaje\n\nBloque 1. El siglo XVIII en Europa hasta 1789.\nEstándar 1.1\nDistingue conceptos históricos como \"Antiguo Régimen\" e \"Ilustración\".\nEstándar 3.1\nDescribe las características de la cultura de la Ilustración y qué implicaciones tiene en algunas monarquías.\n\n\nCompetencias\n\nCompetencias sociales y cívicas. CSC.\nCompetencia para aprender a aprender. CAA.\nCompetencia digital. CD.\nCompetencia en comunicación lingüística. CCL.\n\n\nLos Criterios de Evaluación y Estándares de Aprendizaje, presentados en este recurso, se han seleccionado del Real Decreto 1105/2014, de 26 de diciembre por el que se establece el currículo básico de la Educación Secundaria Obligatoria y del Bachillerato.", + "html_code": "

Objetivos

Contenidos

Criterios de Evaluación

Bloque 1. El siglo XVIII en Europa hasta 1789

Conocer el alcance de la Ilustración como nuevo movimiento cultural y social en Europa y América.

Estándares de Aprendizaje

Bloque 1. El siglo XVIII en Europa hasta 1789.

Distingue conceptos históricos como \"Antiguo Régimen\" e \"Ilustración\".

Describe las características de la cultura de la Ilustración y qué implicaciones tiene en algunas monarquías.

Competencias

Los Criterios de Evaluación y Estándares de Aprendizaje, presentados en este recurso, se han seleccionado del Real Decreto 1105/2014, de 26 de diciembre por el que se establece el currículo básico de la Educación Secundaria Obligatoria y del Bachillerato. 

" + } + ] + }, + { + "filename": "qu_fue_la_ilustracin.html", + "pagename": "¿Qué fue la Ilustración?", + "level": 1, + "idevices": [ + { + "id": "[Si hay un id que se pueda utilizar para identificar el iDevice, se puede incluir aquí]", + "type": "textIdevice", + "title": "La Ilustración", + "text": "La Ilustración fue un movimiento de carácter intelectual que tuvo lugar en Europa a lo largo del XVIII, denominado Siglo de las Luces. Los ilustrados pusieron en cuestión todos los principios del Antiguo Régimen, al tiempo que defendían la fe absoluta en la razón, es decir, la inteligencia humana como el único medio de poder entender el mundo. De esta manera, se debía rechazar aquello que no pudiera ser demostrado mediante el uso de la razón o por la experiencia, que no podían ser sustituidas en ningún caso por la tradición, la autoridad o las verdades sagradas. Aunque la Ilustración tuvo su epicentro en Francia, los precedentes de este movimiento los encontramos en Inglaterra, en pensadores como Isaac Newton y John Locke.\nLos ilustrados consideraban como último objetivo de la vida la felicidad, y creían que la humanidad podría alcanzar esa meta a través de la inteligencia y el conocimiento. Para ello, eran necesarios la educación y el progreso, todo ello, para conseguir una paulatina mejora de las condiciones de vida de la sociedad.\nEl pensamiento ilustrado criticaba la intransigencia religiosa, pues consideraba que la tolerancia debía ser la base de las relaciones humanas. Si bien es cierto que la mayoría de los ilustrados eran creyentes, negaban la superioridad de una sola religión sobre las demás. Incluso, llegaron a proponer el establecimiento de unos códigos morales cuya base fuera la razón.\nWikimedia Commons/Adolph von Menzel. Voltaire en una cena en el castillo de Sans-Souci (Dominio público)", + "html_code": "

La Ilustración fue un movimiento de carácter intelectual que tuvo lugar en Europa a lo largo del XVIII, denominado Siglo de las Luces. Los ilustrados pusieron en cuestión todos los principios del Antiguo Régimen, al tiempo que defendían la fe absoluta en la razón, es decir, la inteligencia humana como el único medio de poder entender el mundo. De esta manera, se debía rechazar aquello que no pudiera ser demostrado mediante el uso de la razón o por la experiencia, que no podían ser sustituidas en ningún caso por la tradición, la autoridad o las verdades sagradas. Aunque la Ilustración tuvo su epicentro en Francia, los precedentes de este movimiento los encontramos en Inglaterra, en pensadores como Isaac Newton y John Locke.

Los ilustrados consideraban como último objetivo de la vida la felicidad, y creían que la humanidad podría alcanzar esa meta a través de la inteligencia y el conocimiento. Para ello, eran necesarios la educación y el progreso, todo ello, para conseguir una paulatina mejora de las condiciones de vida de la sociedad.  

El pensamiento ilustrado criticaba la intransigencia religiosa, pues consideraba que la tolerancia debía ser la base de las relaciones humanas. Si bien es cierto que la mayoría de los ilustrados eran creyentes, negaban la superioridad de una sola religión sobre las demás. Incluso, llegaron a proponer el establecimiento de unos códigos morales cuya base fuera la razón.

\"Voltaire
Wikimedia Commons/Adolph von Menzel. Voltaire en una cena en el castillo de Sans-Souci (Dominio público)
" + }, + { + "id": "[Si hay un id que se pueda utilizar para identificar el iDevice, se puede incluir aquí]", + "type": "textIdevice", + "title": "Ideas de la Ilustración", + "text": "Los principales rasgos que caracterizaron a la Ilustración fueron los siguientes:\nLa superioridad de la razón por encima de todo. El conocimiento era la herramienta para el progreso, y todos los pensamientos ilustrados estaban auspiciados y protegidos por la razón.   \nEl conocimiento y el progreso hacían que la vida mejorara; por ello, uno de los principales rasgos de la Ilustración era el optimismo. El ilustrado era un pensador progresista y ilusionante, pues creía en un futuro mejor. La felicidad era el gran valor que debía tener la vida del ser humano. \nLa educación era el arma principal para llegar al progreso, y la lucha contra la ignorancia estaba asociada a la libertad. Por ello, en la Ilustración se comenzó una recopilación del conocimiento, y, posteriormente, de su divulgación a través de la Enciclopedia. \nLa Ilustración defendía la confianza en los monarcas, que a través de sus reformas, podrían hacer progresar a la sociedad. El optimismo ilustrado devenía en un optimismo en los gobernantes y el reformismo. \nLa secularización de la cultura, alejando la educación de las manos eclesiásticas. El pensamiento ilustrado cuestionaba todo aquello que no estuviera científicamente respaldado. Por eso, en ciertos aspectos, la Iglesia perdía algo de poder frente al Estado.  \nLa Ilustración planteaba que la naturaleza era buena y pura. Su estudio y diversos experimentos científicos permitieron ir explicando las leyes de la naturaleza. El pensamiento ilustrado era naturalista y antropocéntrico, pues se volvía a considerar al hombre como el centro de todo, con su capacidad de razonar y de pensar de manera crítica. ", + "html_code": "

Los principales rasgos que caracterizaron a la Ilustración fueron los siguientes:

" + }, + { + "id": "[Si hay un id que se pueda utilizar para identificar el iDevice, se puede incluir aquí]", + "type": "ClozeIdevice", + "title": "¿Sabes qué palabras faltan?", + "instructions": { + "text": "Completa el siguiente texto con las palabras que faltan", + "html_code": "

Completa el siguiente texto con las palabras que faltan

" + }, + "cloze_text": [ + // ToDo + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/tests/Fixtures/04_La_Ilustracion.metadata.expected.json b/tests/Fixtures/04_La_Ilustracion.metadata.expected.json new file mode 100644 index 0000000..a7019a9 --- /dev/null +++ b/tests/Fixtures/04_La_Ilustracion.metadata.expected.json @@ -0,0 +1,502 @@ +{ + "metadata": [ + { + "schema": "Package", + "content": { + "title": "La Ilustración", + "author": "Víctor Gómez Muñiz", + "language": "es", + "description": "Este recurso está dirigido al alumnado de 4º de ESO y se inserta dentro del itinerario \"El Antiguo Régimen\". Está diseñado para tener una duración de, aproximadamente, una sesión, y el objetivo principal es mostrar ampliamente las principales características de la Ilustración.", + "license": "creative commons: attribution - share alike 4.0", + "classification": "" + } + }, + { + "schema": "Dublin core", + "content": { + "title": "La Ilustración", + "author": "Victor Gómez Muñiz", + "language": "es", + "description": "Este recurso que se presenta está dirigido al alumnado de 4º de ESO y se inserta dentro del itinerario \"El Antiguo Régimen\". Está diseñado para tener una duración de, aproximadamente, una sesión, y el objetivo principal es mostrar ampliamente las principales características de la Ilustración.", + "license": { + "rights": "" + }, + "classification": { + "source": "", + "taxon_path": [] + } + } + }, + { + "schema": "LOM v1.0", + "content": { + "title": [ + { + "language": "es", + "valueOf_": "La Ilustraci\\xc3\\xb3n" + } + ], + "author": [], + "language": [ + { + "extensiontype_": null, + "valueOf_": "es" + } + ], + "description": [ + { + "extensiontype_": null, + "string": [ + { + "language": "es", + "valueOf_": "Este recurso que se presenta est\\xc3\\xa1 dirigido al alumnado de 4\\xc2\\xba de ESO y se inserta dentro del itinerario \\\"El Antiguo R\\xc3\\xa9gimen\\\". Est\\xc3\\xa1 dise\\xc3\\xb1ado para tener una duraci\\xc3\\xb3n de, aproximadamente, una sesi\\xc3\\xb3n, y el objetivo principal es mostrar ampliamente las principales caracter\\xc3\\xadsticas de la Ilustraci\\xc3\\xb3n." + } + ] + }, + { + "extensiontype_": null, + "string": [ + { + "language": "es", + "valueOf_": "Este recurso est\\xc3\\xa1 dirigido al alumnado de 4\\xc2\\xba de ESO y se inserta dentro del itinerario \\\"El Antiguo R\\xc3\\xa9gimen\\\". Est\\xc3\\xa1 dise\\xc3\\xb1ado para tener una duraci\\xc3\\xb3n de, aproximadamente, una sesi\\xc3\\xb3n, y el objetivo principal es mostrar ampliamente las principales caracter\\xc3\\xadsticas de la Ilustraci\\xc3\\xb3n." + } + ] + } + ], + "rights": { + "access": null, + "copyrightAndOtherRestrictions": { + "extensiontype_": null, + "source": { + "extensiontype_": null, + "string": [], + "uniqueElementName": "source", + "valueOf_": "LOMv1.0" + }, + "uniqueElementName": "copyrightAndOtherRestrictions", + "value": { + "extensiontype_": null, + "source": null, + "uniqueElementName": "value", + "value": null, + "valueOf_": "yes" + } + }, + "cost": null, + "description": null, + "uniqueElementName": "rights" + }, + "classification": [] + } + }, + { + "schema": "LOM-ES v1.0", + "content": { + "title": [ + { + "language": "es", + "valueOf_": "La Ilustraci\\xc3\\xb3n" + } + ], + "author": "", + "language": [ + { + "extensiontype_": null, + "valueOf_": "es" + } + ], + "description": [ + { + "extensiontype_": null, + "string": [ + { + "language": "es", + "valueOf_": "Este recurso que se presenta est\\xc3\\xa1 dirigido al alumnado de 4\\xc2\\xba de ESO y se inserta dentro del itinerario \\\"El Antiguo R\\xc3\\xa9gimen\\\". Est\\xc3\\xa1 dise\\xc3\\xb1ado para tener una duraci\\xc3\\xb3n de, aproximadamente, una sesi\\xc3\\xb3n, y el objetivo principal es mostrar ampliamente las principales caracter\\xc3\\xadsticas de la Ilustraci\\xc3\\xb3n." + } + ] + } + ], + "rights": { + "access": { + "accessType": { + "extensiontype_": null, + "source": { + "extensiontype_": null, + "string": [], + "uniqueElementName": "source", + "valueOf_": "LOM-ESv1.0" + }, + "uniqueElementName": "accessType", + "value": { + "extensiontype_": null, + "source": null, + "uniqueElementName": "value", + "value": null, + "valueOf_": "universal" + } + }, + "description": { + "extensiontype_": null, + "string": [ + { + "language": "en", + "valueOf_": "Default" + } + ] + }, + "uniqueElementName": "access" + }, + "copyrightAndOtherRestrictions": { + "extensiontype_": null, + "source": { + "extensiontype_": null, + "string": [], + "uniqueElementName": "source", + "valueOf_": "LOM-ESv1.0" + }, + "uniqueElementName": "copyrightAndOtherRestrictions", + "value": { + "extensiontype_": null, + "source": null, + "uniqueElementName": "value", + "value": null, + "valueOf_": "creative commons: attribution - share alike" + } + }, + "cost": null, + "description": null, + "uniqueElementName": "rights" + }, + "classification": [ + { + "description": null, + "keyword": [], + "purpose": { + "extensiontype_": null, + "source": { + "extensiontype_": null, + "string": [], + "uniqueElementName": "source", + "valueOf_": "LOM-ESv1.0" + }, + "uniqueElementName": "purpose", + "value": { + "extensiontype_": null, + "source": null, + "uniqueElementName": "value", + "value": null, + "valueOf_": "discipline" + } + }, + "taxonPath": [ + { + "source": { + "extensiontype_": null, + "string": [ + { + "language": "es", + "valueOf_": "\\xc3\\x81rbol curricular LOE 2006" + } + ], + "uniqueElementName": "source" + }, + "taxon": [ + { + "entry": { + "extensiontype_": null, + "string": [ + { + "language": "es", + "valueOf_": "Educaci\\xc3\\xb3n Secundaria Obligatoria" + } + ], + "uniqueElementName": "entry" + }, + "id": { + "uniqueElementName": "id", + "valueOf_": "3" + } + }, + { + "entry": { + "extensiontype_": null, + "string": [ + { + "language": "es", + "valueOf_": "Cuarto curso" + } + ], + "uniqueElementName": "entry" + }, + "id": { + "uniqueElementName": "id", + "valueOf_": "3.4" + } + }, + { + "entry": { + "extensiontype_": null, + "string": [ + { + "language": "es", + "valueOf_": "Ciencias Sociales, Geograf\\xc3\\xada e Historia" + } + ], + "uniqueElementName": "entry" + }, + "id": { + "uniqueElementName": "id", + "valueOf_": "3.4.3" + } + } + ] + } + ] + }, + { + "description": null, + "keyword": [], + "purpose": { + "extensiontype_": null, + "source": { + "extensiontype_": null, + "string": [], + "uniqueElementName": "source", + "valueOf_": "LOM-ESv1.0" + }, + "uniqueElementName": "purpose", + "value": { + "extensiontype_": null, + "source": null, + "uniqueElementName": "value", + "value": null, + "valueOf_": "educational level" + } + }, + "taxonPath": [ + { + "source": { + "extensiontype_": null, + "string": [ + { + "language": "es", + "valueOf_": "nivel_educativ" + } + ], + "uniqueElementName": "source" + }, + "taxon": [ + { + "entry": { + "extensiontype_": null, + "string": [ + { + "language": "es", + "valueOf_": "Educaci\\xc3\\xb3n Secundaria Obligatoria" + } + ], + "uniqueElementName": "entry" + }, + "id": { + "uniqueElementName": "id", + "valueOf_": "4" + } + }, + { + "entry": { + "extensiontype_": null, + "string": [ + { + "language": "es", + "valueOf_": "Cuarto curso" + } + ], + "uniqueElementName": "entry" + }, + "id": { + "uniqueElementName": "id", + "valueOf_": "4.4" + } + } + ] + } + ] + } + ] + } + } + ], + "content": { + "file": "04_La_Ilustracion.elp", + "pages": [ + { + "filename": "index.html", + "pagename": "La Ilustración", + "level": 0, + "idevices": [ + { + "id": "", + "type": "text", + "title": "Introducción", + "text": "Este recurso está dirigido al alumnado de 4º de ESO y se inserta dentro del itinerario \"El Antiguo Régimen\". Está diseñado para tener una duración de, aproximadamente, una sesión, y el objetivo principal es mostrar ampliamente las principales características de la Ilustración, un movimiento cultural del siglo XVIII que pretendía acabar con la ignorancia y superstición popular a través de la razón y de la educación Las actividades contenidas en este recurso están creadas para que el alumnado consolide los conocimientos sobre los principales rasgos e ideas ilustradas, los principales pensadores ilustrados y de la Enciclopedia. Cada apartado constará de una parte teórica, como un test o un rosco interactivo, y posteriormente diversas actividades prácticas para realizar en el aula, como el Whatsapp ilustrado. Estos ejercicios tendrán su evaluación a través de una rúbrica en la que se especifica el peso de cada una de ellas. Wikimedia Commons\/Anicet Charles Gabriel Lemonnier. Salón de Madame Geoffrin (Dominio público)", + "html_code": "

Este recurso está dirigido al alumnado de 4º de ESO y se inserta dentro del itinerario \"El Antiguo Régimen\"<\/strong>. Está diseñado para tener una duración de, aproximadamente, una sesión<\/strong>, y el objetivo principal es mostrar ampliamente las principales características de la Ilustración,<\/strong> un movimiento cultural del siglo XVIII que pretendía acabar con la ignorancia y superstición popular a través de la razón y de la educación
<\/span><\/p>

Las actividades contenidas en este recurso están creadas para que el alumnado consolide los conocimientos sobre los principales rasgos e ideas ilustradas, los principales pensadores ilustrados y de la Enciclopedia. Cada apartado constará de una parte teórica, como un test o un rosco interactivo, y posteriormente diversas actividades prácticas para realizar en el aula, como el Whatsapp<\/em> ilustrado. Estos ejercicios tendrán su evaluación a través de una rúbrica en la que se especifica el peso de cada una de ellas.<\/p>

\"Salón
Wikimedia Commons\/Anicet Charles Gabriel Lemonnier<\/a>. Salón de Madame Geoffrin<\/em><\/a> (<\/span>Dominio público<\/span>)<\/span><\/span><\/figcaption> <\/figure><\/div>" + } + ] + }, + { + "filename": "elementos_curriculares.html", + "pagename": "Elementos curriculares", + "level": 1, + "idevices": [ + { + "id": "", + "type": "text", + "title": "", + "text": "Objetivos Enumerar los principios clásicos de la Ilustración y asimilar su influencia en el pensamiento político. Conocer a los principales pensadores ilustrados. Reconocer la importancia de la Enciclopedia como obra clave de la Ilustración. Contenidos El pensamiento ilustrado La Enciclopedia Sociedad y economía en el Siglo de las Luces Criterios de Evaluación Bloque 1. El siglo XVIII en Europa hasta 1789 Criterio 1 Conocer el alcance de la Ilustración como nuevo movimiento cultural y social en Europa y América. Estándares de Aprendizaje Bloque 1. El siglo XVIII en Europa hasta 1789. Estándar 1.1 Distingue conceptos históricos como \"Antiguo Régimen\" e \"Ilustración\". Estándar 3.1 Describe las características de la cultura de la Ilustración y qué implicaciones tiene en algunas monarquías. Competencias Competencias sociales y cívicas. CSC. Competencia para aprender a aprender. CAA. Competencia digital. CD. Competencia en comunicación lingüística. CCL. Los Criterios de Evaluación y Estándares de Aprendizaje, presentados en este recurso, se han seleccionado del Real Decreto 1105\/2014, de 26 de diciembre por el que se establece el currículo básico de la Educación Secundaria Obligatoria y del Bachillerato. ", + "html_code": "

Objetivos<\/h2>