From c9629a3b8aa1cae32c07d240848ade5f53d75560 Mon Sep 17 00:00:00 2001 From: Sl3nc Date: Fri, 10 Apr 2026 21:14:40 -0300 Subject: [PATCH 01/12] Update criteria.json and format --- .github/autograder/criteria.json | 139 +++++++------------- .github/autograder/feedback.json | 213 +++++++++++++++++++++++-------- submission/app.js | 132 ++++++++++--------- submission/detalhes.html | 2 +- submission/index.html | 2 +- submission/relatorio.md | 1 - submission/{css => }/styles.css | 1 - 7 files changed, 279 insertions(+), 211 deletions(-) delete mode 100644 submission/relatorio.md rename submission/{css => }/styles.css (98%) diff --git a/.github/autograder/criteria.json b/.github/autograder/criteria.json index 29e8bd5..bf7cc3c 100644 --- a/.github/autograder/criteria.json +++ b/.github/autograder/criteria.json @@ -16,7 +16,7 @@ "weight": 40, "tests": [ { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "body" }, @@ -24,7 +24,7 @@ ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "header" }, @@ -32,7 +32,7 @@ ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "nav" }, @@ -40,7 +40,7 @@ ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "main" }, @@ -48,7 +48,7 @@ ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "article" }, @@ -56,15 +56,7 @@ ] }, { - "file": "index.html", - "name": "has_tag", - "parameters": [ - { "name": "tag", "value": "img" }, - { "name": "required_count", "value": 5 } - ] - }, - { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "footer" }, @@ -72,7 +64,7 @@ ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "div" }, @@ -80,7 +72,7 @@ ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "form" }, @@ -88,7 +80,7 @@ ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "input" }, @@ -96,7 +88,7 @@ ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "button" }, @@ -104,7 +96,7 @@ ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_attribute", "parameters": [ { "name": "attribute", "value": "class" }, @@ -118,13 +110,8 @@ "weight": 20, "tests": [ { - "file": "index.html", + "file": "submission/index.html", "name": "check_css_linked" - }, - { - "file": "index.html", - "name": "check_internal_links_to_article", - "parameters": [{ "name": "required_count", "value": 4 }] } ] } @@ -139,15 +126,15 @@ "weight": 50, "tests": [ { - "file": "css/styles.css", + "file": "submission/styles.css", "name": "uses_relative_units" }, { - "file": "css/styles.css", + "file": "submission/styles.css", "name": "check_media_queries" }, { - "file": "css/styles.css", + "file": "submission/styles.css", "name": "check_flexbox_usage" } ] @@ -157,7 +144,7 @@ "weight": 50, "tests": [ { - "file": "css/styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "font-size" }, @@ -165,7 +152,7 @@ ] }, { - "file": "css/styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "font-family" }, @@ -173,7 +160,7 @@ ] }, { - "file": "css/styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "text-align" }, @@ -181,7 +168,7 @@ ] }, { - "file": "css/styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "display" }, @@ -189,7 +176,7 @@ ] }, { - "file": "css/styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "position" }, @@ -197,7 +184,7 @@ ] }, { - "file": "css/styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "margin" }, @@ -205,7 +192,7 @@ ] }, { - "file": "css/styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "padding" }, @@ -227,62 +214,35 @@ "weight": 70, "tests": [ { - "file": "index.html", - "name": "check_bootstrap_linked" - }, - { - "file": "index.html", - "name": "check_internal_links", - "parameters": [{ "name": "required_count", "value": 3 }] - }, - { - "file": "index.html", + "file": "submission/index.html", "name": "has_class", "parameters": [ { "name": "class_names", - "value": ["container", "container-fluid"] + "value": ["container"] }, { "name": "required_count", "value": 1 } ] }, { - "file": "index.html", - "name": "has_class", - "parameters": [ - { "name": "class_names", "value": ["row"] }, - { "name": "required_count", "value": 1 } - ] - }, - { - "file": "index.html", - "name": "has_class", - "parameters": [ - { "name": "class_names", "value": ["col-"] }, - { "name": "required_count", "value": 3 } - ] - }, - { - "file": "index.html", - "name": "has_class", - "parameters": [ - { "name": "class_names", "value": ["text-center"] }, - { "name": "required_count", "value": 1 } - ] - }, - { - "file": "index.html", + "file": "submission/index.html", "name": "has_class", "parameters": [ - { "name": "class_names", "value": ["d-flex", "d--flex"] }, + { + "name": "class_names", + "value": ["form-container"] + }, { "name": "required_count", "value": 1 } ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_class", "parameters": [ - { "name": "class_names", "value": ["bg-*"] }, + { + "name": "class_names", + "value": ["card"] + }, { "name": "required_count", "value": 1 } ] } @@ -293,11 +253,11 @@ "weight": 30, "tests": [ { - "file": "css/styles.css", + "file": "submission/styles.css", "name": "check_media_queries" }, { - "file": "css/styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "margin" }, @@ -305,7 +265,7 @@ ] }, { - "file": "css/styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "padding" }, @@ -313,7 +273,7 @@ ] }, { - "file": "css/styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "width" }, @@ -340,7 +300,7 @@ "weight": 70, "tests": [ { - "file": "app.js", + "file": "submission/app.js", "name": "js_has_json_array_with_id", "parameters": [ { "name": "required_key", "value": "id" }, @@ -348,7 +308,7 @@ ] }, { - "file": "app.js", + "file": "submission/app.js", "name": "js_uses_dom_manipulation", "parameters": [ { @@ -364,7 +324,7 @@ ] }, { - "file": "app.js", + "file": "submission/app.js", "name": "js_uses_query_string_parsing" } ] @@ -373,29 +333,20 @@ "subject_name": "linking_and_integrity", "weight": 30, "tests": [ - { - "file": "index.html", - "name": "link_points_to_page_with_query_param", - "parameters": [ - { "name": "target_page", "value": "detalhes.html" }, - { "name": "query_param", "value": "id" }, - { "name": "required_count", "value": 3 } - ] - }, { "file": "all", "name": "has_no_js_framework", "parameters": [ - { "name": "html_file", "value": "index.html" }, - { "name": "js_file", "value": "app.js" } + { "name": "html_file", "value": "submission/index.html" }, + { "name": "js_file", "value": "submission/app.js" } ] }, { "file": "all", "name": "has_no_js_framework", "parameters": [ - { "name": "html_file", "value": "detalhes.html" }, - { "name": "js_file", "value": "app.js" } + { "name": "html_file", "value": "submission/detalhes.html" }, + { "name": "js_file", "value": "submission/app.js" } ] } ] diff --git a/.github/autograder/feedback.json b/.github/autograder/feedback.json index 5a1b17a..904b306 100644 --- a/.github/autograder/feedback.json +++ b/.github/autograder/feedback.json @@ -18,62 +18,98 @@ { "file": "index.html", "name": "has_tag", - "parameters": [{"name": "tag", "value": "body"}, {"name": "required_count", "value": 1}] + "parameters": [ + { "name": "tag", "value": "body" }, + { "name": "required_count", "value": 1 } + ] }, { "file": "index.html", "name": "has_tag", - "parameters": [{"name": "tag", "value": "header"}, {"name": "required_count", "value": 1}] + "parameters": [ + { "name": "tag", "value": "header" }, + { "name": "required_count", "value": 1 } + ] }, { "file": "index.html", "name": "has_tag", - "parameters": [{"name": "tag", "value": "nav"}, {"name": "required_count", "value": 1}] + "parameters": [ + { "name": "tag", "value": "nav" }, + { "name": "required_count", "value": 1 } + ] }, { "file": "index.html", "name": "has_tag", - "parameters": [{"name": "tag", "value": "main"}, {"name": "required_count", "value": 1}] + "parameters": [ + { "name": "tag", "value": "main" }, + { "name": "required_count", "value": 1 } + ] }, { "file": "index.html", "name": "has_tag", - "parameters": [{"name": "tag", "value": "article"}, {"name": "required_count", "value": 4}] + "parameters": [ + { "name": "tag", "value": "article" }, + { "name": "required_count", "value": 4 } + ] }, { "file": "index.html", "name": "has_tag", - "parameters": [{"name": "tag", "value": "img"}, {"name": "required_count", "value": 5}] + "parameters": [ + { "name": "tag", "value": "img" }, + { "name": "required_count", "value": 5 } + ] }, { "file": "index.html", "name": "has_tag", - "parameters": [{"name": "tag", "value": "footer"}, {"name": "required_count", "value": 1}] + "parameters": [ + { "name": "tag", "value": "footer" }, + { "name": "required_count", "value": 1 } + ] }, { "file": "index.html", "name": "has_tag", - "parameters": [{"name": "tag", "value": "div"}, {"name": "required_count", "value": 1}] + "parameters": [ + { "name": "tag", "value": "div" }, + { "name": "required_count", "value": 1 } + ] }, { "file": "index.html", "name": "has_tag", - "parameters": [{"name": "tag", "value": "form"}, {"name": "required_count", "value": 1}] + "parameters": [ + { "name": "tag", "value": "form" }, + { "name": "required_count", "value": 1 } + ] }, { "file": "index.html", "name": "has_tag", - "parameters": [{"name": "tag", "value": "input"}, {"name": "required_count", "value": 1}] + "parameters": [ + { "name": "tag", "value": "input" }, + { "name": "required_count", "value": 1 } + ] }, { "file": "index.html", "name": "has_tag", - "parameters": [{"name": "tag", "value": "button"}, {"name": "required_count", "value": 1}] + "parameters": [ + { "name": "tag", "value": "button" }, + { "name": "required_count", "value": 1 } + ] }, { "file": "index.html", "name": "has_attribute", - "parameters": [{"name": "attribute", "value": "class"}, {"name": "required_count", "value": 2}] + "parameters": [ + { "name": "attribute", "value": "class" }, + { "name": "required_count", "value": 2 } + ] } ] }, @@ -88,7 +124,7 @@ { "file": "index.html", "name": "check_internal_links_to_article", - "parameters": [{"name": "required_count", "value": 4}] + "parameters": [{ "name": "required_count", "value": 4 }] } ] } @@ -102,9 +138,9 @@ "subject_name": "responsivity", "weight": 50, "tests": [ - {"file": "css/styles.css", "name": "uses_relative_units"}, - {"file": "css/styles.css", "name": "check_media_queries"}, - {"file": "css/styles.css", "name": "check_flexbox_usage"} + { "file": "styles.css", "name": "uses_relative_units" }, + { "file": "styles.css", "name": "check_media_queries" }, + { "file": "styles.css", "name": "check_flexbox_usage" } ] }, { @@ -112,39 +148,60 @@ "weight": 50, "tests": [ { - "file": "css/styles.css", + "file": "styles.css", "name": "has_style", - "parameters": [{"name": "style", "value": "font-size"}, {"name": "count", "value": 1}] + "parameters": [ + { "name": "style", "value": "font-size" }, + { "name": "count", "value": 1 } + ] }, { - "file": "css/styles.css", + "file": "styles.css", "name": "has_style", - "parameters": [{"name": "style", "value": "font-family"}, {"name": "count", "value": 1}] + "parameters": [ + { "name": "style", "value": "font-family" }, + { "name": "count", "value": 1 } + ] }, { - "file": "css/styles.css", + "file": "styles.css", "name": "has_style", - "parameters": [{"name": "style", "value": "text-align"}, {"name": "count", "value": 1}] + "parameters": [ + { "name": "style", "value": "text-align" }, + { "name": "count", "value": 1 } + ] }, { - "file": "css/styles.css", + "file": "styles.css", "name": "has_style", - "parameters": [{"name": "style", "value": "display"}, {"name": "count", "value": 1}] + "parameters": [ + { "name": "style", "value": "display" }, + { "name": "count", "value": 1 } + ] }, { - "file": "css/styles.css", + "file": "styles.css", "name": "has_style", - "parameters": [{"name": "style", "value": "position"}, {"name": "count", "value": 1}] + "parameters": [ + { "name": "style", "value": "position" }, + { "name": "count", "value": 1 } + ] }, { - "file": "css/styles.css", + "file": "styles.css", "name": "has_style", - "parameters": [{"name": "style", "value": "margin"}, {"name": "count", "value": 1}] + "parameters": [ + { "name": "style", "value": "margin" }, + { "name": "count", "value": 1 } + ] }, { - "file": "css/styles.css", + "file": "styles.css", "name": "has_style", - "parameters": [{"name": "style", "value": "padding"}, {"name": "count", "value": 1}] + "parameters": [ + { "name": "style", "value": "padding" }, + { "name": "count", "value": 1 } + ] } ] } @@ -167,37 +224,58 @@ { "file": "index.html", "name": "check_internal_links", - "parameters": [{"name": "required_count", "value": 3}] + "parameters": [{ "name": "required_count", "value": 3 }] }, { "file": "index.html", "name": "has_class", - "parameters": [{"name": "classes", "value": ["container", "container-fluid"]}, {"name": "required_count", "value": 1}] + "parameters": [ + { + "name": "classes", + "value": ["container", "container-fluid"] + }, + { "name": "required_count", "value": 1 } + ] }, { "file": "index.html", "name": "has_class", - "parameters": [{"name": "classes", "value": ["row"]}, {"name": "required_count", "value": 1}] + "parameters": [ + { "name": "classes", "value": ["row"] }, + { "name": "required_count", "value": 1 } + ] }, { "file": "index.html", "name": "has_class", - "parameters": [{"name": "classes", "value": ["col-*"]}, {"name": "required_count", "value": 3}] + "parameters": [ + { "name": "classes", "value": ["col-*"] }, + { "name": "required_count", "value": 3 } + ] }, { "file": "index.html", "name": "has_class", - "parameters": [{"name": "classes", "value": ["text-center"]}, {"name": "required_count", "value": 1}] + "parameters": [ + { "name": "classes", "value": ["text-center"] }, + { "name": "required_count", "value": 1 } + ] }, { "file": "index.html", "name": "has_class", - "parameters": [{"name": "classes", "value": ["d-flex", "d-*-flex"]}, {"name": "required_count", "value": 1}] + "parameters": [ + { "name": "classes", "value": ["d-flex", "d-*-flex"] }, + { "name": "required_count", "value": 1 } + ] }, { "file": "index.html", "name": "has_class", - "parameters": [{"name": "classes", "value": ["bg-*"]}, {"name": "required_count", "value": 1}] + "parameters": [ + { "name": "classes", "value": ["bg-*"] }, + { "name": "required_count", "value": 1 } + ] } ] }, @@ -206,28 +284,39 @@ "weight": 30, "tests": [ { - "file": "css/styles.css", + "file": "styles.css", "name": "check_media_queries" }, { - "file": "css/styles.css", + "file": "styles.css", "name": "has_style", - "parameters": [{"name": "style", "value": "margin"}, {"name": "count", "value": 1}] + "parameters": [ + { "name": "style", "value": "margin" }, + { "name": "count", "value": 1 } + ] }, { - "file": "css/styles.css", + "file": "styles.css", "name": "has_style", - "parameters": [{"name": "style", "value": "padding"}, {"name": "count", "value": 1}] + "parameters": [ + { "name": "style", "value": "padding" }, + { "name": "count", "value": 1 } + ] }, { - "file": "css/styles.css", + "file": "styles.css", "name": "has_style", - "parameters": [{"name": "style", "value": "width"}, {"name": "count", "value": 1}] + "parameters": [ + { "name": "style", "value": "width" }, + { "name": "count", "value": 1 } + ] }, { "file": "all", "name": "check_project_structure", - "parameters": [{"name": "expected_structure", "value": "README.md"}] + "parameters": [ + { "name": "expected_structure", "value": "README.md" } + ] } ] } @@ -244,12 +333,26 @@ { "file": "app.js", "name": "js_has_json_array_with_id", - "parameters": [{"name": "property", "value": "id"}, {"name": "required_count", "value": 3}] + "parameters": [ + { "name": "property", "value": "id" }, + { "name": "required_count", "value": 3 } + ] }, { "file": "app.js", "name": "js_uses_dom_manipulation", - "parameters": [{"name": "methods", "value": ["createElement", "appendChild", "innerHTML", "querySelector"]}, {"name": "required_count", "value": 4}] + "parameters": [ + { + "name": "methods", + "value": [ + "createElement", + "appendChild", + "innerHTML", + "querySelector" + ] + }, + { "name": "required_count", "value": 4 } + ] }, { "file": "app.js", @@ -264,17 +367,27 @@ { "file": "index.html", "name": "link_points_to_page_with_query_param", - "parameters": [{"name": "target_page", "value": "detalhes.html"}, {"name": "param", "value": "id"}, {"name": "required_count", "value": 3}] + "parameters": [ + { "name": "target_page", "value": "detalhes.html" }, + { "name": "param", "value": "id" }, + { "name": "required_count", "value": 3 } + ] }, { "file": "all", "name": "has_no_js_framework", - "parameters": [{"name": "html_file", "value": "index.html"}, {"name": "js_file", "value": "app.js"}] + "parameters": [ + { "name": "html_file", "value": "index.html" }, + { "name": "js_file", "value": "app.js" } + ] }, { "file": "all", "name": "has_no_js_framework", - "parameters": [{"name": "html_file", "value": "detalhes.html"}, {"name": "js_file", "value": "app.js"}] + "parameters": [ + { "name": "html_file", "value": "detalhes.html" }, + { "name": "js_file", "value": "app.js" } + ] } ] } diff --git a/submission/app.js b/submission/app.js index acf70c3..3a26b3d 100644 --- a/submission/app.js +++ b/submission/app.js @@ -1,80 +1,86 @@ const dados = [ -  { -    "id": 1, -    "titulo": "Prefeitura Lança Novo Plano de Mobilidade Urbana", -    "descricao": "Novo plano visa melhorar o transporte público e reduzir o trânsito na cidade.", -    "conteudo": "A Prefeitura apresentou nesta segunda-feira um novo plano de mobilidade urbana que inclui a criação de corredores exclusivos de ônibus, ciclovias e a requalificação de vias principais. O projeto será implementado ao longo dos próximos dois anos e promete revolucionar a forma como os cidadãos se locomovem.", -    "categoria": "Cidades", -    "autor": "Joana Ribeiro", -    "data": "2025-03-30", -    "imagem": "imgs/mobilidade.jpg" -  }, -  { -    "id": 2, -    "titulo": "Tecnologia 6G Está em Desenvolvimento", -    "descricao": "Pesquisadores anunciam avanços na próxima geração de redes móveis.", -    "conteudo": "Universidades e empresas de telecomunicação já estão testando tecnologias que poderão compor a infraestrutura do 6G. A expectativa é que a nova geração seja 100 vezes mais rápida que o 5G e amplie a integração entre dispositivos inteligentes, permitindo avanços significativos em áreas como carros autônomos e Internet das Coisas.", -    "categoria": "Tecnologia", -    "autor": "Carlos Mendes", -    "data": "2025-03-28", -    "imagem": "imgs/tecnologia_6g.jpg" -  }, -  { -    "id": 3, -    "titulo": "Festival de Música Reúne Mais de 50 Mil Pessoas", -    "descricao": "Evento cultural movimentou o final de semana com atrações nacionais e internacionais.", -    "conteudo": "Durante três dias de programação, o festival contou com a participação de mais de 40 artistas e promoveu atividades culturais e gastronômicas em paralelo. A prefeitura estima um impacto positivo no turismo local, com hotéis e restaurantes operando com capacidade máxima.", -    "categoria": "Cultura", -    "autor": "Ana Clara Silva", -    "data": "2025-03-27", -    "imagem": "imgs/festival_musica.jpg" -  } + { + id: 1, + titulo: "Prefeitura Lança Novo Plano de Mobilidade Urbana", + descricao: + "Novo plano visa melhorar o transporte público e reduzir o trânsito na cidade.", + conteudo: + "A Prefeitura apresentou nesta segunda-feira um novo plano de mobilidade urbana que inclui a criação de corredores exclusivos de ônibus, ciclovias e a requalificação de vias principais. O projeto será implementado ao longo dos próximos dois anos e promete revolucionar a forma como os cidadãos se locomovem.", + categoria: "Cidades", + autor: "Joana Ribeiro", + data: "2025-03-30", + imagem: "imgs/mobilidade.jpg", + }, + { + id: 2, + titulo: "Tecnologia 6G Está em Desenvolvimento", + descricao: + "Pesquisadores anunciam avanços na próxima geração de redes móveis.", + conteudo: + "Universidades e empresas de telecomunicação já estão testando tecnologias que poderão compor a infraestrutura do 6G. A expectativa é que a nova geração seja 100 vezes mais rápida que o 5G e amplie a integração entre dispositivos inteligentes, permitindo avanços significativos em áreas como carros autônomos e Internet das Coisas.", + categoria: "Tecnologia", + autor: "Carlos Mendes", + data: "2025-03-28", + imagem: "imgs/tecnologia_6g.jpg", + }, + { + id: 3, + titulo: "Festival de Música Reúne Mais de 50 Mil Pessoas", + descricao: + "Evento cultural movimentou o final de semana com atrações nacionais e internacionais.", + conteudo: + "Durante três dias de programação, o festival contou com a participação de mais de 40 artistas e promoveu atividades culturais e gastronômicas em paralelo. A prefeitura estima um impacto positivo no turismo local, com hotéis e restaurantes operando com capacidade máxima.", + categoria: "Cultura", + autor: "Ana Clara Silva", + data: "2025-03-27", + imagem: "imgs/festival_musica.jpg", + }, ]; -document.addEventListener('DOMContentLoaded', () => { - // Verifica em qual página estamos - if (document.getElementById('noticias-container')) { - carregarNoticiasHome(); - } else if (document.getElementById('detalhe-noticia-container')) { - carregarDetalheNoticia(); - } +document.addEventListener("DOMContentLoaded", () => { + // Verifica em qual página estamos + if (document.getElementById("noticias-container")) { + carregarNoticiasHome(); + } else if (document.getElementById("detalhe-noticia-container")) { + carregarDetalheNoticia(); + } }); function carregarNoticiasHome() { - const container = document.getElementById('noticias-container'); - - dados.forEach(noticia => { - const card = document.createElement('article'); - card.className = 'card'; - - const link = document.createElement('a'); - link.href = `detalhes.html?id=${noticia.id}`; + const container = document.getElementById("noticias-container"); + + dados.forEach((noticia) => { + const card = document.createElement("article"); + card.className = "card"; + + const link = document.createElement("a"); + link.href = `detalhes.html?id=${noticia.id}`; - link.innerHTML = ` + link.innerHTML = ` Imagem da notícia: ${noticia.titulo}

${noticia.titulo}

${noticia.descricao}

`; - - card.appendChild(link); - container.appendChild(card); - }); + + card.appendChild(link); + container.appendChild(card); + }); } function carregarDetalheNoticia() { - const container = document.querySelector('#detalhe-noticia-container'); - - // Pega o ID da query string da URL - const params = new URLSearchParams(window.location.search); - const noticiaId = parseInt(params.get('id')); + const container = document.querySelector("#detalhe-noticia-container"); + + // Pega o ID da query string da URL + const params = new URLSearchParams(window.location.search); + const noticiaId = parseInt(params.get("id")); + + if (noticiaId) { + const noticia = dados.find((item) => item.id === noticiaId); - if (noticiaId) { - const noticia = dados.find(item => item.id === noticiaId); - - if (noticia) { - container.innerHTML = ` + if (noticia) { + container.innerHTML = `

${noticia.titulo}

Imagem da notícia: ${noticia.titulo}

${noticia.conteudo}

@@ -84,8 +90,8 @@ function carregarDetalheNoticia() { Categoria: ${noticia.categoria} `; - } else { - container.innerHTML = '

Notícia não encontrada.

'; - } + } else { + container.innerHTML = "

Notícia não encontrada.

"; } + } } diff --git a/submission/detalhes.html b/submission/detalhes.html index 55a1e3e..85b58cd 100644 --- a/submission/detalhes.html +++ b/submission/detalhes.html @@ -4,7 +4,7 @@ Detalhes da Notícia - +
diff --git a/submission/index.html b/submission/index.html index ace6691..0f4ca7b 100644 --- a/submission/index.html +++ b/submission/index.html @@ -7,7 +7,7 @@ Portal de Notícias Locais - +
diff --git a/submission/relatorio.md b/submission/relatorio.md deleted file mode 100644 index 2cc72e0..0000000 --- a/submission/relatorio.md +++ /dev/null @@ -1 +0,0 @@ -TESTE \ No newline at end of file diff --git a/submission/css/styles.css b/submission/styles.css similarity index 98% rename from submission/css/styles.css rename to submission/styles.css index 35abb6d..50cbc85 100644 --- a/submission/css/styles.css +++ b/submission/styles.css @@ -1,4 +1,3 @@ -/* Reset Básico */ body, h1, h2, h3, p, a { margin: 0; padding: 0; From c4a67b5db713cb5df4f054ae8a4c5885b61fdfcd Mon Sep 17 00:00:00 2001 From: Sl3nc Date: Fri, 10 Apr 2026 21:24:04 -0300 Subject: [PATCH 02/12] Update feedback.json to reference submission directory for test files --- .github/autograder/feedback.json | 154 ++++++++++++------------------- 1 file changed, 57 insertions(+), 97 deletions(-) diff --git a/.github/autograder/feedback.json b/.github/autograder/feedback.json index 904b306..bf7cc3c 100644 --- a/.github/autograder/feedback.json +++ b/.github/autograder/feedback.json @@ -16,7 +16,7 @@ "weight": 40, "tests": [ { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "body" }, @@ -24,7 +24,7 @@ ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "header" }, @@ -32,7 +32,7 @@ ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "nav" }, @@ -40,7 +40,7 @@ ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "main" }, @@ -48,7 +48,7 @@ ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "article" }, @@ -56,15 +56,7 @@ ] }, { - "file": "index.html", - "name": "has_tag", - "parameters": [ - { "name": "tag", "value": "img" }, - { "name": "required_count", "value": 5 } - ] - }, - { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "footer" }, @@ -72,7 +64,7 @@ ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "div" }, @@ -80,7 +72,7 @@ ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "form" }, @@ -88,7 +80,7 @@ ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "input" }, @@ -96,7 +88,7 @@ ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_tag", "parameters": [ { "name": "tag", "value": "button" }, @@ -104,7 +96,7 @@ ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_attribute", "parameters": [ { "name": "attribute", "value": "class" }, @@ -118,13 +110,8 @@ "weight": 20, "tests": [ { - "file": "index.html", + "file": "submission/index.html", "name": "check_css_linked" - }, - { - "file": "index.html", - "name": "check_internal_links_to_article", - "parameters": [{ "name": "required_count", "value": 4 }] } ] } @@ -138,9 +125,18 @@ "subject_name": "responsivity", "weight": 50, "tests": [ - { "file": "styles.css", "name": "uses_relative_units" }, - { "file": "styles.css", "name": "check_media_queries" }, - { "file": "styles.css", "name": "check_flexbox_usage" } + { + "file": "submission/styles.css", + "name": "uses_relative_units" + }, + { + "file": "submission/styles.css", + "name": "check_media_queries" + }, + { + "file": "submission/styles.css", + "name": "check_flexbox_usage" + } ] }, { @@ -148,7 +144,7 @@ "weight": 50, "tests": [ { - "file": "styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "font-size" }, @@ -156,7 +152,7 @@ ] }, { - "file": "styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "font-family" }, @@ -164,7 +160,7 @@ ] }, { - "file": "styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "text-align" }, @@ -172,7 +168,7 @@ ] }, { - "file": "styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "display" }, @@ -180,7 +176,7 @@ ] }, { - "file": "styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "position" }, @@ -188,7 +184,7 @@ ] }, { - "file": "styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "margin" }, @@ -196,7 +192,7 @@ ] }, { - "file": "styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "padding" }, @@ -218,62 +214,35 @@ "weight": 70, "tests": [ { - "file": "index.html", - "name": "check_bootstrap_linked" - }, - { - "file": "index.html", - "name": "check_internal_links", - "parameters": [{ "name": "required_count", "value": 3 }] - }, - { - "file": "index.html", + "file": "submission/index.html", "name": "has_class", "parameters": [ { - "name": "classes", - "value": ["container", "container-fluid"] + "name": "class_names", + "value": ["container"] }, { "name": "required_count", "value": 1 } ] }, { - "file": "index.html", - "name": "has_class", - "parameters": [ - { "name": "classes", "value": ["row"] }, - { "name": "required_count", "value": 1 } - ] - }, - { - "file": "index.html", + "file": "submission/index.html", "name": "has_class", "parameters": [ - { "name": "classes", "value": ["col-*"] }, - { "name": "required_count", "value": 3 } - ] - }, - { - "file": "index.html", - "name": "has_class", - "parameters": [ - { "name": "classes", "value": ["text-center"] }, - { "name": "required_count", "value": 1 } - ] - }, - { - "file": "index.html", - "name": "has_class", - "parameters": [ - { "name": "classes", "value": ["d-flex", "d-*-flex"] }, + { + "name": "class_names", + "value": ["form-container"] + }, { "name": "required_count", "value": 1 } ] }, { - "file": "index.html", + "file": "submission/index.html", "name": "has_class", "parameters": [ - { "name": "classes", "value": ["bg-*"] }, + { + "name": "class_names", + "value": ["card"] + }, { "name": "required_count", "value": 1 } ] } @@ -284,11 +253,11 @@ "weight": 30, "tests": [ { - "file": "styles.css", + "file": "submission/styles.css", "name": "check_media_queries" }, { - "file": "styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "margin" }, @@ -296,7 +265,7 @@ ] }, { - "file": "styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "padding" }, @@ -304,7 +273,7 @@ ] }, { - "file": "styles.css", + "file": "submission/styles.css", "name": "has_style", "parameters": [ { "name": "style", "value": "width" }, @@ -331,15 +300,15 @@ "weight": 70, "tests": [ { - "file": "app.js", + "file": "submission/app.js", "name": "js_has_json_array_with_id", "parameters": [ - { "name": "property", "value": "id" }, - { "name": "required_count", "value": 3 } + { "name": "required_key", "value": "id" }, + { "name": "min_items", "value": 3 } ] }, { - "file": "app.js", + "file": "submission/app.js", "name": "js_uses_dom_manipulation", "parameters": [ { @@ -355,7 +324,7 @@ ] }, { - "file": "app.js", + "file": "submission/app.js", "name": "js_uses_query_string_parsing" } ] @@ -364,29 +333,20 @@ "subject_name": "linking_and_integrity", "weight": 30, "tests": [ - { - "file": "index.html", - "name": "link_points_to_page_with_query_param", - "parameters": [ - { "name": "target_page", "value": "detalhes.html" }, - { "name": "param", "value": "id" }, - { "name": "required_count", "value": 3 } - ] - }, { "file": "all", "name": "has_no_js_framework", "parameters": [ - { "name": "html_file", "value": "index.html" }, - { "name": "js_file", "value": "app.js" } + { "name": "html_file", "value": "submission/index.html" }, + { "name": "js_file", "value": "submission/app.js" } ] }, { "file": "all", "name": "has_no_js_framework", "parameters": [ - { "name": "html_file", "value": "detalhes.html" }, - { "name": "js_file", "value": "app.js" } + { "name": "html_file", "value": "submission/detalhes.html" }, + { "name": "js_file", "value": "submission/app.js" } ] } ] From cb9dc510c6f44a77664ce47fa3ba07ae017ebade Mon Sep 17 00:00:00 2001 From: Sl3nc Date: Fri, 10 Apr 2026 21:34:22 -0300 Subject: [PATCH 03/12] Refactor criteria and feedback JSON files to streamline test requirements and improve structure --- .github/autograder/criteria.json | 25 +-- .github/autograder/feedback.json | 364 +------------------------------ 2 files changed, 8 insertions(+), 381 deletions(-) diff --git a/.github/autograder/criteria.json b/.github/autograder/criteria.json index bf7cc3c..d0a8ba5 100644 --- a/.github/autograder/criteria.json +++ b/.github/autograder/criteria.json @@ -52,7 +52,7 @@ "name": "has_tag", "parameters": [ { "name": "tag", "value": "article" }, - { "name": "required_count", "value": 4 } + { "name": "required_count", "value": 3 } ] }, { @@ -125,10 +125,6 @@ "subject_name": "responsivity", "weight": 50, "tests": [ - { - "file": "submission/styles.css", - "name": "uses_relative_units" - }, { "file": "submission/styles.css", "name": "check_media_queries" @@ -234,17 +230,6 @@ }, { "name": "required_count", "value": 1 } ] - }, - { - "file": "submission/index.html", - "name": "has_class", - "parameters": [ - { - "name": "class_names", - "value": ["card"] - }, - { "name": "required_count", "value": 1 } - ] } ] }, @@ -299,14 +284,6 @@ "subject_name": "dynamic_js", "weight": 70, "tests": [ - { - "file": "submission/app.js", - "name": "js_has_json_array_with_id", - "parameters": [ - { "name": "required_key", "value": "id" }, - { "name": "min_items", "value": 3 } - ] - }, { "file": "submission/app.js", "name": "js_uses_dom_manipulation", diff --git a/.github/autograder/feedback.json b/.github/autograder/feedback.json index bf7cc3c..31106e7 100644 --- a/.github/autograder/feedback.json +++ b/.github/autograder/feedback.json @@ -1,358 +1,8 @@ { - "test_library": "web_dev", - "base": { - "weight": 100, - "subjects": [ - { - "subject_name": "semana_5", - "weight": 30, - "subjects": [ - { - "subject_name": "html", - "weight": 60, - "subjects": [ - { - "subject_name": "structure", - "weight": 40, - "tests": [ - { - "file": "submission/index.html", - "name": "has_tag", - "parameters": [ - { "name": "tag", "value": "body" }, - { "name": "required_count", "value": 1 } - ] - }, - { - "file": "submission/index.html", - "name": "has_tag", - "parameters": [ - { "name": "tag", "value": "header" }, - { "name": "required_count", "value": 1 } - ] - }, - { - "file": "submission/index.html", - "name": "has_tag", - "parameters": [ - { "name": "tag", "value": "nav" }, - { "name": "required_count", "value": 1 } - ] - }, - { - "file": "submission/index.html", - "name": "has_tag", - "parameters": [ - { "name": "tag", "value": "main" }, - { "name": "required_count", "value": 1 } - ] - }, - { - "file": "submission/index.html", - "name": "has_tag", - "parameters": [ - { "name": "tag", "value": "article" }, - { "name": "required_count", "value": 4 } - ] - }, - { - "file": "submission/index.html", - "name": "has_tag", - "parameters": [ - { "name": "tag", "value": "footer" }, - { "name": "required_count", "value": 1 } - ] - }, - { - "file": "submission/index.html", - "name": "has_tag", - "parameters": [ - { "name": "tag", "value": "div" }, - { "name": "required_count", "value": 1 } - ] - }, - { - "file": "submission/index.html", - "name": "has_tag", - "parameters": [ - { "name": "tag", "value": "form" }, - { "name": "required_count", "value": 1 } - ] - }, - { - "file": "submission/index.html", - "name": "has_tag", - "parameters": [ - { "name": "tag", "value": "input" }, - { "name": "required_count", "value": 1 } - ] - }, - { - "file": "submission/index.html", - "name": "has_tag", - "parameters": [ - { "name": "tag", "value": "button" }, - { "name": "required_count", "value": 1 } - ] - }, - { - "file": "submission/index.html", - "name": "has_attribute", - "parameters": [ - { "name": "attribute", "value": "class" }, - { "name": "required_count", "value": 2 } - ] - } - ] - }, - { - "subject_name": "link", - "weight": 20, - "tests": [ - { - "file": "submission/index.html", - "name": "check_css_linked" - } - ] - } - ] - }, - { - "subject_name": "css", - "weight": 40, - "subjects": [ - { - "subject_name": "responsivity", - "weight": 50, - "tests": [ - { - "file": "submission/styles.css", - "name": "uses_relative_units" - }, - { - "file": "submission/styles.css", - "name": "check_media_queries" - }, - { - "file": "submission/styles.css", - "name": "check_flexbox_usage" - } - ] - }, - { - "subject_name": "style", - "weight": 50, - "tests": [ - { - "file": "submission/styles.css", - "name": "has_style", - "parameters": [ - { "name": "style", "value": "font-size" }, - { "name": "count", "value": 1 } - ] - }, - { - "file": "submission/styles.css", - "name": "has_style", - "parameters": [ - { "name": "style", "value": "font-family" }, - { "name": "count", "value": 1 } - ] - }, - { - "file": "submission/styles.css", - "name": "has_style", - "parameters": [ - { "name": "style", "value": "text-align" }, - { "name": "count", "value": 1 } - ] - }, - { - "file": "submission/styles.css", - "name": "has_style", - "parameters": [ - { "name": "style", "value": "display" }, - { "name": "count", "value": 1 } - ] - }, - { - "file": "submission/styles.css", - "name": "has_style", - "parameters": [ - { "name": "style", "value": "position" }, - { "name": "count", "value": 1 } - ] - }, - { - "file": "submission/styles.css", - "name": "has_style", - "parameters": [ - { "name": "style", "value": "margin" }, - { "name": "count", "value": 1 } - ] - }, - { - "file": "submission/styles.css", - "name": "has_style", - "parameters": [ - { "name": "style", "value": "padding" }, - { "name": "count", "value": 1 } - ] - } - ] - } - ] - } - ] - }, - { - "subject_name": "semana_6", - "weight": 30, - "subjects": [ - { - "subject_name": "bootstrap_fundamentals", - "weight": 70, - "tests": [ - { - "file": "submission/index.html", - "name": "has_class", - "parameters": [ - { - "name": "class_names", - "value": ["container"] - }, - { "name": "required_count", "value": 1 } - ] - }, - { - "file": "submission/index.html", - "name": "has_class", - "parameters": [ - { - "name": "class_names", - "value": ["form-container"] - }, - { "name": "required_count", "value": 1 } - ] - }, - { - "file": "submission/index.html", - "name": "has_class", - "parameters": [ - { - "name": "class_names", - "value": ["card"] - }, - { "name": "required_count", "value": 1 } - ] - } - ] - }, - { - "subject_name": "css_and_docs", - "weight": 30, - "tests": [ - { - "file": "submission/styles.css", - "name": "check_media_queries" - }, - { - "file": "submission/styles.css", - "name": "has_style", - "parameters": [ - { "name": "style", "value": "margin" }, - { "name": "count", "value": 1 } - ] - }, - { - "file": "submission/styles.css", - "name": "has_style", - "parameters": [ - { "name": "style", "value": "padding" }, - { "name": "count", "value": 1 } - ] - }, - { - "file": "submission/styles.css", - "name": "has_style", - "parameters": [ - { "name": "style", "value": "width" }, - { "name": "count", "value": 1 } - ] - }, - { - "file": "all", - "name": "check_project_structure", - "parameters": [ - { "name": "expected_structure", "value": "README.md" } - ] - } - ] - } - ] - }, - { - "subject_name": "semana_7", - "weight": 40, - "subjects": [ - { - "subject_name": "dynamic_js", - "weight": 70, - "tests": [ - { - "file": "submission/app.js", - "name": "js_has_json_array_with_id", - "parameters": [ - { "name": "required_key", "value": "id" }, - { "name": "min_items", "value": 3 } - ] - }, - { - "file": "submission/app.js", - "name": "js_uses_dom_manipulation", - "parameters": [ - { - "name": "methods", - "value": [ - "createElement", - "appendChild", - "innerHTML", - "querySelector" - ] - }, - { "name": "required_count", "value": 4 } - ] - }, - { - "file": "submission/app.js", - "name": "js_uses_query_string_parsing" - } - ] - }, - { - "subject_name": "linking_and_integrity", - "weight": 30, - "tests": [ - { - "file": "all", - "name": "has_no_js_framework", - "parameters": [ - { "name": "html_file", "value": "submission/index.html" }, - { "name": "js_file", "value": "submission/app.js" } - ] - }, - { - "file": "all", - "name": "has_no_js_framework", - "parameters": [ - { "name": "html_file", "value": "submission/detalhes.html" }, - { "name": "js_file", "value": "submission/app.js" } - ] - } - ] - } - ] - } - ] - } -} + "general": { + "show_score": true, + "show_passed_tests": false, + "add_report_summary": true + }, + "default": {} +} \ No newline at end of file From cf49c4af135fd607454cfc77c462e581ae0bfe0d Mon Sep 17 00:00:00 2001 From: Sl3nc Date: Fri, 10 Apr 2026 21:40:30 -0300 Subject: [PATCH 04/12] Update criteria.json to increase required counts for tags and styles; remove detalhes.html --- .github/autograder/criteria.json | 7 +++---- submission/detalhes.html | 29 ----------------------------- 2 files changed, 3 insertions(+), 33 deletions(-) delete mode 100644 submission/detalhes.html diff --git a/.github/autograder/criteria.json b/.github/autograder/criteria.json index d0a8ba5..e76cea9 100644 --- a/.github/autograder/criteria.json +++ b/.github/autograder/criteria.json @@ -52,7 +52,7 @@ "name": "has_tag", "parameters": [ { "name": "tag", "value": "article" }, - { "name": "required_count", "value": 3 } + { "name": "required_count", "value": 4 } ] }, { @@ -68,7 +68,7 @@ "name": "has_tag", "parameters": [ { "name": "tag", "value": "div" }, - { "name": "required_count", "value": 1 } + { "name": "required_count", "value": 4 } ] }, { @@ -152,7 +152,7 @@ "name": "has_style", "parameters": [ { "name": "style", "value": "font-family" }, - { "name": "count", "value": 1 } + { "name": "count", "value": 2 } ] }, { @@ -322,7 +322,6 @@ "file": "all", "name": "has_no_js_framework", "parameters": [ - { "name": "html_file", "value": "submission/detalhes.html" }, { "name": "js_file", "value": "submission/app.js" } ] } diff --git a/submission/detalhes.html b/submission/detalhes.html deleted file mode 100644 index 85b58cd..0000000 --- a/submission/detalhes.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - Detalhes da Notícia - - - -
- -
- -
-
- -
-
- -
-

© 2025 Portal de Notícias Locais. Todos os direitos reservados.

-
- - - - From b8f23291a7c3b07e5e4372609589a395903badfd Mon Sep 17 00:00:00 2001 From: Sl3nc Date: Fri, 10 Apr 2026 21:47:52 -0300 Subject: [PATCH 05/12] Update criteria.json to adjust required counts and add new validation --- .github/autograder/criteria.json | 15 +++++++++++++-- submission/app.js | 2 -- submission/styles.css | 9 +-------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/.github/autograder/criteria.json b/.github/autograder/criteria.json index e76cea9..cea9e2c 100644 --- a/.github/autograder/criteria.json +++ b/.github/autograder/criteria.json @@ -68,7 +68,7 @@ "name": "has_tag", "parameters": [ { "name": "tag", "value": "div" }, - { "name": "required_count", "value": 4 } + { "name": "required_count", "value": 1 } ] }, { @@ -100,7 +100,7 @@ "name": "has_attribute", "parameters": [ { "name": "attribute", "value": "class" }, - { "name": "required_count", "value": 2 } + { "name": "required_count", "value": 3 } ] } ] @@ -230,6 +230,17 @@ }, { "name": "required_count", "value": 1 } ] + }, + { + "file": "submission/index.html", + "name": "has_class", + "parameters": [ + { + "name": "class_names", + "value": ["card"] + }, + { "name": "required_count", "value": 1 } + ] } ] }, diff --git a/submission/app.js b/submission/app.js index 3a26b3d..9350e3b 100644 --- a/submission/app.js +++ b/submission/app.js @@ -38,7 +38,6 @@ const dados = [ ]; document.addEventListener("DOMContentLoaded", () => { - // Verifica em qual página estamos if (document.getElementById("noticias-container")) { carregarNoticiasHome(); } else if (document.getElementById("detalhe-noticia-container")) { @@ -72,7 +71,6 @@ function carregarNoticiasHome() { function carregarDetalheNoticia() { const container = document.querySelector("#detalhe-noticia-container"); - // Pega o ID da query string da URL const params = new URLSearchParams(window.location.search); const noticiaId = parseInt(params.get("id")); diff --git a/submission/styles.css b/submission/styles.css index 50cbc85..35c6e14 100644 --- a/submission/styles.css +++ b/submission/styles.css @@ -106,11 +106,4 @@ h2 { font-size: 0.9rem; border-top: 1px solid #eee; padding-top: 1rem; -} - -/* Responsividade */ -@media (max-width: 768px) { - .card { - width: 100%; - } -} +} \ No newline at end of file From 58f646b6ee4334f610e1263a597a8b392f085cf0 Mon Sep 17 00:00:00 2001 From: Sl3nc Date: Fri, 10 Apr 2026 21:54:19 -0300 Subject: [PATCH 06/12] Update criteria.json to modify test parameters and remove obsolete checks --- .github/autograder/criteria.json | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/autograder/criteria.json b/.github/autograder/criteria.json index cea9e2c..2ac3eb4 100644 --- a/.github/autograder/criteria.json +++ b/.github/autograder/criteria.json @@ -231,7 +231,7 @@ { "name": "required_count", "value": 1 } ] }, - { + { "file": "submission/index.html", "name": "has_class", "parameters": [ @@ -248,10 +248,6 @@ "subject_name": "css_and_docs", "weight": 30, "tests": [ - { - "file": "submission/styles.css", - "name": "check_media_queries" - }, { "file": "submission/styles.css", "name": "has_style", @@ -280,7 +276,7 @@ "file": "all", "name": "check_project_structure", "parameters": [ - { "name": "expected_structure", "value": "README.md" } + { "name": "expected_structure", "value": "submission/README.md" } ] } ] From eb37fe2768865d487fafd7111e9c43123fa40196 Mon Sep 17 00:00:00 2001 From: Sl3nc Date: Fri, 10 Apr 2026 22:19:17 -0300 Subject: [PATCH 07/12] Add README.md to document Autograder setup and usage for web projects --- README.md | 234 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 233 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0cc6933..c9978ee 100644 --- a/README.md +++ b/README.md @@ -1 +1,233 @@ -# template-assignment \ No newline at end of file +# Demonstação do Autograder para Projetos Web + +Este repositório demonstra como configurar e usar o Autograder da WebTech Network em um fluxo de correção automatizada com GitHub Actions. + +Link da ferramenta: https://github.com/webtech-network/autograder + +## Objetivo do Projeto + +Este projeto separa claramente: + +- O que o aluno entrega (pasta `submission/`) +- Como a correção é definida (`.github/autograder/criteria.json`) +- Como o feedback é exibido (`.github/autograder/feedback.json`) +- Como tudo é executado automaticamente (`.github/workflows/classroom.yml`) + +Com isso, você consegue evoluir critérios de correção sem alterar o código do aluno e manter o processo reprodutível em push e pull request. + +## Estrutura do Repositório + +```text +. +├── .github/ +│ ├── autograder/ +│ │ ├── criteria.json +│ │ ├── feedback.json +│ │ └── setup.json +│ └── workflows/ +│ └── classroom.yml +├── submission/ +│ ├── app.js +│ ├── index.html +│ └── styles.css +├── relatorio.md +└── README.md +``` + +### Papel de Cada Parte + +- `submission/`: representa os arquivos enviados pelo aluno. +- `.github/autograder/criteria.json`: define pesos, blocos e testes da avaliação. +- `.github/autograder/feedback.json`: define como o relatório final será apresentado. +- `.github/workflows/classroom.yml`: executa o autograder no GitHub Actions. +- `.github/autograder/setup.json`: arquivo de setup adicional (neste demo, não está sendo usado ativamente no fluxo). + +## Como o Autograder é Executado Neste Repositório + +O workflow em `.github/workflows/classroom.yml` dispara quando ocorre: + +- `push` na branch `main` +- `pull_request` para `main` +- execução manual com `workflow_dispatch` + +Trecho central do workflow: + +```yaml +- name: Run Autograder + uses: webtech-network/autograder@main + with: + template-preset: "webdev" + feedback-type: "default" + include-feedback: "true" + openai-key: ${{ secrets.ENGINE }} +``` + +### O que cada parâmetro faz + +- `template-preset: "webdev"`: usa a biblioteca de testes voltada para desenvolvimento web. +- `feedback-type: "default"`: seleciona o tipo de feedback padrão. +- `include-feedback: "true"`: publica feedback no resultado da execução. +- `openai-key`: chave do secret usada para recursos de feedback com IA. + +Observação importante: + +- Os caminhos usados em `criteria.json` devem apontar para arquivos em `submission/...`. +- Exemplo correto: `submission/index.html`. + +## Como os Critérios de Correção Estão Organizados (`criteria.json`) + +O arquivo `.github/autograder/criteria.json` define uma árvore de avaliação com pesos. + +### Estrutura de pesos do exemplo + +- `base` (100) +- `semana_5` (30) +- `semana_6` (30) +- `semana_7` (40) + +Cada semana contém sub-blocos com pesos próprios e testes específicos. + +### Semana 5 (HTML + CSS) + +- HTML (60 dentro da semana) +- CSS (40 dentro da semana) + +Exemplos de testes usados: + +- `has_tag` (estrutura semântica: body, header, nav, main, article etc.) +- `has_attribute` (ex.: presença de atributo `class`) +- `check_css_linked` (verifica se CSS está vinculado ao HTML) +- `check_media_queries` e `check_flexbox_usage` +- `has_style` (contagem de propriedades como `font-size`, `margin`, `padding`) + +### Semana 6 (Bootstrap + documentação) + +Exemplos de testes usados: + +- `has_class` para verificar classes como `container`, `form-container`, `card` +- `check_project_structure` para validar estrutura esperada (ex.: `submission/README.md`) + +### Semana 7 (JavaScript dinâmico) + +Exemplos de testes usados: + +- `js_uses_dom_manipulation` (métodos como `createElement`, `appendChild`, `innerHTML`, `querySelector`) +- `js_uses_query_string_parsing` +- `has_no_js_framework` (garante uso de JS sem framework) + +## Como Configurar as Correções em `criteria.json` + +Esta é a seção principal para manutenção da regra de avaliação. + +### 1) Entenda a hierarquia + +Cada nó pode ter: + +- `subject_name` +- `weight` +- `subjects` (subníveis) +- `tests` (testes executáveis) + +Se você alterar pesos, revise o impacto no resultado final. + +### 2) Use o tipo de teste correto + +Alguns testes têm parâmetros diferentes: + +- `has_tag` costuma usar `required_count` +- `has_style` usa `count` +- `has_class` usa `class_names` como lista + +Exemplo: + +```json +{ + "file": "submission/index.html", + "name": "has_class", + "parameters": [ + { "name": "class_names", "value": ["container"] }, + { "name": "required_count", "value": 1 } + ] +} +``` + +### 3) Sempre valide caminhos de arquivos + +Referencie os arquivos como `submission/arquivo.ext`. + +Correto: + +```json +{ "file": "submission/styles.css", "name": "check_media_queries" } +``` + +Evite caminhos incompletos ou fora dessa convenção. + +### 4) Exemplo de adição de novo teste + +Para exigir uma nova tag no HTML: + +```json +{ + "file": "submission/index.html", + "name": "has_tag", + "parameters": [ + { "name": "tag", "value": "section" }, + { "name": "required_count", "value": 1 } + ] +} +``` + +## Como Configurar o Feedback em `feedback.json` + +Arquivo: `.github/autograder/feedback.json` + +Configuração atual: + +```json +{ + "general": { + "show_score": true, + "show_passed_tests": false, + "add_report_summary": true + }, + "default": {} +} +``` + +### Significado dos campos + +- `show_score: true` + - Exibe a pontuação final para o aluno. + +- `show_passed_tests: false` + - Não lista testes que já passaram. + - O feedback fica focado nas falhas. + +- `add_report_summary: true` + - Inclui um resumo geral da avaliação. + +- `default: {}` + - Espaço para configuração padrão adicional por tipo de feedback. + +### Quando mudar essas opções + +- Em fase de aprendizagem inicial, pode ser útil ativar `show_passed_tests: true`. +- Em fase de avaliação somativa, manter `false` reduz ruído e direciona melhoria. + +## Fluxo Prático de Uso + +1. O aluno altera arquivos em `submission/`. +2. O push ou pull request aciona o workflow. +3. O Autograder lê `criteria.json` e executa os testes. +4. O relatório final usa as regras de `feedback.json`. +5. A nota e o feedback ficam disponíveis na execução do GitHub Actions. + +## Resumo + +Este repositório exemplifica um cenário ideal para execução do Autograder para atividades web: + +- Critérios técnicos e pesos em `.github/autograder/criteria.json` +- Política de feedback em `.github/autograder/feedback.json` +- Execução automática em `.github/workflows/classroom.yml` +- Entrega do aluno em `submission/` From 509055acaca40fcdf14db87d46432e00279a9931 Mon Sep 17 00:00:00 2001 From: "Pedro Henrique R. Menezes" Date: Fri, 10 Apr 2026 22:21:56 -0300 Subject: [PATCH 08/12] Update weekly structure and section titles in README --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index c9978ee..68ab514 100644 --- a/README.md +++ b/README.md @@ -81,13 +81,13 @@ O arquivo `.github/autograder/criteria.json` define uma árvore de avaliação c ### Estrutura de pesos do exemplo - `base` (100) -- `semana_5` (30) -- `semana_6` (30) -- `semana_7` (40) +- `semana_1` (30) +- `semana_2` (30) +- `semana_3` (40) Cada semana contém sub-blocos com pesos próprios e testes específicos. -### Semana 5 (HTML + CSS) +### Semana 1 (HTML + CSS) - HTML (60 dentro da semana) - CSS (40 dentro da semana) @@ -100,14 +100,14 @@ Exemplos de testes usados: - `check_media_queries` e `check_flexbox_usage` - `has_style` (contagem de propriedades como `font-size`, `margin`, `padding`) -### Semana 6 (Bootstrap + documentação) +### Semana 2 (Bootstrap + Documentação) Exemplos de testes usados: - `has_class` para verificar classes como `container`, `form-container`, `card` - `check_project_structure` para validar estrutura esperada (ex.: `submission/README.md`) -### Semana 7 (JavaScript dinâmico) +### Semana 3 (JavaScript dinâmico) Exemplos de testes usados: From 0a4c712ad0a17f051022cc4903e9b79b7129a172 Mon Sep 17 00:00:00 2001 From: "Pedro Henrique R. Menezes" Date: Fri, 10 Apr 2026 22:22:59 -0300 Subject: [PATCH 09/12] Update subject names in criteria.json --- .github/autograder/criteria.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/autograder/criteria.json b/.github/autograder/criteria.json index 2ac3eb4..a7ce3e1 100644 --- a/.github/autograder/criteria.json +++ b/.github/autograder/criteria.json @@ -4,7 +4,7 @@ "weight": 100, "subjects": [ { - "subject_name": "semana_5", + "subject_name": "semana_1", "weight": 30, "subjects": [ { @@ -202,7 +202,7 @@ ] }, { - "subject_name": "semana_6", + "subject_name": "semana_2", "weight": 30, "subjects": [ { @@ -284,7 +284,7 @@ ] }, { - "subject_name": "semana_7", + "subject_name": "semana_3", "weight": 40, "subjects": [ { From a41c534435b111904c26543d5e8b82a9a44bc1c0 Mon Sep 17 00:00:00 2001 From: Sl3nc Date: Fri, 10 Apr 2026 22:32:32 -0300 Subject: [PATCH 10/12] Refactor HTML structure and clean up JavaScript event handling --- submission/app.js | 28 ------------------- submission/index.html | 63 ++++++++++++++++++++++--------------------- 2 files changed, 33 insertions(+), 58 deletions(-) diff --git a/submission/app.js b/submission/app.js index 9350e3b..fd56123 100644 --- a/submission/app.js +++ b/submission/app.js @@ -40,8 +40,6 @@ const dados = [ document.addEventListener("DOMContentLoaded", () => { if (document.getElementById("noticias-container")) { carregarNoticiasHome(); - } else if (document.getElementById("detalhe-noticia-container")) { - carregarDetalheNoticia(); } }); @@ -67,29 +65,3 @@ function carregarNoticiasHome() { container.appendChild(card); }); } - -function carregarDetalheNoticia() { - const container = document.querySelector("#detalhe-noticia-container"); - - const params = new URLSearchParams(window.location.search); - const noticiaId = parseInt(params.get("id")); - - if (noticiaId) { - const noticia = dados.find((item) => item.id === noticiaId); - - if (noticia) { - container.innerHTML = ` -

${noticia.titulo}

- Imagem da notícia: ${noticia.titulo} -

${noticia.conteudo}

-
- Autor: ${noticia.autor} - Data: ${new Date(noticia.data).toLocaleDateString()} - Categoria: ${noticia.categoria} -
- `; - } else { - container.innerHTML = "

Notícia não encontrada.

"; - } - } -} diff --git a/submission/index.html b/submission/index.html index 0f4ca7b..7493359 100644 --- a/submission/index.html +++ b/submission/index.html @@ -1,43 +1,46 @@ - + - - - - - - + + + + + + Portal de Notícias Locais - - - + + +
- +
-

Últimas Notícias

-
- -
- - -
-
-
-
-
- - -
-
+

Últimas Notícias

+
+
+ +
+
+
+
+
+ + +
+
-

© 2025 Portal de Notícias Locais. Todos os direitos reservados.

+

+ © 2025 Portal de Notícias Locais. Todos os direitos reservados. +

- + From ad5b73b9708da1a25a7ea67d07a6783107c8989a Mon Sep 17 00:00:00 2001 From: "Pedro Henrique R. Menezes" Date: Fri, 10 Apr 2026 22:36:47 -0300 Subject: [PATCH 11/12] Update README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 68ab514..56e5947 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Demonstação do Autograder para Projetos Web +# Demonstração do Autograder para Projetos Web Este repositório demonstra como configurar e usar o Autograder da WebTech Network em um fluxo de correção automatizada com GitHub Actions. From c5dc64b102ac481f33a5d22cb052cdd836de5053 Mon Sep 17 00:00:00 2001 From: Sl3nc Date: Fri, 10 Apr 2026 22:39:49 -0300 Subject: [PATCH 12/12] Refactor classroom.yml and app.js for improved formatting and structure --- .github/autograder/criteria.json | 12 ++++-------- .github/workflows/classroom.yml | 10 +++++----- submission/app.js | 8 +++----- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/.github/autograder/criteria.json b/.github/autograder/criteria.json index a7ce3e1..37a8266 100644 --- a/.github/autograder/criteria.json +++ b/.github/autograder/criteria.json @@ -276,7 +276,10 @@ "file": "all", "name": "check_project_structure", "parameters": [ - { "name": "expected_structure", "value": "submission/README.md" } + { + "name": "expected_structure", + "value": "submission/README.md" + } ] } ] @@ -324,13 +327,6 @@ { "name": "html_file", "value": "submission/index.html" }, { "name": "js_file", "value": "submission/app.js" } ] - }, - { - "file": "all", - "name": "has_no_js_framework", - "parameters": [ - { "name": "js_file", "value": "submission/app.js" } - ] } ] } diff --git a/.github/workflows/classroom.yml b/.github/workflows/classroom.yml index 3e4b4d6..951a6ec 100644 --- a/.github/workflows/classroom.yml +++ b/.github/workflows/classroom.yml @@ -12,17 +12,17 @@ jobs: grading: permissions: write-all runs-on: ubuntu-latest - if: github.actor != 'github-classroom[bot]' + if: github.actor != 'github-classroom[bot]' steps: - name: Checkout repository uses: actions/checkout@v4 with: - path: submission + path: submission - name: Run Autograder uses: webtech-network/autograder@main - with: - template-preset : "webdev" + with: + template-preset: "webdev" feedback-type: "default" include-feedback: "true" - openai-key: ${{ secrets.ENGINE }} \ No newline at end of file + openai-key: ${{ secrets.ENGINE }} diff --git a/submission/app.js b/submission/app.js index fd56123..b1f277c 100644 --- a/submission/app.js +++ b/submission/app.js @@ -50,10 +50,8 @@ function carregarNoticiasHome() { const card = document.createElement("article"); card.className = "card"; - const link = document.createElement("a"); - link.href = `detalhes.html?id=${noticia.id}`; - - link.innerHTML = ` + const card_content = document.createElement("div"); + card_content.innerHTML = ` Imagem da notícia: ${noticia.titulo}

${noticia.titulo}

@@ -61,7 +59,7 @@ function carregarNoticiasHome() {
`; - card.appendChild(link); + card.appendChild(card_content); container.appendChild(card); }); }