{"id":17241959,"url":"https://github.com/mtkennerly/gfmake","last_synced_at":"2025-03-26T03:21:24.988Z","repository":{"id":66215207,"uuid":"111829511","full_name":"mtkennerly/gfmake","owner":"mtkennerly","description":"Convert game scripts to GameFAQs Markup.","archived":false,"fork":false,"pushed_at":"2019-05-14T11:46:56.000Z","size":45,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-21T00:20:12.197Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mtkennerly.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-11-23T16:15:01.000Z","updated_at":"2019-05-14T11:46:57.000Z","dependencies_parsed_at":null,"dependency_job_id":"3f236e3a-6a25-410f-853d-875cbfd2594b","html_url":"https://github.com/mtkennerly/gfmake","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mtkennerly%2Fgfmake","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mtkennerly%2Fgfmake/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mtkennerly%2Fgfmake/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mtkennerly%2Fgfmake/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mtkennerly","download_url":"https://codeload.github.com/mtkennerly/gfmake/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245580379,"owners_count":20638790,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-15T06:11:51.790Z","updated_at":"2025-03-26T03:21:24.966Z","avatar_url":"https://github.com/mtkennerly.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gfmake\n\ngfmake is a tool written in Haskell to convert the game scripts that I\ntranscribed from their original format into GameFAQS Markup.\n\n## Usage\n\nFrom the console:\n\n```\nstack build\nstack exec -- gfmake --help\nstack exec -- gfmake sample1.gfm.txt\n\nstack install\ngfmake --help\n```\n\nFrom code:\n\n```haskell\nmodule Main where\n\nimport GFMake (convertScript)\n\nmain :: IO ()\nmain = readFile \"sample1.gfm.txt\" \u003e\u003e= (return . convertScript) \u003e\u003e= putStrLn\n```\n\n## Versioning\n\nThis project uses Semantic Versioning, *not* PVP. The public API comprises the\ncommand line interface and all exports from non-`Internal` modules under src.\nExporting new names is not considered a breaking change, so use unqualified\nimports at your discretion.\n\n## Sample\n\nThis is the output for sample1.gfm.txt:\n\n```\n;format:gf-markup\n\n; This is a freeform comment without any special characters.\n\n==Header 2==\n===Header 3===\n===Header 3: Multiple Lines===\n===++Header 3b++===\n====Header 4====\n=====Header 5=====\nThis is original narration for events. If it is long enough, then it is indented after the hyphen. There may also be multiple paragraphs of narration.\n\n| Speaker | This is text or speech directly from the game. The speaker ID is always padded with spaces to at least 10 characters. This may also have multiple lines. |\n| Long Name Here | If the speaker ID is longer than 10 characters, then the indentation is simply shifted over. |\n| Narrated | * - Narration can occur inside of a speaker block. Speech occurs at normal indentation. * - Narration is indented an extra 2 spaces. |\n\n====Header 4 Annotated | (an annotation will be present) / (in some rare cases) / (middle line is default, but all three are possible)====\n|-3 Condition | A | This is said under condition A. |\n|   B | This is said under condition B. * - It may include narration as well. |\n|   *C | Idiosyncratic marker. |\n|-f Long | 1 | GameFAQs |\n|   2 | Markup |\n|   3 | only |\n|   4 | supports |\n|   5 | rowspan |\n|   6 | up |\n|   7 | to |\n|   8 | 15 |\n|   9 | so |\n|   10 | anything |\n|   11 | more |\n|   12 | must |\n|   13 | be |\n|   14 | in |\n|   15 | separate |\n|-1 [cont] | 16 | tables. |\n\n=--Option 1--=\n| Speaker | This is the response to choosing one option. |\n=--Option 1.1--=\n| Speaker | This option is available if you choose Option 1. |\n=--Six--=\n| Speaker | The hyphens continue increasing... |\n=--Seven--=\n| Speaker | ...until they wrap around to an equal sign. |\n=--Twelve--=\n| Speaker | The maximum depth is 12 nested options. |\n=-=\n=-=\n=-=\n=-=\n=-=\n\n=--Option 2--=\n| Speaker | This is the alternative to Option 1. |\n=-=\n```\n\n## To-do\n\n* The plus-formatting for h3b headers doesn't have any significance in GameFAQs\n  Markup and is just to highlight them for manual cleanup, since there aren't\n  enough header levels for them to work very well. It would be better to\n  perform that cleanup automatically.\n\n* Narration and options nested inside of a speech block should be formatted\n  specially, whereas now they end up all on one line in a jumble.\n\nFor nesting inside non-conditional speech, elements could simply be\ninterspersed around the speech:\n\n```\n# Current:\n| Narrated | * - Narration can occur inside of a speaker block. Speech occurs at normal indentation. * - Narration is indented an extra 2 spaces. |\n\n# Future:\nNarration can occur inside of a speaker block.\n| Narrated | Speech occurs at normal indentation. |\nNarration is indented an extra 2 spaces.\n```\n\nFor conditional speech, there would need to be some way to still associate\nthe nested element with its corresponding condition. Since GameFAQs Markup\ndoes not support multiple lines within a cell, this may require representing\nthe narration within the same cell as speech:\n\n```\n# Current:\n|-3 Condition | A | This is said under condition A. |\n  | B | This is said under condition B. * - It may include narration as well. |\n  | *C | Idiosyncratic marker. |\n\n# Future?\n|-3 Condition | A | This is said under condition A. |\n  | B | This is said under condition B. {'''It may include narration as well.'''} |\n  | *C | Idiosyncratic marker. |\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmtkennerly%2Fgfmake","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmtkennerly%2Fgfmake","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmtkennerly%2Fgfmake/lists"}