{"version":3,"sources":["Tools/GameScriptView/SourceBrowserFixup.ts","Tools/GameScriptView/SourceViz/SourceViz.tsx","Home/Home.tsx","Articles/Articles.tsx","GameList/MapList/MapDetails/MapDetails.tsx","GameList/MapList/MapListEntry/MapListEntry.tsx","GameList/MapList/MapList.tsx","GameList/GameList.tsx","Tools/GameScriptView/SolutionExplorer/SolutionExplorer.tsx","Tools/GameScriptView/GameScriptView.tsx","Core/UserAvatar.tsx","Tools/ToolEntry/ToolEntry.tsx","Tools/Tools.tsx","Core/withManifest.tsx","App.tsx","reportWebVitals.ts","AppHeader/AppHeader.tsx","index.tsx"],"names":["SourceBrowserFixup","history","location","root","relativeRoot","url","this","contentRoot","contentPath","pathPattern","anchors","Array","from","getElementsByTagName","replace","substr","lastIndexOf","a","onclick","linkOnClick","bind","onmouseover","linkMouseOver","ev","defaultPrevented","button","isModifiedEvent","preventDefault","aElem","target","closest","loc","href","getAttribute","createLocation","undefined","push","startsWith","setAttribute","event","metaKey","altKey","ctrlKey","shiftKey","SourceViz","props","done","contentReady","React","createRef","fixup","state","codeVizHtml","nextProps","nextState","match","params","hash","prevProps","setState","fetchData","id","element","document","getElementById","scrollIntoView","fixupLinks","current","path","redirectToNextLevelRedirectFileIfNecessary","updatedContentPath","endsWith","fetch","text","anchor","slice","hashParts","split","anchorSplitChar","anchorHasReferencesSuffix","length","pop","join","destinationHash","createSafeLineNumber","redirectMapIife","redirectMap","eval","redirect","map","bytes","prefixLength","shortId","redirectTo","destination","isNumber","s","n","parseFloat","isNaN","isFinite","ref","className","dangerouslySetInnerHTML","__html","Component","withRouter","Home","Articles","MapDetails","mapName","gameIdentifier","contentCache","then","r","json","j","populateContent","mapContent","detailCache","mapData","tasks","mechanics","m","t","content","marked","Promise","all","Name","Description","getMetadata","getContents","getAbout","to","stub","title","src","Scenario","TagCount","getMainSection","getDialog","getMechanics","MapListEntry","mapManifest","name","alt","displayName","MapList","manifest","resp","maps","exact","getMapListing","GameList","gameManifest","games","g","getGameListing","SolutionExplorer","selectedFile","supportedFileExtensions","slnExpHtml","loadSolutionExplorer","syncSolutionExplorer","parts","currentElement","i","folder","querySelector","style","display","previousSibling","dispatchEvent","Event","querySelectorAll","find","selectFile","classList","remove","add","bounds","getBoundingClientRect","top","window","innerHeight","bottom","behavior","inline","makeFoldersCollapsible","initializeSolutionExplorerFolder","children","child","isLink","rewriteSolutionExplorerLink","link","fileName","trimFromEnd","extension","getExtension","setClassName","pathname","isSupportedExtension","textContent","getFileName","lastSlash","unescape","folderIcon","openFolderIcon","pathToIcons","initializeHandler","elements","initialize","parentNode","addImagesToFolder","div","firstChild","imagePlusMinus","createElement","imageFolder","setFolderImage","handler","expandCollapseFolder","insertBefore","tagName","capturedFolder","capturedPlusMinus","capturedFolderImage","capturedDiv","capturedFirstChild","everExpanded","suffixToTrim","endsWithIgnoreCase","filePath","dot","toLowerCase","suffix","indexOf","GameScriptView","UserAvatar","github","imageDimension","getImageSource","alias","ToolWidget","sourceLocation","thumb","description","contributors","c","key","Tools","tools","getToolsListing","withManifest","manifestPath","WithManifest","manifests","App","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","AppHeader","width","height","activeClassName","ReactDOM","render","StrictMode"],"mappings":"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","file":"static/js/main.690d012c.chunk.js","sourcesContent":["import History, { createLocation } from 'history';\r\n\r\nexport default class SourceBrowserFixup {\r\n history: History.History;\r\n location: History.Location;\r\n root: string = \"\";\r\n relativeRoot:string = \"\";\r\n url: string = \"\";\r\n\r\n constructor(history: History.History, location: History.Location) {\r\n this.history = history;\r\n this.location = location;\r\n }\r\n\r\n fixupLinks(contentRoot: HTMLElement, contentPath: string, pathPattern: string, url: string) {\r\n var anchors = Array.from(contentRoot.getElementsByTagName(\"a\"));\r\n this.url = url;\r\n this.root = pathPattern.replace(\":contentPath*\", \"\");\r\n this.relativeRoot = this.root + contentPath.substr(0, contentPath.lastIndexOf(\"/\")+1);\r\n\r\n for(var a of anchors)\r\n {\r\n a.onclick = this.linkOnClick.bind(this);\r\n a.onmouseover = this.linkMouseOver.bind(this);\r\n }\r\n }\r\n\r\n linkOnClick(ev: MouseEvent) {\r\n if (\r\n !ev.defaultPrevented && // onClick prevented default\r\n ev.button === 0 && // ignore everything but left clicks\r\n !SourceBrowserFixup.isModifiedEvent(ev) // ignore clicks with modifier keys\r\n ) {\r\n ev.preventDefault();\r\n var elem = ev.target as HTMLElement;\r\n\r\n var aElem = elem.closest(\"a\") as HTMLAnchorElement;\r\n\r\n let loc = this.location;\r\n\r\n let href = aElem.getAttribute(\"href\");\r\n\r\n if(href != null) {\r\n loc = createLocation(href, null, undefined, this.location);\r\n }\r\n \r\n this.history.push(loc);\r\n }\r\n }\r\n\r\n linkMouseOver(ev: MouseEvent) {\r\n var elem = ev.target as HTMLElement;\r\n\r\n var a = elem.closest(\"a\") as HTMLAnchorElement;\r\n\r\n var href = a.getAttribute(\"href\");\r\n\r\n if(href?.startsWith(\"/\"))\r\n {\r\n a.setAttribute(\"href\", this.root + href.substr(1));\r\n }\r\n else if(href?.startsWith(\"#\"))\r\n {\r\n a.setAttribute(\"href\", this.url + href);\r\n }\r\n else\r\n {\r\n a.setAttribute(\"href\", this.relativeRoot + href);\r\n }\r\n\r\n a.onmouseover = null;\r\n }\r\n\r\n static isModifiedEvent(event: MouseEvent) {\r\n return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\r\n }\r\n}","import React from 'react';\r\nimport { NavLink, withRouter, Switch, Route, RouteComponentProps, Redirect, useHistory } from 'react-router-dom';\r\nimport SourceBrowserFixup from '../SourceBrowserFixup';\r\nimport { ChildPaneRouteProps } from '../GameScriptView';\r\nimport '../SourceBrowser.scss';\r\nimport './SourceViz.scss';\r\n\r\n\r\ninterface SourceVizState {\r\n codeVizHtml: string;\r\n}\r\n\r\nexport class SourceViz extends React.Component, SourceVizState, any>\r\n{\r\n done: boolean = false;\r\n contentReady: boolean = false;\r\n contentRoot = React.createRef();\r\n contentPath: string = \"overview.html\";\r\n fixup: SourceBrowserFixup;\r\n\r\n constructor(props: RouteComponentProps) {\r\n super(props);\r\n\r\n this.fixup = new SourceBrowserFixup(this.props.history, this.props.location);\r\n this.state = { codeVizHtml: \"Loading\" };\r\n }\r\n\r\n shouldComponentUpdate(nextProps: RouteComponentProps, nextState: SourceVizState) { \r\n return !this.done \r\n || this.props.match.params.contentPath !== nextProps.match.params.contentPath\r\n || this.props.location.hash !== nextProps.location.hash;\r\n }\r\n\r\n async componentDidUpdate(prevProps: RouteComponentProps) {\r\n if(this.props.match.params.contentPath !== prevProps.match.params.contentPath)\r\n {\r\n this.done = false;\r\n this.contentReady = false;\r\n this.setState({ codeVizHtml: \"Loading\" });\r\n await this.fetchData();\r\n return;\r\n }\r\n\r\n // If we're here, this is an update after a new contentPath\r\n if(this.contentReady === false)\r\n {\r\n return;\r\n }\r\n\r\n if(this.props.location.hash != null) {\r\n const id = this.props.location.hash.replace('#', '');\r\n const element = document.getElementById(id);\r\n if (element) element.scrollIntoView();\r\n\r\n // If the content path is the same, but the hash changed, we can bail out here, no need to rewrite in that case\r\n if(this.props.match.params.contentPath === prevProps.match.params.contentPath\r\n && this.props.location.hash !== prevProps.location.hash)\r\n return;\r\n }\r\n\r\n // This is after the data is done fetching, we can fixup the DOM and suppress updates\r\n this.fixup = new SourceBrowserFixup(this.props.history, this.props.location);\r\n this.fixup.fixupLinks(this.contentRoot.current!, this.contentPath, this.props.match.path, this.props.match.url);\r\n this.done = true;\r\n }\r\n\r\n async componentDidMount() {\r\n await this.fetchData();\r\n }\r\n\r\n async fetchData() {\r\n if(await this.redirectToNextLevelRedirectFileIfNecessary()) {\r\n return;\r\n }\r\n\r\n var updatedContentPath = this.props.match.params.contentPath;\r\n\r\n if(updatedContentPath == null){\r\n updatedContentPath = this.contentPath;\r\n }\r\n\r\n if(updatedContentPath.endsWith(\".html\") === false)\r\n {\r\n updatedContentPath += \".html\";\r\n }\r\n\r\n this.contentPath = updatedContentPath;\r\n\r\n let codeVizHtml = await (await fetch(`/game-scripts/index/${this.contentPath}`)).text();\r\n\r\n this.contentReady = true;\r\n this.setState({ codeVizHtml: codeVizHtml });\r\n }\r\n static anchorSplitChar = \",\";\r\n\r\n // multi-staged redirect A.html -> A0.html -> filePath.html (to reduce size of a.html)\r\n async redirectToNextLevelRedirectFileIfNecessary() {\r\n let contentPath = this.props.match.params.contentPath;\r\n if(!contentPath) {\r\n return false;\r\n }\r\n\r\n if(contentPath.endsWith(\"/A.html\") === false) {\r\n return false;\r\n }\r\n\r\n var anchor = this.props.location.hash;\r\n if (anchor) {\r\n anchor = anchor.slice(1);\r\n var hashParts = anchor.split(SourceViz.anchorSplitChar);\r\n var anchorHasReferencesSuffix = false;\r\n if (hashParts.length > 1 && hashParts[hashParts.length - 1] == \"references\") {\r\n anchorHasReferencesSuffix = true;\r\n hashParts.pop();\r\n }\r\n var id = hashParts.join(SourceViz.anchorSplitChar);\r\n\r\n var destinationHash = \"#\" + this.createSafeLineNumber(id);\r\n if (anchorHasReferencesSuffix) {\r\n destinationHash = destinationHash + SourceViz.anchorSplitChar + \"references\";\r\n }\r\n\r\n let redirectMapIife = await (await fetch(`/game-scripts/index/${contentPath.replace(\"A.html\", \"A\" + id.slice(0, 1) + \".html\")}`)).text();\r\n\r\n var redirectMap = eval(redirectMapIife);\r\n\r\n await this.redirect(redirectMap.map, redirectMap.bytes, destinationHash);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n async redirect(map: any, prefixLength: number, anchor: string) {\r\n if (!prefixLength) {\r\n prefixLength = 16;\r\n }\r\n \r\n if (anchor) {\r\n anchor = anchor.slice(1);\r\n var hashParts = anchor.split(SourceViz.anchorSplitChar);\r\n var anchorHasReferencesSuffix = false;\r\n if (hashParts.length > 1 && hashParts[hashParts.length - 1] == \"references\") {\r\n anchorHasReferencesSuffix = true;\r\n hashParts.pop();\r\n }\r\n var id = hashParts.join(SourceViz.anchorSplitChar);\r\n var shortId = id;\r\n if (prefixLength < shortId.length) {\r\n shortId = shortId.slice(0, prefixLength);\r\n }\r\n \r\n // all the keys have their first character trimmed since it's a bucket file aX.html\r\n // and X is the same for all ids\r\n shortId = shortId.slice(1);\r\n \r\n var redirectTo = map[shortId];\r\n if (redirectTo) {\r\n var destination = redirectTo + \".html\" + \"#\" + this.createSafeLineNumber(id);\r\n if (anchorHasReferencesSuffix) {\r\n destination = destination + SourceViz.anchorSplitChar + \"references\";\r\n }\r\n \r\n this.props.history.replace(`/tools/game-scripts/${destination}`);\r\n }\r\n }\r\n }\r\n \r\n\r\n createSafeLineNumber(text: string) {\r\n if (this.isNumber(text) && text.length != 16) {\r\n text = \"l\" + text;\r\n }\r\n \r\n return text;\r\n }\r\n \r\n isNumber(s: string) {\r\n let n = parseFloat(s);\r\n return !isNaN(n) && isFinite(n);\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n );\r\n }\r\n\r\n \r\n}\r\n\r\nexport default withRouter(SourceViz);","import React from 'react';\r\n\r\n\r\nexport default class Home extends React.Component {\r\n render() {\r\n return (\r\n
\r\n

Welcome!

\r\n

\r\n This site aims to be the de-facto repository of technical information about the Halo games and related communities (modding, speedrunning, tricking, etc). \r\n

\r\n

\r\n Content ranging from articles detailing the underlying mechanics of glitches, to convenient ways to browse the game scripts is welcome here.\r\n

\r\n

\r\n The initial set of content is primarily centered around Halo 2, as the OpenH2 sibling-project is the main source of data and motivation.\r\n As time goes on, more games' data will be added and more articles will be written/added.\r\n

\r\n

\r\n If you'd like to contribute or spot an inaccuracy, this site is on Github - pull requests and issues are welcome.\r\n

\r\n \r\n - Ron\r\n \r\n
\r\n )\r\n }\r\n}","import React from 'react';\r\n\r\n\r\nexport default class Articles extends React.Component {\r\n render() {\r\n return (\r\n

\r\n Articles\r\n

\r\n\r\n )\r\n }\r\n}","import React from 'react';\r\nimport { Link, Route, RouteComponentProps, withRouter } from 'react-router-dom';\r\nimport { MapContent, MapSummary } from '../MapData';\r\nimport './MapDetails.scss';\r\n\r\ninterface MapDetailProps {\r\n gameIdentifier: string;\r\n mapName: string;\r\n}\r\n\r\ninterface MapDetailState {\r\n mapData: MapSummary;\r\n mapContent: MapContent;\r\n}\r\n\r\nexport class MapDetails extends React.Component, MapDetailState, any>{\r\n static detailCache: { [key: string]: MapSummary } = {};\r\n static contentCache: { [key: string]: MapContent } = {};\r\n\r\n mapName: string = \"\";\r\n gameIdentifier: string = \"\";\r\n\r\n constructor(props: any) {\r\n super(props);\r\n this.state = {} as MapDetailState;\r\n }\r\n\r\n async componentDidMount() {\r\n this.gameIdentifier = this.props.match.params.gameIdentifier;\r\n this.mapName = this.props.match.params.mapName;\r\n\r\n if(MapDetails.contentCache[this.mapName] === undefined) {\r\n fetch(`/data/maps/${this.gameIdentifier}/${this.mapName}/content.json`)\r\n .then(r => r.json())\r\n .then(j => {\r\n MapDetails.contentCache[this.mapName] = j as MapContent;\r\n this.populateContent();\r\n this.setState({mapContent: MapDetails.contentCache[this.mapName]}); \r\n });\r\n }\r\n else {\r\n this.setState({mapContent: MapDetails.contentCache[this.mapName]});\r\n }\r\n\r\n if (MapDetails.detailCache[this.mapName] == undefined) {\r\n fetch(`/data/maps/${this.gameIdentifier}/${this.mapName}/details.json`)\r\n .then(r => r.json())\r\n .then(j => {\r\n MapDetails.detailCache[this.mapName] = j as MapSummary;\r\n this.setState({ mapData: MapDetails.detailCache[this.mapName] });\r\n });\r\n }\r\n else {\r\n this.setState({ mapData: MapDetails.detailCache[this.mapName] });\r\n }\r\n }\r\n\r\n async populateContent() {\r\n \r\n const tasks = MapDetails.contentCache[this.mapName].mechanics\r\n .map(m => fetch(`/data/maps/${this.gameIdentifier}/${this.mapName}/${m.contentPath}`)\r\n .then(r => r.text())\r\n .then(t =>{\r\n // @ts-ignore\r\n m.content = marked(t);\r\n }));\r\n\r\n await Promise.all(tasks);\r\n\r\n this.setState({mapContent: MapDetails.contentCache[this.mapName]}); \r\n }\r\n\r\n getMainSection() {\r\n return (\r\n
\r\n

{this.state.mapData.Name}

\r\n

{this.state.mapData.Description}

\r\n {this.getMetadata()}\r\n {this.getContents()}\r\n {this.getAbout()}\r\n
\r\n );\r\n }\r\n\r\n getContents() {\r\n return (\r\n \r\n )\r\n }\r\n\r\n getMetadata() {\r\n return (\r\n
\r\n \r\n
Name: {this.state.mapData.Name}
\r\n
Description: {this.state.mapData.Description}
\r\n
Scenario: {this.state.mapData.Scenario}
\r\n
Tags: {this.state.mapData.TagCount}
\r\n
\r\n );\r\n }\r\n\r\n getAbout() {\r\n return (\r\n
\r\n

About

\r\n
\r\n );\r\n }\r\n\r\n getDialog() {\r\n return (\r\n
\r\n

Dialog

\r\n
\r\n );\r\n }\r\n\r\n getMechanics() {\r\n return (\r\n
\r\n

Mechanics

\r\n {this.state.mapContent?.mechanics?.length ? null : (nothing to see here)}\r\n {\r\n this.state.mapContent?.mechanics?.map(m => \r\n (\r\n
\r\n

{m.title}

\r\n

\r\n
\r\n )\r\n )\r\n }\r\n
\r\n );\r\n }\r\n\r\n render() {\r\n if(this.state.mapData == undefined)\r\n return (Loading);\r\n\r\n return (\r\n
\r\n {this.getMainSection()}\r\n {this.getDialog()}\r\n {this.getMechanics()}\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withRouter(MapDetails);","import React from 'react';\r\nimport { NavLink } from 'react-router-dom';\r\nimport { MapManifestEntry } from '../MapData';\r\nimport './MapListEntry.scss';\r\n\r\ninterface MapListEntryProps\r\n{\r\n mapManifest: MapManifestEntry;\r\n gameIdentifier: string;\r\n}\r\n\r\nexport default class MapListEntry extends React.Component{\r\n\r\n constructor(props: any) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n {`${this.props.mapManifest.name}\r\n \r\n
\r\n {this.props.mapManifest.displayName}\r\n
\r\n \r\n
);\r\n }\r\n}","import React from 'react';\r\nimport { NavLink, withRouter, Switch, Route, RouteComponentProps } from 'react-router-dom';\r\nimport MapDetails from './MapDetails/MapDetails';\r\nimport { MapManifest } from './MapData';\r\nimport MapListEntry from './MapListEntry/MapListEntry';\r\nimport './MapList.scss';\r\n\r\ninterface MapListProps\r\n{\r\n gameIdentifier: string;\r\n}\r\n\r\ninterface MapListState\r\n{\r\n manifest: MapManifest;\r\n}\r\n\r\nexport class MapList extends React.Component, MapListState, any> {\r\n static manifest: MapManifest;\r\n\r\n constructor(props: RouteComponentProps) {\r\n super(props);\r\n this.state = {} as MapListState;\r\n }\r\n\r\n async componentDidMount() {\r\n if(MapList.manifest == undefined)\r\n {\r\n const resp = await fetch(`/data/maps/h2v/maps.json`);\r\n MapList.manifest = (await resp.json()) as MapManifest;\r\n this.setState({\"manifest\": MapList.manifest});\r\n }\r\n else\r\n {\r\n this.setState({\"manifest\": MapList.manifest});\r\n }\r\n }\r\n\r\n getMapListing() {\r\n return (\r\n
\r\n {this.state.manifest.maps.map(m => {\r\n return ()\r\n })}\r\n
\r\n )\r\n }\r\n\r\n render() {\r\n let path = this.props.match.path;\r\n return (\r\n \r\n \r\n

Maps

\r\n {(this.state.manifest == undefined\r\n ? (Loading)\r\n : this.getMapListing()\r\n )}\r\n
\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withRouter(MapList);","import React from 'react';\r\nimport { NavLink, withRouter, Switch, Route, RouteComponentProps, Redirect } from 'react-router-dom';\r\nimport { GamesManifest } from './MapList/MapData';\r\nimport MapList from './MapList/MapList';\r\n\r\ninterface MapListProps\r\n{\r\n gameIdentifier: string;\r\n}\r\n\r\ninterface MapListState\r\n{\r\n gameManifest: GamesManifest;\r\n}\r\n\r\nexport class GameList extends React.Component, MapListState, any> {\r\n static gameManifest: GamesManifest;\r\n\r\n constructor(props: RouteComponentProps) {\r\n super(props);\r\n this.state = {} as MapListState;\r\n }\r\n\r\n async componentDidMount() {\r\n if(GameList.gameManifest == undefined)\r\n {\r\n const resp = await fetch(`/data/maps/games.json`);\r\n GameList.gameManifest = (await resp.json()) as GamesManifest;\r\n this.setState({\"gameManifest\": GameList.gameManifest});\r\n }\r\n else\r\n {\r\n this.setState({\"gameManifest\": GameList.gameManifest});\r\n }\r\n }\r\n\r\n getGameListing() {\r\n if(this.state.gameManifest.games.length === 1) {\r\n return ()\r\n }\r\n\r\n return (\r\n
\r\n {this.state.gameManifest.games.map(g => {\r\n return ({g.title})\r\n })}\r\n
\r\n )\r\n }\r\n\r\n render() {\r\n let path = this.props.match.path;\r\n return (\r\n \r\n \r\n

Games

\r\n {(this.state.gameManifest == undefined\r\n ? (Loading)\r\n : this.getGameListing()\r\n )}\r\n
\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withRouter(GameList);","import React from 'react';\r\nimport { NavLink, withRouter, Switch, Route, RouteComponentProps, Redirect, useHistory } from 'react-router-dom';\r\nimport { createLocation } from 'history';\r\nimport SourceBrowserFixup from '../SourceBrowserFixup';\r\nimport { ChildPaneRouteProps } from '../GameScriptView';\r\nimport '../SourceBrowser.scss';\r\nimport './SolutionExplorer.scss';\r\n\r\ninterface SolutionExplorerState {\r\n slnExpHtml: string;\r\n}\r\n\r\nexport class SolutionExplorer extends React.Component, SolutionExplorerState, any>\r\n{\r\n contentRoot = React.createRef();\r\n contentPath: string = \"overview.html\";\r\n contentReady = false;\r\n fixup: SourceBrowserFixup;\r\n done = false;\r\n selectedFile: HTMLAnchorElement | null = null;\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.fixup = new SourceBrowserFixup(this.props.history, this.props.location);\r\n this.state = { slnExpHtml: \"Loading\" };\r\n }\r\n\r\n shouldComponentUpdate(nextProps: RouteComponentProps, nextState: SolutionExplorerState) {\r\n return !this.done || this.props.match.params.contentPath !== nextProps.match.params.contentPath;\r\n }\r\n\r\n async componentDidUpdate() {\r\n if (!this.contentReady) return;\r\n\r\n var updatedContentPath = this.props.match.params.contentPath;\r\n\r\n if (updatedContentPath == null) {\r\n updatedContentPath = this.contentPath;\r\n }\r\n\r\n if (updatedContentPath.endsWith(\".html\") === false) {\r\n updatedContentPath += \".html\";\r\n }\r\n\r\n this.contentPath = updatedContentPath;\r\n\r\n if(!this.done) {\r\n this.loadSolutionExplorer();\r\n this.fixup = new SourceBrowserFixup(this.props.history, this.props.location);\r\n this.fixup.fixupLinks(this.contentRoot.current!, this.contentPath, this.props.match.path, this.props.match.url);\r\n this.done = true;\r\n }\r\n\r\n this.syncSolutionExplorer();\r\n }\r\n\r\n syncSolutionExplorer() {\r\n var parts = this.contentPath.split(\"/\");\r\n\r\n let currentElement :HTMLElement | null = this.contentRoot.current;\r\n\r\n for(var i = 0; i < parts.length; i++)\r\n {\r\n if(currentElement === null)\r\n return;\r\n\r\n let folder :HTMLElement | null = currentElement.querySelector(`div[data-assembly=\"${parts[i]}\"]`);\r\n\r\n if(folder !== null) {\r\n if(folder.style.display === \"none\") {\r\n folder.previousSibling?.dispatchEvent(new Event(\"click\"));\r\n }\r\n currentElement = folder;\r\n } else {\r\n let anchors = currentElement.querySelectorAll(\"a\");\r\n var anchor = Array.from(anchors).find(a => a.getAttribute(\"href\")?.endsWith(parts[i]));\r\n\r\n if(anchor != null) {\r\n this.selectFile(anchor);\r\n }\r\n }\r\n }\r\n }\r\n\r\n selectFile(a: HTMLAnchorElement) {\r\n if (this.selectedFile === a) {\r\n return;\r\n }\r\n\r\n if (this.selectedFile && this.selectedFile.classList) {\r\n this.selectedFile.classList.remove(\"selectedFilename\");\r\n }\r\n\r\n this.selectedFile = a;\r\n if (a) {\r\n if (a.classList) {\r\n a.classList.add(\"selectedFilename\");\r\n }\r\n\r\n var bounds = a.getBoundingClientRect();\r\n let isVisible = bounds.top < window.innerHeight && bounds.bottom >= 0\r\n \r\n if(!isVisible) {\r\n a.scrollIntoView({behavior: \"smooth\", inline: \"nearest\"});\r\n }\r\n }\r\n}\r\n\r\n async componentDidMount() {\r\n let slnExpHtml = await (await fetch(\"/game-scripts/index/SolutionExplorer.html\")).text();\r\n\r\n this.contentReady = true;\r\n this.setState({ slnExpHtml: slnExpHtml });\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n );\r\n }\r\n\r\n\r\n loadSolutionExplorer() {\r\n this.makeFoldersCollapsible(/* closed folder */\"202.png\", \"201.png\", \"/game-scripts/wwwroot/content/icons/\", this.initializeSolutionExplorerFolder.bind(this));\r\n }\r\n\r\n initializeSolutionExplorerFolder(folder: any) {\r\n for (var i = 0; i < folder.children.length; i++) {\r\n var child = folder.children[i];\r\n if (this.isLink(child)) {\r\n this.rewriteSolutionExplorerLink(child);\r\n }\r\n }\r\n }\r\n\r\n rewriteSolutionExplorerLink(link: any) {\r\n var url = link.href;\r\n var fileName = this.trimFromEnd(url, \".html\");\r\n var extension = this.getExtension(fileName);\r\n var pathname = link.pathname;\r\n\r\n var setClassName = null;\r\n if (this.isSupportedExtension(extension) && !link.className) {\r\n setClassName = extension;\r\n } else {\r\n //this.rewriteExternalLink(link);\r\n }\r\n\r\n if (setClassName) {\r\n link.className = setClassName;\r\n link.textContent = this.getFileName(url);\r\n }\r\n }\r\n\r\n getFileName(url: any) {\r\n var lastSlash = url.lastIndexOf('/');\r\n if (lastSlash != -1) {\r\n url = url.slice(lastSlash + 1);\r\n }\r\n\r\n url = url.slice(0, url.length - 5);\r\n url = unescape(url);\r\n return url;\r\n }\r\n\r\n makeFoldersCollapsible(folderIcon: any, openFolderIcon: any, pathToIcons: any, initializeHandler: any) {\r\n var elements = this.contentRoot.current?.querySelectorAll(\".folder\");\r\n\r\n if (elements == null) return;\r\n\r\n var length = elements.length;\r\n for (var i = 0; i < length; i++) {\r\n var folder = elements[i] as any;\r\n folder.style.display = 'none';\r\n folder.initialize = initializeHandler;\r\n if (folder.parentNode.id === 'rootFolder'\r\n || folder.parentNode.previousSibling.id === 'rootFolder'\r\n || folder.parentNode.className === 'namespaceExplorerBody') {\r\n this.addImagesToFolder(folder, folderIcon, openFolderIcon, pathToIcons);\r\n }\r\n }\r\n }\r\n\r\n addImagesToFolder(folder: any, folderIcon: any, openFolderIcon: any, pathToIcons: any) {\r\n var div = folder.previousSibling;\r\n var firstChild = div.firstChild;\r\n\r\n var imagePlusMinus = document.createElement(\"img\");\r\n imagePlusMinus.src = pathToIcons + \"plus.png\";\r\n imagePlusMinus.className = \"imagePlusMinus\";\r\n\r\n var imageFolder = document.createElement(\"img\");\r\n imageFolder.src = pathToIcons + folderIcon;\r\n imageFolder.className = \"imageFolder\";\r\n this.setFolderImage(imageFolder, div, firstChild, pathToIcons, folderIcon);\r\n\r\n var handler = this.expandCollapseFolder(folder, imagePlusMinus, imageFolder, div, firstChild, pathToIcons, folderIcon, openFolderIcon);\r\n\r\n var skipImage = this.isLink(firstChild);\r\n if (skipImage) {\r\n div.insertBefore(imagePlusMinus, firstChild);\r\n imagePlusMinus.onclick = handler;\r\n } else {\r\n div.insertBefore(imageFolder, firstChild);\r\n div.insertBefore(imagePlusMinus, imageFolder);\r\n div.onclick = handler;\r\n }\r\n }\r\n\r\n isLink(element: any) {\r\n return element && element.tagName && element.tagName == \"A\";\r\n }\r\n\r\n expandCollapseFolder(capturedFolder: any, capturedPlusMinus: any, capturedFolderImage: any, capturedDiv: any, capturedFirstChild: any, pathToIcons: any, folderIcon: any, openFolderIcon: any) {\r\n return () => {\r\n if (capturedFolder.style.display == 'none') {\r\n capturedPlusMinus.src = pathToIcons + \"minus.png\";\r\n if (capturedDiv.className != \"projectCSInSolution\" && capturedDiv.className != \"projectVBInSolution\") {\r\n capturedFolderImage.src = pathToIcons + openFolderIcon;\r\n }\r\n\r\n if (capturedFolder.initialize) {\r\n capturedFolder.initialize(capturedFolder);\r\n capturedFolder.initialize = null;\r\n }\r\n\r\n if (!capturedFolder.everExpanded) {\r\n for (var i = 0; i < capturedFolder.children.length; i++) {\r\n if (capturedFolder.children[i].className === 'folder') {\r\n this.addImagesToFolder(capturedFolder.children[i], folderIcon, openFolderIcon, pathToIcons);\r\n }\r\n }\r\n }\r\n\r\n capturedFolder.everExpanded = true;\r\n capturedFolder.style.display = 'block';\r\n }\r\n else {\r\n capturedPlusMinus.src = pathToIcons + \"plus.png\";\r\n this.setFolderImage(capturedFolderImage, capturedDiv, capturedFirstChild, pathToIcons, folderIcon);\r\n capturedFolder.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n setFolderImage(folder: any, div: any, firstChild: any, pathToIcons: any, folderIcon: any) {\r\n var text = firstChild.textContent;\r\n if (text === 'References' || text === \"Used By\") {\r\n folder.src = pathToIcons + \"192.png\";\r\n } else if (text === 'Properties') {\r\n folder.src = pathToIcons + \"102.png\";\r\n } else if (div.className == \"projectCSInSolution\") {\r\n folder.src = pathToIcons + \"196.png\";\r\n } else if (div.className == \"projectVBInSolution\") {\r\n folder.src = pathToIcons + \"195.png\";\r\n }\r\n else {\r\n folder.src = pathToIcons + folderIcon;\r\n }\r\n }\r\n\r\n trimFromEnd(text: string, suffixToTrim: string) {\r\n if (!text || !suffixToTrim) {\r\n return text;\r\n }\r\n\r\n if (this.endsWithIgnoreCase(text, suffixToTrim)) {\r\n text = text.slice(0, text.length - suffixToTrim.length);\r\n }\r\n\r\n return text;\r\n }\r\n\r\n getExtension(filePath: string) {\r\n if (!filePath) {\r\n return \"\";\r\n }\r\n\r\n var dot = filePath.lastIndexOf(\".\");\r\n if (dot == filePath.length - 1) {\r\n return \"\";\r\n }\r\n\r\n return filePath.slice(dot + 1).toLowerCase();\r\n }\r\n\r\n endsWith(text: string, suffix: string) {\r\n if (!text || !suffix) {\r\n return false;\r\n }\r\n\r\n if (suffix.length > text.length) {\r\n return false;\r\n }\r\n\r\n var slice = text.slice(text.length - suffix.length, text.length);\r\n return slice == suffix;\r\n }\r\n\r\n isSupportedExtension(extension: string) {\r\n return this.supportedFileExtensions.indexOf(extension) != -1;\r\n }\r\n\r\n endsWithIgnoreCase(text: string, suffix: string) {\r\n if (!text || !suffix) {\r\n return false;\r\n }\r\n\r\n if (suffix.length > text.length) {\r\n return false;\r\n }\r\n\r\n var slice = text.slice(text.length - suffix.length, text.length);\r\n return slice && (slice.toLowerCase() == suffix.toLowerCase());\r\n }\r\n\r\n supportedFileExtensions = [\r\n \"cs\",\r\n \"vb\",\r\n \"ts\",\r\n \"csproj\",\r\n \"vbproj\",\r\n \"targets\",\r\n \"props\",\r\n \"xaml\",\r\n \"xml\",\r\n \"resx\"\r\n ];\r\n}\r\nexport default withRouter(SolutionExplorer);","import React from 'react';\r\nimport './GameScriptView.scss';\r\nimport SolutionExplorer from './SolutionExplorer/SolutionExplorer'\r\nimport SourceViz from './SourceViz/SourceViz'\r\nimport { withRouter, RouteComponentProps } from 'react-router-dom';\r\n\r\nexport interface ChildPaneRouteProps {\r\n contentPath: string;\r\n}\r\n\r\nexport class GameScriptView extends React.Component, any, any>\r\n{\r\n constructor(props: any) {\r\n super(props);\r\n\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withRouter(GameScriptView);","import React from \"react\";\r\nimport './UserAvatar.scss';\r\n\r\nexport interface UserAvatarProperties {\r\n alias: string,\r\n github: string,\r\n}\r\n\r\nexport default class UserAvatar extends React.Component\r\n{\r\n static imageDimension = 75;\r\n\r\n getImageSource() {\r\n if(this.props.github?.length > 0)\r\n {\r\n return `${this.props.github}.png?size=${UserAvatar.imageDimension}`;\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n \r\n {`Image\r\n \r\n \r\n );\r\n }\r\n}","import React from \"react\";\r\nimport { Link } from \"react-router-dom\";\r\nimport UserAvatar from \"../../Core/UserAvatar\";\r\nimport { ToolsManifestEntry } from '../ToolData';\r\nimport './ToolEntry.scss';\r\n\r\nexport default class ToolWidget extends React.Component\r\n{\r\n render() {\r\n return (\r\n
\r\n
\r\n {\"{ }\"}\r\n \r\n \r\n

{this.props.name}

\r\n
\r\n

{this.props.description}

\r\n
\r\n
\r\n {this.props.contributors.map(c => ())}\r\n
\r\n
\r\n );\r\n }\r\n}","import React from 'react';\r\nimport { Switch, Route } from 'react-router-dom';\r\nimport GameScriptView from './GameScriptView/GameScriptView';\r\nimport { ManifestProps, withManifest } from '../Core/withManifest';\r\nimport ToolEntry from './ToolEntry/ToolEntry';\r\nimport { ToolsManifest } from './ToolData';\r\nimport './Tools.scss';\r\n\r\nexport class Tools extends React.Component, any, any> {\r\n getToolsListing() {\r\n return (
\r\n

\r\n Tools\r\n

\r\n
\r\n {this.props.manifest?.tools.map(t => {\r\n return ()\r\n })}\r\n
\r\n
);\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n \r\n {this.getToolsListing()}\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n\r\nexport default withManifest(Tools, \"/data/tools/tools.json\");\r\n","import React from \"react\";\r\n\r\nexport type ManifestProps = ManifestHolder & Props;\r\n\r\nexport interface ManifestHolder {\r\n manifest?: TManifest;\r\n}\r\n\r\nexport const withManifest =

(Component: React.ComponentType

, manifestPath: string) =>\r\n class WithManifest extends React.Component> {\r\n static manifests : {[typeName: string]: ManifestProps

} = {};\r\n\r\n constructor(props: P) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n async componentDidMount() {\r\n if(WithManifest.manifests[typeof(this)] === undefined)\r\n {\r\n const resp = await fetch(manifestPath);\r\n WithManifest.manifests[typeof(this)] = (await resp.json()) as ManifestProps

;\r\n this.setState({\"manifest\": WithManifest.manifests[typeof(this)]});\r\n }\r\n else\r\n {\r\n this.setState({\"manifest\": WithManifest.manifests[typeof(this)]});\r\n }\r\n }\r\n\r\n render() {\r\n const {...props} = this.props;\r\n return this.state.manifest == undefined\r\n ? (Loading)\r\n : ();\r\n }\r\n };\r\n","import React from 'react';\r\nimport { Switch, Route } from 'react-router-dom';\r\nimport Home from './Home/Home';\r\nimport Articles from './Articles/Articles';\r\nimport MapList from './GameList/MapList/MapList';\r\nimport GameList from './GameList/GameList';\r\nimport Tools from './Tools/Tools';\r\n\r\nfunction App() {\r\n return (\r\n

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nexport default App;\r\n","import { ReportHandler } from 'web-vitals';\r\n\r\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry); \r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n}\r\n\r\nexport default reportWebVitals;\r\n","import React from 'react';\r\nimport { NavLink } from 'react-router-dom';\r\nimport './AppHeader.scss';\r\n\r\nexport default class AppHeader extends React.Component {\r\n render() {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n

OpenBlam

\r\n

The home of technical Halo info

\r\n
\r\n
\r\n \r\n
\r\n \r\n )\r\n }\r\n}","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport App from './App';\r\nimport reportWebVitals from './reportWebVitals';\r\nimport AppHeader from './AppHeader/AppHeader';\r\nimport { BrowserRouter as Router } from 'react-router-dom';\r\nimport './awsm.scss';\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n"],"sourceRoot":""}