diff --git a/internal/db/testdata/gdoc byby/article.md b/internal/db/testdata/gdoc byby/article.md index a935ba48..95a9b471 100644 --- a/internal/db/testdata/gdoc byby/article.md +++ b/internal/db/testdata/gdoc byby/article.md @@ -14,8 +14,6 @@ porttitor turpis ligula eget magna. Proin ligula ipsum, iaculis sit amet urna ultrices, bibendum pharetra felis. Quisque gravida sit amet lectus suscipit mattis. In pretium viverra est, quis sodales orci accumsan at. Quisque porta orci nec pretium iaculis. Duis congue porta velit non dapibus. Nam at pellentesque mauris. Cras porta velit suscipit purus commodo, sed ullamcorper est elementum. Suspendisse pellentesque arcu quis ipsum tempor scelerisque. Vivamus varius dolor sed nibh pulvinar iaculis. Phasellus iaculis, massa eget ornare pretium, ex nisi aliquam libero, eget ullamcorper nisi quam nec erat. - - -
+{{}} Maecenas sollicitudin lorem lectus, a dignissim quam auctor dictum. Integer eu tempus metus. Etiam ultricies, justo aliquet rutrum vehicula, nunc odio hendrerit turpis, non ullamcorper velit eros luctus turpis. Phasellus non venenatis ipsum. Aenean mi quam, porttitor nec sapien a, posuere pharetra ante. Aenean ac tristique enim. Phasellus interdum ex sed nisl semper, tempor tincidunt augue rutrum. Pellentesque nec lorem eleifend, dictum lorem ac, luctus lacus. Aliquam congue mattis nulla vitae sodales. Vivamus sed molestie elit. Donec sit amet risus enim. Etiam id ultrices nisi, at hendrerit diam. Vestibulum at quam lorem. Nunc consequat rutrum orci, ac laoreet enim. diff --git a/internal/db/testdata/gdoc byby/page.json b/internal/db/testdata/gdoc byby/page.json index cf9fbb02..4a04aa23 100644 --- a/internal/db/testdata/gdoc byby/page.json +++ b/internal/db/testdata/gdoc byby/page.json @@ -22,7 +22,7 @@ "title-tag": "", "twitter-title": "" }, - "body": "Lorem ipsum dolor sit amet, <consectetur> adipiscing elit. Aenean ullamcorper augue nec commodo egestas. Vivamus cursus lectus magna, aliquet cursus metus interdum in. Quisque imperdiet gravida commodo. Vestibulum lobortis lobortis rutrum. Suspendisse tristique tristique placerat. Maecenas aliquet consectetur dolor vitae ornare. Nunc sodales placerat bibendum. Vivamus purus leo, finibus vitae felis nec, rutrum rutrum metus. In vehicula scelerisque rhoncus.\n\n### Blah blah\n\n- Heading 1\n\n - Heading 2\n\nPraesent vitae facilisis neque. Phasellus arcu magna, euismod et porttitor sit amet, suscipit quis turpis. Donec lacinia, nisl vel dignissim suscipit, massa lorem tempus purus, ut feugiat purus nisi id orci. Duis vestibulum, arcu in lobortis volutpat, neque tellus mollis turpis, semper\n\n

Heading 1

\n\n

Heading 2

\n\nporttitor turpis ligula eget magna. Proin ligula ipsum, iaculis sit amet urna ultrices, bibendum pharetra felis. Quisque gravida sit amet lectus suscipit mattis. In pretium viverra est, quis sodales orci accumsan at. Quisque porta orci nec pretium iaculis. Duis congue porta velit non dapibus. Nam at pellentesque mauris. Cras porta velit suscipit purus commodo, sed ullamcorper est elementum. Suspendisse pellentesque arcu quis ipsum tempor scelerisque. Vivamus varius dolor sed nibh pulvinar iaculis. Phasellus iaculis, massa eget ornare pretium, ex nisi aliquam libero, eget ullamcorper nisi quam nec erat.\n\n\n\n
\n\nMaecenas sollicitudin lorem lectus, a dignissim quam auctor dictum. Integer eu tempus metus. Etiam ultricies, justo aliquet rutrum vehicula, nunc odio hendrerit turpis, non ullamcorper velit eros luctus turpis. Phasellus non venenatis ipsum. Aenean mi quam, porttitor nec sapien a, posuere pharetra ante. Aenean ac tristique enim. Phasellus interdum ex sed nisl semper, tempor tincidunt augue rutrum. Pellentesque nec lorem eleifend, dictum lorem ac, luctus lacus. Aliquam congue mattis nulla vitae sodales. Vivamus sed molestie elit. Donec sit amet risus enim. Etiam id ultrices nisi, at hendrerit diam. Vestibulum at quam lorem. Nunc consequat rutrum orci, ac laoreet enim.\n", + "body": "Lorem ipsum dolor sit amet, <consectetur> adipiscing elit. Aenean ullamcorper augue nec commodo egestas. Vivamus cursus lectus magna, aliquet cursus metus interdum in. Quisque imperdiet gravida commodo. Vestibulum lobortis lobortis rutrum. Suspendisse tristique tristique placerat. Maecenas aliquet consectetur dolor vitae ornare. Nunc sodales placerat bibendum. Vivamus purus leo, finibus vitae felis nec, rutrum rutrum metus. In vehicula scelerisque rhoncus.\n\n### Blah blah\n\n- Heading 1\n\n - Heading 2\n\nPraesent vitae facilisis neque. Phasellus arcu magna, euismod et porttitor sit amet, suscipit quis turpis. Donec lacinia, nisl vel dignissim suscipit, massa lorem tempus purus, ut feugiat purus nisi id orci. Duis vestibulum, arcu in lobortis volutpat, neque tellus mollis turpis, semper\n\n

Heading 1

\n\n

Heading 2

\n\nporttitor turpis ligula eget magna. Proin ligula ipsum, iaculis sit amet urna ultrices, bibendum pharetra felis. Quisque gravida sit amet lectus suscipit mattis. In pretium viverra est, quis sodales orci accumsan at. Quisque porta orci nec pretium iaculis. Duis congue porta velit non dapibus. Nam at pellentesque mauris. Cras porta velit suscipit purus commodo, sed ullamcorper est elementum. Suspendisse pellentesque arcu quis ipsum tempor scelerisque. Vivamus varius dolor sed nibh pulvinar iaculis. Phasellus iaculis, massa eget ornare pretium, ex nisi aliquam libero, eget ullamcorper nisi quam nec erat.\n\n{{}}\n\nMaecenas sollicitudin lorem lectus, a dignissim quam auctor dictum. Integer eu tempus metus. Etiam ultricies, justo aliquet rutrum vehicula, nunc odio hendrerit turpis, non ullamcorper velit eros luctus turpis. Phasellus non venenatis ipsum. Aenean mi quam, porttitor nec sapien a, posuere pharetra ante. Aenean ac tristique enim. Phasellus interdum ex sed nisl semper, tempor tincidunt augue rutrum. Pellentesque nec lorem eleifend, dictum lorem ac, luctus lacus. Aliquam congue mattis nulla vitae sodales. Vivamus sed molestie elit. Donec sit amet risus enim. Etiam id ultrices nisi, at hendrerit diam. Vestibulum at quam lorem. Nunc consequat rutrum orci, ac laoreet enim.\n", "schedule_for": null, "last_published": null, "created_at": "2020-03-15T20:00:00Z", diff --git a/internal/db/testdata/gdoc curly/article.md b/internal/db/testdata/gdoc curly/article.md index bd499a1d..bf91f79d 100644 --- a/internal/db/testdata/gdoc curly/article.md +++ b/internal/db/testdata/gdoc curly/article.md @@ -6,7 +6,7 @@ Then, the county realized some mail ballots found yet another error. Mail ballots said “vote for not more than three” candidates in the county commissioner race — potentially disenfranchising voters, since in reality, they were only supposed to choose two candidates. -
+{{}} Greene County’s string of errors was the most for a single county this year, but it had plenty of company. On or before Election Day for the November municipal election, 12 counties reported 16 errors, more than double the number of errors from any other election since 2019. @@ -92,7 +92,7 @@ Coulter, of the Open Source Election Technology Institute, said that jurisdictio Greene County canceled and reissued ballots upon discovering the errors, as did Potter County. Lancaster County resisted doing so and settled on allowing voters to come into the office to have their ballot reissued. -
+{{}} Greenburg said the best strategy from his election administrator days was to take the ballot from the last comparable election, which in this case would have been the 2019 municipal election, and begin building the ballot from that. He would advise new directors to start there. diff --git a/internal/db/testdata/gdoc curly/page.json b/internal/db/testdata/gdoc curly/page.json index 556f9e03..691f420b 100644 --- a/internal/db/testdata/gdoc curly/page.json +++ b/internal/db/testdata/gdoc curly/page.json @@ -22,7 +22,7 @@ "title-tag": "Election errors rise in PA as voting officials resign", "twitter-title": "" }, - "body": "This article is made possible through Spotlight PA’s collaboration with Votebeat, a nonpartisan news organization covering local election administration and voting. Help us answer your questions about voting where you live by filling out our survey.\n\nIn mid-October, Greene County, in southwest Pennsylvania, notified voters that some mail ballots for the November election listed two races for magisterial district judges, though voters were only supposed to be electing one.\n\nThen, the county realized some mail ballots listed school board candidates in the wrong order.\n\nAnd just days before the election, officials in Greene County found yet another error. Mail ballots said “vote for not more than three” candidates in the county commissioner race — potentially disenfranchising voters, since in reality, they were only supposed to choose two candidates.\n\n
\n\nGreene County’s string of errors was the most for a single county this year, but it had plenty of company. On or before Election Day for the November municipal election, 12 counties reported 16 errors, more than double the number of errors from any other election since 2019.\n\nElection experts, as well as the Department of State, agree the increase is linked to turnover and loss of experience at local election offices.\n\nCounties in Pennsylvania have been steadily reporting more election administration errors impacting voters’ ballots with each election since 2019, an analysis by Votebeat and Spotlight PA of data collected by the news organizations and the Open Source Election Technology Institute has found.\n\nThe errors have the potential to affect voters’ trust in elections ahead of what is expected to be a highly contentious presidential election.\n\nAt a state Senate hearing this month, state Sen. Pat Stefano (R., Fayette) asked Secretary of the Commonwealth Al Schmidt about the numerous errors, saying they “send a ripple through our faith in the system.”\n\n“It does,” Schmidt responded. “These are all human errors that occurred. They occur most frequently, overwhelmingly, when you have new election administrators.”\n\nGenya Coulter, senior director of stakeholder relations at the Open Source Election Technology Institute, began collecting reports of mail and in-person ballot-printing errors in 2022 after noticing an increase in news stories about such mistakes. Votebeat and Spotlight PA supplemented her data with additional incidents of election administration errors found in news reports to track the trend.\n\nUntil this year, eight errors reported during the 2021 municipal election were the high-water mark for errors in a Pennsylvania election, according to the data.\n\nCounty errors this November included:\n\n- instructions to vote for the wrong number of candidates;\n\n- candidates or races left off the ballot;\n\n- improper ballot return instructions;\n\n- duplicate ballots sent to the same voter.\n\nThe most high-profile problem stemmed from a human error programming Northampton County’s voting machines that made votes for one judge appear on a ballot print-out next to another judge’s name — a debacle that brought national attention to the county.\n\nCoulter said ballot-printing errors can shake voter trust. “You have \\[paper ballots\\] because they are a verifiable record of the election,” Coulter said. “If you're going to audit elections after, like in a risk-limiting audit, to make sure everything is correct, what are you going to do if the ballot itself is not correct?”\n\n\n\n## ‘A perfect storm’\n\nCounties are supposed to proofread their ballots before printing for spelling, candidate order, instructional errors, or other inaccuracies. Often this is done by the election director or their deputy.\n\nJeff Greenburg, a senior advisor on election administration for the Philadelphia-based nonprofit Committee of Seventy who previously ran elections in Mercer County, noted that the municipal ballot is usually the longest and most complex, increasing the risk of something slipping through the cracks during proofing.\n\n“It is the one that is the most complicated even for veteran administrators,” he said. “I think that, coupled with the turnover, creates a perfect storm, so to speak.”\n\n“In my mind,” he added, “it is directly related to the turnover in election directors.”\n\nIt’s true that many of the errors are happening in counties where the people in the top election administration positions have churned.\n\nGreene County is currently searching for its third director this year. In 2019, the county’s top two election officials had more than 24 years of combined experience, according to records obtained by Votebeat and Spotlight PA. Both those officials left, and a replacement elections director who started this year resigned after nine months. His replacement started only two weeks before the 2023 general election and lasted a total of four weeks.\n\nClint Barry, chair of the Greene County GOP, said the county’s problems this year were “100% director error” and the job has gotten tougher since Pennsylvania adopted no-excuse mail balloting in 2019.\n\n“The law is cumbersome,” he said. “I think it would take you three to four years to get yourself up to speed. The learning curve is very steep.”\n\nGreene County Chief Clerk Jeff Marshall, who oversees the elections department, said there’s “no doubt” that training new people quickly can lead to errors. He also pointed out that this was the first year since 2019 that commissioners, who help oversee elections, were on the ballot and thus could not be involved in the election administration process.\n\nMarshall said he is optimistic about filling the position but is concerned that applicants lack experience.\n\nLancaster County — which has had a string of ballot problems since 2021 — also has a relatively new director and deputy director. The current director and deputy have roughly three-and-a-half combined years of experience between them, compared to the 19.5 combined years of experience under the administrative leadership that was in place for the 2019 municipal election, during which the county had no errors.
\n\nThis year the county sent out improper instructions on returning mail ballots in the November election, telling voters to insert ballots in a “white secrecy envelope” even though the provided secrecy envelope was yellow. During the May primary, its ballots instructed voters to vote for the wrong number of candidates in one race.\n\nAnd Potter County — which also had multiple errors this year — has a director who began in August 2022 and had never previously administered an election. The county sent out ballots instructing some voters to vote for the wrong number of candidates. It also left a race for constable off some ballots.\n\n## ‘A battle plan for disaster’\n\nBarry, the GOP chair from Greene County, thinks part of the problem is that the Department of State does not provide enough training for local officials, and takes too long to get back to directors with answers to their questions.\n\n“They can be bright, but they really have no training,” he said, adding that he sees a cycle where directors come in, receive little training, and burn out.\n\n“It's a battle plan for disaster. There’s no other way to say it.”\n\nMatt Heckel, press secretary for the Department of State, said the agency recognizes the importance of training in light of the number of election officials who have left their jobs since 2020. It has recently hired a new training manager dedicated to working with county officials.\n\nThe department said it has made other changes to support local election officials next year, including establishing a dedicated elections training team, contacting each county to identify their needs, creating a comprehensive calendar of duties and deadlines in 2024, providing a ballot review checklist, conducting trainings on updating voter rolls, and reviewing logic and accuracy testing, among other things.
\n\nThe department is also planning to hold a training on reporting election night results and provide directors with a video of basics on how to use the statewide voter registration system.\n\nMarshall, the Greene County chief clerk, said the Department of State offers support, but there are limits to that because elections are the responsibility of counties and the agency often ends up recommending the county consult with its attorney.\n\n“So they'll give us guidance or suggested procedures but that clear ‘Here is what you do’ is not there,” he said.\n\nCoulter, of the Open Source Election Technology Institute, said that jurisdictions where vote by mail is new typically see an increase in errors. No-excuse mail voting was introduced in Pennsylvania in 2019 and implemented the following year. She also stressed that in her research, she typically found that errors were quickly caught and fixed.\n\n“Even the best election directors have ballot printing errors,” she said. “The election directors who I think really handle things the best go, ‘Hey, this happened. We’re working overtime to get you this ballot. We apologize for the error. We’ll make it right.’ I think that really goes a long way instead of just playing ostrich.”\n\nGreene County canceled and reissued ballots upon discovering the errors, as did Potter County. Lancaster County resisted doing so and settled on allowing voters to come into the office to have their ballot reissued.\n\n
\n\nGreenburg said the best strategy from his election administrator days was to take the ballot from the last comparable election, which in this case would have been the 2019 municipal election, and begin building the ballot from that. He would advise new directors to start there.\n\n“The more experienced we get, the less often you will see those errors,” he said. “I am cautiously optimistic that we will not see a repeat of those next year.” The presidential election ballot, he said, is the least complicated.\n\nErrors in Pennsylvania, a hotly contested swing state, tend to draw outsized scrutiny.\n\nLuzerne County’s 2022 ballot paper shortage drew national attention and a congressional hearing. Schmidt told Politico last month, after right-wing figures picked up on Northampton’s issue, that “the broader concern is that an incident like this would be misused to undermine confidence.”\n\n“That is absolutely a risk that could happen, especially heading into 2024, which is going to be incredibly contentious,” Coulter said. “On the other hand, is it a best practice to sweep everything under the rug and pretend everything is fine when something clearly went wrong? It’s a really delicate balance there.”\n\nBEFORE YOU GO… If you learned something from this article, pay it forward and contribute to Spotlight PA at spotlightpa.org/donate. Spotlight PA is funded by foundations and readers like you who are committed to accountability journalism that gets results.\n", + "body": "This article is made possible through Spotlight PA’s collaboration with Votebeat, a nonpartisan news organization covering local election administration and voting. Help us answer your questions about voting where you live by filling out our survey.\n\nIn mid-October, Greene County, in southwest Pennsylvania, notified voters that some mail ballots for the November election listed two races for magisterial district judges, though voters were only supposed to be electing one.\n\nThen, the county realized some mail ballots listed school board candidates in the wrong order.\n\nAnd just days before the election, officials in Greene County found yet another error. Mail ballots said “vote for not more than three” candidates in the county commissioner race — potentially disenfranchising voters, since in reality, they were only supposed to choose two candidates.\n\n{{}}\n\nGreene County’s string of errors was the most for a single county this year, but it had plenty of company. On or before Election Day for the November municipal election, 12 counties reported 16 errors, more than double the number of errors from any other election since 2019.\n\nElection experts, as well as the Department of State, agree the increase is linked to turnover and loss of experience at local election offices.\n\nCounties in Pennsylvania have been steadily reporting more election administration errors impacting voters’ ballots with each election since 2019, an analysis by Votebeat and Spotlight PA of data collected by the news organizations and the Open Source Election Technology Institute has found.\n\nThe errors have the potential to affect voters’ trust in elections ahead of what is expected to be a highly contentious presidential election.\n\nAt a state Senate hearing this month, state Sen. Pat Stefano (R., Fayette) asked Secretary of the Commonwealth Al Schmidt about the numerous errors, saying they “send a ripple through our faith in the system.”\n\n“It does,” Schmidt responded. “These are all human errors that occurred. They occur most frequently, overwhelmingly, when you have new election administrators.”\n\nGenya Coulter, senior director of stakeholder relations at the Open Source Election Technology Institute, began collecting reports of mail and in-person ballot-printing errors in 2022 after noticing an increase in news stories about such mistakes. Votebeat and Spotlight PA supplemented her data with additional incidents of election administration errors found in news reports to track the trend.\n\nUntil this year, eight errors reported during the 2021 municipal election were the high-water mark for errors in a Pennsylvania election, according to the data.\n\nCounty errors this November included:\n\n- instructions to vote for the wrong number of candidates;\n\n- candidates or races left off the ballot;\n\n- improper ballot return instructions;\n\n- duplicate ballots sent to the same voter.\n\nThe most high-profile problem stemmed from a human error programming Northampton County’s voting machines that made votes for one judge appear on a ballot print-out next to another judge’s name — a debacle that brought national attention to the county.\n\nCoulter said ballot-printing errors can shake voter trust. “You have \\[paper ballots\\] because they are a verifiable record of the election,” Coulter said. “If you're going to audit elections after, like in a risk-limiting audit, to make sure everything is correct, what are you going to do if the ballot itself is not correct?”\n\n\n\n## ‘A perfect storm’\n\nCounties are supposed to proofread their ballots before printing for spelling, candidate order, instructional errors, or other inaccuracies. Often this is done by the election director or their deputy.\n\nJeff Greenburg, a senior advisor on election administration for the Philadelphia-based nonprofit Committee of Seventy who previously ran elections in Mercer County, noted that the municipal ballot is usually the longest and most complex, increasing the risk of something slipping through the cracks during proofing.\n\n“It is the one that is the most complicated even for veteran administrators,” he said. “I think that, coupled with the turnover, creates a perfect storm, so to speak.”\n\n“In my mind,” he added, “it is directly related to the turnover in election directors.”\n\nIt’s true that many of the errors are happening in counties where the people in the top election administration positions have churned.\n\nGreene County is currently searching for its third director this year. In 2019, the county’s top two election officials had more than 24 years of combined experience, according to records obtained by Votebeat and Spotlight PA. Both those officials left, and a replacement elections director who started this year resigned after nine months. His replacement started only two weeks before the 2023 general election and lasted a total of four weeks.\n\nClint Barry, chair of the Greene County GOP, said the county’s problems this year were “100% director error” and the job has gotten tougher since Pennsylvania adopted no-excuse mail balloting in 2019.\n\n“The law is cumbersome,” he said. “I think it would take you three to four years to get yourself up to speed. The learning curve is very steep.”\n\nGreene County Chief Clerk Jeff Marshall, who oversees the elections department, said there’s “no doubt” that training new people quickly can lead to errors. He also pointed out that this was the first year since 2019 that commissioners, who help oversee elections, were on the ballot and thus could not be involved in the election administration process.\n\nMarshall said he is optimistic about filling the position but is concerned that applicants lack experience.\n\nLancaster County — which has had a string of ballot problems since 2021 — also has a relatively new director and deputy director. The current director and deputy have roughly three-and-a-half combined years of experience between them, compared to the 19.5 combined years of experience under the administrative leadership that was in place for the 2019 municipal election, during which the county had no errors.
\n\nThis year the county sent out improper instructions on returning mail ballots in the November election, telling voters to insert ballots in a “white secrecy envelope” even though the provided secrecy envelope was yellow. During the May primary, its ballots instructed voters to vote for the wrong number of candidates in one race.\n\nAnd Potter County — which also had multiple errors this year — has a director who began in August 2022 and had never previously administered an election. The county sent out ballots instructing some voters to vote for the wrong number of candidates. It also left a race for constable off some ballots.\n\n## ‘A battle plan for disaster’\n\nBarry, the GOP chair from Greene County, thinks part of the problem is that the Department of State does not provide enough training for local officials, and takes too long to get back to directors with answers to their questions.\n\n“They can be bright, but they really have no training,” he said, adding that he sees a cycle where directors come in, receive little training, and burn out.\n\n“It's a battle plan for disaster. There’s no other way to say it.”\n\nMatt Heckel, press secretary for the Department of State, said the agency recognizes the importance of training in light of the number of election officials who have left their jobs since 2020. It has recently hired a new training manager dedicated to working with county officials.\n\nThe department said it has made other changes to support local election officials next year, including establishing a dedicated elections training team, contacting each county to identify their needs, creating a comprehensive calendar of duties and deadlines in 2024, providing a ballot review checklist, conducting trainings on updating voter rolls, and reviewing logic and accuracy testing, among other things.
\n\nThe department is also planning to hold a training on reporting election night results and provide directors with a video of basics on how to use the statewide voter registration system.\n\nMarshall, the Greene County chief clerk, said the Department of State offers support, but there are limits to that because elections are the responsibility of counties and the agency often ends up recommending the county consult with its attorney.\n\n“So they'll give us guidance or suggested procedures but that clear ‘Here is what you do’ is not there,” he said.\n\nCoulter, of the Open Source Election Technology Institute, said that jurisdictions where vote by mail is new typically see an increase in errors. No-excuse mail voting was introduced in Pennsylvania in 2019 and implemented the following year. She also stressed that in her research, she typically found that errors were quickly caught and fixed.\n\n“Even the best election directors have ballot printing errors,” she said. “The election directors who I think really handle things the best go, ‘Hey, this happened. We’re working overtime to get you this ballot. We apologize for the error. We’ll make it right.’ I think that really goes a long way instead of just playing ostrich.”\n\nGreene County canceled and reissued ballots upon discovering the errors, as did Potter County. Lancaster County resisted doing so and settled on allowing voters to come into the office to have their ballot reissued.\n\n{{}}\n\nGreenburg said the best strategy from his election administrator days was to take the ballot from the last comparable election, which in this case would have been the 2019 municipal election, and begin building the ballot from that. He would advise new directors to start there.\n\n“The more experienced we get, the less often you will see those errors,” he said. “I am cautiously optimistic that we will not see a repeat of those next year.” The presidential election ballot, he said, is the least complicated.\n\nErrors in Pennsylvania, a hotly contested swing state, tend to draw outsized scrutiny.\n\nLuzerne County’s 2022 ballot paper shortage drew national attention and a congressional hearing. Schmidt told Politico last month, after right-wing figures picked up on Northampton’s issue, that “the broader concern is that an incident like this would be misused to undermine confidence.”\n\n“That is absolutely a risk that could happen, especially heading into 2024, which is going to be incredibly contentious,” Coulter said. “On the other hand, is it a best practice to sweep everything under the rug and pretend everything is fine when something clearly went wrong? It’s a really delicate balance there.”\n\nBEFORE YOU GO… If you learned something from this article, pay it forward and contribute to Spotlight PA at spotlightpa.org/donate. Spotlight PA is funded by foundations and readers like you who are committed to accountability journalism that gets results.\n", "schedule_for": null, "last_published": null, "created_at": "2020-03-15T20:00:00Z", diff --git a/internal/db/testdata/gdoc hash/article.md b/internal/db/testdata/gdoc hash/article.md index 52d578cc..25201e9c 100644 --- a/internal/db/testdata/gdoc hash/article.md +++ b/internal/db/testdata/gdoc hash/article.md @@ -12,8 +12,6 @@ Blah blah porttitor turpis ligula eget magna. Proin ligula ipsum, iaculis sit amet urna ultrices, bibendum pharetra felis. Quisque gravida sit amet lectus suscipit mattis. In pretium viverra est, quis sodales orci accumsan at. Quisque porta orci nec pretium iaculis. Duis congue porta velit non dapibus. Nam at pellentesque mauris. Cras porta velit suscipit purus commodo, sed ullamcorper est elementum. Suspendisse pellentesque arcu quis ipsum tempor scelerisque. Vivamus varius dolor sed nibh pulvinar iaculis. Phasellus iaculis, massa eget ornare pretium, ex nisi aliquam libero, eget ullamcorper nisi quam nec erat. - - -
+{{}} Maecenas sollicitudin lorem lectus, a dignissim quam auctor dictum. Integer eu tempus metus. Etiam ultricies, justo aliquet rutrum vehicula, nunc odio hendrerit turpis, non ullamcorper velit eros luctus turpis. Phasellus non venenatis ipsum. Aenean mi quam, porttitor nec sapien a, posuere pharetra ante. Aenean ac tristique enim. Phasellus interdum ex sed nisl semper, tempor tincidunt augue rutrum. Pellentesque nec lorem eleifend, dictum lorem ac, luctus lacus. Aliquam congue mattis nulla vitae sodales. Vivamus sed molestie elit. Donec sit amet risus enim. Etiam id ultrices nisi, at hendrerit diam. Vestibulum at quam lorem. Nunc consequat rutrum orci, ac laoreet enim. diff --git a/internal/db/testdata/gdoc hash/page.json b/internal/db/testdata/gdoc hash/page.json index f4bbad90..de6c13f0 100644 --- a/internal/db/testdata/gdoc hash/page.json +++ b/internal/db/testdata/gdoc hash/page.json @@ -20,7 +20,7 @@ "title-tag": "", "twitter-title": "" }, - "body": "Lorem ipsum dolor sit amet, <consectetur> adipiscing elit. Aenean ullamcorper augue nec commodo egestas. Vivamus cursus lectus magna, aliquet cursus metus interdum in. Quisque imperdiet gravida commodo. Vestibulum lobortis lobortis rutrum. Suspendisse tristique tristique placerat. Maecenas aliquet consectetur dolor vitae ornare. Nunc sodales placerat bibendum. Vivamus purus leo, finibus vitae felis nec, rutrum rutrum metus. In vehicula scelerisque rhoncus.\n\nBlah blah\n\n###\n\nPraesent vitae facilisis neque. Phasellus arcu magna, euismod et porttitor sit amet, suscipit quis turpis. Donec lacinia, nisl vel dignissim suscipit, massa lorem tempus purus, ut feugiat purus nisi id orci. Duis vestibulum, arcu in lobortis volutpat, neque tellus mollis turpis, semper\n\n# Heading 1\n\n## Heading 2\n\nporttitor turpis ligula eget magna. Proin ligula ipsum, iaculis sit amet urna ultrices, bibendum pharetra felis. Quisque gravida sit amet lectus suscipit mattis. In pretium viverra est, quis sodales orci accumsan at. Quisque porta orci nec pretium iaculis. Duis congue porta velit non dapibus. Nam at pellentesque mauris. Cras porta velit suscipit purus commodo, sed ullamcorper est elementum. Suspendisse pellentesque arcu quis ipsum tempor scelerisque. Vivamus varius dolor sed nibh pulvinar iaculis. Phasellus iaculis, massa eget ornare pretium, ex nisi aliquam libero, eget ullamcorper nisi quam nec erat.\n\n\n\n
\n\nMaecenas sollicitudin lorem lectus, a dignissim quam auctor dictum. Integer eu tempus metus. Etiam ultricies, justo aliquet rutrum vehicula, nunc odio hendrerit turpis, non ullamcorper velit eros luctus turpis. Phasellus non venenatis ipsum. Aenean mi quam, porttitor nec sapien a, posuere pharetra ante. Aenean ac tristique enim. Phasellus interdum ex sed nisl semper, tempor tincidunt augue rutrum. Pellentesque nec lorem eleifend, dictum lorem ac, luctus lacus. Aliquam congue mattis nulla vitae sodales. Vivamus sed molestie elit. Donec sit amet risus enim. Etiam id ultrices nisi, at hendrerit diam. Vestibulum at quam lorem. Nunc consequat rutrum orci, ac laoreet enim.\n", + "body": "Lorem ipsum dolor sit amet, <consectetur> adipiscing elit. Aenean ullamcorper augue nec commodo egestas. Vivamus cursus lectus magna, aliquet cursus metus interdum in. Quisque imperdiet gravida commodo. Vestibulum lobortis lobortis rutrum. Suspendisse tristique tristique placerat. Maecenas aliquet consectetur dolor vitae ornare. Nunc sodales placerat bibendum. Vivamus purus leo, finibus vitae felis nec, rutrum rutrum metus. In vehicula scelerisque rhoncus.\n\nBlah blah\n\n###\n\nPraesent vitae facilisis neque. Phasellus arcu magna, euismod et porttitor sit amet, suscipit quis turpis. Donec lacinia, nisl vel dignissim suscipit, massa lorem tempus purus, ut feugiat purus nisi id orci. Duis vestibulum, arcu in lobortis volutpat, neque tellus mollis turpis, semper\n\n# Heading 1\n\n## Heading 2\n\nporttitor turpis ligula eget magna. Proin ligula ipsum, iaculis sit amet urna ultrices, bibendum pharetra felis. Quisque gravida sit amet lectus suscipit mattis. In pretium viverra est, quis sodales orci accumsan at. Quisque porta orci nec pretium iaculis. Duis congue porta velit non dapibus. Nam at pellentesque mauris. Cras porta velit suscipit purus commodo, sed ullamcorper est elementum. Suspendisse pellentesque arcu quis ipsum tempor scelerisque. Vivamus varius dolor sed nibh pulvinar iaculis. Phasellus iaculis, massa eget ornare pretium, ex nisi aliquam libero, eget ullamcorper nisi quam nec erat.\n\n{{}}\n\nMaecenas sollicitudin lorem lectus, a dignissim quam auctor dictum. Integer eu tempus metus. Etiam ultricies, justo aliquet rutrum vehicula, nunc odio hendrerit turpis, non ullamcorper velit eros luctus turpis. Phasellus non venenatis ipsum. Aenean mi quam, porttitor nec sapien a, posuere pharetra ante. Aenean ac tristique enim. Phasellus interdum ex sed nisl semper, tempor tincidunt augue rutrum. Pellentesque nec lorem eleifend, dictum lorem ac, luctus lacus. Aliquam congue mattis nulla vitae sodales. Vivamus sed molestie elit. Donec sit amet risus enim. Etiam id ultrices nisi, at hendrerit diam. Vestibulum at quam lorem. Nunc consequat rutrum orci, ac laoreet enim.\n", "schedule_for": null, "last_published": null, "created_at": "2020-03-15T20:00:00Z", diff --git a/internal/db/testdata/gdoc mark/article.md b/internal/db/testdata/gdoc mark/article.md index a1055f5e..676968eb 100644 --- a/internal/db/testdata/gdoc mark/article.md +++ b/internal/db/testdata/gdoc mark/article.md @@ -6,7 +6,7 @@ Mail ballot voters from heavily nonwhite and lower-income communities in Philade By law, elections officials in Pennsylvania cannot accept mail ballots from voters who do not properly date and sign the outer return envelopes of their mail ballots. Whether to accept those undated and improperly dated ballots — such as those mistakenly using dates of birth or dates with the wrong year — is currently the subject of ongoing federal litigation. -
+{{}} By analyzing Philadelphia’s list of more than 1,800 voters who returned undated or improperly dated ballots for the May 16 primary and sorting them by their home ZIP code, Votebeat and Spotlight PA were able to determine how many of them live in areas where the nonwhite population or population living in poverty was above the city’s average. @@ -63,7 +63,7 @@ Then, with a week to go before the election, the Pennsylvania Supreme Court rule New litigation began almost immediately, with the American Civil Liberties Union of Pennsylvania representing the NAACP and several organizations who are suing in federal court under the same civil rights argument as the 2021 case. -
+{{}} That case is still pending in the Western District of Pennsylvania. As evidence of the outcome’s potentially far-reaching consequences, groups including the state GOP, National Republican Congressional Committee, and Republican National Convention have all intervened as defendants, while the U.S. Department of Justice has released a statement of interest in the case. diff --git a/internal/db/testdata/gdoc mark/page.json b/internal/db/testdata/gdoc mark/page.json index a24520c1..f8a5c8fc 100644 --- a/internal/db/testdata/gdoc mark/page.json +++ b/internal/db/testdata/gdoc mark/page.json @@ -23,7 +23,7 @@ "title-tag": "", "twitter-title": "" }, - "body": "This article is made possible through Spotlight PA’s collaboration with Votebeat, a nonpartisan news organization covering local election administration and voting. This article is available for reprint under the terms of Votebeat’s republishing policy.\n\nMail ballot voters from heavily nonwhite and lower-income communities in Philadelphia are more likely to have their ballots rejected due to simple mistakes, compared with all voters in the city who requested mail ballots, according to a Votebeat and Spotlight PA analysis.\n\n“It should come to no surprise that the voters who are most affected by this are the city’s most vulnerable populations,” said Nick Custodio, deputy Philadelphia commissioner for Chairwoman Lisa Deeley and a spokesperson for the office. “The Legislature must act and stop ticky-tack mistakes… from disenfranchising voters.”\n\nBy law, elections officials in Pennsylvania cannot accept mail ballots from voters who do not properly date and sign the outer return envelopes of their mail ballots. Whether to accept those undated and improperly dated ballots — such as those mistakenly using dates of birth or dates with the wrong year — is currently the subject of ongoing federal litigation.\n\n
\n\nBy analyzing Philadelphia’s list of more than 1,800 voters who returned undated or improperly dated ballots for the May 16 primary and sorting them by their home ZIP code, Votebeat and Spotlight PA were able to determine how many of them live in areas where the nonwhite population or population living in poverty was above the city’s average.\n\nTo provide a comparison, we repeated the same analysis on a list of all Philadelphia voters who requested mail ballots for the primary.\n\nThe results revealed that voters making dating errors on their ballots were significantly more likely to come from ZIP codes with a higher percentage of nonwhite residents or a greater percentage of the population living in poverty than all city voters requesting mail ballots, echoing findings from a similar analysis done by Votebeat and Spotlight PA in 2022.

While roughly 44% of voters requesting mail ballots came from parts of the city with higher levels of nonwhite residents, 56% of voters who made dating errors came from such areas.\n\nWhen we analyzed voters’ ZIP codes based on income levels, 34% of voters requesting mail ballots live in high-poverty areas, but 44% of voters with dating errors came from those areas.\n\nThe analysis also found that older voters are more likely to have their ballot at risk of rejection due to dating errors, similar to the findings in the 2022 analysis. While mail voters already skew older than voters as a whole, the analysis found that voters whose ballots were subject to rejection for dating errors had a median age approximately five years older than the median age of all voters requesting mail ballots.

Philadelphia publishes lists of voters whose ballots have fatal defects ahead of an election so that voters have an opportunity to fix them, a process referred to as “curing” that is not allowed in all counties.\n\nVotebeat used the demographics of these voters’ ZIP codes because Pennsylvania’s voter roll does not contain racial information for voters, making a precise analysis of the race of specific voters in each category impossible.\n\nHowever, Votebeat and Spotlight PA verified the findings through John Curiel, an assistant professor of political science at Ohio Northern University, who uses a process called Bayesian inference to estimate a person's race based on last name and ZIP code.\n\nCuriel’s analysis found that roughly 59% of all voters requesting mail ballots were nonwhite, while approximately 66% of voters with date errors on their ballots were nonwhite.\n\nOne such voter whose ballot was rejected is Sonja Rhett, a 55-year-old Black resident of North Philadelphia.\n\nRhett said she was unaware there was a dating issue with her ballot, and that if she had known, she would have tried to fix it. Her ZIP code has one of the highest percentages of nonwhite residents in the city.\n\n“I’m upset, because if they had told me, I would have done something,” she said. The city commissioners office in Philadelphia publishes a list of voters who have flawed ballots prior to Election Day. The city notifies voters via email when possible, and political parties often use the published list to reach out as well.\n\nWhen asked about the finding that voters with ballot-dating issues are more likely to live in majority nonwhite or low-income areas, she said, “I’m not surprised about anything right now.”\n\nEugene Williamson, a 77-year-old Black resident of Overbrook, also had his ballot flagged for rejection.\n\nWilliamson said he got a call alerting him to the problem, so then voted provisionally at his polling place. Provisional ballots are given to voters whose eligibility to vote is in question when they check in at a polling place. Provisional ballots from voters whose mail ballots were canceled are accepted by Philadelphia, but have been an issue in neighboring Delaware County.\n\nWhen Votebeat shared its findings that voters at risk of having their ballot canceled due to dating issues are more likely to come from areas of the city like his with higher than average nonwhite and low-income populations, Williamson said he was not surprised.\n\n“They try to eliminate minorities from voting, period,” said Williamson. “That’s why I put forth the effort and went to the poll.”\n\nBut Dennis Wright, a Black resident of West Oak Lane, said he takes responsibility for his ballot's dating error.\n\n“I’ve been voting my whole life and I’m 79 years old. And I did miss something on my ballot. So I chalk it up to that,” he said.\n\n\n\n## Legal saga continues\n\nWhether or not to accept mail ballots with no date or improper dates has been fiercely debated in courts since practically the advent of Pennsylvania’s no-excuse mail-in voting system in 2019. The lengthy progress of various lawsuits and the courts’ decisions mean the rules for counting those ballots have changed from election to election.\n\nDuring the 2020 presidential election, Pennsylvania’s Supreme Court split evenly on whether to count the ballots. A seventh justice broke the 3-3 split by ordering this universe of ballots to be accepted for the presidential election but rejected in the future. Conservatives balked at the decision and pointed to it as an example of the justices — a majority of which were Democrats at the time of the ruling — overstepping their constitutional authority to influence the contest.\n\nAct 77, the 2019 law that introduced universal no-excuse mail voting, says ballots need to be dated. But Justice David Wecht, the deciding seventh vote in 2020, reasoned at the time that the ballots should be counted only for that election because the law was relatively new and voters may not have been well informed of the rules.\n\nIn 2021, a judicial candidate in Lehigh County challenged the law in federal court under a different line of argument: claiming that the dating requirement was immaterial to a voter's eligibility to vote, and thus those ballots could not be rejected solely on that basis under the 1964 Civil Rights Act.\n\nThe 3rd Circuit Court of Appeals sided with that reasoning in May 2022 — leading to these ballots being counted in the spring primary. But less than one month before the November 2022 midterm elections, the U.S. Supreme Court mooted that decision.\n\nThen, with a week to go before the election, the Pennsylvania Supreme Court ruled that the ballots should not be counted, but did not address the issue of whether the dates are immaterial to the voter’s eligibility.\n\nNew litigation began almost immediately, with the American Civil Liberties Union of Pennsylvania representing the NAACP and several organizations who are suing in federal court under the same civil rights argument as the 2021 case.\n\n
\n\nThat case is still pending in the Western District of Pennsylvania. As evidence of the outcome’s potentially far-reaching consequences, groups including the state GOP, National Republican Congressional Committee, and Republican National Convention have all intervened as defendants, while the U.S. Department of Justice has released a statement of interest in the case.\n\nPolicy advocates and election directors have also pointed out that the Legislature could resolve the dispute by clarifying the dating requirement in the state’s election law.\n\nThe NAACP case is still making its way through the court, but in a recent opinion rejecting a motion from the Republican interveners to dismiss the case, the court said that the NAACP, the other organizations, and the voters bringing the case had a right to have their concerns about the materiality of the date heard.\n\nAdam Bonin, a Philadelphia-based election law attorney who has represented high-profile Democratic candidates such as Gov. Josh Shapiro, said he wasn’t very surprised by the results of the analysis.\n\n“Ballots with errors skew Black, Latino, and older,” he said. “There's no doubt about that.”\n\nBonin is litigating a similar case in the same federal district as the NAACP case, and the cases are being jointly managed. He said an expert witness submitted an analysis for his case reaching a similar conclusion.\n\nIt is unclear when a decision will come in the NAACP case, though the ACLU has said it hopes for a ruling this year.\n\nThis article is a part of Every Voice, Every Vote, a collaborative project managed by The Lenfest Institute for Journalism. Lead support is provided by the William Penn Foundation with additional funding from The Lenfest Institute, Peter and Judy Leone, the John S. and James L. Knight Foundation, Harriet and Larry Weiss, and the Wyncote Foundation, among others. To learn more about the project and view a full list of supporters, visit everyvoice-everyvote.org. Editorial content is created independently of the project’s donors.\n", + "body": "This article is made possible through Spotlight PA’s collaboration with Votebeat, a nonpartisan news organization covering local election administration and voting. This article is available for reprint under the terms of Votebeat’s republishing policy.\n\nMail ballot voters from heavily nonwhite and lower-income communities in Philadelphia are more likely to have their ballots rejected due to simple mistakes, compared with all voters in the city who requested mail ballots, according to a Votebeat and Spotlight PA analysis.\n\n“It should come to no surprise that the voters who are most affected by this are the city’s most vulnerable populations,” said Nick Custodio, deputy Philadelphia commissioner for Chairwoman Lisa Deeley and a spokesperson for the office. “The Legislature must act and stop ticky-tack mistakes… from disenfranchising voters.”\n\nBy law, elections officials in Pennsylvania cannot accept mail ballots from voters who do not properly date and sign the outer return envelopes of their mail ballots. Whether to accept those undated and improperly dated ballots — such as those mistakenly using dates of birth or dates with the wrong year — is currently the subject of ongoing federal litigation.\n\n{{}}\n\nBy analyzing Philadelphia’s list of more than 1,800 voters who returned undated or improperly dated ballots for the May 16 primary and sorting them by their home ZIP code, Votebeat and Spotlight PA were able to determine how many of them live in areas where the nonwhite population or population living in poverty was above the city’s average.\n\nTo provide a comparison, we repeated the same analysis on a list of all Philadelphia voters who requested mail ballots for the primary.\n\nThe results revealed that voters making dating errors on their ballots were significantly more likely to come from ZIP codes with a higher percentage of nonwhite residents or a greater percentage of the population living in poverty than all city voters requesting mail ballots, echoing findings from a similar analysis done by Votebeat and Spotlight PA in 2022.

While roughly 44% of voters requesting mail ballots came from parts of the city with higher levels of nonwhite residents, 56% of voters who made dating errors came from such areas.\n\nWhen we analyzed voters’ ZIP codes based on income levels, 34% of voters requesting mail ballots live in high-poverty areas, but 44% of voters with dating errors came from those areas.\n\nThe analysis also found that older voters are more likely to have their ballot at risk of rejection due to dating errors, similar to the findings in the 2022 analysis. While mail voters already skew older than voters as a whole, the analysis found that voters whose ballots were subject to rejection for dating errors had a median age approximately five years older than the median age of all voters requesting mail ballots.

Philadelphia publishes lists of voters whose ballots have fatal defects ahead of an election so that voters have an opportunity to fix them, a process referred to as “curing” that is not allowed in all counties.\n\nVotebeat used the demographics of these voters’ ZIP codes because Pennsylvania’s voter roll does not contain racial information for voters, making a precise analysis of the race of specific voters in each category impossible.\n\nHowever, Votebeat and Spotlight PA verified the findings through John Curiel, an assistant professor of political science at Ohio Northern University, who uses a process called Bayesian inference to estimate a person's race based on last name and ZIP code.\n\nCuriel’s analysis found that roughly 59% of all voters requesting mail ballots were nonwhite, while approximately 66% of voters with date errors on their ballots were nonwhite.\n\nOne such voter whose ballot was rejected is Sonja Rhett, a 55-year-old Black resident of North Philadelphia.\n\nRhett said she was unaware there was a dating issue with her ballot, and that if she had known, she would have tried to fix it. Her ZIP code has one of the highest percentages of nonwhite residents in the city.\n\n“I’m upset, because if they had told me, I would have done something,” she said. The city commissioners office in Philadelphia publishes a list of voters who have flawed ballots prior to Election Day. The city notifies voters via email when possible, and political parties often use the published list to reach out as well.\n\nWhen asked about the finding that voters with ballot-dating issues are more likely to live in majority nonwhite or low-income areas, she said, “I’m not surprised about anything right now.”\n\nEugene Williamson, a 77-year-old Black resident of Overbrook, also had his ballot flagged for rejection.\n\nWilliamson said he got a call alerting him to the problem, so then voted provisionally at his polling place. Provisional ballots are given to voters whose eligibility to vote is in question when they check in at a polling place. Provisional ballots from voters whose mail ballots were canceled are accepted by Philadelphia, but have been an issue in neighboring Delaware County.\n\nWhen Votebeat shared its findings that voters at risk of having their ballot canceled due to dating issues are more likely to come from areas of the city like his with higher than average nonwhite and low-income populations, Williamson said he was not surprised.\n\n“They try to eliminate minorities from voting, period,” said Williamson. “That’s why I put forth the effort and went to the poll.”\n\nBut Dennis Wright, a Black resident of West Oak Lane, said he takes responsibility for his ballot's dating error.\n\n“I’ve been voting my whole life and I’m 79 years old. And I did miss something on my ballot. So I chalk it up to that,” he said.\n\n\n\n## Legal saga continues\n\nWhether or not to accept mail ballots with no date or improper dates has been fiercely debated in courts since practically the advent of Pennsylvania’s no-excuse mail-in voting system in 2019. The lengthy progress of various lawsuits and the courts’ decisions mean the rules for counting those ballots have changed from election to election.\n\nDuring the 2020 presidential election, Pennsylvania’s Supreme Court split evenly on whether to count the ballots. A seventh justice broke the 3-3 split by ordering this universe of ballots to be accepted for the presidential election but rejected in the future. Conservatives balked at the decision and pointed to it as an example of the justices — a majority of which were Democrats at the time of the ruling — overstepping their constitutional authority to influence the contest.\n\nAct 77, the 2019 law that introduced universal no-excuse mail voting, says ballots need to be dated. But Justice David Wecht, the deciding seventh vote in 2020, reasoned at the time that the ballots should be counted only for that election because the law was relatively new and voters may not have been well informed of the rules.\n\nIn 2021, a judicial candidate in Lehigh County challenged the law in federal court under a different line of argument: claiming that the dating requirement was immaterial to a voter's eligibility to vote, and thus those ballots could not be rejected solely on that basis under the 1964 Civil Rights Act.\n\nThe 3rd Circuit Court of Appeals sided with that reasoning in May 2022 — leading to these ballots being counted in the spring primary. But less than one month before the November 2022 midterm elections, the U.S. Supreme Court mooted that decision.\n\nThen, with a week to go before the election, the Pennsylvania Supreme Court ruled that the ballots should not be counted, but did not address the issue of whether the dates are immaterial to the voter’s eligibility.\n\nNew litigation began almost immediately, with the American Civil Liberties Union of Pennsylvania representing the NAACP and several organizations who are suing in federal court under the same civil rights argument as the 2021 case.\n\n{{}}\n\nThat case is still pending in the Western District of Pennsylvania. As evidence of the outcome’s potentially far-reaching consequences, groups including the state GOP, National Republican Congressional Committee, and Republican National Convention have all intervened as defendants, while the U.S. Department of Justice has released a statement of interest in the case.\n\nPolicy advocates and election directors have also pointed out that the Legislature could resolve the dispute by clarifying the dating requirement in the state’s election law.\n\nThe NAACP case is still making its way through the court, but in a recent opinion rejecting a motion from the Republican interveners to dismiss the case, the court said that the NAACP, the other organizations, and the voters bringing the case had a right to have their concerns about the materiality of the date heard.\n\nAdam Bonin, a Philadelphia-based election law attorney who has represented high-profile Democratic candidates such as Gov. Josh Shapiro, said he wasn’t very surprised by the results of the analysis.\n\n“Ballots with errors skew Black, Latino, and older,” he said. “There's no doubt about that.”\n\nBonin is litigating a similar case in the same federal district as the NAACP case, and the cases are being jointly managed. He said an expert witness submitted an analysis for his case reaching a similar conclusion.\n\nIt is unclear when a decision will come in the NAACP case, though the ACLU has said it hopes for a ruling this year.\n\nThis article is a part of Every Voice, Every Vote, a collaborative project managed by The Lenfest Institute for Journalism. Lead support is provided by the William Penn Foundation with additional funding from The Lenfest Institute, Peter and Judy Leone, the John S. and James L. Knight Foundation, Harriet and Larry Weiss, and the Wyncote Foundation, among others. To learn more about the project and view a full list of supporters, visit everyvoice-everyvote.org. Editorial content is created independently of the project’s donors.\n", "schedule_for": null, "last_published": null, "created_at": "2020-03-15T20:00:00Z", diff --git a/internal/db/testdata/gdoc na/article.md b/internal/db/testdata/gdoc na/article.md index 99327b7f..2cc399ca 100644 --- a/internal/db/testdata/gdoc na/article.md +++ b/internal/db/testdata/gdoc na/article.md @@ -20,7 +20,7 @@ USE REAL HEADINGS, NOT JUST BOLD TEXT: TO EMBED HTML -
+{{}} TO ADD ADDITIONAL IMAGE diff --git a/internal/db/testdata/gdoc na/page.json b/internal/db/testdata/gdoc na/page.json index 4f0835bc..da7e6a27 100644 --- a/internal/db/testdata/gdoc na/page.json +++ b/internal/db/testdata/gdoc na/page.json @@ -20,7 +20,7 @@ "title-tag": "", "twitter-title": "" }, - "body": "Spotlight PA is an independent, nonpartisan newsroom powered by The Philadelphia Inquirer in partnership with PennLive/The Patriot-News, TribLIVE/Pittsburgh Tribune-Review, and WITF Public Media. Sign up for our free newsletters.\n\nHARRISBURG —\n\nWHILE YOU’RE HERE… If you learned something from this story, pay it forward and become a member of Spotlight PA so someone else can in the future at spotlightpa.org/donate. Spotlight PA is funded by foundations and readers like you who are committed to accountability journalism that gets results.\n\n\\[DELETE BELOW/FOR TEMPLATE PURPOSES ONLY\\]\n\nUSE REAL HEADINGS, NOT JUST BOLD TEXT:\n\n

Heading 1: Mostly don’t use this because the title is h1

\n\n

Heading 2: Mostly just use this for subheds.

\n\n

H3: Sub-subheds.

\n\n

H4: Sub-sub-subhed.

\n\nTable information\n\nTO EMBED HTML\n\n
\n\nTO ADD ADDITIONAL IMAGE\n\n{{}}\n\nTO HIDE TEXT FROM FINAL COPY:\n\nTO ADD A TABLE OF CONTENTS, USE REAL HEADINGS AND ADD:\n\n### Contents\n\n- Heading 1: Mostly don’t use this because the title is h1\n\n - Heading 2: Mostly just use this for subheds.\n\n - H3: Sub-subheds.\n\n - H4: Sub-sub-subhed.\n\nTO ADD A PLAIN TABLE (Note that plain tables do not work well on mobile. Prefer to use table embeds from Datawrapper or Flourish):\n\n

a

b

c

1

2

3

\n", + "body": "Spotlight PA is an independent, nonpartisan newsroom powered by The Philadelphia Inquirer in partnership with PennLive/The Patriot-News, TribLIVE/Pittsburgh Tribune-Review, and WITF Public Media. Sign up for our free newsletters.\n\nHARRISBURG —\n\nWHILE YOU’RE HERE… If you learned something from this story, pay it forward and become a member of Spotlight PA so someone else can in the future at spotlightpa.org/donate. Spotlight PA is funded by foundations and readers like you who are committed to accountability journalism that gets results.\n\n\\[DELETE BELOW/FOR TEMPLATE PURPOSES ONLY\\]\n\nUSE REAL HEADINGS, NOT JUST BOLD TEXT:\n\n

Heading 1: Mostly don’t use this because the title is h1

\n\n

Heading 2: Mostly just use this for subheds.

\n\n

H3: Sub-subheds.

\n\n

H4: Sub-sub-subhed.

\n\nTable information\n\nTO EMBED HTML\n\n{{}}\n\nTO ADD ADDITIONAL IMAGE\n\n{{}}\n\nTO HIDE TEXT FROM FINAL COPY:\n\nTO ADD A TABLE OF CONTENTS, USE REAL HEADINGS AND ADD:\n\n### Contents\n\n- Heading 1: Mostly don’t use this because the title is h1\n\n - Heading 2: Mostly just use this for subheds.\n\n - H3: Sub-subheds.\n\n - H4: Sub-sub-subhed.\n\nTO ADD A PLAIN TABLE (Note that plain tables do not work well on mobile. Prefer to use table embeds from Datawrapper or Flourish):\n\n

a

b

c

1

2

3

\n", "schedule_for": null, "last_published": null, "created_at": "2020-03-15T20:00:00Z", diff --git a/internal/db/testdata/gdoc picture/article.md b/internal/db/testdata/gdoc picture/article.md index b55b8ac0..74d68227 100644 --- a/internal/db/testdata/gdoc picture/article.md +++ b/internal/db/testdata/gdoc picture/article.md @@ -4,7 +4,7 @@ MILLVALE — Don't call
+{{}}

It may only be a year old, but Harold's already feels like a cozy classic neighborhood spot. With its pop culture-themed menu items (this season's mocktails include the "Yippee-Ki-Yay Minty Frother," a Die Hard hat tip), faux-bookshelf bathroom doors, and weekly watch parties and trivia nights, it's got major cool-librarian vibes. The bar’s name channels Millvale’s eerie history and Flint’s love of Hal Ashby’s 1971 cult classic Harold and Maude. diff --git a/internal/db/testdata/gdoc picture/page.json b/internal/db/testdata/gdoc picture/page.json index fbfa1f1e..57f7404a 100644 --- a/internal/db/testdata/gdoc picture/page.json +++ b/internal/db/testdata/gdoc picture/page.json @@ -22,7 +22,7 @@ "title-tag": "LGBTQ-friendly Millvale, PA bar sells and houses spirits", "twitter-title": "" }, - "body": "
This story first appeared in PA Local, a weekly newsletter by Spotlight PA taking a fresh, positive look at the incredible people, beautiful places, and delicious food of Pennsylvania.
Sign up for free here.
\n\nMILLVALE — Don't call Harold's Haunt a gay bar. Or a lesbian bar. The queer, Wiccan-owned watering hole bills itself as a "they bar," a nod to its inclusive mission.\n\n“We talked about being a lesbian bar, because there are none in Pittsburgh,” owner Athena Flint told PA Local. “But that didn’t quite fit. I’m queer, not a lesbian, and my sibling is trans nonbinary. It’s important to me that the trans nonbinary community has lots of safe spaces, especially during this weird, chaotic time.”

With its lavender walls, vegan-friendly bar food, witchy entertainment on TV screens, and a cocktail menu that includes sober offerings, Harold’s is carving out a distinct and welcoming niche in the Pittsburgh area and beyond. So far, Flint hasn’t heard of another they bar. “So maybe it will be the beginning of something,” she said. “Who knows?”\n\n
\n\n

It may only be a year old, but Harold's already feels like a cozy classic neighborhood spot. With its pop culture-themed menu items (this season's mocktails include the "Yippee-Ki-Yay Minty Frother," a Die Hard hat tip), faux-bookshelf bathroom doors, and weekly watch parties and trivia nights, it's got major cool-librarian vibes. The bar’s name channels Millvale’s eerie history and Flint’s love of Hal Ashby’s 1971 cult classic Harold and Maude.\n\nFlint, who’s 36 and grew up in Pittsburgh suburb South Hills, has done a lot of research on the Millvale area, some of which is on display at the bar. “This area used to be the Allegheny Poor Farm,” one sign explains. “It was where the city sent all the undesirables. Destitute. Ill. And old.” The former poorhouse, Flint told Spotlight PA, is only about a block and a half from Harold’s. “This whole place is very, very haunted,” she said of the area.

The name also references a ghost that Flint says spooks her other Millvale property, the Wiccan and queer bookshop Maude’s Paperwing Gallery (also named after the Ashby film). When Flint opened the store three years ago, she and her associates sensed a presence in the back hallway, Flint says. Several medium visits and seances confirmed their suspicions, revealing a very grouchy 60-something who is stuck in a “time loop,” Flint told PA Local. They dubbed him Harold.

The specter, Flint says, isn’t a friendly ghost. “He has killed a number of our electronics,” she noted. In fact, he’s decidedly unfriendly: “He’s sexist, racist, homophobic, the whole works. He also hates Irish people. There’s currently an Irish flag back there, because Mara, the second in command here, is Irish with a capital I. She loves to taunt him.”\n\nPerhaps to Harold’s chagrin, the bar that bears his name has a history of progressivism. In a past life, it was Howard’s Pub, Flint said. And “the people who used to own the bar, their daughter is a lesbian, and she’s the person who kicked off Pride Millvale, which started three years ago. She took it upon herself to go to every business and encourage them to hang a Pride flag.”\n\nWhen Howard’s closed, Flint feared the neighborhood would lose a lifeline. “I was worried that some corporate moneybags was going to come in … then we wouldn’t have one of the very few queer safe spaces in Millvale bars,” she said. “It really felt like there was so much forward momentum happening, and I didn't want to see it backslide.”\n\n{{}}\n\n
They soon learned that the former Howard’s is also haunted, apparently by spirits less curmudgeonly than Harold. Flint’s friend Ringa Sunn, who’s been decorating the interior bathroom walls with pages of old books, has had the most brushes there with the supernatural, usually while working after hours. “The first time, they heard a voice and felt someone standing behind them, and assumed it was the contractors coming in to do work — and then turned around and no one was there,” Flint said.\n\nFlint also got some spooky assistance at a crucial moment, noting an incident where unexpected flashing lights helped prevent a disaster.\n\nShe and friends were hanging outside the darkened bar when the flickering began. “So we came back to look — I actually have a video of this on TikTok — and as I was videoing they turned off again,” Flint said.\n\n“But what we saw was that someone had put a cooler on the bar top and it had started leaking directly over an outlet. And the motion-detecting light inside had turned on somehow just in time for us to see it — which is the only way we realized there was this massive leak happening that could have ruined the bartop, or caused a fire.” They’ve theorized it was a previous owner, “just looking out for the bar.”\n\nFlint and her coven of colleagues co-hosted a gathering on the winter solstice, Dec. 21, at New Sun Rising, a service organization that helps small businesses in the area. The solstice is an important Wiccan holiday, and Flint looked forward to seeing neighbors and friends. “It’s going to be an open-to-everyone potluck type gathering, and I’m going to help people make their own spell jars,” Flint said ahead of the event. “One of our local musicians is going to play. And as part of the ritual, we’re going to bless the space for them.”\n\nIn January, Maude’s will close due to the loss of its lease, but Flint hopes to find another space in Millvale and plans to open an online store in the interim. But Harold’s will continue, as will, presumably, its supernatural activity. “Before all of this, I would have said that I’m not a believer,” Flint said. But now she’s seen the light, and “it’s been told to me by enough different mediums that I’m like, OK, I guess the veil is thin here!”\n\n
Despite Harold’s off-putting personality, Flint says she plans to reach out to him when they leave Maude’s current locale. “I think I’m at the point where I will invite him if we have a new space,” she says. “But he’s not going to go to the bar, because we already have a set of spirits down there.”\n\nBEFORE YOU GO… If you learned something from this article, pay it forward and contribute to Spotlight PA at spotlightpa.org/donate. Spotlight PA is funded by foundations and readers like you who are committed to accountability journalism that gets results.\n", + "body": "
This story first appeared in PA Local, a weekly newsletter by Spotlight PA taking a fresh, positive look at the incredible people, beautiful places, and delicious food of Pennsylvania. Sign up for free here.
\n\nMILLVALE — Don't call Harold's Haunt a gay bar. Or a lesbian bar. The queer, Wiccan-owned watering hole bills itself as a "they bar," a nod to its inclusive mission.\n\n“We talked about being a lesbian bar, because there are none in Pittsburgh,” owner Athena Flint told PA Local. “But that didn’t quite fit. I’m queer, not a lesbian, and my sibling is trans nonbinary. It’s important to me that the trans nonbinary community has lots of safe spaces, especially during this weird, chaotic time.”

With its lavender walls, vegan-friendly bar food, witchy entertainment on TV screens, and a cocktail menu that includes sober offerings, Harold’s is carving out a distinct and welcoming niche in the Pittsburgh area and beyond. So far, Flint hasn’t heard of another they bar. “So maybe it will be the beginning of something,” she said. “Who knows?”\n\n{{}}\n\n

It may only be a year old, but Harold's already feels like a cozy classic neighborhood spot. With its pop culture-themed menu items (this season's mocktails include the "Yippee-Ki-Yay Minty Frother," a Die Hard hat tip), faux-bookshelf bathroom doors, and weekly watch parties and trivia nights, it's got major cool-librarian vibes. The bar’s name channels Millvale’s eerie history and Flint’s love of Hal Ashby’s 1971 cult classic Harold and Maude.\n\nFlint, who’s 36 and grew up in Pittsburgh suburb South Hills, has done a lot of research on the Millvale area, some of which is on display at the bar. “This area used to be the Allegheny Poor Farm,” one sign explains. “It was where the city sent all the undesirables. Destitute. Ill. And old.” The former poorhouse, Flint told Spotlight PA, is only about a block and a half from Harold’s. “This whole place is very, very haunted,” she said of the area.

The name also references a ghost that Flint says spooks her other Millvale property, the Wiccan and queer bookshop Maude’s Paperwing Gallery (also named after the Ashby film). When Flint opened the store three years ago, she and her associates sensed a presence in the back hallway, Flint says. Several medium visits and seances confirmed their suspicions, revealing a very grouchy 60-something who is stuck in a “time loop,” Flint told PA Local. They dubbed him Harold.

The specter, Flint says, isn’t a friendly ghost. “He has killed a number of our electronics,” she noted. In fact, he’s decidedly unfriendly: “He’s sexist, racist, homophobic, the whole works. He also hates Irish people. There’s currently an Irish flag back there, because Mara, the second in command here, is Irish with a capital I. She loves to taunt him.”\n\nPerhaps to Harold’s chagrin, the bar that bears his name has a history of progressivism. In a past life, it was Howard’s Pub, Flint said. And “the people who used to own the bar, their daughter is a lesbian, and she’s the person who kicked off Pride Millvale, which started three years ago. She took it upon herself to go to every business and encourage them to hang a Pride flag.”\n\nWhen Howard’s closed, Flint feared the neighborhood would lose a lifeline. “I was worried that some corporate moneybags was going to come in … then we wouldn’t have one of the very few queer safe spaces in Millvale bars,” she said. “It really felt like there was so much forward momentum happening, and I didn't want to see it backslide.”\n\n{{}}\n\n
They soon learned that the former Howard’s is also haunted, apparently by spirits less curmudgeonly than Harold. Flint’s friend Ringa Sunn, who’s been decorating the interior bathroom walls with pages of old books, has had the most brushes there with the supernatural, usually while working after hours. “The first time, they heard a voice and felt someone standing behind them, and assumed it was the contractors coming in to do work — and then turned around and no one was there,” Flint said.\n\nFlint also got some spooky assistance at a crucial moment, noting an incident where unexpected flashing lights helped prevent a disaster.\n\nShe and friends were hanging outside the darkened bar when the flickering began. “So we came back to look — I actually have a video of this on TikTok — and as I was videoing they turned off again,” Flint said.\n\n“But what we saw was that someone had put a cooler on the bar top and it had started leaking directly over an outlet. And the motion-detecting light inside had turned on somehow just in time for us to see it — which is the only way we realized there was this massive leak happening that could have ruined the bartop, or caused a fire.” They’ve theorized it was a previous owner, “just looking out for the bar.”\n\nFlint and her coven of colleagues co-hosted a gathering on the winter solstice, Dec. 21, at New Sun Rising, a service organization that helps small businesses in the area. The solstice is an important Wiccan holiday, and Flint looked forward to seeing neighbors and friends. “It’s going to be an open-to-everyone potluck type gathering, and I’m going to help people make their own spell jars,” Flint said ahead of the event. “One of our local musicians is going to play. And as part of the ritual, we’re going to bless the space for them.”\n\nIn January, Maude’s will close due to the loss of its lease, but Flint hopes to find another space in Millvale and plans to open an online store in the interim. But Harold’s will continue, as will, presumably, its supernatural activity. “Before all of this, I would have said that I’m not a believer,” Flint said. But now she’s seen the light, and “it’s been told to me by enough different mediums that I’m like, OK, I guess the veil is thin here!”\n\n
Despite Harold’s off-putting personality, Flint says she plans to reach out to him when they leave Maude’s current locale. “I think I’m at the point where I will invite him if we have a new space,” she says. “But he’s not going to go to the bar, because we already have a set of spirits down there.”\n\nBEFORE YOU GO… If you learned something from this article, pay it forward and contribute to Spotlight PA at spotlightpa.org/donate. Spotlight PA is funded by foundations and readers like you who are committed to accountability journalism that gets results.\n", "schedule_for": null, "last_published": null, "created_at": "2020-03-15T20:00:00Z", diff --git a/pkg/almanack/service-gdocs.go b/pkg/almanack/service-gdocs.go index 01030da9..57d93cb3 100644 --- a/pkg/almanack/service-gdocs.go +++ b/pkg/almanack/service-gdocs.go @@ -311,40 +311,49 @@ func removeTail(n *html.Node) { func replaceSpotlightEmbeds(s string) string { n, err := html.Parse(strings.NewReader(s)) if err != nil { - // l := almlog.FromContext(ctx) - // l.WarnContext(ctx, "invalid HTML in embed", "html", s) return s } - // data-spl-embed-version="1" - div := xhtml.Select(n, func(n *html.Node) bool { + // $("[data-spl-embed-version=1]") + divs := xhtml.SelectSlice(n, func(n *html.Node) bool { return n.DataAtom == atom.Div && xhtml.Attr(n, "data-spl-embed-version") == "1" }) - if div == nil { + if len(divs) < 1 { return s } - netloc := xhtml.Attr(div, "data-spl-src") - u, err := url.Parse(netloc) - if err != nil { - // l := almlog.FromContext(ctx) - // l.WarnContext(ctx, "invalid URL in embed", "html", s, "url", netloc) - return s - } - tag := strings.Trim(u.Path, "/") - q := u.Query() var buf strings.Builder - buf.WriteString("{{<") - buf.WriteString(tag) - for _, k := range iterx.Sorted(iterx.Keys(q)) { - vv := q[k] - for _, v := range vv { - buf.WriteString(" ") - buf.WriteString(k) - buf.WriteString("=\"") - buf.WriteString(html.EscapeString(v)) - buf.WriteString("\"") + for i, div := range divs { + if i != 0 { + buf.WriteString("\n") + } + netloc := xhtml.Attr(div, "data-spl-src") + u, err := url.Parse(netloc) + if err != nil { + return s + } + tag := strings.Trim(u.Path, "/") + if !slices.Contains([]string{ + "embeds/cta", + "embeds/donate", + "embeds/newsletter", + "embeds/tips", + }, tag) { + return s + } + q := u.Query() + buf.WriteString("{{<") + buf.WriteString(tag) + for _, k := range iterx.Sorted(iterx.Keys(q)) { + vv := q[k] + for _, v := range vv { + buf.WriteString(" ") + buf.WriteString(k) + buf.WriteString("=\"") + buf.WriteString(html.EscapeString(v)) + buf.WriteString("\"") + } } + buf.WriteString(">}}") } - buf.WriteString(">}}\n") return buf.String() } diff --git a/pkg/almanack/service-gdocs_test.go b/pkg/almanack/service-gdocs_test.go index 58ea9f02..b56fb83f 100644 --- a/pkg/almanack/service-gdocs_test.go +++ b/pkg/almanack/service-gdocs_test.go @@ -1,11 +1,9 @@ package almanack import ( - "context" "testing" "github.com/carlmjohnson/be" - "github.com/spotlightpa/almanack/pkg/almlog" ) func TestImageCAS(t *testing.T) { @@ -39,21 +37,28 @@ func TestReplaceSpotlightEmbeds(t *testing.T) { {"", ""}, {"Hello, World!", "Hello, World!"}, { - `
`, - "", + `
`, + `
`, }, - {` - + { + ` + -
- `, +
`, + `{{}}`, + }, + { ` - `}, + +
+ +
`, + `{{}} +{{}}`, + }, } - ctx := context.Background() - almlog.UseDevLogger() for _, tc := range cases { t := be.Relaxed(t) - be.Equal(t, tc.want, replaceSpotlightEmbeds(ctx, tc.in)) + be.Equal(t, tc.want, replaceSpotlightEmbeds(tc.in)) } }