Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixing Issue #728 #1131

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open

Conversation

lilyhuang-github
Copy link

@lilyhuang-github lilyhuang-github commented Oct 5, 2024

Summary

Issue: #728

Checklist

  • Tests are implemented
  • All tests are passing
  • Style checks run (see documentation for more details)
  • Style checks are passing
  • Code comments from template removed

I know the issue is "claimed" and assigned to someone else but it's been 4 years
and I can't find the spider in the most recent repo so I decided to do it.

Summary by CodeRabbit

  • New Features

    • Introduced a spider to scrape meeting information from Northeastern Illinois University.
    • Added a new HTML page displaying board meeting materials with an accordion-style layout for easy navigation.
    • Included a search function for filtering meeting materials by year.
  • Bug Fixes

    • Established a comprehensive test suite for the spider to ensure accurate parsing and data extraction.
  • Documentation

    • New HTML files created to enhance the user interface and accessibility of meeting materials.

Copy link

coderabbitai bot commented Oct 5, 2024

Walkthrough

A new spider class, ChiNortheasternIlUniversitySpider, has been added to the city_scrapers project to scrape meeting information from the Northeastern Illinois University website. It includes methods for parsing meeting details, such as titles, times, and associated links. Additionally, two new HTML files were created to represent the board meeting materials and a test HTML file. A test suite using pytest was also introduced to validate the spider's functionality against expected outputs.

Changes

File Change Summary
city_scrapers/spiders/chi_northeastern_il_university.py Added ChiNortheasternIlUniversitySpider class with methods for parsing meeting information.
test2.html New HTML file created for displaying board meeting materials for Northeastern Illinois University.
tests/files/chi_northeastern_il_university.html New HTML file created for board meeting materials page.
tests/test_chi_northeastern_il_university.py New test suite for ChiNortheasternIlUniversitySpider, validating parsing logic with assertions.

Poem

In the land of meetings, where knowledge grows,
A spider weaves tales, as the agenda flows.
With links and times, it gathers the lore,
From Northeastern's halls, it opens the door.
So hop with delight, for the data's now clear,
Thanks to our spider, let’s give a cheer! 🐇✨


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@lilyhuang-github lilyhuang-github marked this pull request as ready for review October 5, 2024 03:02
@lilyhuang-github
Copy link
Author

I did most of the style changes for flake8. There's just the issue of having a line too long in the test for testing links.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 12

🧹 Outside diff range and nitpick comments (9)
tests/test_chi_northeastern_il_university.py (5)

27-31: Consider expanding title tests for better coverage.

While the current test checks the titles of the first two parsed items, it might be beneficial to test more items or use a parameterized test to cover a wider range of cases. This would help ensure that all types of titles are correctly parsed.


34-47: Consider expanding tests for better coverage of parsed items.

The current tests for description, start time, end time, and time notes only check the first parsed item. To ensure comprehensive coverage, consider:

  1. Testing these attributes for multiple items.
  2. Using parameterized tests to cover various scenarios.
  3. Adding edge cases, such as items with unusual time formats or descriptions.

This would help catch potential parsing issues across different types of entries.


50-58: Enhance robustness of id, status, and classification tests.

  1. For the test_id function:

    • Consider using a dynamic date based on the frozen time instead of a hardcoded date to make the test more resilient to changes in test data.
    • Example: f"chi_northeastern_il_university/{parsed_items[0]['start'].strftime('%Y%m%d%H%M')}/x/board_meeting"
  2. For all three tests:

    • Consider testing multiple items or using parameterized tests to ensure comprehensive coverage across different types of entries.

These changes would make the tests more robust and less prone to failing due to changes in test data.

Also applies to: 97-98


72-94: Consider expanding source and links tests for better coverage.

While the current tests for source and links are thorough for the first item, consider:

  1. Testing the source for multiple items to ensure consistency across all parsed entries.
  2. Using parameterized tests for links to cover various scenarios (e.g., items with different numbers of links, different link types).
  3. Adding edge cases, such as items with no links or unusual link formats.

This would help ensure that the parsing logic handles various cases correctly across all items.


1-103: Overall: Well-structured test suite with room for expanded coverage.

This test file for the ChiNortheasternIlUniversitySpider is well-organized and covers all major attributes of the parsed items. The use of pytest and freezegun demonstrates good testing practices, ensuring consistent and reliable tests.

Areas for improvement:

  1. Expand coverage for tests that currently only check the first item (e.g., description, start/end times, source, links).
  2. Utilize more parameterized tests to cover various scenarios and edge cases.
  3. Consider adding tests for error handling and edge cases in the spider's parsing logic.

These enhancements would further strengthen the test suite and help catch potential issues across a wider range of scenarios.

city_scrapers/spiders/chi_northeastern_il_university.py (1)

52-54: Remove unused method getMeetingDetails

The method getMeetingDetails is not called anywhere in the code. Removing unused methods helps keep the codebase clean and maintainable.

Consider removing the method:

-def getMeetingDetails(self, response):
-    print(response.text)
test2.html (3)

164-175: Missing hyperlinks in navigation headers

In the "Academics" navigation menu (lines 164-222), some primary list items like "Taking Classes," "Academic Units," and "Opportunities" lack hyperlinks. Users might expect these headers to be clickable.

Consider adding hyperlinks to these headers or restructuring the menu to improve user experience.

Also applies to: 179-195, 199-222


475-485: Optimize social media image alt attributes

While alt attributes are provided for social media icons, consider making them more descriptive for better accessibility. For example, instead of "Facebook Icon," use "Follow us on Facebook."

Update the alt attributes:

- <img alt="Facebook Icon" src="/sites/default/files/2021-10/facebook_logo_white.png">
+ <img alt="Follow us on Facebook" src="/sites/default/files/2021-10/facebook_logo_white.png">

Apply similar changes to other social media icons.


978-980: Format address for better readability and accessibility

The address is presented using <br /> tags (lines 978-980). This can be problematic for screen readers.

Consider using proper block elements like <p> or <address> for semantic markup.

- <p style="text-align: center;"><span>Northeastern Illinois University</span><br />
- 5500 North St. Louis Avenue<br />
- Chicago, Illinois 60625-4699<br />
- (773) 583-4050</p>
+ <address style="text-align: center;">
+   <span>Northeastern Illinois University</span><br />
+   5500 North St. Louis Avenue<br />
+   Chicago, Illinois 60625-4699<br />
+   (773) 583-4050
+ </address>
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 19f64de and 3e89b51.

📒 Files selected for processing (4)
  • city_scrapers/spiders/chi_northeastern_il_university.py (1 hunks)
  • test2.html (1 hunks)
  • tests/files/chi_northeastern_il_university.html (1 hunks)
  • tests/test_chi_northeastern_il_university.py (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • tests/files/chi_northeastern_il_university.html
🧰 Additional context used
🪛 Ruff
city_scrapers/spiders/chi_northeastern_il_university.py

56-56: Use item != "" instead of not item == ""

Replace with != operator

(SIM201)

🔇 Additional comments (3)
tests/test_chi_northeastern_il_university.py (3)

1-25: LGTM: Imports and test setup are well-structured.

The imports, test response setup, spider instantiation, and time freezing are all implemented correctly. This provides a solid foundation for the subsequent tests.


61-69: LGTM: Comprehensive location testing.

The test_location function provides good coverage by testing multiple items and checking both the name and address of the locations. This approach helps ensure that different location formats are correctly parsed.


101-103: LGTM: Excellent use of parameterized testing for 'all_day' attribute.

The test_all_day function uses pytest's parameterized testing feature effectively to check the 'all_day' attribute across all parsed items. This approach ensures comprehensive coverage and helps catch any inconsistencies in the parsing of this attribute.

print(response.text)

def _parse_title(self, item):
return item if not item == "" else "BOARD MEETING"
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Simplify comparison by using item != ""

Instead of using not item == "", it's more Pythonic to use item != "".

Apply this diff to simplify the condition:

 def _parse_title(self, item):
-    return item if not item == "" else "BOARD MEETING"
+    return item if item != "" else "BOARD MEETING"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
return item if not item == "" else "BOARD MEETING"
return item if item != "" else "BOARD MEETING"
🧰 Tools
🪛 Ruff

56-56: Use item != "" instead of not item == ""

Replace with != operator

(SIM201)

Comment on lines +22 to +28
head = meeting.css("h4.accordion::text").get().split()
if len(head) >= 3:
date = " ".join(head[:3])
title = " ".join(head[3:]) if len(head) > 3 else ""
else:
date = head
title = ""
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Improve date and title parsing logic

The current logic for parsing date and title from head may fail if the format of head changes or doesn't meet expectations. This can lead to incorrect data extraction.

Consider using more robust parsing by checking the content of head:

 def parse(self, response):
     for meeting in response.css("div.board-meeting-materials-row.views-row"):
         head = meeting.css("h4.accordion::text").get().split()
-        if len(head) >= 3:
-            date = " ".join(head[:3])
-            title = " ".join(head[3:]) if len(head) > 3 else ""
-        else:
-            date = head
-            title = ""
+        date_parts = []
+        title_parts = []
+        for part in head:
+            if re.match(r'\w+ \d{1,2}, \d{4}', ' '.join(date_parts + [part])):
+                date_parts.append(part)
+            else:
+                title_parts.append(part)
+        date = ' '.join(date_parts)
+        title = ' '.join(title_parts) if title_parts else ""
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
head = meeting.css("h4.accordion::text").get().split()
if len(head) >= 3:
date = " ".join(head[:3])
title = " ".join(head[3:]) if len(head) > 3 else ""
else:
date = head
title = ""
head = meeting.css("h4.accordion::text").get().split()
date_parts = []
title_parts = []
for part in head:
if re.match(r'\w+ \d{1,2}, \d{4}', ' '.join(date_parts + [part])):
date_parts.append(part)
else:
title_parts.append(part)
date = ' '.join(date_parts)
title = ' '.join(title_parts) if title_parts else ""

Comment on lines +84 to +92
time = re.findall(pattern, parse)[-1]
midDay = re.search(replacementPattern, time).group(0)
trueTime = (
time.replace(midDay, " AM").strip()
if "a" in midDay
else time.replace(midDay, " PM").strip()
)
fullDate = date + " " + trueTime
return datetime.strptime(fullDate, "%B %d, %Y %I:%M %p")
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Add error handling for empty regex results in _parse_end

In the _parse_end method, if parse is None or the regex search doesn't find any matches, accessing [-1] on the result of re.findall will raise an IndexError.

Ensure that parse is not None and that re.findall returns a non-empty list before proceeding:

 def _parse_end(self, date, parse):
+    if not parse:
+        # Handle the case where parse is None or empty
+        return None
     pattern = re.compile(
         r"\d{1,2}:\d{1,2}.[a-z]{0,1}\.{0,1}[a-z]{0,1}\.{0,1}", re.MULTILINE
     )
     replacementPattern = re.compile("[^0-9:].*")
     times = re.findall(pattern, parse)
+    if not times:
+        # Handle the absence of time strings
+        return None
-    time = times[-1]
+    time = times[-1]

Committable suggestion was skipped due to low confidence.

Comment on lines +32 to +33
res = requests.get(agenda)
details = extract_text(BytesIO(res.content))
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Avoid using requests within Scrapy spiders

Using requests.get at lines 32-33 is not recommended within Scrapy spiders, as it bypasses Scrapy's built-in features like asynchronous request handling, caching, and adherence to robots.txt. Instead, utilize Scrapy's Request or response.follow methods to make HTTP requests.

Refactor the code to use scrapy.Request and handle the agenda PDF download asynchronously. Here's how you can modify the code:

-import requests
+from scrapy import Request

...

-            res = requests.get(agenda)
-            details = extract_text(BytesIO(res.content))
+            yield Request(
+                url=agenda,
+                callback=self.parse_agenda,
+                meta={'date': date, 'title': title, 'links': links}
+            )

# Then, define the parse_agenda method to handle the response
+    def parse_agenda(self, response):
+        details = extract_text(BytesIO(response.body))
+        meeting = Meeting(
+            title=self._parse_title(response.meta['title']),
+            description="",
+            classification=self._parse_classification(response.meta['title']),
+            start=self._parse_start(response.meta['date'], details),
+            end=self._parse_end(response.meta['date'], details),
+            all_day=self._parse_all_day(),
+            time_notes="",
+            location=self._parse_location(details),
+            links=response.meta['links'],
+            source=self._parse_source(response),
+        )
+        meeting["status"] = self._get_status(meeting)
+        meeting["id"] = self._get_id(meeting)
+        yield meeting

Committable suggestion was skipped due to low confidence.

Comment on lines +101 to +107
pattern = re.compile(r"(\d\d\d\d.*\n?)(?=\s*Meeting)", re.MULTILINE)
match = re.search(pattern, item)
location = match.group(1).strip().split("|")
return {
"address": location[0].strip() + ", " + location[1].strip(),
"name": location[2].strip(),
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Add error handling for regex search in _parse_location

In _parse_location, re.search(pattern, item) may return None if no match is found. Attempting to access match.group(1) when match is None will raise an AttributeError.

Include a check to handle cases where match is None:

 def _parse_location(self, item):
     pattern = re.compile(r"(\d\d\d\d.*\n?)(?=\s*Meeting)", re.MULTILINE)
     match = re.search(pattern, item)
+    if not match:
+        # Handle the absence of a matching location string
+        return {"address": "", "name": ""}
     location = match.group(1).strip().split("|")

Committable suggestion was skipped due to low confidence.

Comment on lines +90 to +110
<div class="mega-nav-version-2-link-div" id="mega-nav-version-2-link-financial-aid-div">
<a class="mega-nav-version-2-link" id="mega-nav-version-2-link-financial-aid" href="https://admissions.neiu.edu/">
Admissions
</a>
<div class="mega-nav-version-2-link-dropdown" id="mega-nav-version-2-link-dropdown-financial-aid">
<p class="mega-nav-version-2-dropdown-heading">Learn About NEIU</p>
<div class="mega-nav-version-2-dropdown-row">
<div class="mega-nav-version-2-dropdown-col">
<ul>
<li><a href="https://admissions.neiu.edu/visit">Visit</a></li>
<li><a href="/academics/programs">Our Programs</a></li>
<li><a href="https://admissions.neiu.edu/admission-requirements">Requirements</a></li>
<li><a href="https://admissions.neiu.edu/admitted-students">Admitted Students</a></li>
<li><a href="https://admissions.neiu.edu/your-success">Your Success</a></li>
<li><a href="/mosaic">Profiles</a></li>
</ul>

</div>
</div>
</div>
</div>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Duplicate id attributes in navigation menu

The id attribute mega-nav-version-2-link-financial-aid-div is used multiple times in the navigation menu (lines 90 and 112). IDs must be unique within an HTML document to ensure proper functioning of scripts and styles.

Apply this diff to make the IDs unique:

- <div class="mega-nav-version-2-link-div" id="mega-nav-version-2-link-financial-aid-div">
+ <div class="mega-nav-version-2-link-div" id="mega-nav-version-2-link-financial-aid-div-2">

Ensure to update any corresponding references in your CSS and JavaScript code.

Also applies to: 112-153

Comment on lines +90 to +153
<div class="mega-nav-version-2-link-div" id="mega-nav-version-2-link-financial-aid-div">
<a class="mega-nav-version-2-link" id="mega-nav-version-2-link-financial-aid" href="https://admissions.neiu.edu/">
Admissions
</a>
<div class="mega-nav-version-2-link-dropdown" id="mega-nav-version-2-link-dropdown-financial-aid">
<p class="mega-nav-version-2-dropdown-heading">Learn About NEIU</p>
<div class="mega-nav-version-2-dropdown-row">
<div class="mega-nav-version-2-dropdown-col">
<ul>
<li><a href="https://admissions.neiu.edu/visit">Visit</a></li>
<li><a href="/academics/programs">Our Programs</a></li>
<li><a href="https://admissions.neiu.edu/admission-requirements">Requirements</a></li>
<li><a href="https://admissions.neiu.edu/admitted-students">Admitted Students</a></li>
<li><a href="https://admissions.neiu.edu/your-success">Your Success</a></li>
<li><a href="/mosaic">Profiles</a></li>
</ul>

</div>
</div>
</div>
</div>

<div class="mega-nav-version-2-link-div" id="mega-nav-version-2-link-financial-aid-div">
<a class="mega-nav-version-2-link" id="mega-nav-version-2-link-financial-aid" href="/financial-aid">
Financial Aid
</a>
<div class="mega-nav-version-2-link-dropdown" id="mega-nav-version-2-link-dropdown-financial-aid">
<p class="mega-nav-version-2-dropdown-heading">Finance Your Education</p>
<div class="mega-nav-version-2-dropdown-row">
<div class="mega-nav-version-2-dropdown-col">
<ul>
<li><a href="/financial-aid/financing-your-education">Tuition &amp; Fees</a>
<ul>
<li><a href="/financial-aid/tuition-and-fees-costs-attendance/tuition-information">Tuition Information</a></li>
<li><a href="/financial-aid/tuition-and-fees-costs-of-attendance/fees-information">Fees Information</a></li>
<li><a href="/financial-aid/financing-your-education/calculating-your-net-cost">Calculating Your Net Cost</a></li>
</ul>
</li>
<li><a href="/financial-aid/applying-for-federal-state-assistance">Applying for Federal &amp; State Assistance</a>
<ul>
<li><a href="/financial-aid/applying-for-federal-state-assistance/financial-aid-forms-documents">Financial Aid Forms &amp; Documents</a></li>
<li><a href="/financial-aid/applying-for-federal-state-assistance/summer-financial-aid-resources">Summer Financial Aid Resources</a></li>
</ul>
</li>
<li><a href="/financial-aid/consumer-informationstudent-rights-know">Consumer Information</a></li>
</ul>

</div>
<div class="mega-nav-version-2-dropdown-col">
<ul>
<li><a href="/financial-aid/scholarship-opportunities">Scholarship Opportunities</a>
<ul>
<li><a href="/financial-aid/scholarship-opportunities/scholarship-listing">Scholarship Listing</a></li>
</ul>
</li>
<li><a href="/financial-aid/applying-for-student-loans">Applying for Student Loans</a></li>
<li><a href="/financial-aid/student-employment-opportunities">Student Employment Opportunities</a></li>
<li><a href="/financial-aid/understanding-my-financial-account">Understanding My Financial Account</a></li>
</ul>

</div>
</div>
</div>
</div>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Repeated IDs in multiple navigation sections

Multiple navigation sections use the same id attributes, such as mega-nav-version-2-link-financial-aid-div and mega-nav-version-2-link-dropdown-financial-aid. Repeating IDs across elements violates HTML standards and can cause issues with styling and scripting.

Assign unique IDs to each navigation section. For example:

- <div class="mega-nav-version-2-link-div" id="mega-nav-version-2-link-financial-aid-div">
+ <div class="mega-nav-version-2-link-div" id="mega-nav-version-2-link-financial-aid-div-1">
- <div class="mega-nav-version-2-link-dropdown" id="mega-nav-version-2-link-dropdown-financial-aid">
+ <div class="mega-nav-version-2-link-dropdown" id="mega-nav-version-2-link-dropdown-financial-aid-1">

Repeat this process for other duplicated IDs, incrementing the suffix accordingly, and update any associated scripts or styles.

Also applies to: 156-226, 229-310, 313-354, 357-412

Comment on lines +775 to +882
<div class="board-meeting-materials-row views-row"><h4 class="accordion">SEPTEMBER 19, 2024 FINANCE, BUILDINGS AND GROUNDS COMMITTEE MEETING</h4><div class="accordion-content"><ul>
<li><a href="https://www.neiu.edu/sites/default/files/2024-09/2024.09.19.%20%20FBG%20Com_Agenda_FINAL_0.pdf" target="_blank">Meeting Agenda</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-09/2024.09.19.%20FBG%20Com_Mtg%20Matls_combined.pdf" target="_blank">Meeting Materials</a>
<ul>
<li><a href="https://www.neiu.edu/sites/default/files/2024-09/Colorblind%20image_Page_3.jpg" target="_blank">Markham Prairie Image - colorblind friendly</a></li>
</ul>
</li>
<li><a href="https://youtu.be/oih78kfmz_k" target="_blank">Meeting Video</a></li>
</ul>
</div></div>
<div class="board-meeting-materials-row views-row"><h4 class="accordion">SEPTEMBER 19, 2024 AUDIT COMMITTEE MEETING</h4><div class="accordion-content"><ul>
<li><a href="https://www.neiu.edu/sites/default/files/2024-09/2024.09.19.%20Audit%20Com_FINAL.pdf" target="_blank">Meeting Agenda</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-09/2024.09.19.%20Audit%20Com_Mtg%20Matls_combined.pdf" target="_blank">Meeting Materials</a></li>
<li><a href="https://youtu.be/-msYRzsI9vQ" target="_blank">Meeting Video</a></li>
</ul>
</div></div>
<div class="board-meeting-materials-row views-row"><h4 class="accordion">SEPTEMBER 5, 2024 ACADEMIC/STUDENT AFFAIRS, ENROLLMENT, AND TECHNOLOGY COMMITTEE MEETING</h4><div class="accordion-content"><ul>
<li><a href="https://www.neiu.edu/sites/default/files/2024-08/2024.09.05.%20ASAET%20Agenda_FINAL.pdf" target="_blank">Meeting Agenda</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-08/2024.09.05.%20ASAET%20Com%20Mtg%20Matls_combined_.pdf" target="_blank">Meeting Materials</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-09/2024.09.05.%20ASAET%20Com%20Mtg%20Minutes_approved%2009192024.pdf" target="_blank">Meeting Minutes</a></li>
</ul>
</div></div>
<div class="board-meeting-materials-row views-row"><h4 class="accordion">JULY 30, 2024 SPECIAL BOARD MEETING</h4><div class="accordion-content"><ul>
<li><a href="https://www.neiu.edu/sites/default/files/2024-07/2024.07.30.%20Sp%20Board%20Meeting%20Agenda_FINAL.pdf" target="_blank">Meeting Agenda</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-07/2024.07.30.%20Presidential%20Agreement%20Term%20Sheet.pdf" target="_blank">Meeting Materials</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-09/2024.07.30.%20BoT%20Special_mtg%20minutes_approved%2009192024.pdf" target="_blank">Meeting Minutes</a></li>
</ul>
</div></div>
<div class="board-meeting-materials-row views-row"><h4 class="accordion">JUNE 25, 2024 SPECIAL BOARD MEETING</h4><div class="accordion-content"><ul>
<li><a href="https://www.neiu.edu/sites/default/files/2024-06/2024.06.25.%20Sp%20Board%20Meeting%20Agenda_FINAL.pdf" target="_blank">Meeting Agenda</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-09/2024.06.25.%20BoT%20Special%20Mtg%20Minutes_approved%2009192024.pdf" target="_blank">Meeting Minutes</a></li>
</ul>
</div></div>
<div class="board-meeting-materials-row views-row"><h4 class="accordion">JUNE 13, 2024 SPECIAL BOARD MEETING</h4><div class="accordion-content"><ul>
<li><a href="https://www.neiu.edu/sites/default/files/2024-06/2024.06.13.%20Board%20Meeting%20Agenda_FINAL%20Revised_0.pdf" target="_blank">Meeting Agenda</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-09/2024.06.13.%20BoT%20Special%20Mtg%20Minutes_approved%2009192024.pdf" target="_blank">Meeting Minutes</a></li>
</ul>
</div></div>
<div class="board-meeting-materials-row views-row"><h4 class="accordion">MAY 28, 2024</h4><div class="accordion-content"><ul>
<li><a href="https://www.neiu.edu/sites/default/files/2024-05/2024.05.28.%20Agenda_FINAL.pdf" target="_blank">Meeting Agenda</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-05/2028.05.28.%20President%27s%20Report_combined.pdf" target="_blank">President's Report to the Board</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-09/2024.05.28.%20BoT%20Mtg%20Minutes_approved%2009192024.pdf" target="_blank">Meeting Minutes</a></li>
</ul>
<p>&nbsp;</p>
</div></div>
<div class="board-meeting-materials-row views-row"><h4 class="accordion">MAY 16, 2024 ACADEMIC/STUDENT AFFAIRS, ENROLLMENT, AND TECHNOLOGY COMMITTEE</h4><div class="accordion-content"><ul>
<li><a href="https://www.neiu.edu/sites/default/files/2024-05/2024.05.16.%20ASAET%20Agenda_FINAL.pdf" target="_blank">Meeting Agenda</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-05/2024.05.16.%20ASAET%20Com_meeting%20matls_combined.pdf" target="_blank">Meeting Materials</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-09/2024.05.16.%20ASAET%20Com%20Mtg%20Minutes_approved%2009192024.pdf" target="_blank">Meeting Minutes</a></li>
</ul>
</div></div>
<div class="board-meeting-materials-row views-row"><h4 class="accordion">MAY 14, 2024 FINANCE, BUILDINGS AND GROUNDS COMMITTEE</h4><div class="accordion-content"><ul>
<li><a href="https://www.neiu.edu/sites/default/files/2024-05/2024.05.14.%20%20FBG%20Com_Agenda_FINAL_0.pdf" target="_blank">Meeting Agenda</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-05/2024.05.14%20FBG%20Com_meeting%20matls_combined_0.pdf" target="_blank">Meeting Materials</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-09/2024.05.14.%20FBG%20Com_Mtg%20Minutes_approved%2009192024.pdf" target="_blank">Meeting Minutes</a></li>
</ul>
</div></div>
<div class="board-meeting-materials-row views-row"><h4 class="accordion">APRIL 18, 2024 - El Centro Location</h4><div class="accordion-content"><ul>
<li><a href="https://www.neiu.edu/sites/default/files/2024-04/2024.04.18.%20Agenda_FINAL.pdf" target="_blank">Meeting Agenda</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-04/2024.04.18.%20Pres.%20Report_combined.pdf" target="_blank">President's Report to the Board</a>
<ul>
<li><a href="https://www.neiu.edu/sites/default/files/2024-05/2024.04.18.%20Ed.D.%20Program%207%20YR%20Budget%20-%20GCOE.pdf" target="_blank">Ed.D. Program Budget</a></li>
</ul>
</li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-05/2024.04.18.%20BoT%20Mtg%20MInutes_approved%2005282024.pdf" target="_blank">Meeting Minutes</a></li>
</ul>
</div></div>
<div class="board-meeting-materials-row views-row"><h4 class="accordion">APRIL 18, 2024 ACADEMIC/STUDENT AFFAIRS, ENROLLMENT, AND TECHNOLOGY COMMITTEE</h4><div class="accordion-content"><ul>
<li><a href="https://www.neiu.edu/sites/default/files/2024-04/2024.04.18.%20ASAET%20Agenda_FINAL_0.pdf" target="_blank">Meeting Agenda</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-04/2024.04.18.%20ASAET%20Mtg%20Mtls_combined.pdf" target="_blank">Meeting Materials</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-05/2024.04.18.%20ASAET%20Com_Mtg%20Minutes_approved%2005282024.pdf" target="_blank">Meeting Minutes</a></li>
</ul>
</div></div>
<div class="board-meeting-materials-row views-row"><h4 class="accordion">MARCH 21, 2024 FINANCE, BUILDINGS AND GROUNDS COMMITTEE</h4><div class="accordion-content"><ul>
<li><a href="https://www.neiu.edu/sites/default/files/2024-03/2024.03.21.%20FBG%20Com_Agenda_FINAL.pdf" target="_blank">Meeting Agenda</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-03/2024.03.21.%20FBG%20Com_Mtg%20Mtls_combined.pdf" target="_blank">Meeting Materials</a>
<ul>
<li><a href="https://www.neiu.edu/sites/default/files/2024-05/2023.09.21.%20FY25%20Operating%20%26%20Capital%20Request%20Budget%20-%20v5.pdf" target="_blank">FY2025 Preliminary Operating and Capital Budgets Request</a></li>
</ul>
</li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-04/2024.03.21.%20FBG%20Com%20Mtg%20Minutes_approved%2004182024.pdf" target="_blank">Meeting Minutes</a></li>
</ul>
</div></div>
<div class="board-meeting-materials-row views-row"><h4 class="accordion">FEBRUARY 15, 2024</h4><div class="accordion-content"><ul>
<li><a href="https://www.neiu.edu/sites/default/files/2024-02/2024.02.15.%20Agenda_FINAL.pdf" target="_blank">Meeting Agenda</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-02/2024.02.15.%20Presidents%20Report_combined.pdf" target="_blank">President's Report to the Board</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-04/2024.02.15.%20BoT%20Mtg%20Minutes_approved%2004182024.pdf" target="_blank">Meeting Minutes</a></li>
</ul>
</div></div>
<div class="board-meeting-materials-row views-row"><h4 class="accordion">JANUARY 18, 2024 COMMITTEE MEETING DAY</h4><div class="accordion-content"><ul>
<li><a href="https://www.neiu.edu/sites/default/files/2024-01/2024.01.18.%20Committee%20Mtg%20Agenda.pdf" target="_blank">Committee Meeting Agenda</a>
<ul>
<li><a href="https://www.neiu.edu/sites/default/files/2024-01/2024.01.18.%20Audit%20Mtg%20Matls_combined.pdf" target="_blank">Audit Committee Meeting materials</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-02/2024.01.18.%20Audit%20Com%20Mtg%20Minutes_approved%2002152024.pdf" target="_blank">Meeting Minutes</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-01/2024.01.18.%20ASAET%20Com%20Mtg%20Mtls_combined.pdf" target="_blank">Academic/Student Affairs, Enrollment, and Technology Committee Meeting materials</a></li>
<li><a href="https://www.neiu.edu/sites/default/files/2024-02/2024.01.18.%20ASAET%20Com%20Mtg%20Minutes_approved%2002152024.pdf" target="_blank">Meeting Minutes</a></li>
</ul>
</li>
</ul>
</div></div>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Accessibility: Ensure proper heading hierarchy

The accordion headings for board meeting materials use <h4> tags (lines 773, 783, etc.) without a proper heading hierarchy. This can affect screen readers and SEO.

Adjust the heading levels to follow a logical order, starting with <h2> or <h3> as appropriate.

<hr>
<p>Board meeting materials are approved by the President of the University in advance of each meeting.&nbsp;All meeting materials for Trustees are prepared and distributed by the Assistant Secretary to the Board of Trustees.</p>
<p>This page is updated regularly.&nbsp;If you are not able to locate the meeting information you require, approved meeting minutes and board meeting materials can also be&nbsp;found&nbsp;in the <a href="https://neiulibraries.libguides.com/c.php?g=60370&amp;p=4145968" target="_blank">Ronald Williams Library Archives.</a></p>
<p>For further assistance, or for&nbsp;audio recordings of Board proceedings, please contact the Assistant Secretary to the Board at <a href="mailto:bot@neiu.edu">k-voigt@neiu.edu</a>.</p>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Inconsistent email address in contact link

On line 709, the href attribute is mailto:bot@neiu.edu, but the displayed text is k-voigt@neiu.edu. This inconsistency may confuse users.

Please correct the email address to ensure consistency. If k-voigt@neiu.edu is the correct address:

- <a href="mailto:bot@neiu.edu">k-voigt@neiu.edu</a>
+ <a href="mailto:k-voigt@neiu.edu">k-voigt@neiu.edu</a>

If bot@neiu.edu is the correct address:

- <a href="mailto:bot@neiu.edu">k-voigt@neiu.edu</a>
+ <a href="mailto:bot@neiu.edu">bot@neiu.edu</a>

Committable suggestion was skipped due to low confidence.

Comment on lines +548 to +550
'//www.google.com/cse/cse.js?cx=' + cx;
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(gcse, s);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Always use HTTPS for external scripts

To enhance security and avoid mixed content warnings, it's recommended to always load external scripts over HTTPS. The current code conditionally loads the script over HTTP or HTTPS based on the page protocol.

Apply this diff to always use HTTPS:

-   gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
+   gcse.src = 'https:' +
    '//www.google.com/cse/cse.js?cx=' + cx;

Committable suggestion was skipped due to low confidence.

@lilyhuang-github
Copy link
Author

I'll start checking what the ai reviewer suggests at a later date.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant