diff --git a/docs/script.js b/docs/script.js index 64f5826..47353a5 100644 --- a/docs/script.js +++ b/docs/script.js @@ -1,25 +1,19 @@ +const loadedColumns = []; +const defaultShowLangs = ['Rust 1.55', 'Haskell']; +let conceptsData = []; +let progLangList = []; -// Create an array to track visibility states of column -var loadedColumns = []; -var defaultShowLangs = ['Rust 1.55', 'Haskell']; - -// Use the DataTables library to create a table with search and filter functionality -$(document).ready(function () { - - +$(document).ready(() => { marked.setOptions({ - highlight: function (code, lang) { + highlight: (code, lang) => { if (lang && hljs.getLanguage(lang)) { return hljs.highlight(code, { language: lang }).value; - } else { - return hljs.highlightAuto(code).value; } + + return hljs.highlightAuto(code).value; } }); - let conceptsData = {} - let progLangList = [] - const progLangConceptsUrl = 'prog_lang_concepts.yaml'; const progLangListUrl = 'prog_langs.yaml'; @@ -34,171 +28,123 @@ $(document).ready(function () { addLangToggle(progLangList); addTocHtml(conceptsData); }) - .then(results => { - for (let i in defaultShowLangs) { - loadLangConceptsInColumn('#langTable', defaultShowLangs[i], conceptsData); + .then(() => { + for (const lang of defaultShowLangs) { + loadLangConceptsInColumn('#langTable', lang); } }); }); -/** - * fetches the concepts data from the yaml file and returns a dictionary - * @param {*} yamlUrl - * @return {dictionary} dictionary of concept, subconcept and prompt - */ async function getProgLangConcepts(yamlUrl) { - // Fetch the YAML data from the URL const response = await fetch(yamlUrl); - // Check if the request was successful if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } - // Get the response body as text const yamlText = await response.text(); - - // Parse the YAML data const yamlData = jsyaml.safeLoad(yamlText); - let conceptsData = [] - - for (let concept in yamlData) { - if (yamlData.hasOwnProperty(concept)) { - let subObj = yamlData[concept]; - for (let subConcept in subObj) { - if (subObj.hasOwnProperty(subConcept)) { - // rowHeader.push(`${key} - ${subKey}`); - conceptsData.push({ - 'concept': `${concept}`, - 'subconcept': `${subConcept}`, - 'filename': `datatypes_primitives.md`, + const conceptsDataResult = []; + + for (const concept in yamlData) { + if (Object.prototype.hasOwnProperty.call(yamlData, concept)) { + const subObj = yamlData[concept]; + for (const subConcept in subObj) { + if (Object.prototype.hasOwnProperty.call(subObj, subConcept)) { + conceptsDataResult.push({ + concept: `${concept}`, + subconcept: `${subConcept}`, + filename: 'datatypes_primitives.md' }); } } } } - return conceptsData; + return conceptsDataResult; } - - - async function getProgLangs(yamlUrl) { - // Fetch the YAML data from the URL const response = await fetch(yamlUrl); - // Check if the request was successful if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } - // Get the response body as text const yamlText = await response.text(); - - // Parse the YAML data const yamlData = jsyaml.safeLoad(yamlText); - let progLangList = [] - progLangList = yamlData['Programming Languages'] - - return progLangList; + const progLangListResult = yamlData['Programming Languages']; + return progLangListResult; } -async function showEmptyTable(tableId, conceptsData, prog_lang_list) { - - //Create one column for each programming language - let columns = [] - let map = { - '\.': '_', - }; +async function showEmptyTable(tableId, conceptsDataParam, prog_lang_list) { + const columns = []; - - - // Creating Concerpts, concept, subconept column definitions - // Concepts is the visible column. - // concept and subconcept are hidden columns used to create filenames later columns.push({ title: 'Concepts', name: 'Concepts', data: 'Concepts', width: '20ch', - "createdCell": function (td, cellData, rowData, row, col) { + createdCell: (td) => { $(td).css('font-weight', 'bold'); } - }, //copilot suggested this !!! - { title: 'concept', name: 'concept', data: 'concept', visible: false }, // hidden column - { title: 'subconcept', name: 'subconcept', data: 'subconcept', visible: false }, //hidden column - ); - + }, + { title: 'concept', name: 'concept', data: 'concept', visible: false }, + { title: 'subconcept', name: 'subconcept', data: 'subconcept', visible: false }); - - // Creating column definitions for each language - for (let langTitle of prog_lang_list) { - // Add a new key-value pair to each dictionary - let safeLangName = getSafeName(langTitle) // if data key contains a dot, it will not work + for (const langTitle of prog_lang_list) { + const safeLangName = getSafeName(langTitle); let visibility = false; - // default columns to show + if (defaultShowLangs.includes(langTitle)) { visibility = true; } + columns.push({ title: `${langTitle}`, name: `${safeLangName}`, data: `${safeLangName}`, width: '50ch', visible: visibility }); } - - // Populating the diciotnary with the data - //Creating a three column row temporarily - let rows = conceptsData.map(item => ({ - 'Concepts': `${item.concept} - ${item.subconcept}`, - 'concept': `${item.concept}`, - 'subconcept': `${item.subconcept}` + const rows = conceptsDataParam.map(item => ({ + Concepts: `${item.concept} - ${item.subconcept}`, + concept: `${item.concept}`, + subconcept: `${item.subconcept}` })); - // extend the row one cell at a time for each language. - // adding a placeholder text for correspoding to a language in the cell - for (let i = 0; i < rows.length; i++) { - for (let lang of prog_lang_list) { - // Add a new key-value pair to each dictionary - rows[i][getSafeName(lang)] = `Loading for ${getSafeName(lang)} ...`; //Show place holder text + for (const row of rows) { + for (const lang of prog_lang_list) { + row[getSafeName(lang)] = `Loading for ${getSafeName(lang)} ...`; } } - // console.log(rows); - $(tableId).DataTable({ data: rows, - columns: columns, + columns, paging: false, autoWidth: false, - - order: [] //disable sorting. Maintain the cocept order in prog_lang_concepts.yaml file + order: [] }); - - } - async function loadLangConceptsInColumnMd(tableId, progLang) { + const mytable = $(tableId).DataTable(); + const columnIndex = mytable.column(`${progLang}:name`).index(); - //get column for a language - let mytable = $(tableId).DataTable(); - let columnIndex = mytable.column(progLang + ':name').index(); + if (columnIndex === undefined) { + return; + } mytable.rows().every(function () { - // Get the data for this row - var data = this.data(); + const data = this.data(); - // Update the value of the cell in the target column - let concept = data['concept']; - let subconcept = data['subconcept']; - let safename = getSafeName(progLang) - filepath = 'content-autogen/gpt_3_5_turbo/' + getSafeName(progLang) + '/'; - fileurl = filepath + getSafeName(concept) + '_' + getSafeName(subconcept) + '.md'; - // data[safename] = 'New Value'; // Replace 'New Value' with the new value you want to set + const concept = data['concept']; + const subconcept = data['subconcept']; + const safename = getSafeName(progLang); + const filepath = 'content-autogen/gpt_3_5_turbo/' + getSafeName(progLang) + '/'; + const fileurl = filepath + getSafeName(concept) + '_' + getSafeName(subconcept) + '.md'; fetch(fileurl) .then(response => response.text()) .then(filecontent => { - data[getSafeName(progLang)] = marked(filecontent); + data[safename] = marked(filecontent); this.invalidate().draw(); }) .catch((error) => { @@ -207,33 +153,31 @@ async function loadLangConceptsInColumnMd(tableId, progLang) { }); loadedColumns.push(progLang); - } async function loadLangConceptsInColumn(tableId, progLang) { + const mytable = $(tableId).DataTable(); + const columnIndex = mytable.column(`${progLang}:name`).index(); - //get column for a language - let mytable = $(tableId).DataTable(); - let columnIndex = mytable.column(progLang + ':name').index(); + if (columnIndex === undefined) { + return; + } - let fileurl = 'content-autogen/gpt_3_5_turbo/' + getSafeName(progLang) + '.json'; + const fileurl = 'content-autogen/gpt_3_5_turbo/' + getSafeName(progLang) + '.json'; let mergedContent = {}; fetch(fileurl) .then(response => response.text()) .then(filecontent => { mergedContent = JSON.parse(filecontent); mytable.rows().every(function () { - // Get the data for this row - var data = this.data(); - - let concept = data['concept']; - let subconcept = data['subconcept']; - // Update the value of the cell in the target column - let safeProglang = getSafeName(progLang) - let key = getSafeName(concept) + '_' + getSafeName(subconcept); + const data = this.data(); + + const concept = data['concept']; + const subconcept = data['subconcept']; + const safeProglang = getSafeName(progLang); + const key = getSafeName(concept) + '_' + getSafeName(subconcept); data[safeProglang] = marked(mergedContent[key]); this.invalidate().draw(); - }); loadedColumns.push(progLang); @@ -241,144 +185,99 @@ async function loadLangConceptsInColumn(tableId, progLang) { .catch((error) => { console.error('Error:', error); }); - - - } function getSafeName(value) { - - // const regex = /[&\/\\#, +()$~%.'":*?<>{}]/g; const regex = /[&\/\\, +()$~%.'":*?<>{}-]/g; - // const regex = /\.|\ |-|\?|\(|\)|\/|\\|/g; - let newvalue = value.replace(regex, "_"); + const newvalue = value.replace(regex, '_'); return newvalue; - // let regex = new RegExp(Object.keys(map).join('|'), 'g'); - // return str.replace(regex, function(matched) { - // return map[matched]; - // }); } function addLangToggle(prog_lang_list) { + for (const lang of prog_lang_list.sort()) { + const columnTitle = lang; + const columnName = getSafeName(lang); - // Creating toggle for each language - for (let lang of prog_lang_list.sort()) { - let columnTitle = lang; - let columnName = getSafeName(lang); + const a = document.createElement('a'); + a.setAttribute('class', 'toggle-vis'); + a.setAttribute('columnname', columnName); - // Create a new anchor element - let a = document.createElement('a'); - - // Set the attributes - a.setAttribute("class", "toggle-vis"); - a.setAttribute("columnname", columnName) - - // Set the text of the anchor element a.textContent = columnTitle + ' , '; if (defaultShowLangs.includes(columnTitle)) { - a.style.color = "blue"; + a.style.color = 'blue'; } else { - a.style.color = "grey"; + a.style.color = 'grey'; } - a.onclick = function (e) { e.preventDefault(); - let mytable = $('#langTable').DataTable(); // Get the column API object - let column = mytable.column($(this).attr('columnname') + ':name'); + const mytable = $('#langTable').DataTable(); + const column = mytable.column($(this).getAttribute('columnname') + ':name'); - // Toggle the visibility column.visible(!column.visible()); - this.style.color = this.style.color == "grey" ? "blue" : "grey"; + this.style.color = this.style.color === 'grey' ? 'blue' : 'grey'; - - // if making visible fo rthe first time then fetch data for subconcepts and replace the placeholder text - if (column.visible() == true && loadedColumns.includes(columnTitle) == false) { + if (column.visible() === true && loadedColumns.includes(columnTitle) === false) { loadLangConceptsInColumn('#langTable', columnTitle); } - }; - // Select the div with the specific class - // var div = document.querySelector('.toggle-vis'); - var div = document.querySelector('#toggle'); - - // Append the anchor element to the div - div.appendChild(a); + const div = document.querySelector('#toggle'); + if (div) { + div.appendChild(a); + } } - } -function addTocHtml(conceptsData) { - let html = '