{"id":28502924,"url":"https://github.com/googleworkspace/classroomrosetta","last_synced_at":"2025-07-05T11:30:36.089Z","repository":{"id":297953657,"uuid":"992310505","full_name":"googleworkspace/classroomrosetta","owner":"googleworkspace","description":null,"archived":false,"fork":false,"pushed_at":"2025-06-08T14:41:07.000Z","size":38339,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-08T15:31:06.651Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/googleworkspace.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-29T00:32:37.000Z","updated_at":"2025-06-08T14:41:12.000Z","dependencies_parsed_at":"2025-06-08T15:42:13.840Z","dependency_job_id":null,"html_url":"https://github.com/googleworkspace/classroomrosetta","commit_stats":null,"previous_names":["googleworkspace/classroomrosetta"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/googleworkspace/classroomrosetta","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/googleworkspace%2Fclassroomrosetta","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/googleworkspace%2Fclassroomrosetta/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/googleworkspace%2Fclassroomrosetta/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/googleworkspace%2Fclassroomrosetta/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/googleworkspace","download_url":"https://codeload.github.com/googleworkspace/classroomrosetta/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/googleworkspace%2Fclassroomrosetta/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263733296,"owners_count":23503136,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-08T16:38:34.410Z","updated_at":"2025-07-05T11:30:36.083Z","avatar_url":"https://github.com/googleworkspace.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# IMSCC to Google Classroom Converter - Project Synopsis\n\n## Overview\n\nThis project is designed to facilitate the migration of course content from learning management systems (LMS) that export in the IMS Common Cartridge (IMSCC) format to Google Classroom. It aims to automate the conversion of various IMSCC package components into compatible Google Classroom assignments, materials, and structures.\n\n## Core Functionality: IMSCC Parsing Helper Service\n\nA key component of this system is the **IMSCC Parsing Helper Service**. This service is responsible for the initial processing and interpretation of the unzipped IMSCC package contents. Its primary functions include:\n\n* **Manifest Parsing:** Reading and interpreting the `imsmanifest.xml` file, which serves as the blueprint for the course structure and its resources.\n* **Metadata Extraction:** Extracting crucial metadata from the manifest and associated resource files. This includes:\n    * Course titles.\n    * Module/Item titles (using LOM - Learning Object Metadata - standards where available, and handling various LOM versions and namespaces).\n    * Resource-specific information.\n* **Content Extraction:**\n    * Identifying and extracting HTML content from discussion topics (`imsdt_v1p1` schema), which often contains the core instructional text.\n    * Extracting URLs from web link resources (`imswl_v1p2` schema).\n* **Resource Identification \u0026 Handling:**\n    * Identifying different types of resources within the package, such as:\n        * Discussion Topics\n        * Web Links\n        * QTI (Question \u0026 Test Interoperability) assessments/quizzes (though the detailed conversion is handled by other services).\n        * General web content and files.\n    * Resolving relative file paths specified in the manifest and HTML content to locate actual files within the package.\n* **Data Cleaning and Preparation:**\n    * Decoding URI components and HTML entities to ensure content is correctly interpreted.\n    * Sanitizing names (e.g., for topics, assignments) to be compatible with Google Classroom requirements.\n    * Pre-processing HTML content to normalize certain tags (e.g., `\u003cbr\u003e`) and clean up common artifacts (e.g., redundant links wrapping images) before further conversion or display.\n* **Utility Functions:** Providing various helper functions for path manipulation, MIME type detection (in conjunction with other services), and handling character encoding issues (like BOM or Cyrillic path corrections).\n\n## Goal\n\nThe ultimate goal is to provide a streamlined workflow for educators to transfer their existing course materials from IMSCC-compliant platforms into Google Classroom, minimizing manual effort and preserving as much of the original course structure and content fidelity as possible. The `ImsccParsingHelperService` lays the groundwork for this by making the complex IMSCC structure understandable and usable by subsequent conversion and API interaction services.\n\n\n## Installation\n\nA GCP project is needed to run this project. Billing needs to be applied to work with Firebase. Firebase hosting is used to host the application which rund client side.\n\n1. Install Firebase Cli\n```\nnpm install -g firebase-tools\n```\n\n2. Create a directory\n```\nmkdir classroomrosetta\ncd classroomrosetta\n```\n\n3. Pull the github project\n```\ngit clone https://github.com/xxxxxxx\n```\n\n4. Initialize Node\n```\nnpm install\n```\n\n5. Initialize Firebase\n```\nfirebase init\n```\n\n6. Enable the Google Authentication in the Firebase\n\n7. Configure the .env file and replace as much as is available.\n```\nPROJECT_NAME=\u003cProject name\u003e\nGCLOUD_PROJECT_ID=\u003cProject name\u003e\nAPP_NAME=\u003cApp name for angular\u003e\nDIST_PATH=\u003cDistribution path\u003e\nFIREBASE_API_KEY=\u003cFirebase API key from the firebase console\u003e\nFIREBASE_AUTH_DOMAIN=\u003cfirebase domain\u003e\nFIREBASE_PROJECT_ID=\u003cProject name\u003e\nFIREBASE_STORAGE_BUCKET=\u003cFirebase storage Bucket\u003e\nFIREBASE_MESSAGING_SENDER_ID=\u003cFirebase messaging sender id\u003e\nFIREBASE_APP_ID=\u003cFirebase app id\u003e\nFIREBASE_CLIENT_ID=\u003cFirebase client id for the Google Authentication\u003e\nAPPS_SCRIPT_EXECUTION_API_URL=\u003cDeployed Apps Script API URL\u003e\n```\n\n8. Deploy using the Gulp Command\n```\ngulp fullSetupAndDeploy\n```\n\n9. Deploy the Apps Script file as an API. The project will need the OAuth consent screent completed for internal use and the project number associated in the settings. Replace the APPS_SCRIPT_EXECUTION_API_URL with the API url.\n\n10. Run the Gulp deployment again.\n```\ngulp fullSetupAndDeploy\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoogleworkspace%2Fclassroomrosetta","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgoogleworkspace%2Fclassroomrosetta","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoogleworkspace%2Fclassroomrosetta/lists"}