Giter Site home page Giter Site logo

elixirschool / school_house Goto Github PK

View Code? Open in Web Editor NEW
148.0 8.0 46.0 11.42 MB

The new era of Elixir School now powered by @phoenixframework

Home Page: https://elixirschool.com/

License: Apache License 2.0

Elixir 44.10% CSS 4.64% JavaScript 5.88% Dockerfile 1.29% Makefile 0.24% HTML 43.53% Shell 0.31%
elixir-lang phoenix-framework tailwindcss tailwindui static-site lessons education learning hacktoberfest

school_house's Introduction

Elixir School

Elixir School is the premier destination for people seeking to learn and master the Elixir programming language.

You can access lessons at ElixirSchool.com.

Feedback and participation are strongly encouraged! Please see Contributing for more details on how to get involved.

Running Locally

This repository only contains the lessons and blog posts hosted on Elixir School. To run the Elixir School website locally, find the code and setup instructions in the school_house repository.

Translating a Lesson

  1. Each of the languages has a folder in lessons/ directory of this repo. To start translating you need to copy a file from the English language to the corresponding folder in your language and start translating it.

  2. Check the translation report for pages that haven't been translated yet, or for pages which need to have their translations updated in the corresponding language you want to work with.

  3. Translated lessons must include page metadata.

    • title should be a translation of the original lesson's title.
    • version should be set to the original English version.

    For example lessons/ja/basics/basics.md:

---
title: 基本
version: 1.0.0
---
  1. Submit a PR with the new translated lesson 🎉

Posting an Article

Elixir School is powered by Phoenix and NimblePublisher, a publishing engine that supports Markdown formatting. If you're familiar with Phoenix & NimblePublisher then you're ready to go, if you aren't don't fret we're here to help!

  1. We need to create the file for our article. Blog posts live in the posts/ directory. Our filename will need to confirm to the YYYY-MM-DD-name-separated-with-hyphens.md pattern.

  2. After opening the new file in our favorite editor we need to add some metadata to the top of it:

%{
  author: "Author Name",
  author_link: "https://github.com/author_github_account",
  tags: ["phoenix"],
  date: ~D[YYYY-MM-DD],
  title: "Full Article Title",
  excerpt: """
  Article short preview text
  """
}
---
  1. Once we've completed writing our post submit a pull request to have it reviewed before it is published.

school_house's People

Contributors

39hn avatar a5hk avatar brehen avatar brooklinjazz avatar btkostner avatar burden avatar codeanpeace avatar cristineguadelupe avatar danielsoro avatar doomspork avatar eksperimental avatar fabianskier avatar fmterrorf avatar jaimeiniesta avatar kianmeng avatar kimihito avatar kinson avatar lubien avatar maxbeizer avatar maxdevjs avatar msutkowski avatar rastopyr avatar rsmidt avatar sbinlondon avatar sujinleeme avatar tenshikiri avatar thth avatar vclayton avatar yuriamm avatar yxshv avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

school_house's Issues

Table of contents fails on international characters

Detected on https://rocketvalidator.com/s/4ec0b390-f775-4db1-87a4-ced8f5ece619/p/4686420/i

It looks like the tables of contents for lessons does not generate the headings when those contain non-English characters.

While in the legacy site it works fine:

https://elixirschool.com/es/lessons/specifics/mnesia/#inicialización-de-datos-y-migración

the beta site doesn't work OK:

https://beta.elixirschool.com/es/storage/mnesia

Captura de pantalla 2021-07-29 a las 13 22 03

Headings containing non-English characters like "inicialización" are not being generated.

Dark mode white flash

How can we avoid that white flash when browsing in dark mode?

I'm not sure how the dark mode is activated, but it looks like each request renders the pages in white mode and then it's switched to dark, which is quite confusing.

Road to Launch

I'm going to use this issue to outline what remains to get this iteration of Elixir School live 🚀

Must Have

  1. Update Lessons menu to be more responsive. cc @burden
  2. Move gettext into external repo to keep translation materials together. Note: The downside here is keeping them updated. I will tackle this.
  3. Automated deploys for changes to both repositories #20
  4. Announcement blog post

Nice to Have

  1. Add code examples to homepage and Why Elixir? pages #32
  2. Blog RSS feed. We have this currently so it would be a loss of functionality for a short time. I could see this being move to Must Have. #54
  3. Sitemap.xml #62
  4. Expand on the Why Elixir and homepage copy
  5. Document project

HTML issues with meta tags

The most common HTML issues we have are related with <meta> tags generated by Phoenix:

https://rocketvalidator.com/s/0bdee490-cff7-495a-95a3-40211cd2b5cd/i?search=meta

There are all sort of issues but in the end it's just one line in the layout:

https://github.com/elixirschool/school_house/blob/master/lib/school_house_web/templates/layout/root.html.leex#L6

<%= csrf_meta_tag() %>

This function comes from PhoenixHTML, and is documented here:

https://hexdocs.pm/phoenix_html/Phoenix.HTML.Tag.html#csrf_meta_tag/0

Now, trouble with this meta tag is that the W3C HTML Validator says it's malformed. You can see by yourself on https://validator.w3.org/nu/#textarea and checking this example HTML:

<!DOCTYPE html>
<html lang="">
<head>
<title>Test</title>
<meta charset="UTF-8" content="ASonEyRBAAJaA2srAAZrZlkhYmYeGHUFHdsgU5uN9iYdN_3_tRV_njE_" csrf-param="_csrf_token" method-param="_method" name="csrf-token">
</head>
<body>
<p></p>
</body>
</html>

This raises 4 errors:

  • Attribute csrf-param not allowed on element meta at this point.
  • Attribute method-param not allowed on element meta at this point.
  • Attribute name not allowed on element meta at this point.
  • Attribute content not allowed on element meta at this point.

I see those options:

1.- Muting all those issues

We can just accept that this is generated by Phoenix so we won't fix those issues, and just mute them.

2.- Try to generate valid meta tags

What I do on the RV site is change it to:

<meta charset="UTF-8">
<meta content="<%= get_csrf_token() %>" name="csrf-token">

which fixes the issues, it moves the charset declaration to its own tag as expected, and simplifies the one for the CSRF token. But we would be missing the csrf-param="_csrf_token" method-param="_method" which I'm not sure how they're generated.

What do you think?

Implement dark mode

This is a popular feature on the existing site, we should be sure to port it. I believe TailwindCSS has something built in to make this easier 🤞

Improve responsiveness

The focus has been just the desktop experience so far. We need to revisit all of the markup to improve the tablet and phone experience.

Add a Conferences directory

I'd like to add a page that lists conferences for Elixir and the BEAM ecosystem. A couple thoughts we could think about and consider:

  1. Allow sorting by country
  2. Online vs in-person sorting
  3. List each time and place the conference has occurred. This helps people tell which ones are established and which are newer.
  4. Consider listing previous talks and link to the videos/content?
  5. ???

Enable Filtering for Blog Posts

Right now in the footer of the website there are three links that should link to a list of blog posts filtered by their associated tag. We need to implement the filtering logic and update the following links:

  • Blog > Announcements
  • Blog > Today I Learned
  • Blog > Reviews

Split from #73

HTML / Accessibility validation

Hello!

As we talked in #35 we're using Rocket Validator to check for HTML and Accessibility issues in the new site for Elixir School.

I've set up a weekly schedule to run site-wide reports, and the new domain stats feature (now in beta) gives the latest reports run for that domain, and some nice stats showing the evolution in the number of issues and check coverage.

Here's the direct link to the latest stats and reports for that domain:

https://rocketvalidator.com/domains/elixirschool.com?auth=171c6160-f0a2-49d9-b83f-065c15c8a072

@doomspork feel free to replace this with your own shared link, so that we get the data from reports in your account, which I believe should be our main reference.

RuntimeError

Message

  ** (RuntimeError) expected action/2 to return a Plug.Conn, all plugs must receive a connection (conn) and return a connection, got: nil

Backtrace (last 10 lines)

lib/school_house_web/controllers/post_controller.ex:1 SchoolHouseWeb.PostController.phoenix_controller_pipeline/2
lib/phoenix/router.ex:352 Phoenix.Router.__call__/2
lib/school_house_web/endpoint.ex:1 SchoolHouseWeb.Endpoint.plug_builder_call/2
lib/school_house_web/endpoint.ex:3 anonymous fn/3 in SchoolHouseWeb.Endpoint."call (overridable 3)"/2
lib/appsignal/instrumentation.ex:10 Appsignal.Instrumentation.instrument/1
lib/school_house_web/endpoint.ex:1 SchoolHouseWeb.Endpoint."call (overridable 4)"/2
lib/plug/error_handler.ex:65 SchoolHouseWeb.Endpoint.call/2
lib/phoenix/endpoint/cowboy2_handler.ex:65 Phoenix.Endpoint.Cowboy2Handler.init/4

View on AppSignal: https://appsignal.com/elixirschool/sites/6073b19e14ad66590ce95ae9/exceptions/incidents/8?timestamp=2021-04-15T10:05:21Z

Duplicate IDs in table of contents

There are some duplicate IDs generated by the table of contents for the lessons:

https://rocketvalidator.com/s/0bdee490-cff7-495a-95a3-40211cd2b5cd/i?search=duplicate+ID

For example, in https://beta.elixirschool.com/en/ecto/associations there are 2 sections titled "Many to Many":

  • Types of Associations > Many To Many
  • Saving Associated Data > Many To Many

Captura de pantalla 2021-07-25 a las 18 45 44

Clicking on those will always get you to the first one, as the second is a duplicate.

In order to fix this we need to give a unique ID to each section. I'm not sure how to do that, maybe including numbers, like:

  1. Set Up
  2. Types of Associations
    2.1 Belongs To/Has Many
    2.2.1 The Has Many Migration
    2.2.1 The Has Many Schema

...

Error on populate_surrounding_lessons

Some lesson URLs are raising an error:

https://beta.elixirschool.com/ru/ecto/querying_basics

[error] #PID<0.18017.0> running SchoolHouseWeb.Endpoint (connection #PID<0.18016.0>, stream id 1) terminated
Server: elixirschool-jaime.ngrok.io:80 (http)
Request: GET /ru/ecto/querying_basics
** (exit) an exception was raised:
    ** (ArithmeticError) bad argument in arithmetic expression
        (school_house 0.1.0) lib/school_house/lessons.ex:113: SchoolHouse.Lessons.populate_surrounding_lessons/1
        (school_house 0.1.0) lib/school_house/lessons.ex:48: SchoolHouse.Lessons.get/3
        (school_house 0.1.0) lib/school_house_web/controllers/lesson_controller.ex:16: SchoolHouseWeb.LessonController.lesson/2
        (school_house 0.1.0) lib/school_house_web/controllers/lesson_controller.ex:1: SchoolHouseWeb.LessonController.action/2
        (school_house 0.1.0) lib/school_house_web/controllers/lesson_controller.ex:1: SchoolHouseWeb.LessonController.phoenix_controller_pipeline/2
        (phoenix 1.5.9) lib/phoenix/router.ex:352: Phoenix.Router.__call__/2
        (school_house 0.1.0) lib/school_house_web/endpoint.ex:1: SchoolHouseWeb.Endpoint.plug_builder_call/2
        (school_house 0.1.0) lib/school_house_web/endpoint.ex:3: anonymous fn/3 in SchoolHouseWeb.Endpoint."call (overridable 3)"/2
        (appsignal 2.1.7) lib/appsignal/instrumentation.ex:10: Appsignal.Instrumentation.instrument/1
        (school_house 0.1.0) lib/plug/debugger.ex:136: SchoolHouseWeb.Endpoint."call (overridable 4)"/2
        (school_house 0.1.0) lib/school_house_web/endpoint.ex:1: SchoolHouseWeb.Endpoint."call (overridable 5)"/2
        (school_house 0.1.0) lib/plug/error_handler.ex:65: SchoolHouseWeb.Endpoint.call/2
        (phoenix 1.5.9) lib/phoenix/endpoint/cowboy2_handler.ex:65: Phoenix.Endpoint.Cowboy2Handler.init/4
        (cowboy 2.9.0) /Users/jaime/code/elixirschool/school_house/deps/cowboy/src/cowboy_handler.erl:37: :cowboy_handler.execute/2
        (cowboy 2.9.0) /Users/jaime/code/elixirschool/school_house/deps/cowboy/src/cowboy_stream_h.erl:306: :cowboy_stream_h.execute/3
        (cowboy 2.9.0) /Users/jaime/code/elixirschool/school_house/deps/cowboy/src/cowboy_stream_h.erl:295: :cowboy_stream_h.request_process/3
        (stdlib 3.14.2) proc_lib.erl:226: :proc_lib.init_p_do_apply/3

Locale menu generates broken links

When working at validation I was surprised to see that Rocket Validator had found 4,273 web pages in the site so I decided to have a look at the list of web pages found.

Captura de pantalla 2021-07-23 a las 10 35 48

The web page URLS definitely look weird:

Captura de pantalla 2021-07-23 a las 10 36 34

"announcemtat", "announcemvit", "phonoix", "phoplix"... That seems to be caused by the way we're generating the URLs for the pages in other languages, changing "en" by the language code:

  • phoenix -> phoplix ("en" -> "pl")

When a page can't be found, the site is still responding with 200 OK instead of 404 Not Found as it should, which explains why Rocket Validator picked the web page and still validated the content:

➔ curl -i https://beta.elixirschool.com/blog/elixirconf-announcemskt
HTTP/2 200 
date: Fri, 23 Jul 2021 08:43:18 GMT

So in order to fix this we need to:

1.- Fix locale menu URLs
2.- Return 404 on pages not found

I'll work on that.

Phoenix.Template.UndefinedError happened in SchoolHouseWeb.LessonController#lesson

Message

  ** (Phoenix.Template.UndefinedError) Could not render "404.html" for SchoolHouseWeb.LessonView, please define a matching clause for render/2 or define a template at "lib/school_house_web/templates/lesson/*". The following templates were compiled:

* _section_header.html
* lesson.html

Assigns:

%{conn: %Plug.Conn{adapter: {Plug.Cowboy.Conn, :...}, assigns: %{layout: {SchoolHouseWeb.LayoutView, "app.html"}}, before_send: [#Function<0.36096693/1 in Plug.CSRFProtection.call/2>, #Function<2.107009429/1 in Phoenix.Controller.fetch_flash/2>, #Function<0.29283909/1 in Plug.Session.before_send/2>, #Function<0.24098476/1 in Plug.Telemetry.call/2>], body_params: %{}, cookies: %{}, halted: false, host: "beta.elixirschool.com", method: "GET", owner: #PID<0.3709.0>, params: %{"locale" => "ar", "name" => "documartation", "section" => "basics"}, path_info: ["ar", "basics", "documartation"], path_params: %{"locale" => "ar", "name" => "documartation", "section" => "basics"}, port: 80, private: %{SchoolHouseWeb.Router => {[], %{}}, :phoenix_action => :lesson, :phoenix_controller => SchoolHouseWeb.LessonController, :phoenix_endpoint => SchoolHouseWeb.Endpoint, :phoenix_flash => %{}, :phoenix_format => "html", :phoenix_layout => {SchoolHouseWeb.LayoutView, :app}, :phoenix_request_logger => {"request_logger", "request_logger"}, :phoenix_root_layout => {SchoolHouseWeb.LayoutView, :root}, :phoenix_router => SchoolHouseWeb.Router, :phoenix_template => "404.html", :phoenix_view => SchoolHouseWeb.LessonView, :plug_session => %{}, :plug_session_fetch => :done}, query_params: %{}, query_string: "", remote_ip: {0, 0, 0, 0, 0, 65535, 2590, 10351}, req_cookies: %{}, req_headers: [{"accept-encoding", "gzip"}, {"cdn-loop", "cloudflare"}, {"cf-connecting-ip", "100.24.30.204"}, {"cf-ipcountry", "US"}, {"cf-ray", "63fda754adf6551e-EWR"}, {"cf-request-id", "097266e8ea0000551e18976000000001"}, {"cf-visitor", "{\"scheme\":\"https\"}"}, {"connect-time", "1"}, {"connection", "close"}, {"host", "beta.elixirschool.com"}, {"total-route-time", "0"}, {"user-agent", "RocketValidator/Spider (+https://rocketvalidator.com)"}, {"via", "1.1 vegur"}, {"x-forwarded-for", "100.24.30.204, 162.158.62.42"}, {"x-forwarded-port", "80"}, {"x-forwarded-proto", "http"}, {"x-request-id", "8459bf4c-b512-4983-bf71-c056aa104644"}, {"x-request-start", "1618410852637"}], request_path: "/ar/basics/documartation", resp_body: nil, resp_cookies: %{}, resp_headers: [{"cache-control", "max-age=0, private, must-revalidate"}, {"x-request-id", "8459bf4c-b512-4983-bf71-c056aa104644"}, {"x-frame-options", "SAMEORIGIN"}, {"x-xss-protection", "1; mode=block"}, {"x-content-type-options", "nosniff"}, {"x-download-options", "noopen"}, {"x-permitted-cross-domain-policies", "none"}, {"cross-origin-window-policy", "deny"}], scheme: :http, script_name: [], secret_key_base: :..., state: :unset, status: nil}, view_module: SchoolHouseWeb.LessonView, view_template: "404.html"}

Assigned keys: [:conn, :view_module, :view_template]

Backtrace (last 10 lines)

lib/phoenix/template.ex:337 Phoenix.Template.raise_template_not_found/3
lib/appsignal/instrumentation.ex:10 Appsignal.Instrumentation.instrument/1
lib/phoenix/view.ex:310 Phoenix.View.render_within/3
lib/phoenix/controller.ex:788 Phoenix.Controller.render_with_layouts/4
lib/phoenix/controller.ex:776 Phoenix.Controller.render_and_send/4
lib/school_house_web/controllers/lesson_controller.ex:1 SchoolHouseWeb.LessonController.action/2
lib/school_house_web/controllers/lesson_controller.ex:1 SchoolHouseWeb.LessonController.phoenix_controller_pipeline/2
lib/phoenix/router.ex:352 Phoenix.Router.__call__/2

View on AppSignal: https://appsignal.com/elixirschool/sites/6073b19e14ad66590ce95ae9/exceptions/incidents/7?timestamp=2021-04-14T14:34:12Z

Populate Remaining Empty Links

There are several links on the home page that have no corresponding page on the website. @doomspork should we create new pages for each of them?

Here are the ones I've noticed - I may be missing a few:

Header:

  • Get Involved
  • Support

Footer:

  • Blog > Announcements
  • Blog > Today I Learned
  • Blog > Reviews
  • Project > Contributors
  • Project > Get Involved
  • Project > Support

Error during make setup

I was setting up the repo and run into this when running make setup:

== Compilation error in file lib/school_house/lessons.ex ==
** (ArgumentError) argument error
    :erlang.binary_to_integer("Elixir School")
    (elixir 1.12.0) lib/enum.ex:1553: Enum."-map/2-lists^map/1-0-"/2
    lib/school_house/content/lesson.ex:77: SchoolHouse.Content.Lesson.parse_version/1
    lib/school_house/content/lesson.ex:36: SchoolHouse.Content.Lesson.build/3
    (nimble_publisher 0.1.1) lib/nimble_publisher.ex:44: anonymous fn/3 in NimblePublisher.__extract__/2
    (elixir 1.12.0) lib/enum.ex:2356: Enum."-reduce/3-lists^foldl/2-0-"/3
    (nimble_publisher 0.1.1) lib/nimble_publisher.ex:41: NimblePublisher.__extract__/2
    lib/school_house/lessons.ex:31: (module)
    lib/school_house/lessons.ex:31: anonymous fn/2 in :elixir_compiler_43.__MODULE__/1
    (elixir 1.12.0) lib/enum.ex:2356: Enum."-reduce/3-lists^foldl/2-0-"/3
    lib/school_house/lessons.ex:11: (module)
make: *** [setup] Error 1

Table of contents does not properly handle sections with `` in the name

There's a few pages where the section header is an inline code fragment like if, these are not being handled by the table of contents code correctly because they become nested tags.

I think there's 2 options here:

  1. We update all of those lessons to no longer make use of the `` in section headers. This also unifies the styling of all the table of contents and headers.
  2. Work through the parsing logic to support them. The most challenge example if the section "if and unless"

ArithmeticError happened in SchoolHouseWeb.LessonController#lesson

Message

  ** (ArithmeticError) bad argument in arithmetic expression

Backtrace (last 10 lines)

lib/school_house/lessons.ex:42 SchoolHouse.Lessons.populate_surrounding_lessons/1
lib/school_house_web/controllers/lesson_controller.ex:7 SchoolHouseWeb.LessonController.lesson/2
lib/school_house_web/controllers/lesson_controller.ex:1 SchoolHouseWeb.LessonController.action/2
lib/school_house_web/controllers/lesson_controller.ex:1 SchoolHouseWeb.LessonController.phoenix_controller_pipeline/2
lib/phoenix/router.ex:352 Phoenix.Router.__call__/2
lib/school_house_web/endpoint.ex:1 SchoolHouseWeb.Endpoint.plug_builder_call/2
lib/school_house_web/endpoint.ex:3 anonymous fn/3 in SchoolHouseWeb.Endpoint."call (overridable 3)"/2
lib/appsignal/instrumentation.ex:10 Appsignal.Instrumentation.instrument/1

View on AppSignal: https://appsignal.com/elixirschool/sites/6073b19e14ad66590ce95ae9/exceptions/incidents/5?timestamp=2021-04-15T14:56:44Z

Suggestions for improving the blog

What are some possible improvements to the blog that would help with content discoverability?

Some ideas off the top of my head:

  1. Tag cloud
  2. Posts by Author
  3. Pagination of blog
  4. In addition to Recent posts, display a small number of random posts

Docker build is broken

While I had tested #60 I must have missed something as docker no longer builds and as such deploys are broken. I'll try to look into this tonight 👍

Satisfy Credo CI check

There's currently a few things Credo is complaining about, those need to get cleaned up in order to get CI green.

We can also evaluate modifications to the Credo config if we're unhappy with the defaults.

Homepage stats on Elixir adoption and community

To help drive home the awesomeness of Elixir, the community, and the ecosystem as a whole stats would be great. Some ideas:

  • Number of conferences
  • Number of podcasts
  • Number of translations on Elixir School
  • Number of companies (see: elixir-companies.com)
  • Number of countries with an Elixir presence (meetups/conference/etc)
  • Number of Hex packages

Accessibility Suggestions

Thanks to Mikolaj Holysz for taking the time to check out the beta site and compile some accessibility-related notes 🎉 !

Here are the notes 🗒️ .

I have already tackled my lanuages typo 😅.

Elixir version?

I think we should set a required Elixir version, currently in mix.exs it says 1.7.0 but that's quite old, is there any reason not to use 1.12?

Maybe we can add a .tool-versions file like it's done in asdf, or maybe it's enough with specifying it in the README?

Broken images in blog posts

There are some blog posts where the images are not being properly rendered:

https://rocketvalidator.com/s/0bdee490-cff7-495a-95a3-40211cd2b5cd/i?search=Bad+value+“%7B%25+&page=1&non_doc=false

It complains about "Bad value “{% asset " and the images are broken. For example in https://beta.elixirschool.com/blog/live-view-with-channels

Captura de pantalla 2021-07-25 a las 19 01 23

This doesn't happen in the main site, https://elixirschool.com/blog/live-view-with-channels so I guess these tags were only valid in Jekyll?

Create "Get Involved" Page

We should create a page that describes how someone can contribute to elixir school. These include:

  • Translations. This could include steps to how to translate or link out to another new page depending on how much content we have for that.
  • New content. This could direct people to the Issues on the content repo maybe with a new-lesson label filter?
  • Blog posts.
  • ??

Split from #73

Add Previous and Next lesson links.

The lesson is already set up to contain the next and previous lessons, we just need to add the UI. Additionally I parsed all the lessons and pulled the first paragraph (above the TOC) out and into the excerpt attribute. This allows us to display this along with these links.

I'll work on tackling this next.

Trigger HTML / A11Y validation on deploys

Related to #20 I think we could also add a webhook to notify of deploys on Rocket Validator. This way, an automatic report looking for HTML / Accessibility issues can be run. Here's more info, but basically we just need to POST to an URL that contains the trigger:

https://docs.rocketvalidator.com/deploy-hooks/

I can set this up if that sounds like a good idea. All I need to know are the main URLs to validate (production, staging...)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.