{"id":456,"date":"2025-11-17T10:00:16","date_gmt":"2025-11-17T10:00:16","guid":{"rendered":"http:\/\/scvcamp239.com\/?page_id=456"},"modified":"2025-11-17T22:15:08","modified_gmt":"2025-11-17T22:15:08","slug":"southern-heritage-tracker","status":"publish","type":"page","link":"https:\/\/scvcamp239.com\/?page_id=456","title":{"rendered":"Southern Heritage Tracker"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"456\" class=\"elementor elementor-456\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4c58cb0 e-flex e-con-boxed e-con e-parent\" data-id=\"4c58cb0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c716c67 elementor-widget elementor-widget-html\" data-id=\"c716c67\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<title>Southern Heritage Tracker<\/title>\n<style>\nbody { font-family: \"Times New Roman\", Times, serif; margin: 20px; background: #f8f8f8; color: #3b1f0b; }\nh1 { color: #800000; font-size: 2em; margin-bottom: 5px; }\np.description { font-size: 1.1em; margin-bottom: 10px; }\n#lastUpdated { font-size: 0.9em; margin-bottom: 15px; color: #555; }\n.controls { margin-bottom: 20px; }\nselect, button { margin-left: 10px; padding: 6px 12px; font-family: \"Times New Roman\", Times, serif; font-weight: bold; border-radius: 6px; cursor: pointer; }\nbutton { background-color: #800000; color: #fff; border: none; } button:hover { background-color: #b22222; }\nselect { background-color: #fff; color: #3b1f0b; font-weight: normal; border: 1px solid #ccc; }\n\n.legend { margin-bottom: 15px; font-size: 0.95em; }\n.legend span { display: inline-block; padding: 4px 8px; margin-right: 10px; border-radius: 6px; font-weight: bold; }\n\n.event { padding: 14px; margin-bottom: 16px; border-radius: 10px; box-shadow: 2px 2px 6px rgba(0,0,0,0.1); background: #e0e0e0; border: 1px solid #800000; transition: background 0.2s; }\n.gold { background: #fff8dc; border-color: #ffbf00; }\ndetails summary { font-size: 1.05em; cursor: pointer; }\ndetails summary:hover { color: #b22222; }\n.event div.article { margin: 10px 0 10px 15px; }\na { color: #800000; text-decoration: underline; } a:hover { color: #b22222; }\n.no-events { font-style: italic; color: #555; padding: 10px; border: 1px solid #800000; border-radius: 8px; background: #fdf5e6; }\n<\/style>\n<\/head>\n<body>\n\n<h1>Southern Heritage Tracker<\/h1>\n<p class=\"description\">Keeping you updated on developments regarding our monuments and other Southern heritage issues.<\/p>\n<p id=\"lastUpdated\"><\/p>\n\n<div class=\"legend\">\n  <span class=\"gold\">Gold Highlight: Newly restored, reinstalled, rededicated, or erected monuments<\/span>\n<\/div>\n\n<div class=\"controls\">\n  <label for=\"stateSelect\">Filter by State:<\/label>\n  <select id=\"stateSelect\">\n    <option value=\"\">All States<\/option>\n    <option value=\"AL\">Alabama<\/option><option value=\"AK\">Alaska<\/option><option value=\"AZ\">Arizona<\/option>\n    <option value=\"AR\">Arkansas<\/option><option value=\"CA\">California<\/option><option value=\"CO\">Colorado<\/option>\n    <option value=\"CT\">Connecticut<\/option><option value=\"DE\">Delaware<\/option><option value=\"FL\">Florida<\/option>\n    <option value=\"GA\">Georgia<\/option><option value=\"HI\">Hawaii<\/option><option value=\"ID\">Idaho<\/option>\n    <option value=\"IL\">Illinois<\/option><option value=\"IN\">Indiana<\/option><option value=\"IA\">Iowa<\/option>\n    <option value=\"KS\">Kansas<\/option><option value=\"KY\">Kentucky<\/option><option value=\"LA\">Louisiana<\/option>\n    <option value=\"ME\">Maine<\/option><option value=\"MD\">Maryland<\/option><option value=\"MA\">Massachusetts<\/option>\n    <option value=\"MI\">Michigan<\/option><option value=\"MN\">Minnesota<\/option><option value=\"MS\">Mississippi<\/option>\n    <option value=\"MO\">Missouri<\/option><option value=\"MT\">Montana<\/option><option value=\"NE\">Nebraska<\/option>\n    <option value=\"NV\">Nevada<\/option><option value=\"NH\">New Hampshire<\/option><option value=\"NJ\">New Jersey<\/option>\n    <option value=\"NM\">New Mexico<\/option><option value=\"NY\">New York<\/option><option value=\"NC\">North Carolina<\/option>\n    <option value=\"ND\">North Dakota<\/option><option value=\"OH\">Ohio<\/option><option value=\"OK\">Oklahoma<\/option>\n    <option value=\"OR\">Oregon<\/option><option value=\"PA\">Pennsylvania<\/option><option value=\"RI\">Rhode Island<\/option>\n    <option value=\"SC\">South Carolina<\/option><option value=\"SD\">South Dakota<\/option><option value=\"TN\">Tennessee<\/option>\n    <option value=\"TX\">Texas<\/option><option value=\"UT\">Utah<\/option><option value=\"VT\">Vermont<\/option>\n    <option value=\"VA\">Virginia<\/option><option value=\"WA\">Washington<\/option><option value=\"WV\">West Virginia<\/option>\n    <option value=\"WI\">Wisconsin<\/option><option value=\"WY\">Wyoming<\/option>\n  <\/select>\n\n  <button onclick=\"loadEvents()\">Scan News<\/button>\n  <button onclick=\"toggleAll(true)\">Expand All<\/button>\n  <button onclick=\"toggleAll(false)\">Collapse All<\/button>\n<\/div>\n\n<div id=\"results\"><\/div>\n\n<script>\n\/*\n  Southern Heritage Tracker\n  - Tries primary RSS-to-JSON service, falls back to fetching raw RSS via a proxy and parsing XML.\n  - Pulls news feeds + government feeds (configurable).\n  - Filters out irrelevant NPS park-closure items and blog noise using exclusion keywords.\n  - Only returns items that contain 'confederate' AND at least one monument-type word.\n  - Groups related articles by headline prefix and highlights \"gold\" events.\n*\/\n\nconst MAX_ITEMS_PER_FEED = 10;               \/\/ keep page fast\nconst AUTO_REFRESH_MINUTES = 15;             \/\/ auto-refresh interval\nconst API_RSS2JSON = \"https:\/\/api.rss2json.com\/v1\/api.json?rss_url=\"; \/\/ primary RSS-to-JSON service\nconst RAW_PROXY = \"https:\/\/api.allorigins.win\/raw?url=\"; \/\/ fallback proxy to fetch raw RSS XML\n\n\/\/ News aggregator feeds (Google News search RSS used as primary. If that errors, fallback parsing will run)\nconst RSS_FEEDS = [\n  \"https:\/\/news.google.com\/rss\/search?q=confederate+monument\",\n  \"https:\/\/news.google.com\/rss\/search?q=confederate+statue\",\n  \"https:\/\/news.google.com\/rss\/search?q=confederate+memorial\",\n  \"https:\/\/news.google.com\/rss\/search?q=school+renaming\"\n];\n\n\/\/ --- Government \/ official press release feeds ---\n\/\/ Add any official press\/agency feed URLs here. I included a few examples; add more specific state\/county press release feeds as needed.\nconst GOVERNMENT_FEEDS = [\n  \"https:\/\/www.defense.gov\/news\/rss\/\",      \/\/ Dept. of Defense (news & releases)\n  \"https:\/\/www.govinfo.gov\/feeds\",          \/\/ GovInfo index (may need to be customized to specific collection)\n  \"https:\/\/www.state.gov\/rss-feeds\"         \/\/ Dept. of State (directory of RSS feeds you can pick from)\n  \/\/ Add state\/county press RSS URLs here (recommended: specific state's press release RSS)\n];\n\n\/\/ Keyword logic: require 'confederate' AND at least one monument keyword\nconst MONUMENT_WORDS = [\"monument\",\"statue\",\"memorial\",\"marker\",\"plaque\",\"memorials\"];\nconst KEYWORDS_EXTRA = [\"school\",\"name\",\"renaming\",\"rededicated\",\"reinstalled\",\"reinstallation\",\"reerected\",\"re-erected\"];\n\/\/ Gold keywords for special highlight\nconst GOLD_KEYWORDS = [\n  \"monument erected\",\"monument put back\",\"monument restored\",\n  \"restore\",\"restored\",\"restoration\",\"reinstalled\",\"reinstallation\",\n  \"rededicated\",\"rededication\",\"reerected\",\"re-erected\"\n];\n\n\/\/ Words\/phrases to exclude (to filter NPS park closures, routine park notices, facility updates, etc.)\nconst EXCLUDE_KEYWORDS = [\n  \"park closure\",\"trail\",\"campground\",\"visitor center\",\"hours\",\"parking\",\"weather\",\n  \"road closed\",\"facility\",\"closure\",\"closed for\",\"trailhead\",\"camping\",\"campground\",\n  \"fire danger\",\"burn ban\",\"parking lot\",\"maintenance\",\"construction\",\"scenic drive\"\n];\n\nconst STATE_CODES = { \"AL\":\"Alabama\",\"AK\":\"Alaska\",\"AZ\":\"Arizona\",\"AR\":\"Arkansas\",\"CA\":\"California\",\"CO\":\"Colorado\",\"CT\":\"Connecticut\",\"DE\":\"Delaware\",\"FL\":\"Florida\",\"GA\":\"Georgia\",\"HI\":\"Hawaii\",\"ID\":\"Idaho\",\"IL\":\"Illinois\",\"IN\":\"Indiana\",\"IA\":\"Iowa\",\"KS\":\"Kansas\",\"KY\":\"Kentucky\",\"LA\":\"Louisiana\",\"ME\":\"Maine\",\"MD\":\"Maryland\",\"MA\":\"Massachusetts\",\"MI\":\"Michigan\",\"MN\":\"Minnesota\",\"MS\":\"Mississippi\",\"MO\":\"Missouri\",\"MT\":\"Montana\",\"NE\":\"Nebraska\",\"NV\":\"Nevada\",\"NH\":\"New Hampshire\",\"NJ\":\"New Jersey\",\"NM\":\"New Mexico\",\"NY\":\"New York\",\"NC\":\"North Carolina\",\"ND\":\"North Dakota\",\"OH\":\"Ohio\",\"OK\":\"Oklahoma\",\"OR\":\"Oregon\",\"PA\":\"Pennsylvania\",\"RI\":\"Rhode Island\",\"SC\":\"South Carolina\",\"SD\":\"South Dakota\",\"TN\":\"Tennessee\",\"TX\":\"Texas\",\"UT\":\"Utah\",\"VT\":\"Vermont\",\"VA\":\"Virginia\",\"WA\":\"Washington\",\"WV\":\"West Virginia\",\"WI\":\"Wisconsin\",\"WY\":\"Wyoming\" };\n\nfunction lower(s){ return (s||\"\").toLowerCase(); }\n\n\/\/ --- Helpers for fetching & parsing ---\n\n\/\/ Primary fetch via rss2json (convenient JSON). If it fails (400 or other), fallback will be used.\nasync function fetchViaRSS2JSON(rssUrl){\n  try{\n    const res = await fetch(API_RSS2JSON + encodeURIComponent(rssUrl));\n    if(!res.ok) throw new Error(\"rss2json failed: \" + res.status);\n    const json = await res.json();\n    if(json.status && json.status !== \"ok\" && !json.items) throw new Error(\"rss2json bad payload\");\n    \/\/ if json.items exist, normalize into item objects\n    if(json.items && Array.isArray(json.items)){\n      return json.items.map(i => ({\n        title: i.title || \"\",\n        link: i.link || i.guid || \"\",\n        description: i.description || i.content || \"\",\n        pubDate: i.pubDate || i.pubDate || (i.isoDate || \"\"),\n        source: i.source || \"\"\n      }));\n    }\n    return [];\n  } catch(e){\n    console.warn(\"rss2json error for\", rssUrl, e.message || e);\n    throw e;\n  }\n}\n\n\/\/ Fallback: fetch raw RSS XML (via a CORS-friendly proxy) and parse items\nasync function fetchAndParseRawRSS(rssUrl){\n  try{\n    const proxied = RAW_PROXY + encodeURIComponent(rssUrl);\n    const res = await fetch(proxied);\n    if(!res.ok) throw new Error(\"raw proxy failed: \" + res.status);\n    const text = await res.text();\n    return parseRSSItemsFromXML(text);\n  } catch(e){\n    console.warn(\"raw RSS fetch error for\", rssUrl, e.message || e);\n    return [];\n  }\n}\n\n\/\/ Parse XML string -> items array {title, link, description, pubDate}\nfunction parseRSSItemsFromXML(xmlText){\n  const parser = new DOMParser();\n  const doc = parser.parseFromString(xmlText, \"application\/xml\");\n  \/\/ check parsererror\n  if(doc.querySelector(\"parsererror\")) return [];\n  const items = Array.from(doc.getElementsByTagName(\"item\"));\n  return items.map(it => {\n    const get = (tag) => {\n      const el = it.getElementsByTagName(tag)[0];\n      return el ? (el.textContent || \"\") : \"\";\n    };\n    \/\/ Some feeds use media:content or guid for link - try common fallbacks\n    let link = get(\"link\");\n    if(!link){\n      const guid = get(\"guid\");\n      if(guid && guid.indexOf(\"http\")===0) link = guid;\n    }\n    return {\n      title: get(\"title\"),\n      link: link,\n      description: get(\"description\") || get(\"content:encoded\") || \"\",\n      pubDate: get(\"pubDate\") || \"\"\n    };\n  });\n}\n\n\/\/ Unified fetch function: try rss2json then fallback to raw XML parsing\nasync function fetchFeedItems(rssUrl){\n  \/\/ try rss2json first\n  try {\n    const items = await fetchViaRSS2JSON(rssUrl);\n    if(items && items.length) return items;\n  } catch(e){\n    \/\/ proceed to fallback\n  }\n  \/\/ fallback: fetch raw RSS (via proxy) and parse\n  try {\n    const rawItems = await fetchAndParseRawRSS(rssUrl);\n    return rawItems;\n  } catch(e){\n    console.warn(\"Both fetch methods failed for\", rssUrl);\n    return [];\n  }\n}\n\n\/\/ --- Relevance & filtering functions ---\n\nfunction containsAny(text, arr){\n  if(!text) return false;\n  text = text.toLowerCase();\n  return arr.some(k => text.includes(k.toLowerCase()));\n}\n\nfunction isPotentiallyRelevant(item){\n  const combined = (item.title + \" \" + item.description + \" \" + (item.source||\"\")).toLowerCase();\n\n  \/\/ Exclude common noise (park closures, weather, etc.)\n  if(containsAny(combined, EXCLUDE_KEYWORDS)) return false;\n\n  \/\/ must contain 'confederate'\n  if(!combined.includes(\"confederate\")) return false;\n\n  \/\/ must also contain at least one monument-type word OR other relevant words (school\/name)\n  if(containsAny(combined, MONUMENT_WORDS) || containsAny(combined, KEYWORDS_EXTRA)) return true;\n\n  \/\/ otherwise skip\n  return false;\n}\n\nfunction isGold(item){\n  const combined = (item.title + \" \" + item.description).toLowerCase();\n  return containsAny(combined, GOLD_KEYWORDS);\n}\n\n\/\/ Try to infer a simple event grouping key: use title prefix before \":\" or \" - \" or the full title if short\nfunction eventKeyFromTitle(title){\n  if(!title) return \"Untitled\";\n  \/\/ remove site suffix like \" - AP\" or \" | News\"\n  let t = title.split(\"|\")[0].split(\" - \")[0].split(\":\")[0].trim();\n  return t.length > 6 ? t : title;\n}\n\n\/\/ Utility to truncate long descriptions for the overview\nfunction shortDescription(desc, max=200){\n  if(!desc) return \"\";\n  const plain = desc.replace(\/<[^>]+>\/g,\"\").trim(); \/\/ strip HTML tags\n  if(plain.length <= max) return plain;\n  return plain.substring(0,max) + \"...\";\n}\n\n\/\/ returns true if text includes state name (for state filter)\nfunction matchesStateFilter(text, stateCode){\n  if(!stateCode) return true;\n  const stateName = STATE_CODES[stateCode];\n  if(!stateName) return true;\n  return text.toLowerCase().includes(stateName.toLowerCase());\n}\n\n\/\/ --- Main loader ---\n\nasync function loadEvents(){\n  const results = document.getElementById(\"results\");\n  results.innerHTML = \"<p class='no-events'>Loading...<\/p>\";\n  const stateFilter = document.getElementById(\"stateSelect\").value;\n\n  \/\/ aggregate all feeds (news + government)\n  const allFeeds = [...RSS_FEEDS, ...GOVERNMENT_FEEDS];\n\n  const eventsMap = {}; \/\/ eventKey -> [articles]\n\n  \/\/ iterate feeds in sequence (could be parallel but keep it simple)\n  for(const feedUrl of allFeeds){\n    try {\n      const feedItems = await fetchFeedItems(feedUrl);\n      \/\/ limit items per feed\n      const slice = feedItems.slice(0, MAX_ITEMS_PER_FEED);\n      slice.forEach(it => {\n        \/\/ normalize\n        const item = {\n          title: it.title || \"\",\n          link: it.link || \"\",\n          description: it.description || \"\",\n          date: it.pubDate ? new Date(it.pubDate) : (new Date()),\n          source: it.source || feedUrl\n        };\n        const combinedText = (item.title + \" \" + item.description + \" \" + item.source).toLowerCase();\n\n        \/\/ Relevance & filter: require 'confederate' & monument-type, allow state filter, exclude park-closure noise\n        if(!isPotentiallyRelevant(item)) return;\n        if(!matchesStateFilter(combinedText, stateFilter)) return;\n\n        const eventKey = eventKeyFromTitle(item.title);\n        if(!eventsMap[eventKey]) eventsMap[eventKey] = [];\n        eventsMap[eventKey].push({\n          title: item.title,\n          link: item.link,\n          desc: item.description,\n          date: item.date,\n          gold: isGold(item),\n          source: item.source\n        });\n      });\n    } catch(err){\n      console.warn(\"feed processing error\", feedUrl, err);\n      \/\/ continue to next feed\n    }\n  }\n\n  \/\/ update last updated\n  document.getElementById(\"lastUpdated\").textContent = \"Last updated: \" + new Date().toLocaleString();\n\n  \/\/ render results\n  results.innerHTML = \"\";\n  const keys = Object.keys(eventsMap);\n  if(keys.length === 0){\n    results.innerHTML = \"<p class='no-events'>No heritage debate events found at this time.<\/p>\";\n    return;\n  }\n\n  \/\/ sort events by newest article in group (newest first)\n  keys.sort((a,b) => {\n    const maxA = Math.max(...eventsMap[a].map(e => e.date.getTime()));\n    const maxB = Math.max(...eventsMap[b].map(e => e.date.getTime()));\n    return maxB - maxA;\n  });\n\n  keys.forEach(key => {\n    const group = eventsMap[key];\n    const isGroupGold = group.some(x => x.gold);\n\n    const details = document.createElement(\"details\");\n    details.className = \"event\" + (isGroupGold ? \" gold\" : \"\");\n\n    const summary = document.createElement(\"summary\");\n    summary.innerHTML = `<strong>${key}<\/strong> (${group.length} article${group.length>1?\"s\":\"\"})`;\n    details.appendChild(summary);\n\n    \/\/ sort group articles newest-first\n    group.sort((x,y) => y.date - x.date);\n    group.forEach(a => {\n      const div = document.createElement(\"div\");\n      div.className = \"article\";\n      const short = shortDescription(a.desc, 220);\n      const dateText = a.date ? a.date.toDateString() : \"\";\n      div.innerHTML = `<em>${dateText}<\/em> \u2014 ${short}<br><a href=\"${a.link}\" target=\"_blank\" rel=\"noopener noreferrer\">Read Article<\/a>`;\n      details.appendChild(div);\n    });\n\n    results.appendChild(details);\n  });\n}\n\n\/\/ Expand\/Collapse that always queries current #results\nfunction toggleAll(expand){\n  const container = document.getElementById(\"results\");\n  const detailsList = container.querySelectorAll(\"details\");\n  detailsList.forEach(d => d.open = expand);\n}\n\n\/\/ Auto refresh\nsetInterval(loadEvents, AUTO_REFRESH_MINUTES * 60 * 1000);\n\n\/\/ initial load\nloadEvents();\n<\/script>\n\n<\/body>\n<\/html>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Southern Heritage Tracker Southern Heritage Tracker Keeping you updated on developments regarding our monuments and other Southern heritage issues. Gold Highlight: Newly restored, reinstalled, rededicated, or erected monuments Filter by State: All StatesAlabamaAlaskaArizonaArkansasCaliforniaColoradoConnecticutDelawareFloridaGeorgiaHawaiiIdahoIllinoisIndianaIowaKansasKentuckyLouisianaMaineMarylandMassachusettsMichiganMinnesotaMississippiMissouriMontanaNebraskaNevadaNew HampshireNew JerseyNew MexicoNew YorkNorth CarolinaNorth DakotaOhioOklahomaOregonPennsylvaniaRhode IslandSouth CarolinaSouth DakotaTennesseeTexasUtahVermontVirginiaWashingtonWest VirginiaWisconsinWyoming Scan News Expand All Collapse All<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-456","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Southern Heritage Tracker - Robert E. Lee Camp #239, S.C.V.<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/scvcamp239.com\/?page_id=456\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Southern Heritage Tracker - Robert E. Lee Camp #239, S.C.V.\" \/>\n<meta property=\"og:description\" content=\"Southern Heritage Tracker Southern Heritage Tracker Keeping you updated on developments regarding our monuments and other Southern heritage issues. Gold Highlight: Newly restored, reinstalled, rededicated, or erected monuments Filter by State: All StatesAlabamaAlaskaArizonaArkansasCaliforniaColoradoConnecticutDelawareFloridaGeorgiaHawaiiIdahoIllinoisIndianaIowaKansasKentuckyLouisianaMaineMarylandMassachusettsMichiganMinnesotaMississippiMissouriMontanaNebraskaNevadaNew HampshireNew JerseyNew MexicoNew YorkNorth CarolinaNorth DakotaOhioOklahomaOregonPennsylvaniaRhode IslandSouth CarolinaSouth DakotaTennesseeTexasUtahVermontVirginiaWashingtonWest VirginiaWisconsinWyoming Scan News Expand All Collapse All\" \/>\n<meta property=\"og:url\" content=\"http:\/\/scvcamp239.com\/?page_id=456\" \/>\n<meta property=\"og:site_name\" content=\"Robert E. Lee Camp #239, S.C.V.\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/profile.php?id=100064600903138\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-17T22:15:08+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@LeeCamp239\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\\\/\\\/scvcamp239.com\\\/?page_id=456\",\"url\":\"http:\\\/\\\/scvcamp239.com\\\/?page_id=456\",\"name\":\"Southern Heritage Tracker - Robert E. Lee Camp #239, S.C.V.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/scvcamp239.com\\\/#website\"},\"datePublished\":\"2025-11-17T10:00:16+00:00\",\"dateModified\":\"2025-11-17T22:15:08+00:00\",\"breadcrumb\":{\"@id\":\"http:\\\/\\\/scvcamp239.com\\\/?page_id=456#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\\\/\\\/scvcamp239.com\\\/?page_id=456\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\\\/\\\/scvcamp239.com\\\/?page_id=456#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/scvcamp239.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Southern Heritage Tracker\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/scvcamp239.com\\\/#website\",\"url\":\"https:\\\/\\\/scvcamp239.com\\\/\",\"name\":\"Robert E. Lee Camp #239, S.C.V.\",\"description\":\"Honoring the legacy of Confederate veterans in Fort Worth, Texas.\",\"publisher\":{\"@id\":\"https:\\\/\\\/scvcamp239.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/scvcamp239.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/scvcamp239.com\\\/#organization\",\"name\":\"Robert E. Lee Camp #239, Sons of Confederate Veterans\",\"url\":\"https:\\\/\\\/scvcamp239.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/scvcamp239.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"http:\\\/\\\/scvcamp239.com\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/SCV-Logo-W-RELEE.webp\",\"contentUrl\":\"http:\\\/\\\/scvcamp239.com\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/SCV-Logo-W-RELEE.webp\",\"width\":1200,\"height\":1200,\"caption\":\"Robert E. Lee Camp #239, Sons of Confederate Veterans\"},\"image\":{\"@id\":\"https:\\\/\\\/scvcamp239.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/profile.php?id=100064600903138\",\"https:\\\/\\\/x.com\\\/LeeCamp239\",\"https:\\\/\\\/www.youtube.com\\\/@SCVCamp239\",\"https:\\\/\\\/www.instagram.com\\\/relee239\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Southern Heritage Tracker - Robert E. Lee Camp #239, S.C.V.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/scvcamp239.com\/?page_id=456","og_locale":"en_US","og_type":"article","og_title":"Southern Heritage Tracker - Robert E. Lee Camp #239, S.C.V.","og_description":"Southern Heritage Tracker Southern Heritage Tracker Keeping you updated on developments regarding our monuments and other Southern heritage issues. Gold Highlight: Newly restored, reinstalled, rededicated, or erected monuments Filter by State: All StatesAlabamaAlaskaArizonaArkansasCaliforniaColoradoConnecticutDelawareFloridaGeorgiaHawaiiIdahoIllinoisIndianaIowaKansasKentuckyLouisianaMaineMarylandMassachusettsMichiganMinnesotaMississippiMissouriMontanaNebraskaNevadaNew HampshireNew JerseyNew MexicoNew YorkNorth CarolinaNorth DakotaOhioOklahomaOregonPennsylvaniaRhode IslandSouth CarolinaSouth DakotaTennesseeTexasUtahVermontVirginiaWashingtonWest VirginiaWisconsinWyoming Scan News Expand All Collapse All","og_url":"http:\/\/scvcamp239.com\/?page_id=456","og_site_name":"Robert E. Lee Camp #239, S.C.V.","article_publisher":"https:\/\/www.facebook.com\/profile.php?id=100064600903138","article_modified_time":"2025-11-17T22:15:08+00:00","twitter_card":"summary_large_image","twitter_site":"@LeeCamp239","twitter_misc":{"Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/scvcamp239.com\/?page_id=456","url":"http:\/\/scvcamp239.com\/?page_id=456","name":"Southern Heritage Tracker - Robert E. Lee Camp #239, S.C.V.","isPartOf":{"@id":"https:\/\/scvcamp239.com\/#website"},"datePublished":"2025-11-17T10:00:16+00:00","dateModified":"2025-11-17T22:15:08+00:00","breadcrumb":{"@id":"http:\/\/scvcamp239.com\/?page_id=456#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["http:\/\/scvcamp239.com\/?page_id=456"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/scvcamp239.com\/?page_id=456#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/scvcamp239.com\/"},{"@type":"ListItem","position":2,"name":"Southern Heritage Tracker"}]},{"@type":"WebSite","@id":"https:\/\/scvcamp239.com\/#website","url":"https:\/\/scvcamp239.com\/","name":"Robert E. Lee Camp #239, S.C.V.","description":"Honoring the legacy of Confederate veterans in Fort Worth, Texas.","publisher":{"@id":"https:\/\/scvcamp239.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/scvcamp239.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/scvcamp239.com\/#organization","name":"Robert E. Lee Camp #239, Sons of Confederate Veterans","url":"https:\/\/scvcamp239.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/scvcamp239.com\/#\/schema\/logo\/image\/","url":"http:\/\/scvcamp239.com\/wp-content\/uploads\/2025\/04\/SCV-Logo-W-RELEE.webp","contentUrl":"http:\/\/scvcamp239.com\/wp-content\/uploads\/2025\/04\/SCV-Logo-W-RELEE.webp","width":1200,"height":1200,"caption":"Robert E. Lee Camp #239, Sons of Confederate Veterans"},"image":{"@id":"https:\/\/scvcamp239.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/profile.php?id=100064600903138","https:\/\/x.com\/LeeCamp239","https:\/\/www.youtube.com\/@SCVCamp239","https:\/\/www.instagram.com\/relee239\/"]}]}},"_links":{"self":[{"href":"https:\/\/scvcamp239.com\/index.php?rest_route=\/wp\/v2\/pages\/456","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scvcamp239.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/scvcamp239.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/scvcamp239.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/scvcamp239.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=456"}],"version-history":[{"count":14,"href":"https:\/\/scvcamp239.com\/index.php?rest_route=\/wp\/v2\/pages\/456\/revisions"}],"predecessor-version":[{"id":473,"href":"https:\/\/scvcamp239.com\/index.php?rest_route=\/wp\/v2\/pages\/456\/revisions\/473"}],"wp:attachment":[{"href":"https:\/\/scvcamp239.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=456"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}