{"id":20551654,"url":"https://github.com/do-community/learning-labs","last_synced_at":"2026-04-22T09:31:21.009Z","repository":{"id":51335651,"uuid":"362785449","full_name":"do-community/learning-labs","owner":"do-community","description":"LearningLabs is a Shark-a-Hack 2021-Q1 Project","archived":false,"fork":false,"pushed_at":"2021-05-26T15:10:47.000Z","size":41554,"stargazers_count":5,"open_issues_count":1,"forks_count":2,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-04-21T12:47:59.460Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"CSS","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/do-community.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-04-29T10:55:57.000Z","updated_at":"2021-05-26T15:10:50.000Z","dependencies_parsed_at":"2022-08-27T16:30:38.877Z","dependency_job_id":null,"html_url":"https://github.com/do-community/learning-labs","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/do-community/learning-labs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/do-community%2Flearning-labs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/do-community%2Flearning-labs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/do-community%2Flearning-labs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/do-community%2Flearning-labs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/do-community","download_url":"https://codeload.github.com/do-community/learning-labs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/do-community%2Flearning-labs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32129579,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-22T08:34:57.708Z","status":"ssl_error","status_checked_at":"2026-04-22T08:34:55.583Z","response_time":58,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":"2024-11-16T02:32:54.350Z","updated_at":"2026-04-22T09:31:20.992Z","avatar_url":"https://github.com/do-community.png","language":"CSS","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DevEd LearningLabs\nLearningLabs is an experimental project created for Shark-a-Hack 2021-q1, the internal hackaton from DigitalOcean.\nThis is a space for experimentation in alternative ways to present educational content we have in our community website.\n\n![Screenshot from 2021-04-29 15-14-19](https://user-images.githubusercontent.com/293241/116556419-b57d1d80-a8fd-11eb-9465-81d8af0ccfc2.png)\n\nLearningLabs is built with [Librarian](https://github.com/librarianphp/librarian).\n\n## Installation\nTo run LearningLabs locally, you'll need a development environment with the following:\n\n- PHP 7.4+ (cli only)\n- [Composer](https://getcomposer.org)\n\nThis can be accomplished with the Docker setup that is included in the repository. In this case, you'll need to have Docker and Docker Compose installed locally.\n\nStart by cloning this repository:\n\n```shell\ngit clone https://github.com/do-community/learning-labs\ncd learning-labs\n```\n\nIf you are running LearningLabs with Docker, you should get your environment up and running now with:\n\n```shell\ndocker-compose up -d\n```\nThen run `composer install` to install the PHP dependencies. \n\n### With Docker Compose\n```command\ndocker-compose exec app composer install\n```\n\nThen you can access the application from your browser at `localhost:8000`.\n\n### With a local PHP server\n```command\ncomposer install\n```\nThen, you can run the built-in PHP web server with:\n\n```shell\nphp -S 0.0.0.0:8000 -t web/\n```\n\nYou can now access the application from your browser at `localhost:8000`.\n\n### Customizing Layouts\n\nTo customize the views, you'll need to be able to compile CSS assets and that requires `npm` running on your development environment. Otherwise you won't have access to all that Tailwind has to offer!\n\nTo install Tailwind dependencies, run:\n\n```shell\nnpm install\n```\nTo compile the CSS assets (needed when you make significant changes to the layout), run:\n\n```shell\nnpm run dev\n```\n\n## Creating Content\nContent uses overall the same format of DEV.to posts, but the front matter is fluid and can be customized for your needs.\n\nAll content should be organized into subdirectories inside `app/Resources/data`. The name of the subdirectory is used as content type, so right now we have:\n\n- `app/Resources/data/glossary` - glossary entries following the convention `name-of-term.md`. So the URL for these will be `/glossary/name-of-term`\n- `app/Resources/data/_p` - pages like \"about\".\n\nIf you want to create a new content type, you just need to create a new directory there, and store your `.md` files for that content in there.\n\n### Contributing with the Audio Glossary\n\nThe audio glossary is based on our [glossary](https://www.digitalocean.com/community/tags/glossary) tutorials. These are short tutorials explaining a concept. \nYou can contribute by recording the audio voice-over for a glossary item and sending a PR with:\n\n- audio in MP3 format named after the glossary term name (ex: `ansible.mp3`), placed on `web/audio`\n- new `.md` file named after the glossary term name (ex: `ansible.md`), placed on `data/glossary`\n\nYou can use the `ansible` glossary entry as reference: [data/glossary/ansible.md](https://raw.githubusercontent.com/do-community/learning-labs/main/app/Resources/data/glossary/ansible.md) \n\n### Liquid Tags Currently Supported:\n\n- **DigitalOcean Tutorial (custom tag):**\n  - {% tutorial how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-20-04 %}\n- **Local Audio:** \n  - {% audio /audio/test_cafe.mp3 %}\n- **Local Video:**\n  - {% video /video/test.mp4 %}\n- **Tweet:**\n  - {% twitter 1387740559385767941 %}\n- **GitHub File:**\n  - {% github https://github.com/librarianphp/librarian/blob/main/web/.htaccess %}\n- **YouTube Video:**\n  - {% youtube iom_nhYQIYk %}\n\n## Creating Custom Liquid Tags\n\nLiquid tags are classes that implement the `CustomTagParserInterface`. They need to implement a method named `parse`, which receives the string provided to the liquid tag when called from the markdown file.\nFor instance, this is the full code for the `video` liquid tag parser class:\n\n```php\n\u003c?php\n#src/CustomTagParser/VideoTagParser.php\n\nnamespace Parsed\\CustomTagParser;\n\nuse Parsed\\CustomTagParserInterface;\n\nclass VideoTagParser implements CustomTagParserInterface\n{\n    public function parse($tag_value, array $params = [])\n    {\n        return \"\u003cvideo controls\u003e\" .\n         \"\u003csource src=\\\"$tag_value\\\" type=\\\"video/mp4\\\"\u003e\" .\n         \"Your browser does not support the video tag.\" .\n         \"\u003c/video\u003e\";\n    }\n}\n```\n\nYou'll have to include your custom tag parser class within the ContentParser:\n\n```php\n$parser = new \\Parsed\\ContentParser();\n$parser-\u003eaddCustomTagParser('video', new VideoTagParser());\n```\n_Note: The built-in tag parsers are already registered within ContentParser. These are: `video`, `audio`, `twitter`, `youtube` and `github`._\n\n\nFor instance, if you have in your markdown:\n\n```\n{% video /videos/test.mp4 %}\n```\n\nIt will convert to the tag into the following code:\n\n```html\n\u003cvideo controls\u003e\n   \u003csource src=\"/videos/test.mp4\" type=\"video/mp4\"\u003e\n    Your browser does not support the video tag.\n\u003c/video\u003e\n```\n\n### About Librarian\n[Librarian](https://github.com/librarianphp/librarian) is a stateless CMS / document indexer based on static markdown files.\n\n* No database\n* No sessions\n* No users\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdo-community%2Flearning-labs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdo-community%2Flearning-labs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdo-community%2Flearning-labs/lists"}