diff --git a/configLoader.ts b/configLoader.ts index ed51ddc..6c4b879 100644 --- a/configLoader.ts +++ b/configLoader.ts @@ -3,9 +3,9 @@ import { join } from "node:path"; import { configurationOptions } from "./lib/types"; export default function loadConfig(): configurationOptions { - const CONFIG_FILE_NAME = "richie.config.js"; + const CONFIG_FILE_NAME = "richie.config"; - const projectConfigFile = join(process.cwd(), CONFIG_FILE_NAME); + const projectConfigFile = join(process.cwd(), `${CONFIG_FILE_NAME}.js`); const projectHasConfig = existsSync(projectConfigFile); let projectConfig: configurationOptions = {} as configurationOptions; diff --git a/test/browser.test.ts b/test/browser.test.ts index 57f83af..f8a1e47 100644 --- a/test/browser.test.ts +++ b/test/browser.test.ts @@ -1,8 +1,10 @@ -import { mkdirSync, writeFileSync } from "node:fs"; +import { mkdirSync, rmSync, writeFileSync } from "node:fs"; import { dirname, join, relative, resolve } from "node:path"; import puppeteer, { type Browser } from "puppeteer"; import { richies } from "../lib/types"; +const outputBase = "test/outputs/browser-env"; + async function _RenderResult( browser: Browser, htmlPath: string, @@ -28,7 +30,7 @@ async function _RenderResult( // Define the output destination const outputDest = join( - "test/test-sample-outputs", // Base output folder + outputBase, // Base output folder relative("test/test-sample", htmlPath), // Relative path from the base source folder ); @@ -36,7 +38,7 @@ async function _RenderResult( mkdirSync(dirname(outputDest), { recursive: true }); writeFileSync(outputDest, content); - console.log(`HTML saved to ${outputDest}`); + /* console.log(`HTML saved to ${outputDest}`); */ } catch (err) { console.error("Error during rendering:", err); } @@ -105,6 +107,9 @@ const testParamMap: Partial< }; async function runAll() { + // Clean up and prepare output directory + rmSync(outputBase, { recursive: true, force: true }); + // Launch the browser once at the start const browser = await puppeteer.launch({ headless: true }); diff --git a/test/main.test.ts b/test/node.test.ts similarity index 56% rename from test/main.test.ts rename to test/node.test.ts index 5353533..f17e377 100644 --- a/test/main.test.ts +++ b/test/node.test.ts @@ -1,124 +1,101 @@ import { existsSync, mkdirSync, rmSync } from "node:fs"; - import { basename, join } from "path"; import { richies, testProps } from "../lib/types"; import { richie } from "../richie"; -const opfolder = "./test/outputs"; -let iterN = 0; - -function mkDestPath(testfile: string): string { - iterN += 1; +const opFolder = "./test/outputs/node-env"; +let iteration = 0; +// Generate a unique destination path for test output +function createDestinationPath(testFile: string): string { + iteration += 1; return join( process.cwd(), - opfolder, - `OP_Of_(${iterN}) ${basename(testfile)}`, + opFolder, + `Output_${iteration}_${basename(testFile)}`, ); } -function createTestProps(testfile: string): testProps { +// Create test properties object +function createTestProps(testFile: string): testProps { return { - testfile: testfile, - destFile: mkDestPath(testfile), + testfile: testFile, + destFile: createDestinationPath(testFile), }; } +// Define test cases const testRecords: Record<richies, testProps> = { article: createTestProps("test/test-sample/article.html"), - breadcrumb: createTestProps( "test/test-sample/breadcrumb/sub-breadcrumb/notindex.html", ), - crecipe: createTestProps("test/test-sample/carousels/recipies.html"), recipe: createTestProps("test/test-sample/carousels/recipies.html"), - movie: createTestProps("test/test-sample/carousels/movies.html"), cmovie: createTestProps("test/test-sample/carousels/movies.html"), - restaurant: createTestProps( "test/test-sample/carousels/restaurants.html", ), crestaurant: createTestProps( "test/test-sample/carousels/restaurants.html", ), - course: createTestProps("test/test-sample/carousels/courses.html"), ccourse: createTestProps("test/test-sample/carousels/courses.html"), - event: createTestProps("test/test-sample/events.html"), - faq: createTestProps("test/test-sample/faq.html"), - video: createTestProps("test/test-sample/videos.html"), - localbusiness: createTestProps("test/test-sample/localbusiness.html"), - organization: createTestProps("test/test-sample/org.html"), - product: createTestProps("test/test-sample/product.html"), productwv: createTestProps( "test/test-sample/productVarient/productCombined.html", ), - profile: createTestProps("test/test-sample/profilepage.html"), - searchbox: createTestProps( "test/test-sample/Sitesearch/searchpage.html", ), - software: createTestProps("test/test-sample/softwareapp.html"), }; -function run(richieName: richies): Promise<void> { - const testfile = testRecords[richieName].testfile; - const destinationFile = testRecords[richieName].destFile; - - return richie([richieName], testfile, destinationFile); +// Execute a single test case +async function executeTest(richieName: richies): Promise<void> { + const { testfile, destFile } = testRecords[richieName]; + await richie([richieName], testfile, destFile); } -function runAll(): Promise<string> { - //delete old artifacts - try { - rmSync(opfolder, { recursive: true }); - } catch { - //nothing to do - } finally { - //make op dir - mkdirSync(opfolder, { recursive: true }); - } - - const testOps: Promise<void>[] = []; - - for (const richieName of Object.keys(testRecords)) { - testOps.push(run(richieName as richies)); - } +// Execute all test cases +async function executeAllTests(): Promise<string> { + // Clean up and prepare output directory + rmSync(opFolder, { recursive: true, force: true }); + mkdirSync(opFolder, { recursive: true }); + + // Run all tests in parallel + await Promise.all( + Object.keys(testRecords).map((richieName) => + executeTest(richieName as richies), + ), + ); - return new Promise((resolve, reject) => { - Promise.all(testOps) - .then(() => { - resolve("passed"); - }) - .catch((err) => { - reject(err); - }); - }); + return "passed"; } -function outputCheck(): string { - for (const richieName of Object.keys(testRecords)) { - if (!existsSync(testRecords[richieName as richies].destFile)) { - return "failed"; - } - } - return "passed"; +// Verify output files +function verifyOutputs(): string { + return ( + Object.values(testRecords).every(({ destFile }) => + existsSync(destFile), + ) + ) ? + "passed" + : "failed"; } -test("InAction test", async () => { - expect(await runAll()).toBe("passed"); +// Test cases +test("Execute all tests", async () => { + expect(await executeAllTests()).toBe("passed"); }); -test("Output files Check", () => { - expect(outputCheck()).toBe("passed"); +test("Verify output files", () => { + expect(verifyOutputs()).toBe("passed"); }); diff --git a/test/outputs/browser-env/Sitesearch/searchpage.html b/test/outputs/browser-env/Sitesearch/searchpage.html new file mode 100644 index 0000000..2fc29ae --- /dev/null +++ b/test/outputs/browser-env/Sitesearch/searchpage.html @@ -0,0 +1,27 @@ +<!DOCTYPE html><html lang="en"><head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Search Form</title> + + <script src="./client.js" type="text/javascript" defer=""></script> + <script src="../bundle.min.js"> + </script> + <script> + document.addEventListener('DOMContentLoaded', function () { + RichieJS.default({ richieNames: ['searchbox'] }) + }); + </script> + +<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","url":"https://www.cresteem.com/","potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/Sitesearch/searchpage?q={searchTerm}"},"query-input":"required name=searchTerm"}}</script></head> + +<body> + <h1>Search Form</h1> + <form onsubmit="return search()"> + <label for="searchInput">Search:</label> + <input type="text" id="searchTerm" name="searchTerm"> + <button type="submit">Search</button> + </form> + <div id="result"></div> + + +</body></html> \ No newline at end of file diff --git a/test/outputs/browser-env/article.html b/test/outputs/browser-env/article.html new file mode 100644 index 0000000..250cce8 --- /dev/null +++ b/test/outputs/browser-env/article.html @@ -0,0 +1,52 @@ +<!DOCTYPE html><html lang="en"><head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Article Test Page</title> + <link rel="shortcut icon" href="favicon.ico" type="image/x-icon"> + + <script src="./bundle.min.js"> + </script> + <script> + document.addEventListener('DOMContentLoaded', function() { + RichieJS.default({richieNames:['article']}) + }); + </script> + +<script type="application/ld+json">{"@context":"https://schema.org","@type":"NewsArticle","headline":"Article Test Page","image":["https://i.imgur.com/X3E4UxT.jpeg","https://i.imgur.com/pJSzybj.jpeg"],"datePublished":"2024-02-06T20:37:00+05:30","dateModified":"2024-06-26T17:23:00+05:30","author":[{"@type":"Person","honorificPrefix":"Dr","name":"Phil","url":"https://www.instagram.com/iamspdarsan/","jobTitle":"Software Engineer"},{"@type":"Organization","name":"Winchester","url":"https://www.linkedin.com/in/iamspdarsan/"}],"publisher":[{"name":"Cresteem","url":"https://cresteem.com/blogs/"},{"name":"Google","url":"https://google.com/blogs/"}]}</script></head> + + +<body data-articletype="NewsArticle"><!-- article type - Article, NewsArticle, BlogPosting--> + <!-- published date --> + <p class="rjs-article-pdt">2024-02-06 08:37 PM</p> + <!-- modified date --> + <p class="rjs-article-mdt">2024-06-26 05:23 PM</p> + + <main> + <!-- thumbnail images or cover images --> + <img class="rjs-article-img" src="https://i.imgur.com/X3E4UxT.jpeg" alt=""> + <img class="rjs-article-img" src="https://i.imgur.com/pJSzybj.jpeg" alt=""> + + <!-- authorname --> + <!-- anameP is Person type --> + <!-- anameO is Organisation type --> + <!-- HonorPrefix supported e.g.: Mr, Mrs, Miss, Ms, Mx, Sir, Dame, Dr, Cllr, Lady, or Lord, or other titles or positions--> + <p class="rjs-article-anameP-1">Dr.Phil</p> + + <!-- author profile url --> + <a class="rjs-article-aurl-1" href="https://www.instagram.com/iamspdarsan/">User Profile</a> + + <!-- author job title - this is optional--> + <p class="rjs-article-ajob-1">Software Engineer</p> + + <p class="rjs-article-anameO-2">Winchester</p> + <a class="rjs-article-aurl-2" href="https://www.linkedin.com/in/iamspdarsan/">User Profile</a> + + <p class="rjs-article-pname-1">Cresteem</p> + <a class="rjs-article-purl-1" href="https://cresteem.com/blogs/"></a> + + <p class="rjs-article-pname-2">Google</p> + <a class="rjs-article-purl-2" href="https://google.com/blogs/"></a> + </main> + + +</body></html> \ No newline at end of file diff --git a/test/outputs/browser-env/carousels/courses.html b/test/outputs/browser-env/carousels/courses.html new file mode 100644 index 0000000..0f1d410 --- /dev/null +++ b/test/outputs/browser-env/carousels/courses.html @@ -0,0 +1,135 @@ +<!DOCTYPE html><html lang="en"><head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Courses</title> + <script src="../bundle.min.js"> + </script> + <script> + document.addEventListener('DOMContentLoaded', function () { + RichieJS.default({ richieNames: ['ccourse', 'course'] }) + }); + </script> +<script type="application/ld+json">{"@context":"https://schema.org","@type":"ItemList","itemListElement":[{"@type":"ListItem","position":"1","item":{"@type":"Course","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/courses#rjs-course-1","name":"Python Crash Course","description":"This course serves as an introduction to Python programming, covering essential concepts and skills necessary for beginners to start coding in Python. Participants will learn about basic syntax, data types, control flow structures, functions, and file handling. Additionally, the course will cover key Python libraries and modules for common tasks such as data manipulation, visualization, and working with external files. Throughout the course, hands-on exercises and projects will reinforce learning objectives, allowing participants to apply their newfound knowledge to real-world scenarios.","provider":{"@type":"Organization","name":"LMS","sameAs":"https://lms.com/"},"offers":{"@type":"Offer","category":"Fees","price":100,"priceCurrency":"USD"},"hasCourseInstance":{"@type":"CourseInstance","courseMode":"online","instructor":{"@type":"Person","name":"Saravanan"},"inLanguage":["English"],"courseSchedule":{"@type":"Schedule","duration":"PT68H","repeatFrequency":"monthly","repeatCount":8}}}},{"@type":"ListItem","position":"2","item":{"@type":"Course","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/courses#rjs-course-2","name":"Node.Js introduction","description":"This course provides a comprehensive introduction to Node.js, a popular runtime environment for executing JavaScript code server-side. Participants will learn how to build scalable, high-performance web applications using Node.js, leveraging its asynchronous, event-driven architecture. The course covers essential concepts such as event loops, modules, package management, and asynchronous programming patterns. Additionally, participants will explore key Node.js frameworks and libraries for web development, including Express.js for building web servers and handling HTTP requests. Hands-on exercises and projects will reinforce learning objectives, allowing participants to apply their knowledge to real-world scenarios.","provider":{"@type":"Organization","name":"Edutube","sameAs":"https://edutube.com/"},"offers":{"@type":"Offer","category":"Fees","price":2000,"priceCurrency":"USD"},"hasCourseInstance":{"@type":"CourseInstance","courseMode":"onsite","instructor":{"@type":"Person","name":"Ram"},"inLanguage":["Tamil","French"],"courseSchedule":{"@type":"Schedule","duration":"PT24H","repeatFrequency":"daily","repeatCount":4}}}},{"@type":"ListItem","position":"3","item":{"@type":"Course","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/courses#rjs-course-3","name":"Java Intermediate to Advanced","description":"This course offers a comprehensive introduction to Java programming, covering core concepts and principles essential for beginners to embark on their journey in Java development. Participants will learn about Java syntax, object-oriented programming (OOP), control flow structures, exception handling, and input/output operations. Additionally, the course will cover key Java libraries and frameworks, providing a solid foundation for developing robust, scalable applications. Hands-on exercises and projects will reinforce learning objectives, enabling participants to apply their knowledge to practical scenarios.","provider":{"@type":"Organization","name":"Notoracle","sameAs":"https://notoracle.com/"},"offers":{"@type":"Offer","category":"Fees","price":2000,"priceCurrency":"INR"},"hasCourseInstance":{"@type":"CourseInstance","courseMode":"blended","instructor":{"@type":"Person","name":"Peter"},"inLanguage":["Tamil","English","Hindi"],"courseSchedule":{"@type":"Schedule","duration":"PT720H","repeatFrequency":"daily","repeatCount":7}}}}]}</script><script type="application/ld+json">[{"@context":"https://schema.org","@type":"Course","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/courses#rjs-course-1","name":"Python Crash Course","description":"This course serves as an introduction to Python programming, covering essential concepts and skills necessary for beginners to start coding in Python. Participants will learn about basic syntax, data types, control flow structures, functions, and file handling. Additionally, the course will cover key Python libraries and modules for common tasks such as data manipulation, visualization, and working with external files. Throughout the course, hands-on exercises and projects will reinforce learning objectives, allowing participants to apply their newfound knowledge to real-world scenarios.","provider":{"@type":"Organization","name":"LMS","sameAs":"https://lms.com/"},"offers":{"@type":"Offer","category":"Fees","price":100,"priceCurrency":"USD"},"hasCourseInstance":{"@type":"CourseInstance","courseMode":"online","instructor":{"@type":"Person","name":"Saravanan"},"inLanguage":["English"],"courseSchedule":{"@type":"Schedule","duration":"PT68H","repeatFrequency":"monthly","repeatCount":8}}},{"@context":"https://schema.org","@type":"Course","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/courses#rjs-course-2","name":"Node.Js introduction","description":"This course provides a comprehensive introduction to Node.js, a popular runtime environment for executing JavaScript code server-side. Participants will learn how to build scalable, high-performance web applications using Node.js, leveraging its asynchronous, event-driven architecture. The course covers essential concepts such as event loops, modules, package management, and asynchronous programming patterns. Additionally, participants will explore key Node.js frameworks and libraries for web development, including Express.js for building web servers and handling HTTP requests. Hands-on exercises and projects will reinforce learning objectives, allowing participants to apply their knowledge to real-world scenarios.","provider":{"@type":"Organization","name":"Edutube","sameAs":"https://edutube.com/"},"offers":{"@type":"Offer","category":"Fees","price":2000,"priceCurrency":"USD"},"hasCourseInstance":{"@type":"CourseInstance","courseMode":"onsite","instructor":{"@type":"Person","name":"Ram"},"inLanguage":["Tamil","French"],"courseSchedule":{"@type":"Schedule","duration":"PT24H","repeatFrequency":"daily","repeatCount":4}}},{"@context":"https://schema.org","@type":"Course","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/courses#rjs-course-3","name":"Java Intermediate to Advanced","description":"This course offers a comprehensive introduction to Java programming, covering core concepts and principles essential for beginners to embark on their journey in Java development. Participants will learn about Java syntax, object-oriented programming (OOP), control flow structures, exception handling, and input/output operations. Additionally, the course will cover key Java libraries and frameworks, providing a solid foundation for developing robust, scalable applications. Hands-on exercises and projects will reinforce learning objectives, enabling participants to apply their knowledge to practical scenarios.","provider":{"@type":"Organization","name":"Notoracle","sameAs":"https://notoracle.com/"},"offers":{"@type":"Offer","category":"Fees","price":2000,"priceCurrency":"INR"},"hasCourseInstance":{"@type":"CourseInstance","courseMode":"blended","instructor":{"@type":"Person","name":"Peter"},"inLanguage":["Tamil","English","Hindi"],"courseSchedule":{"@type":"Schedule","duration":"PT720H","repeatFrequency":"daily","repeatCount":7}}}]</script></head> + +<body> + <main> + <!-- course instance 1 --> + <div id="rjs-course-1"> + + <!-- name of course with language as data attribute--> + <p class="rjs-course-1-name" data-lang="English">Python Crash Course</p> + + <!-- instructor name --> + <!-- "By<space>Instructor" can be added or straight forward name in instructor inner text--> + <p class="rjs-course-1-ins">By Saravanan</p> + + <!-- mode of course online|onsite|blended- Case insensitive--> + <p class="rjs-course-1-mode">Online</p> + + <!-- description --> + <p class="rjs-course-1-desc">This course serves as an introduction to Python programming, covering essential + concepts and skills necessary for beginners to start coding in Python. Participants will learn about + basic syntax, data types, control flow structures, functions, and file handling. Additionally, the + course will cover key Python libraries and modules for common tasks such as data manipulation, + visualization, and working with external files. Throughout the course, hands-on exercises and projects + will reinforce learning objectives, allowing participants to apply their newfound knowledge to + real-world scenarios.</p> + + <!-- course duration --> + <p class="rjs-course-1-period" data-freq="monthly" data-rep="8">68 Hours</p> + + <!-- cost of course with currency as data--> + <!-- digit from innertext is only be taken --> + <p class="rjs-course-1-cost" data-currency="usd">100 USD</p> + + <!-- publisher url with publisher name as innnertext --> + <a class="rjs-course-1-purl" href="https://lms.com/"> + <p>LMS</p> + </a> + <!-- OR + publisher url with publisher name as element with id able class name + <a class="rjs-course-1-purl" href="https://cresteem.com/"> + <p class="pname">cresteem</p> + </a> --> + </div> + + <!-- course instance 2 --> + <div id="rjs-course-2"> + + <!-- name of course with language as data attribute--> + <p class="rjs-course-2-name" data-lang="Tamil,French">Node.Js introduction</p> + + <!-- instructor name --> + <!-- "By<space>Instructor" can be added or straight forward name in instructor inner text--> + <p class="rjs-course-2-ins">By Ram</p> + + <!-- mode of course online|onsite|blended - Case insensitive--> + <p class="rjs-course-2-mode">Onsite</p> + + <!-- description --> + <p class="rjs-course-2-desc">This course provides a comprehensive introduction to Node.js, a popular runtime + environment for executing JavaScript code server-side. Participants will learn how to build scalable, + high-performance web applications using Node.js, leveraging its asynchronous, event-driven architecture. + The course covers essential concepts such as event loops, modules, package management, and asynchronous + programming patterns. Additionally, participants will explore key Node.js frameworks and libraries for + web development, including Express.js for building web servers and handling HTTP requests. Hands-on + exercises and projects will reinforce learning objectives, allowing participants to apply their + knowledge to real-world scenarios.</p> + + <!-- course duration --> + <p class="rjs-course-2-period" data-freq="daily" data-rep="4">24 Hours</p> + + <!-- cost of course with currency as data--> + <!-- digit from innertext is only be taken --> + <p class="rjs-course-2-cost" data-currency="usd">2000 USD</p> + + <!-- publisher url with publisher name as innnertext --> + <a class="rjs-course-2-purl" href="https://edutube.com/"> + <p class="pname">Edutube</p> + </a> + </div> + + <!-- course instance 2 --> + <div id="rjs-course-3"> + + <!-- name of course with language as data attribute--> + <p class="rjs-course-3-name" data-lang="Tamil">Java Intermediate to Advanced</p> + + <!-- lang as id able elem --> + <p class="rjs-course-3-lang">English</p> + <p class="rjs-course-3-lang">Hindi</p> + + <!-- instructor name --> + <!-- "By<space>Instructor" can be added or straight forward name in instructor inner text--> + <p class="rjs-course-3-ins">Peter</p> + + <!-- mode of course online|onsite|blended - Case insensitive--> + <p class="rjs-course-3-mode">Blended</p> + + + <!-- description --> + <p class="rjs-course-3-desc">This course offers a comprehensive introduction to Java programming, covering + core + concepts and principles essential for beginners to embark on their journey in Java development. + Participants will learn about Java syntax, object-oriented programming (OOP), control flow structures, + exception handling, and input/output operations. Additionally, the course will cover key Java libraries + and frameworks, providing a solid foundation for developing robust, scalable applications. Hands-on + exercises and projects will reinforce learning objectives, enabling participants to apply their + knowledge to practical scenarios.</p> + + <!-- course duration --> + <p class="rjs-course-3-period" data-freq="daily" data-rep="7">1 Months</p> + + <!-- cost of course with currency as data--> + <!-- digit from innertext is only be taken --> + <p class="rjs-course-3-cost" data-currency="inr">2000 RS</p> + + <!-- publisher url with publisher name as innnertext --> + <a class="rjs-course-3-purl" href="https://notoracle.com/"> + <p class="pname">Notoracle</p> + </a> + </div> + </main> + + +</body></html> \ No newline at end of file diff --git a/test/outputs/browser-env/carousels/movies.html b/test/outputs/browser-env/carousels/movies.html new file mode 100644 index 0000000..fc4a212 --- /dev/null +++ b/test/outputs/browser-env/carousels/movies.html @@ -0,0 +1,140 @@ +<!DOCTYPE html><html lang="en"><head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Movies</title> + <script src="../bundle.min.js"> + </script> + <script> + document.addEventListener('DOMContentLoaded', function () { + RichieJS.default({ richieNames: ['cmovie','movie'] }) + }); + </script> +<script type="application/ld+json">{"@context":"https://schema.org","@type":"ItemList","itemListElement":[{"@type":"ListItem","position":"1","item":{"@type":"Movie","name":"Dawn of Justice","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/movies#rjs-movie-1","image":["https://i.imgur.com/GdoMshp.jpeg","https://i.imgur.com/yXDOO5w.png"],"dateCreated":"2016-02-05","director":["Zack Synder","Another director"],"review":[{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":98,"bestRating":100},"author":{"@type":"Person","name":"Darsan"},"publisher":{"@type":"Organization","name":"IMDB"}},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.5,"bestRating":5},"author":{"@type":"Organization","name":"NotIndiaGlitz"},"publisher":{"@type":"Organization","name":"RottenTomato"}}],"aggregateRating":{"@type":"AggregateRating","ratingValue":100,"bestRating":100,"ratingCount":1000}}},{"@type":"ListItem","position":"2","item":{"@type":"Movie","name":"Justice League","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/movies#rjs-movie-2","image":["https://i.imgur.com/FReAq9b.jpeg","https://i.imgur.com/tdl6BTi.jpeg"],"dateCreated":"2017-04-10","director":["Zack Synder","Joss Whedon"],"review":[{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":90,"bestRating":100},"author":{"@type":"Person","name":"Darsan"},"publisher":{"@type":"Organization","name":"IMDB"}},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":3.5,"bestRating":5},"author":{"@type":"Organization","name":"NotIndiaGlitz"},"publisher":{"@type":"Organization","name":"Rotten Tomato"}}],"aggregateRating":{"@type":"AggregateRating","ratingValue":95,"bestRating":100,"ratingCount":800}}}]}</script><script type="application/ld+json">[{"@context":"https://schema.org","@type":"Movie","name":"Dawn of Justice","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/movies#rjs-movie-1","image":["https://i.imgur.com/GdoMshp.jpeg","https://i.imgur.com/yXDOO5w.png"],"dateCreated":"2016-02-05","director":["Zack Synder","Another director"],"review":[{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":98,"bestRating":100},"author":{"@type":"Person","name":"Darsan"},"publisher":{"@type":"Organization","name":"IMDB"}},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.5,"bestRating":5},"author":{"@type":"Organization","name":"NotIndiaGlitz"},"publisher":{"@type":"Organization","name":"RottenTomato"}}],"aggregateRating":{"@type":"AggregateRating","ratingValue":100,"bestRating":100,"ratingCount":1000}},{"@context":"https://schema.org","@type":"Movie","name":"Justice League","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/movies#rjs-movie-2","image":["https://i.imgur.com/FReAq9b.jpeg","https://i.imgur.com/tdl6BTi.jpeg"],"dateCreated":"2017-04-10","director":["Zack Synder","Joss Whedon"],"review":[{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":90,"bestRating":100},"author":{"@type":"Person","name":"Darsan"},"publisher":{"@type":"Organization","name":"IMDB"}},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":3.5,"bestRating":5},"author":{"@type":"Organization","name":"NotIndiaGlitz"},"publisher":{"@type":"Organization","name":"Rotten Tomato"}}],"aggregateRating":{"@type":"AggregateRating","ratingValue":95,"bestRating":100,"ratingCount":800}}]</script></head> + +<body> + <!-- id is mandatory for anchor link --> + <!-- movieBaseID-id --> + <div id="rjs-movie-1"> + + <!-- name of the movie --> + <p class="rjs-movie-1-name">Dawn of Justice</p> + + <!--images --> + <img class="rjs-movie-1-img" src="https://i.imgur.com/GdoMshp.jpeg" alt=""> + <img class="rjs-movie-1-img" src="https://i.imgur.com/yXDOO5w.png" alt=""> + + <!-- date released YYYY-MM-DD --> + <p class="rjs-movie-1-pdt">2016-02-05</p> + + <!-- directors --> + <p class="rjs-movie-1-dir">Zack Synder</p> + <p class="rjs-movie-1-dir">Another director</p> + + + <!-- aggregate review --> + <div class="rjs-movie-1-aggrate"> + <!-- aggregated rate value--> + <p class="arv">100</p> + + <!-- max range of rating --> + <p class="mr">100</p> + + <!-- number of user ratings --> + <p class="rc">1000</p> + </div> + + <!-- user reviews --> + <div class="rjs-movie-1-reviews"> + + <!-- user rate instance --> + <div class="urate"> + + <p class="raterP">Darsan</p><!-- rater name| P(person) and O(organisation) - suffix is reserved--> + + <p class="mr">100</p><!-- max rate range in system --> + + <p class="rv">98</p><!-- ratedValue --> + + <p class="rpOn">IMDB</p><!-- rating published on --> + </div> + + <div class="urate"> + + <p class="raterO">NotIndiaGlitz</p> + <!-- rater name| P(person) and O(organisation) - suffix is reserved--> + + <p class="mr">5</p><!-- max rate range in system --> + + <p class="rv">4.5</p><!-- ratedValue --> + + <p class="rpOn">RottenTomato</p><!-- rating published on --> + </div> + + </div><!-- user reviews ended --> + + </div><!-- movie 1 ended --> + + <!-- id is mandatory for anchor link --> + <div id="rjs-movie-2"> + + <!-- name of the movie --> + <p class="rjs-movie-2-name">Justice League</p> + + <!--images --> + <img class="rjs-movie-2-img" src="https://i.imgur.com/FReAq9b.jpeg" alt=""> + <img class="rjs-movie-2-img" src="https://i.imgur.com/tdl6BTi.jpeg" alt=""> + + <!-- date released --> + <p class="rjs-movie-2-pdt">2017-04-10</p> + + <!-- directors --> + <p class="rjs-movie-2-dir">Zack Synder</p> + <p class="rjs-movie-2-dir">Joss Whedon</p> + + + <!-- aggregate review --> + <div class="rjs-movie-2-aggrate"> + <!-- aggregated rate value--> + <p class="arv">95</p> + + <!-- max range of rating --> + <p class="mr">100</p> + + <!-- number of user ratings --> + <p class="rc">800</p> + </div> + + <!-- user reviews --> + <div class="rjs-movie-2-reviews"> + + <!-- user rate instance --> + <div class="urate"> + + <p class="raterP">Darsan</p><!-- rater name| P(person) and O(organisation) - suffix is reserved--> + + <p class="mr">100</p><!-- max rate range in system --> + + <p class="rv">90</p><!-- ratedValue --> + + <p class="rpOn">IMDB</p><!-- rating published on --> + </div> + + <div class="urate"> + + <p class="raterO">NotIndiaGlitz</p> + <!-- rater name| P(person) and O(organisation) - suffix is reserved--> + + <p class="mr">5</p><!-- max rate range in system --> + + <p class="rv">3.5</p><!-- ratedValue --> + + <p class="rpOn">Rotten Tomato</p><!-- rating published on --> + </div> + + </div><!-- user reviews ended --> + + </div><!-- movie 2 ended --> + + + +</body></html> \ No newline at end of file diff --git a/test/outputs/browser-env/carousels/recipies.html b/test/outputs/browser-env/carousels/recipies.html new file mode 100644 index 0000000..4477e9c --- /dev/null +++ b/test/outputs/browser-env/carousels/recipies.html @@ -0,0 +1,311 @@ +<!DOCTYPE html><html lang="en"><head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Recipe</title> + <meta name="description" content="Discover the tantalizing world of Biryani: a symphony of aromatic spices, tender meats, and fluffy rice, all layered together to create a culinary masterpiece that promises an unforgettable dining experience."> + <script src="../bundle.min.js"> + </script> + <script> + document.addEventListener('DOMContentLoaded', function() { + RichieJS.default({richieNames:['crecipe','recipe']}) + }); + </script> +<script type="application/ld+json">{"@context":"https://schema.org","@type":"ItemList","itemListElement":[{"@type":"ListItem","position":"1","item":{"@type":"Recipe","name":"Biryani","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/recipies#rjs-recipe-1","image":["https://i.imgur.com/ULHbPTa.jpeg","https://i.imgur.com/RstsU7N.jpeg"],"author":{"@type":"Person","name":"Darsan"},"datePublished":"2023-01-12","description":"Biryani is a flavorful and aromatic rice dish originating from the Indian subcontinent. It consists of long-grain rice cooked with a blend of spices such as cumin, cardamom, and saffron, layered with marinated meats or vegetables. Biryani offers a rich and complex taste profile and is often served with accompaniments like raita or salad.","recipeCuisine":"Indian","prepTime":"PT25M","cookTime":"PT20M","totalTime":"PT45M","keywords":"Biryani recipe, Authentic biryani, Homemade biryani, Indian biryani, Chicken biryani, Vegetable biryani, Spicy biryani, Easy biryani recipe, Delicious biryani, Traditional biryani dish","recipeYield":"4 servings","recipeCategory":"Rich Dishes","nutrition":{"@type":"NutritionInformation","calories":"300 calories"},"aggregateRating":{"@type":"AggregateRating","ratingValue":99,"bestRating":100,"ratingCount":1200},"recipeIngredient":["Basmati Rice - 2 cups","Meat (chicken, lamb, or beef) or Vegetables - 500 grams","Aromatic Spices","Yogurt - 1/2 cup","Saffron - A pinch (soaked in 2 tablespoons of warm milk)","Rose Water - 1 tablespoon"],"recipeInstructions":[{"@type":"HowToStep","name":"Prepare the Rice:","text":"Rinse 2 cups of basmati rice under cold water until the water runs clear. Soak the rice in water for 30 minutes, then drain. In a large pot, bring water to a boil and add the drained rice along with a pinch of salt. Cook until the rice is 70% done, then drain and set aside.","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/recipies#step1","image":"https://i.imgur.com/9XdcrCN.jpeg"},{"@type":"HowToStep","name":"Prepare the Meat or Vegetables:","text":"Marinate 500 grams of meat (chicken, lamb, or beef) or vegetables in a mixture of yogurt and aromatic spices (cumin, cardamom, cloves, cinnamon, bay leaves). Allow the meat or vegetables to marinate for at least 30 minutes to absorb the flavors.","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/recipies#step2","image":"https://i.imgur.com/yisIi6d.jpeg"},{"@type":"HowToStep","name":"Layering:","text":"In a heavy-bottomed pot, layer the partially cooked rice and marinated meat or vegetables alternately. Drizzle saffron soaked in warm milk and rose water over the layers for added fragrance and color. Optionally, sprinkle fried onions and chopped mint leaves between the layers.","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/recipies#step3","image":"https://i.imgur.com/9XdcrCN.jpeg"},{"@type":"HowToStep","name":"Cooking:","text":"Cover the pot with a tight-fitting lid and cook on low heat for 20-25 minutes, allowing the flavors to meld together and the rice to fully cook. Alternatively, you can place the pot in a preheated oven at 350°F (180°C) for the same duration.","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/recipies#step4","image":"https://images.pexels.com/photos/2890387/pexels-photo-2890387.jpeg"},{"@type":"HowToStep","name":"Serve:","text":"Once cooked, gently fluff the biryani with a fork, ensuring the layers remain intact. Serve hot garnished with additional fried onions, chopped cilantro, and a side of raita or salad for a complete meal experience. Enjoy your flavorful homemade biryani!","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/recipies#step5","image":"https://i.imgur.com/9XdcrCN.jpeg"}],"video":{"@type":"VideoObject","name":"SIMPLE CHICKEN BIRYANI FOR BEGINNERS | CHICKEN BIRYANI RECIPE FOR BACHELORS - YouTube","description":"Simple Chicken Biryani for Beginners | Chicken Biryani Recipe for Bachelors | Simple Chicken Biryani for Bachelors | Chicken Biryani with Biryani Masala | Ch...","thumbnailUrl":"https://i.ytimg.com/vi/95BCU1n268w/maxresdefault.jpg","contentUrl":"https://www.youtube.com/watch?v=95BCU1n268w","embedUrl":"https://www.youtube-nocookie.com/embed/95BCU1n268w?si=I6Tdi-DXX3bVVuP3","uploadDate":"2020-05-15T22:30:00-07:00","duration":"PT5M9S","interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"WatchAction"},"userInteractionCount":36085893},"expires":"3020-05-16T11:00:00.000+05:30"}}},{"@type":"ListItem","position":"2","item":{"@type":"Recipe","name":"Classic Oatmeal","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/recipies#rjs-recipe-2","image":["https://i.imgur.com/xyz123.jpg"],"author":{"@type":"Person","name":"Your Name"},"datePublished":"2024-04-26","description":"Classic oatmeal is a nutritious and comforting breakfast option. Made from rolled oats and simmered in milk or water, it's a versatile dish that can be customized with various toppings to suit your taste preferences.","recipeCuisine":"American","prepTime":"PT10M","cookTime":"PT5M","totalTime":"PT15M","keywords":"Oatmeal recipe, Classic oatmeal, Breakfast dish, Healthy breakfast, Quick oats, Cinnamon oats, Simple oatmeal, Nutritious breakfast, Warm breakfast","recipeYield":"2 servings","recipeCategory":"Breakfast","nutrition":{"@type":"NutritionInformation","calories":"150 calories"},"aggregateRating":{"@type":"AggregateRating","ratingValue":4.5,"bestRating":5,"ratingCount":500},"recipeIngredient":["Rolled oats - 1 cup","Milk or water - 2 cups","Optional toppings: fruits, nuts, honey, cinnamon, etc."],"recipeInstructions":[{"@type":"HowToStep","name":"Cook the Oats:","text":"In a saucepan, bring the milk or water to a gentle boil over medium heat. Stir in the rolled oats and reduce the heat to low. Simmer uncovered, stirring occasionally, for about 5 minutes or until the oats are soft and the mixture has thickened to your desired consistency.","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/recipies#step1","image":"https://i.imgur.com/abc123.jpg"},{"@type":"HowToStep","name":"Serve:","text":"Once cooked, remove the oatmeal from heat and let it sit for a minute before serving. Pour into bowls and top with your favorite toppings such as fresh fruits, nuts, a drizzle of honey, or a sprinkle of cinnamon. Enjoy your warm and nutritious bowl of oatmeal!","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/recipies#step2","image":"https://i.imgur.com/abc123.jpg"}],"video":{"@type":"VideoObject","name":"10 Minutes Oats Recipe | Easy Breakfast - YouTube","description":"10 Minutes Oats Recipe | Easy Breakfast.","thumbnailUrl":"https://i.ytimg.com/vi/E8GtcPT25Hs/maxresdefault.jpg","contentUrl":"https://www.youtube.com/watch?v=E8GtcPT25Hs","embedUrl":"https://www.youtube-nocookie.com/embed/E8GtcPT25Hs?si=lgkECFFRd86ypZoE","uploadDate":"2023-06-29T00:21:52-07:00","duration":"PT1M45S","interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"WatchAction"},"userInteractionCount":807674},"expires":"3023-06-29T12:51:52.000+05:30"}}}]}</script><script type="application/ld+json">[{"@context":"https://schema.org","@type":"Recipe","name":"Biryani","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/recipies#rjs-recipe-1","image":["https://i.imgur.com/ULHbPTa.jpeg","https://i.imgur.com/RstsU7N.jpeg"],"author":{"@type":"Person","name":"Darsan"},"datePublished":"2023-01-12","description":"Biryani is a flavorful and aromatic rice dish originating from the Indian subcontinent. It consists of long-grain rice cooked with a blend of spices such as cumin, cardamom, and saffron, layered with marinated meats or vegetables. Biryani offers a rich and complex taste profile and is often served with accompaniments like raita or salad.","recipeCuisine":"Indian","prepTime":"PT25M","cookTime":"PT20M","totalTime":"PT45M","keywords":"Biryani recipe, Authentic biryani, Homemade biryani, Indian biryani, Chicken biryani, Vegetable biryani, Spicy biryani, Easy biryani recipe, Delicious biryani, Traditional biryani dish","recipeYield":"4 servings","recipeCategory":"Rich Dishes","nutrition":{"@type":"NutritionInformation","calories":"300 calories"},"aggregateRating":{"@type":"AggregateRating","ratingValue":99,"bestRating":100,"ratingCount":1200},"recipeIngredient":["Basmati Rice - 2 cups","Meat (chicken, lamb, or beef) or Vegetables - 500 grams","Aromatic Spices","Yogurt - 1/2 cup","Saffron - A pinch (soaked in 2 tablespoons of warm milk)","Rose Water - 1 tablespoon"],"recipeInstructions":[{"@type":"HowToStep","name":"Prepare the Rice:","text":"Rinse 2 cups of basmati rice under cold water until the water runs clear. Soak the rice in water for 30 minutes, then drain. In a large pot, bring water to a boil and add the drained rice along with a pinch of salt. Cook until the rice is 70% done, then drain and set aside.","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/recipies#step1","image":"https://i.imgur.com/9XdcrCN.jpeg"},{"@type":"HowToStep","name":"Prepare the Meat or Vegetables:","text":"Marinate 500 grams of meat (chicken, lamb, or beef) or vegetables in a mixture of yogurt and aromatic spices (cumin, cardamom, cloves, cinnamon, bay leaves). Allow the meat or vegetables to marinate for at least 30 minutes to absorb the flavors.","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/recipies#step2","image":"https://i.imgur.com/yisIi6d.jpeg"},{"@type":"HowToStep","name":"Layering:","text":"In a heavy-bottomed pot, layer the partially cooked rice and marinated meat or vegetables alternately. Drizzle saffron soaked in warm milk and rose water over the layers for added fragrance and color. Optionally, sprinkle fried onions and chopped mint leaves between the layers.","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/recipies#step3","image":"https://i.imgur.com/9XdcrCN.jpeg"},{"@type":"HowToStep","name":"Cooking:","text":"Cover the pot with a tight-fitting lid and cook on low heat for 20-25 minutes, allowing the flavors to meld together and the rice to fully cook. Alternatively, you can place the pot in a preheated oven at 350°F (180°C) for the same duration.","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/recipies#step4","image":"https://images.pexels.com/photos/2890387/pexels-photo-2890387.jpeg"},{"@type":"HowToStep","name":"Serve:","text":"Once cooked, gently fluff the biryani with a fork, ensuring the layers remain intact. Serve hot garnished with additional fried onions, chopped cilantro, and a side of raita or salad for a complete meal experience. Enjoy your flavorful homemade biryani!","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/recipies#step5","image":"https://i.imgur.com/9XdcrCN.jpeg"}],"video":{"@type":"VideoObject","name":"SIMPLE CHICKEN BIRYANI FOR BEGINNERS | CHICKEN BIRYANI RECIPE FOR BACHELORS - YouTube","description":"Simple Chicken Biryani for Beginners | Chicken Biryani Recipe for Bachelors | Simple Chicken Biryani for Bachelors | Chicken Biryani with Biryani Masala | Ch...","thumbnailUrl":"https://i.ytimg.com/vi/95BCU1n268w/maxresdefault.jpg","contentUrl":"https://www.youtube.com/watch?v=95BCU1n268w","embedUrl":"https://www.youtube-nocookie.com/embed/95BCU1n268w?si=I6Tdi-DXX3bVVuP3","uploadDate":"2020-05-15T22:30:00-07:00","duration":"PT5M9S","interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"WatchAction"},"userInteractionCount":36085893},"expires":"3020-05-16T11:00:00.000+05:30"}},{"@context":"https://schema.org","@type":"Recipe","name":"Classic Oatmeal","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/recipies#rjs-recipe-2","image":["https://i.imgur.com/xyz123.jpg"],"author":{"@type":"Person","name":"Your Name"},"datePublished":"2024-04-26","description":"Classic oatmeal is a nutritious and comforting breakfast option. Made from rolled oats and simmered in milk or water, it's a versatile dish that can be customized with various toppings to suit your taste preferences.","recipeCuisine":"American","prepTime":"PT10M","cookTime":"PT5M","totalTime":"PT15M","keywords":"Oatmeal recipe, Classic oatmeal, Breakfast dish, Healthy breakfast, Quick oats, Cinnamon oats, Simple oatmeal, Nutritious breakfast, Warm breakfast","recipeYield":"2 servings","recipeCategory":"Breakfast","nutrition":{"@type":"NutritionInformation","calories":"150 calories"},"aggregateRating":{"@type":"AggregateRating","ratingValue":4.5,"bestRating":5,"ratingCount":500},"recipeIngredient":["Rolled oats - 1 cup","Milk or water - 2 cups","Optional toppings: fruits, nuts, honey, cinnamon, etc."],"recipeInstructions":[{"@type":"HowToStep","name":"Cook the Oats:","text":"In a saucepan, bring the milk or water to a gentle boil over medium heat. Stir in the rolled oats and reduce the heat to low. Simmer uncovered, stirring occasionally, for about 5 minutes or until the oats are soft and the mixture has thickened to your desired consistency.","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/recipies#step1","image":"https://i.imgur.com/abc123.jpg"},{"@type":"HowToStep","name":"Serve:","text":"Once cooked, remove the oatmeal from heat and let it sit for a minute before serving. Pour into bowls and top with your favorite toppings such as fresh fruits, nuts, a drizzle of honey, or a sprinkle of cinnamon. Enjoy your warm and nutritious bowl of oatmeal!","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/recipies#step2","image":"https://i.imgur.com/abc123.jpg"}],"video":{"@type":"VideoObject","name":"10 Minutes Oats Recipe | Easy Breakfast - YouTube","description":"10 Minutes Oats Recipe | Easy Breakfast.","thumbnailUrl":"https://i.ytimg.com/vi/E8GtcPT25Hs/maxresdefault.jpg","contentUrl":"https://www.youtube.com/watch?v=E8GtcPT25Hs","embedUrl":"https://www.youtube-nocookie.com/embed/E8GtcPT25Hs?si=lgkECFFRd86ypZoE","uploadDate":"2023-06-29T00:21:52-07:00","duration":"PT1M45S","interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"WatchAction"},"userInteractionCount":807674},"expires":"3023-06-29T12:51:52.000+05:30"}}]</script></head> + +<body> + <main> + + <div id="rjs-recipe-1"> + + <!-- name of recipe --> + <p class="rjs-recipe-1-name">Biryani</p> + + <!-- image thumbanails --> + <img class="rjs-recipe-1-img" src="https://i.imgur.com/ULHbPTa.jpeg"> + <img class="rjs-recipe-1-img" src="https://i.imgur.com/RstsU7N.jpeg"> + + <!--author name --> + <p class="rjs-recipe-1-aname">Darsan</p> + + <!-- published date --> + <p class="rjs-recipe-1-pdt">2023-01-12</p> + + <!-- description --> + <p class="rjs-recipe-1-desc"> + Biryani is a flavorful and aromatic rice dish originating from the + Indian subcontinent. It consists of long-grain rice cooked with a + blend of spices such as cumin, cardamom, and saffron, layered with + marinated meats or vegetables. Biryani offers a rich and complex taste + profile and is often served with accompaniments like raita or salad. + </p> + + <!-- ptm - means minutes--> + <!-- pth - means hours--> + <!-- pthm - hours and minutes (hours should be first ex: 2 Hours and 10 minutes)--> + <p class="rjs-recipe-1-ptm">25 minutes</p> + <!-- <p class="rjs-recipe-1-pth">1 Hours</p> --> + <!-- <p class="rjs-recipe-1-pthm">1 Hours and 25 minutes</p> --> + + <!-- ctm - means minutes--> + <!-- cth - means hours--> + <!-- cthm - hours and minutes (hours should be first ex: 2 Hours and 10 minutes)--> + <p class="rjs-recipe-1-ctm">20 minutes</p> + <!-- <p class="rjs-recipe-1-cth">2 Hours</p> + <p class="rjs-recipe-1-cthm">1 Hours and 10 minutes</p> --> + + + <!-- serving counts (yield)--> + <p class="rjs-recipe-1-serves">4</p> + + <!-- category --> + <p class="rjs-recipe-1-cat">Rich Dishes</p> + + <!-- cuisine --> + <p class="rjs-recipe-1-csnt">Indian</p> + + <!-- nutrition informations --> + <div class="rjs-recipe-1-nutrition"> + <!-- calories --> + <p class="cal">300</p> + </div> + + <!-- ingredients --> + <ul class="rjs-recipe-1-ingredient"> + <li>Basmati Rice - 2 cups</li> + <li>Meat (chicken, lamb, or beef) or Vegetables - 500 grams</li> + <li> Aromatic Spices </li> + <li>Yogurt - 1/2 cup</li> + <li>Saffron - A pinch (soaked in 2 tablespoons of warm milk)</li> + <li>Rose Water - 1 tablespoon</li> + </ul> + + <!-- instructions --> + <div class="rjs-recipe-1-instructions"> + + <!-- steps --> + <div class="step" id="step1"> + + <p class="short">Prepare the Rice:</p> + + <img class="simg" src="https://i.imgur.com/9XdcrCN.jpeg"> + + <p class="long"> + Rinse 2 cups of basmati rice under cold water until the water runs + clear. Soak the rice in water for 30 minutes, then drain. In a + large pot, bring water to a boil and add the drained rice along + with a pinch of salt. Cook until the rice is 70% done, then drain + and set aside. + </p> + </div> + + + <!-- steps --> + <div class="step" id="step2"> + + <p class="short">Prepare the Meat or Vegetables:</p> + + <img class="simg" src="https://i.imgur.com/yisIi6d.jpeg"> + + <p class="long"> + Marinate 500 grams of meat (chicken, lamb, or beef) or vegetables + in a mixture of yogurt and aromatic spices (cumin, cardamom, + cloves, cinnamon, bay leaves). Allow the meat or vegetables to + marinate for at least 30 minutes to absorb the flavors. + </p> + </div> + + <!-- steps --> + <div class="step" id="step3"> + + <p class="short">Layering:</p> + + <img class="simg" src="https://i.imgur.com/9XdcrCN.jpeg"> + + <p class="long"> + In a heavy-bottomed pot, layer the partially cooked rice and + marinated meat or vegetables alternately. Drizzle saffron soaked + in warm milk and rose water over the layers for added fragrance + and color. Optionally, sprinkle fried onions and chopped mint + leaves between the layers. + </p> + </div> + + <!-- steps --> + <div class="step" id="step4"> + + <p class="short">Cooking:</p> + + <img class="simg" src="https://images.pexels.com/photos/2890387/pexels-photo-2890387.jpeg"> + + <p class="long"> + Cover the pot with a tight-fitting lid and cook on low heat for + 20-25 minutes, allowing the flavors to meld together and the rice + to fully cook. Alternatively, you can place the pot in a preheated + oven at 350°F (180°C) for the same duration. + </p> + </div> + + <!-- steps --> + <div class="step" id="step5"> + + <p class="short">Serve:</p> + + <img class="simg" src="https://i.imgur.com/9XdcrCN.jpeg"> + + <p class="long"> + Once cooked, gently fluff the biryani with a fork, ensuring the + layers remain intact. Serve hot garnished with additional fried + onions, chopped cilantro, and a side of raita or salad for a + complete meal experience. Enjoy your flavorful homemade biryani! + </p> + </div> + + </div><!-- INSTRUCTIONS OVER --> + + <!-- aggregate rating --> + <div class="rjs-recipe-1-aggrate"> + <!-- max rate --> + <p class="mr">100</p> + <!-- rated value--> + <p class="arv">99</p> + <!-- number of ratings --> + <p class="rc">1200</p> + </div> + + <!--embedded youtube video --> + <iframe class="rjs-recipe-1-vframe" width="560" height="315" src="https://www.youtube-nocookie.com/embed/95BCU1n268w?si=I6Tdi-DXX3bVVuP3" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe> + + <!-- keywords --> + <ul class="rjs-recipe-1-kw"> + <li>Biryani recipe</li> + <li>Authentic biryani</li> + <li>Homemade biryani</li> + <li>Indian biryani</li> + <li>Chicken biryani</li> + <li>Vegetable biryani</li> + <li>Spicy biryani</li> + <li>Easy biryani recipe</li> + <li>Delicious biryani</li> + <li>Traditional biryani dish</li> + </ul> + + </div> + + <!-- oatmeal --> + <div id="rjs-recipe-2"> + + <!-- name of recipe --> + <p class="rjs-recipe-2-name">Classic Oatmeal</p> + + <!-- image thumbnail --> + <img class="rjs-recipe-2-img" src="https://i.imgur.com/xyz123.jpg"> + + <!-- author name --> + <p class="rjs-recipe-2-aname">Your Name</p> + + <!-- published date --> + <p class="rjs-recipe-2-pdt">2024-04-26</p> + + <!-- description --> + <p class="rjs-recipe-2-desc"> + Classic oatmeal is a nutritious and comforting breakfast option. Made from + rolled oats and simmered in milk or water, it's a versatile dish that can + be customized with various toppings to suit your taste preferences. + </p> + + <!-- preparation time --> + <p class="rjs-recipe-2-ptm">10 minutes</p> + + <!-- cooking time --> + <p class="rjs-recipe-2-ctm">5 minutes</p> + + <!-- serving counts --> + <p class="rjs-recipe-2-serves">2</p> + + <!-- category --> + <p class="rjs-recipe-2-cat">Breakfast</p> + + <!-- cuisine --> + <p class="rjs-recipe-2-csnt">American</p> + + <!-- nutrition information --> + <div class="rjs-recipe-2-nutrition"> + <!-- calories --> + <p class="cal">150</p> + </div> + + <!-- ingredients --> + <ul class="rjs-recipe-2-ingredient"> + <li>Rolled oats - 1 cup</li> + <li>Milk or water - 2 cups</li> + <li>Optional toppings: fruits, nuts, honey, cinnamon, etc.</li> + </ul> + + <!-- instructions --> + <div class="rjs-recipe-2-instructions"> + + <!-- steps --> + <div class="step" id="step1"> + + <p class="short">Cook the Oats:</p> + + <img class="simg" src="https://i.imgur.com/abc123.jpg"> + + <p class="long"> + In a saucepan, bring the milk or water to a gentle boil over medium heat. + Stir in the rolled oats and reduce the heat to low. Simmer uncovered, + stirring occasionally, for about 5 minutes or until the oats are soft and + the mixture has thickened to your desired consistency. + </p> + </div> + + <!-- steps --> + <div class="step" id="step2"> + + <p class="short">Serve:</p> + + <img class="simg" src="https://i.imgur.com/abc123.jpg"> + + <p class="long"> + Once cooked, remove the oatmeal from heat and let it sit for a minute + before serving. Pour into bowls and top with your favorite toppings + such as fresh fruits, nuts, a drizzle of honey, or a sprinkle of cinnamon. + Enjoy your warm and nutritious bowl of oatmeal! + </p> + </div> + + </div><!-- INSTRUCTIONS OVER --> + + <!-- aggregate rating --> + <div class="rjs-recipe-2-aggrate"> + <!-- max rate --> + <p class="mr">5</p> + <!-- rated value--> + <p class="arv">4.5</p> + <!-- number of ratings --> + <p class="rc">500</p> + </div> + + <!-- keywords --> + <ul class="rjs-recipe-2-kw"> + <li>Oatmeal recipe</li> + <li>Classic oatmeal</li> + <li>Breakfast dish</li> + <li>Healthy breakfast</li> + <li>Quick oats</li> + <li>Cinnamon oats</li> + <li>Simple oatmeal</li> + <li>Nutritious breakfast</li> + <li>Warm breakfast</li> + </ul> + + <iframe class="rjs-recipe-2-vframe" width="560" height="315" src="https://www.youtube-nocookie.com/embed/E8GtcPT25Hs?si=lgkECFFRd86ypZoE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe> + + </div> + + + </main> + + + +</body></html> \ No newline at end of file diff --git a/test/outputs/browser-env/carousels/restaurants.html b/test/outputs/browser-env/carousels/restaurants.html new file mode 100644 index 0000000..987716f --- /dev/null +++ b/test/outputs/browser-env/carousels/restaurants.html @@ -0,0 +1,287 @@ +<!DOCTYPE html><html lang="en"><head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Restaurants</title> + <script src="../bundle.min.js"> + </script> + <script> + document.addEventListener('DOMContentLoaded', function () { + RichieJS.default({ richieNames: ['crestaurant', 'restaurant'] }) + }); + </script> +<script type="application/ld+json">{"@context":"https://schema.org","@type":"ItemList","itemListElement":[{"@type":"ListItem","position":"1","item":{"@type":"Restaurant","name":"Hookie Dookie","address":{"@type":"PostalAddress","streetAddress":"008, Papanna street, St Mark's Rd","addressLocality":"Bengaluru","addressRegion":"Karnataka","postalCode":560001,"addressCountry":"IN"},"image":["https://i.imgur.com/3aIBedv.jpeg","https://i.imgur.com/RbIZogg.jpeg","https://i.imgur.com/UL6OJWN.jpeg"],"review":[{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.5,"bestRating":5},"author":{"@type":"Person","name":"Dean"},"publisher":{"@type":"Organization","name":"Amazon"}},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.5,"bestRating":5},"author":{"@type":"Person","name":"Someone"},"publisher":{"@type":"Organization","name":"Noogle"}}],"geo":{"@type":"GeoCoordinates","latitude":12.971167914890476,"longitude":77.5978368737318},"url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/restaurants#rjs-restaurant-1","telephone":"+91-84259372x3","priceRange":"INR 200 - INR 500","openingHoursSpecification":[{"@type":"OpeningHoursSpecification","dayOfWeek":["Sunday","Monday","Tuesday","Wednesday","Thursday"],"opens":"10:00","closes":"21:00"},{"@type":"OpeningHoursSpecification","dayOfWeek":["Saturday"],"opens":"13:00","closes":"18:00"},{"@type":"OpeningHoursSpecification","dayOfWeek":["Friday"],"opens":"10:00","closes":"18:00"}],"acceptsReservations":true,"aggregateRating":{"@type":"AggregateRating","ratingValue":100,"bestRating":100,"ratingCount":1000},"servesCuisine":["Asian","Mexican"],"areaServed":["Chennai","Osur","Hyderabad"],"menu":"https://www.restaurant.com/menu","keywords":"#Tag1, #Tag2, #Tag3, #Tag4"}},{"@type":"ListItem","position":"2","item":{"@type":"Restaurant","name":"Gotham Restaurant","address":{"@type":"PostalAddress","streetAddress":"12 E 12th St","addressLocality":"New York","addressRegion":"NY","postalCode":10003,"addressCountry":"US"},"image":["https://lh3.googleusercontent.com/p/AF1QipNaSKp5Aj8n9Pcqf2TCckFMMS93N4rEXmGHNTnd"],"review":[{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.9,"bestRating":5},"author":{"@type":"Person","name":"Sammy"},"publisher":{"@type":"Organization","name":"Google"}},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.6,"bestRating":5},"author":{"@type":"Person","name":"John"},"publisher":{"@type":"Organization","name":"Noogle"}}],"geo":{"@type":"GeoCoordinates","latitude":40.73420297304284,"longitude":-73.9983076246472},"url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/restaurants#rjs-restaurant-2","telephone":"+1 212-380-8x60","priceRange":"$100 - $1200","openingHoursSpecification":[{"@type":"OpeningHoursSpecification","dayOfWeek":["Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday"],"opens":"08:00","closes":"21:00"},{"@type":"OpeningHoursSpecification","dayOfWeek":["Saturday"],"opens":"13:00","closes":"18:00"},{"@type":"OpeningHoursSpecification","dayOfWeek":["Friday"],"opens":"10:00","closes":"18:00"}],"acceptsReservations":false,"aggregateRating":{"@type":"AggregateRating","ratingValue":78,"bestRating":100,"ratingCount":9873},"servesCuisine":["American","Mexican"],"areaServed":["NewYork"],"menu":"https://www.gotham.com/menu","keywords":"#Tag1, #Tag2, #Tag3, #Tag4"}}]}</script><script type="application/ld+json">[{"@context":"https://schema.org","@type":"Restaurant","name":"Hookie Dookie","address":{"@type":"PostalAddress","streetAddress":"008, Papanna street, St Mark's Rd","addressLocality":"Bengaluru","addressRegion":"Karnataka","postalCode":560001,"addressCountry":"IN"},"image":["https://i.imgur.com/3aIBedv.jpeg","https://i.imgur.com/RbIZogg.jpeg","https://i.imgur.com/UL6OJWN.jpeg"],"review":[{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.5,"bestRating":5},"author":{"@type":"Person","name":"Dean"},"publisher":{"@type":"Organization","name":"Amazon"}},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.5,"bestRating":5},"author":{"@type":"Person","name":"Someone"},"publisher":{"@type":"Organization","name":"Noogle"}}],"geo":{"@type":"GeoCoordinates","latitude":12.971167914890476,"longitude":77.5978368737318},"url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/restaurants#rjs-restaurant-1","telephone":"+91-84259372x3","priceRange":"INR 200 - INR 500","openingHoursSpecification":[{"@type":"OpeningHoursSpecification","dayOfWeek":["Sunday","Monday","Tuesday","Wednesday","Thursday"],"opens":"10:00","closes":"21:00"},{"@type":"OpeningHoursSpecification","dayOfWeek":["Saturday"],"opens":"13:00","closes":"18:00"},{"@type":"OpeningHoursSpecification","dayOfWeek":["Friday"],"opens":"10:00","closes":"18:00"}],"acceptsReservations":true,"aggregateRating":{"@type":"AggregateRating","ratingValue":100,"bestRating":100,"ratingCount":1000},"servesCuisine":["Asian","Mexican"],"areaServed":["Chennai","Osur","Hyderabad"],"menu":"https://www.restaurant.com/menu","keywords":"#Tag1, #Tag2, #Tag3, #Tag4"},{"@context":"https://schema.org","@type":"Restaurant","name":"Gotham Restaurant","address":{"@type":"PostalAddress","streetAddress":"12 E 12th St","addressLocality":"New York","addressRegion":"NY","postalCode":10003,"addressCountry":"US"},"image":["https://lh3.googleusercontent.com/p/AF1QipNaSKp5Aj8n9Pcqf2TCckFMMS93N4rEXmGHNTnd"],"review":[{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.9,"bestRating":5},"author":{"@type":"Person","name":"Sammy"},"publisher":{"@type":"Organization","name":"Google"}},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.6,"bestRating":5},"author":{"@type":"Person","name":"John"},"publisher":{"@type":"Organization","name":"Noogle"}}],"geo":{"@type":"GeoCoordinates","latitude":40.73420297304284,"longitude":-73.9983076246472},"url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/carousels/restaurants#rjs-restaurant-2","telephone":"+1 212-380-8x60","priceRange":"$100 - $1200","openingHoursSpecification":[{"@type":"OpeningHoursSpecification","dayOfWeek":["Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday"],"opens":"08:00","closes":"21:00"},{"@type":"OpeningHoursSpecification","dayOfWeek":["Saturday"],"opens":"13:00","closes":"18:00"},{"@type":"OpeningHoursSpecification","dayOfWeek":["Friday"],"opens":"10:00","closes":"18:00"}],"acceptsReservations":false,"aggregateRating":{"@type":"AggregateRating","ratingValue":78,"bestRating":100,"ratingCount":9873},"servesCuisine":["American","Mexican"],"areaServed":["NewYork"],"menu":"https://www.gotham.com/menu","keywords":"#Tag1, #Tag2, #Tag3, #Tag4"}]</script></head> + +<body> + <main> + <div id="rjs-restaurant-1"> + <!-- name --> + <p class="rjs-restaurant-1-name">Hookie Dookie</p> + + <!-- image=[] --> + <div> + <img class="rjs-restaurant-1-img" src="https://i.imgur.com/3aIBedv.jpeg" alt="picture of reception"> + <img class="rjs-restaurant-1-img" src="https://i.imgur.com/RbIZogg.jpeg" alt="another 1"> + <img class="rjs-restaurant-1-img" src="https://i.imgur.com/UL6OJWN.jpeg" alt="another 1"> + </div> + + <!-- address --> + <!-- geo will be generated from address --> + <div class="rjs-restaurant-1-loc"> + <!-- loc-st for street --> + <!-- any number of loc-st can be created but 2 is good --> + <p class="stl">008, Papanna street</p> + <p class="stl">St Mark's Rd</p> + + <!-- city --> + <p class="ct">Bengaluru</p> + + <!-- state --> + <p class="st">Karnataka</p> + + <!-- pincode --> + <p class="pc">560001</p> + + <!-- country --> + <p class="ctry">India</p> + </div> + + <!-- review --> + <section class="rjs-restaurant-1-reviews"> + + <div class="urate"> + <!-- rating value --> + <p class="rv">4.5</p> + + <!-- max rate --> + <p class="mr">5</p> + + <!-- authorO is Organisation class - pub class prop not req--> + <!-- authorP is Person class - pub class prop req--> + <!-- <p class="review-authorO">Foogle</p> --> + <p class="raterP">Dean</p> + + <p class="rpOn">Amazon</p> + </div> + + <div class="urate"> + <!-- rating value --> + <p class="rv">4.5</p> + + <!-- max rate --> + <p class="mr">5</p> + + <!-- authorO is Organisation class - pub class prop not req--> + <!-- authorP is Person class - pub class prop req--> + <!-- <p class="review-authorO">Foogle</p> --> + <p class="raterP">Someone</p> + + <p class="rpOn">Noogle</p> + </div> + + </section> + + <!-- telephone --> + <!-- data-reservation="true" for reservation accepted (Boolean)--> + <p class="rjs-restaurant-1-tel" data-reserve="true">+91-84259372x3</p> + + <!-- serv cuisine - can be more than 1--> + <p class="rjs-restaurant-1-csnt">Asian</p> + <p class="rjs-restaurant-1-csnt">Mexican</p> + + <!-- price range --> + <p class="rjs-restaurant-1-cost">INR 200 - INR 500</p> + + <!-- opening hour specification --> + <section class="rjs-restaurant-1-workhours"> + <!-- wdr for working day range --> + <!-- wdr-HR capital HR means 24 hour format specification --> + <!-- wdr-hr capital hr means 12 hour format specification --> + <!-- sepeartor should be - --> + <p class="wdr">Sunday - Thursday <span class="HR">(10:00 - 21:00)</span></p> + <!-- <p class="wdr">Sunday - Thursday <span class="wdr-hr">(10:00AM - 09:00PM)</span></p> --> + + <!-- wd for single working day--> + <!-- wd-HR capital HR means 24 hour format specification --> + <!-- wd-hr capital hr means 12 hour format specification --> + <p class="wd">Saturday <span class="HR">(13:00 - 18:00)</span></p> + <!-- <p class="wd">Saturday <span class="hr">(01:00PM - 06:00PM)</span></p> --> + + <p class="wd">Friday <span class="hr">(10:00AM - 06:00PM)</span></p> + + </section> + + <!-- menu optional menu url--> + <a class="rjs-restaurant-1-menu" href="https://www.restaurant.com/menu"> + <p>Menu</p> + </a> + + + <!-- aggregate review --> + <div class="rjs-restaurant-1-aggrate"> + <!-- aggregate rate that got --> + <p class="arv">100</p> + + <!-- max possibly rate --> + <p class="mr">100</p> + + <!-- total user rate count --> + <p class="rc">1000</p> + </div> + + <iframe class="rjs-restaurant-1-map" src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3888.010685301285!2d77.59783687373181!3d12.971167914890476!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3bae17900055fdd7%3A0x6d90920a8379858d!2sHookie%20Dookie%20Cafe%20Lounge!5e0!3m2!1sen!2sin!4v1714251053888!5m2!1sen!2sin" width="400" height="300" style="border:0;" allowfullscreen="" loading="lazy" referrerpolicy="no-referrer-when-downgrade"></iframe> + + <p class="rjs-restaurant-1-kw"> + <span>#Tag1</span> + <span>#Tag2</span> + <span>#Tag3</span> + <span>#Tag4</span> + </p> + + <p class="rjs-restaurant-1-areaserves"> + <span>Chennai</span> + <span>Osur</span> + <span>Hyderabad</span> + </p> + <!-- + <p class="rjs-restaurant-1-areaserves"> + Bangalore + </p> --> + </div> + + <!-- restaurant 2 --> + <div id="rjs-restaurant-2"> + <!-- name --> + <p class="rjs-restaurant-2-name">Gotham Restaurant</p> + + <!-- image=[] --> + <div> + <img class="rjs-restaurant-2-img" src="https://lh3.googleusercontent.com/p/AF1QipNaSKp5Aj8n9Pcqf2TCckFMMS93N4rEXmGHNTnd" alt="picture of reception"> + + </div> + + <!-- address --> + <!-- geo will be generated from address --> + <div class="rjs-restaurant-2-loc"> + <!-- loc-st for street --> + <!-- any number of loc-st can be created but 2 is good --> + <p class="stl">12 E 12th St</p> + + + <!-- city --> + <p class="ct">New York</p> + + <!-- state --> + <p class="st">NY</p> + + <!-- pincode --> + <p class="pc">10003</p> + + <!-- country --> + <p class="ctry">United States of America</p> + </div> + + <!-- review --> + <section class="rjs-restaurant-2-reviews"> + + <div class="urate"> + <!-- rating value --> + <p class="rv">4.9</p> + + <!-- max rate --> + <p class="mr">5</p> + + <!-- authorO is Organisation class - pub class prop not req--> + <!-- authorP is Person class - pub class prop req--> + <!-- <p class="review-authorO">Foogle</p> --> + <p class="raterP">Sammy</p> + + <p class="rpOn">Google</p> + </div> + + <div class="urate"> + <!-- rating value --> + <p class="rv">4.6</p> + + <!-- max rate --> + <p class="mr">5</p> + + <!-- authorO is Organisation class - pub class prop not req--> + <!-- authorP is Person class - pub class prop req--> + <!-- <p class="review-authorO">Foogle</p> --> + <p class="raterP">John</p> + + <p class="rpOn">Noogle</p> + </div> + + </section> + + <!-- telephone --> + <!-- data-reservation="true" for reservation accepted (Boolean)--> + <p class="rjs-restaurant-2-tel" data-reserve="false">+1 212-380-8x60</p> + + <!-- serv cuisine - can be more than 1--> + <p class="rjs-restaurant-2-csnt">American</p> + <p class="rjs-restaurant-2-csnt">Mexican</p> + + <!-- price range --> + <p class="rjs-restaurant-2-cost">$100 - $1200</p> + + <!-- opening hour specification --> + <section class="rjs-restaurant-2-workhours"> + <!-- wdr for working day range --> + <!-- wdr-HR capital HR means 24 hour format specification --> + <!-- wdr-hr capital hr means 12 hour format specification --> + <!-- sepeartor should be - --> + <p class="wdr">Saturday - Thursday<span class="HR">(08:00 - 21:00)</span></p> + + <!-- wd for single working day--> + <!-- wd-HR capital HR means 24 hour format specification --> + <!-- wd-hr capital hr means 12 hour format specification --> + <p class="wd">Saturday <span class="HR">(13:00 - 18:00)</span></p> + + <p class="wd">Friday <span class="hr">(10:00AM - 06:00PM)</span></p> + + </section> + + <!-- menu optional menu url--> + <a class="rjs-restaurant-2-menu" href="https://www.gotham.com/menu"> + <p>Menu</p> + </a> + + + <!-- aggregate review --> + <div class="rjs-restaurant-2-aggrate"> + <!-- aggregate rate that got --> + <p class="arv">78</p> + + <!-- max possibly rate --> + <p class="mr">100</p> + + <!-- total user rate count --> + <p class="rc">9873</p> + </div> + + <iframe class="rjs-restaurant-2-map" src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3023.264596144853!2d-73.99830762464724!3d40.73420297304284!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x89c25999ce85bd67%3A0x3d32c30c093bc099!2sGotham%20Restaurant!5e0!3m2!1sen!2sin!4v1714230109461!5m2!1sen!2sin" width="400" height="300" style="border:0;" allowfullscreen="" loading="lazy" referrerpolicy="no-referrer-when-downgrade"></iframe> + + <p class="rjs-restaurant-2-kw"> + <span>#Tag1</span> + <span>#Tag2</span> + <span>#Tag3</span> + <span>#Tag4</span> + </p> + + <!-- + <p class="rjs-restaurant-2-areaserves"> + <span>New York</span> + <span>Queens</span> + <span>Dakota</span> + </p> --> + + <p class="rjs-restaurant-2-areaserves"> + New York + </p> + </div> + </main> + + +</body></html> \ No newline at end of file diff --git a/test/outputs/browser-env/events.html b/test/outputs/browser-env/events.html new file mode 100644 index 0000000..745ed67 --- /dev/null +++ b/test/outputs/browser-env/events.html @@ -0,0 +1,239 @@ +<!DOCTYPE html><html lang="en"><head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Events</title> + <script src="./bundle.min.js"> + </script> + <script> + document.addEventListener('DOMContentLoaded', function() { + RichieJS.default({richieNames:['event']}) + }); + </script> +<script type="application/ld+json">[{"@context":"https://schema.org","@type":"Event","name":"The Age of AI","startDate":"2024-02-26T17:23:00+05:30","endDate":"2024-03-26T17:23:00+05:30","eventAttendanceMode":"OnlineEventAttendanceMode","eventStatus":"EventScheduled","location":[{"@type":"VirtualLocation","url":"https://open.spotify.com/genre/0JQ5DArNBzkmxXHCqFLx2J"}],"image":["https://jdi.group/wp-content/uploads/2023/07/AI-Event-Banner_Article-1-1536x768.jpg","https://neurosciencenews.com/files/2023/12/ai-life-prediction-neurosicencce.jpg.webp"],"description":"Explore the cutting-edge world of Deep Learning at our AI event! Dive into the latest advancements, breakthroughs, and applications of neural networks and deep learning algorithms. Join experts, researchers, and enthusiasts as we discuss the future of AI, its impact on various industries, and how deep learning is reshaping technology and society. From natural language processing to computer vision and beyond, discover the power of deep learning and its potential to revolutionize the way we live, work, and interact with machines.","offers":{"@type":"Offer","category":"Free","price":0,"priceCurrency":"INR","url":"https://www.yourjs-eventsite.com/book-event"},"performer":{"@type":"PerformingGroup","name":"DARSAN, DEAN and SAM"},"organizer":{"@type":"Organization","name":"Cresteem","url":"https://www.organisationpage.com"}},{"@context":"https://schema.org","@type":"Event","name":"The Age of Dark Web","startDate":"2024-02-26T17:23:00+05:30","endDate":"2024-03-26T17:23:00+05:30","eventAttendanceMode":"OfflineEventAttendanceMode","eventStatus":"EventMovedOnline","location":[{"@type":"Place","name":"The Grand Plaza","address":{"@type":"PostalAddress","streetAddress":"90, MGR Nagar Street, Public Office Road","addressLocality":"Nagapattinam","addressRegion":"TamilNadu","postalCode":611001,"addressCountry":"IN"}}],"image":["https://jdi.group/wp-content/uploads/2023/07/AI-Event-Banner_Article-1-1536x768.jpg","https://neurosciencenews.com/files/2023/12/ai-life-prediction-neurosicencce.jpg.webp"],"description":"Explore the mysterious realms of the Dark Web during this age of digital anonymity. 💻🌐 Uncover hidden networks, encrypted communication, and clandestine marketplaces. Delve into the shadows of cyberspace where anonymity reigns and secrets lurk. Discover the unseen corners of the internet and unlock the secrets of the digital underworld. #DarkWeb #CyberSecrecy #DigitalAge","offers":{"@type":"Offer","category":"Fees","price":200,"priceCurrency":"INR","url":"https://www.yourjs-eventsite.com/book-event"},"performer":{"@type":"Person","name":"DARSAN"},"organizer":{"@type":"Organization","name":"Cresteem","url":"https://www.organisationpage.com"}},{"@context":"https://schema.org","@type":"Event","name":"How to Win","startDate":"2024-02-26T17:23:00+05:30","endDate":"2024-03-26T17:23:00+05:30","eventAttendanceMode":"MixedEventAttendanceMode","eventStatus":"EventCancelled","location":[{"@type":"VirtualLocation","url":"https://open.spotify.com/genre/0JQ5DArNBzkmxXHCqFLx2J"},{"@type":"Place","name":"The Grand Plaza","address":{"@type":"PostalAddress","streetAddress":"90, MGR Nagar Street, Public Office Road","addressLocality":"Nagapattinam","addressRegion":"TamilNadu","postalCode":611001,"addressCountry":"IN"}}],"image":["https://jdi.group/wp-content/uploads/2023/07/AI-Event-Banner_Article-1-1536x768.jpg","https://neurosciencenews.com/files/2023/12/ai-life-prediction-neurosicencce.jpg.webp"],"description":"Unlock the secrets to winning your audience over in webinars! 🌟 Preparation is key: set clear objectives and rehearse your content. Engage with interactive elements like polls and Q&A to keep participants hooked. Keep it concise, visually appealing, and follow up afterward for maximum impact. Ready to captivate your audience? Let's make your next webinar a hit! 💼💻 #WebinarSuccess #Engagement #PreparationIsKey","offers":{"@type":"Offer","category":"Fees","price":10,"priceCurrency":"USD","url":"https://www.yourjs-eventsite.com/book-event"},"performer":{"@type":"PerformingGroup","name":"DEAN and SAM"},"organizer":{"@type":"Person","name":"JOHN","url":"https://www.userprofile.com"}}]</script></head> + +<body> + + <main> + + <!-- "1.online-event" --> + <div> + <p class="rjs-event-1-name">The Age of AI</p> + + <!-- starting date --> + <p>Starting Date: <span class="rjs-event-1-from">2024-02-26 05:23 PM</span></p> + + <!-- optional ending date --> + <p>Ending Date: <span class="rjs-event-1-end">2024-03-26 05:23 PM</span></p> + + <!-- Event mode --> + <p>Attendance Mode: <span class="rjs-event-1-mode" data-mode="online">Online</span></p> + + <!-- event status --> + <!-- <p>Event Status: <span class="rjs-event-1-sts" data-sts="postponed">Postponed</span></p> --> + <!-- <p>Event Status: <span class="rjs-event-1-sts" data-sts="toonline">Moved to Online</span></p> --> + <!-- <p>Event Status: <span class="rjs-event-1-sts" data-sts="cancelled">Cancelled</span></p> --> + <!-- <p>Event Status: <span class="rjs-event-1-sts" data-sts="rescheduled">Rescheduled</span></p> --> + <p>Event Status: <span class="rjs-event-1-sts" data-sts="scheduled">Scheduled</span></p> + + <!-- location --> + <section class="rjs-event-1-loc"> + <!-- online platform link --> + <a class="vlurl" href="https://open.spotify.com/genre/0JQ5DArNBzkmxXHCqFLx2J">Spotify Podcasts</a> + </section> + + <!-- any number of img possible--> + <img class="rjs-event-1-img" src="https://jdi.group/wp-content/uploads/2023/07/AI-Event-Banner_Article-1-1536x768.jpg" alt=""> + <img class="rjs-event-1-img" src="https://neurosciencenews.com/files/2023/12/ai-life-prediction-neurosicencce.jpg.webp" alt=""> + + + <!-- description --> + <p class="rjs-event-1-desc"><b>Explore the cutting-edge world of Deep Learning</b> at our AI event! Dive + into + the + latest advancements, breakthroughs, and applications of neural networks and deep learning algorithms. + Join experts, researchers, and enthusiasts as we discuss the future of AI, its impact on various + industries, and how deep learning is reshaping technology and society. From natural language processing + to computer vision and beyond, discover the power of deep learning and its potential to revolutionize + the way we live, work, and interact with machines.</p> + + <!-- offers --> + <!-- <p>Event Fee: <span class="rjs-event-1-cost">Free</span></p> --> + <p>Event Fee: <span class="rjs-event-1-cost" data-currency="free">FREE</span></p> + <!-- booking link --> + <a class="rjs-event-1-rlink" href="https://www.yourjs-eventsite.com/book-event">Book Here</a> + + <!--any number of performer possible--> + <p>Actor/Performer: + <span class="rjs-event-1-aname">DARSAN</span>, + <span class="rjs-event-1-aname">DEAN</span>, + <span class="rjs-event-1-aname">SAM</span> + </p> + + + <!-- organiser --> + <!-- pnameP is person / pnameO is organisation --> + <!-- <p>Organised By <span class="rjs-event-1-pnameP">JOHN</span></p> --> + <p>Organised By <a href="https://www.organisationpage.com" class="rjs-event-1-pnameO">Cresteem</a></p> + + + </div> + + + <!-- 2.offline-event --> + <div> + <p class="rjs-event-2-name">The Age of Dark Web</p> + + <!-- starting date --> + <p>Starting Date: <span class="rjs-event-2-from">2024-02-26 05:23 PM</span></p> + + <!-- optional ending date --> + <p>Ending Date: <span class="rjs-event-2-end">2024-03-26 05:23 PM</span></p> + + <!-- Event mode --> + <p>Attendance Mode: <span class="rjs-event-2-mode" data-mode="offline">Offline</span></p> + + <!-- event status --> + <!-- <p>Event Status: <span class="rjs-event-2-sts" data-sts="postponed">Postponed</span></p> --> + <p>Event Status: <span class="rjs-event-2-sts" data-sts="toonline">Moved to Online</span></p> + <!-- <p>Event Status: <span class="rjs-event-2-sts" data-sts="cancelled">Cancelled</span></p> --> + <!-- <p>Event Status: <span class="rjs-event-2-sts" data-sts="rescheduled">Rescheduled</span></p> --> + <!-- <p>Event Status: <span class="rjs-event-2-sts" data-sts="scheduled">Scheduled</span></p> --> + + <!-- location --> + <section class="rjs-event-2-loc"> + <p class="venue">The Grand Plaza</p> + <!-- st for street --> + <!-- any number of st can be created but 2 is good --> + <p class="stl">90, MGR Nagar Street</p> + <p class="stl">Public Office Road</p> + + <!-- city --> + <p class="ct">Nagapattinam</p> + + <!-- state --> + <p class="st">TamilNadu</p> + + <!-- pincode --> + <p class="pc">611-001</p> + + <!-- country --> + <p class="ctry">India</p> + </section> + + <!-- any number of img possible--> + <img class="rjs-event-2-img" src="https://jdi.group/wp-content/uploads/2023/07/AI-Event-Banner_Article-1-1536x768.jpg" alt=""> + <img class="rjs-event-2-img" src="https://neurosciencenews.com/files/2023/12/ai-life-prediction-neurosicencce.jpg.webp" alt=""> + + + <!-- description --> + <p class="rjs-event-2-desc">Explore the mysterious realms of the <strong>Dark Web</strong> during this age + of + digital anonymity. 💻🌐 Uncover hidden networks, encrypted communication, and clandestine marketplaces. + Delve into the <strong>shadows of cyberspace</strong> where anonymity reigns and secrets lurk. Discover + the <strong>unseen corners</strong> of the internet and unlock the secrets of the digital underworld. + #DarkWeb #CyberSecrecy #DigitalAge</p> + + <!-- offers --> + <!-- <p>Event Fee: <span class="rjs-event-2-cost">Free</span></p> --> + <p>Event Fee: <span class="rjs-event-2-cost" data-currency="inr">200 INR</span></p> + <!-- booking link --> + <a class="rjs-event-2-rlink" href="https://www.yourjs-eventsite.com/book-event">Book Here</a> + + <!--any number of performer possible--> + <p>Actor/Performer: + <span class="rjs-event-2-aname">DARSAN</span>, + </p> + + + <!-- organiser --> + <!-- pnameP is person / pnameO is organisation --> + <!-- <p>Organised By <span class="rjs-event-2-pnameP">JOHN</span></p> --> + <p>Organised By <a href="https://www.organisationpage.com" class="rjs-event-2-pnameO">Cresteem</a></p> + + + </div> + + + <!-- mixed-event --> + <div> + + <p class="rjs-event-3-name">How to Win</p> + + <!-- starting date --> + <p>Starting Date: <span class="rjs-event-3-from">2024-02-26 05:23 PM</span></p> + + <!-- optional ending date --> + <p>Ending Date: <span class="rjs-event-3-end">2024-03-26 05:23 PM</span></p> + + <!-- Event mode --> + <p>Attendance Mode: <span class="rjs-event-3-mode" data-mode="mixed">Online and Offline</span></p> + + <!-- event status --> + <p>Event Status: <span class="rjs-event-3-sts" data-sts="cancelled">Cancelled</span></p> + + + <!-- location --> + <section class="rjs-event-3-loc"> + <p class="venue">The Grand Plaza</p> + <!-- st for street --> + <!-- any number of st can be created but 2 is good --> + <p class="stl">90, MGR Nagar Street</p> + <p class="stl">Public Office Road</p> + + <!-- city --> + <p class="ct">Nagapattinam</p> + + <!-- state --> + <p class="st">TamilNadu</p> + + <!-- pincode --> + <p class="pc">611-001</p> + + <!-- country --> + <p class="ctry">India</p> + + <!-- online platform link --> + <a class="vlurl" href="https://open.spotify.com/genre/0JQ5DArNBzkmxXHCqFLx2J">Spotify Podcasts</a> + + </section> + + <!-- any number of img possible--> + <img class="rjs-event-3-img" src="https://jdi.group/wp-content/uploads/2023/07/AI-Event-Banner_Article-1-1536x768.jpg" alt=""> + <img class="rjs-event-3-img" src="https://neurosciencenews.com/files/2023/12/ai-life-prediction-neurosicencce.jpg.webp" alt=""> + + + <!-- description --> + <p class="rjs-event-3-desc">Unlock the secrets to <strong>winning your audience over in webinars!</strong> + 🌟 + <strong>Preparation is key:</strong> set clear objectives and rehearse your content. Engage with + <strong>interactive elements</strong> like polls and Q&A to keep participants hooked. Keep it + <strong>concise</strong>, <strong>visually appealing</strong>, and follow up afterward for maximum + impact. Ready to captivate your audience? Let's make your next webinar a hit! 💼💻 #WebinarSuccess + #Engagement #PreparationIsKey + </p> + + <!-- offers --> + <!-- <p>Event Fee: <span class="rjs-event-3-cost">Free</span></p> --> + <p>Event Fee: <span class="rjs-event-3-cost" data-currency="USD">10 USD</span></p> + <!-- booking link --> + <a class="rjs-event-3-rlink" href="https://www.yourjs-eventsite.com/book-event">Book Here</a> + + <!--any number of performer possible--> + <p>Actor/Performer: + <span class="rjs-event-3-aname">DEAN</span>, + <span class="rjs-event-3-aname">SAM</span> + </p> + + + <!-- organiser --> + <!-- pnameP is person / pnameO is organisation --> + <p>Organised By <a href="https://www.userprofile.com" class="rjs-event-3-pnameP">JOHN</a></p> + + + </div> + </main> + + + + +</body></html> \ No newline at end of file diff --git a/test/outputs/browser-env/faq.html b/test/outputs/browser-env/faq.html new file mode 100644 index 0000000..804be72 --- /dev/null +++ b/test/outputs/browser-env/faq.html @@ -0,0 +1,79 @@ +<!DOCTYPE html><html lang="en"><head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>FAQ Page</title> + <script src="./bundle.min.js"> + </script> + <script> + document.addEventListener('DOMContentLoaded', function () { + RichieJS.default({ richieNames: ['faq'] }) + }); + </script> +<script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Can you provide a content management system (CMS) that allows me to update the website easily?","acceptedAnswer":{"@type":"Answer","text":"Certainly! We take pride in crafting custom Content Management Systems (CMS) tailored exclusively to your requirements. Unlike common pre-made template CMS, our solutions are designed with your unique needs in mind. With Cresteem, managing your website's content is not only simple but also seamlessly integrated for a truly personalized experience."}},{"@type":"Question","name":"Do you offer any additional services, such as digital marketing, SEO, or social media management, to help promote the website?","acceptedAnswer":{"@type":"Answer","text":"Absolutely! Beyond website development, Cresteem offers an array of comprehensive services. Our immersive digital marketing strategies are finely tuned to captivate your potential clients, ensuring rapid growth. We deploy strategic operations to optimize your website's performance, and our expertise extends to captivating your target audience on various social media platforms. We're your one-stop solution for a powerful online presence."}},{"@type":"Question","name":"Will the website be optimized for fast loading times and performance?","acceptedAnswer":{"@type":"Answer","text":"At Cresteem, yes optimizing website performance is our top priority. We're dedicated to creating highly accessible, lightning-fast, and reliable web applications, landing pages, or e-commerce platforms tailored to your business. Our commitment is evident in our track record of achieving load times consistently below 2 seconds. We employ a range of cutting-edge tools and techniques, including Google PageSpeed Insights, responsive design, and emulated devices, to ensure your website maintains the highest quality and speed."}}]}</script></head> + +<body> + <!-- rjs resvered name - faq reservered name - id(unique number) - reserved wrappername --> + <details class="rjs-faq"> + + <summary class="question"> + Can you provide a content management system (CMS) that allows me to + update the website easily? + </summary> + + <p class="answer"> + <b>Certainly! We take pride in crafting custom Content Management + Systems (CMS) tailored exclusively to your requirements.</b> + Unlike common pre-made template CMS, our solutions are designed with + your unique needs in mind. With Cresteem, managing your website's + content is not only simple but also seamlessly integrated for a + truly + <b>personalized experience.</b> + </p> + + </details> + + + <details class="rjs-faq"> + + <summary class="question"> + Do you offer any additional services, such as digital marketing, + SEO, or social media management, to help promote the website? + </summary> + + <p class="answer"> + <b>Absolutely! Beyond website development,</b> Cresteem offers an + array of comprehensive services. Our immersive + <b>digital marketing strategies are finely tuned to captivate your + potential clients</b>, ensuring rapid growth. We deploy strategic operations to optimize + your website's performance, and our expertise extends to captivating + your target audience on various social media platforms. + <b>We're your one-stop solution for a powerful online presence.</b> + </p> + </details> + + + <details class="rjs-faq"> + + <summary class="question"> + Will the website be optimized for fast loading times and + performance? + </summary> + + <p class="answer"> + At Cresteem, + <b>yes optimizing website performance is our top priority.</b> We're + dedicated to creating + <b>highly accessible, lightning-fast, and reliable web applications, + landing pages, or e-commerce platforms</b> + tailored to your business. Our commitment is evident in our + <b>track record of achieving load times consistently below 2 + seconds.</b> + We employ a range of cutting-edge tools and techniques, including + Google PageSpeed Insights, responsive design, and emulated devices, + to ensure your website maintains the highest quality and speed. + </p> + </details> + + + +</body></html> \ No newline at end of file diff --git a/test/outputs/browser-env/localbusiness.html b/test/outputs/browser-env/localbusiness.html new file mode 100644 index 0000000..620d410 --- /dev/null +++ b/test/outputs/browser-env/localbusiness.html @@ -0,0 +1,283 @@ +<!DOCTYPE html><html lang="en"><head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Restaurants</title> + <script src="./bundle.min.js"> + </script> + <script> + document.addEventListener('DOMContentLoaded', function () { + RichieJS.default({ richieNames: ['localbusiness'] }) + }); + </script> +<script type="application/ld+json">[{"@context":"https://schema.org","@type":"LocalBusiness","name":"Hookie Dookie","address":{"@type":"PostalAddress","streetAddress":"008, Papanna street, St Mark's Rd","addressLocality":"Bengaluru","addressRegion":"Karnataka","postalCode":560001,"addressCountry":"IN"},"image":["https://i.imgur.com/3aIBedv.jpeg","https://i.imgur.com/RbIZogg.jpeg","https://i.imgur.com/UL6OJWN.jpeg"],"review":[{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.5,"bestRating":5},"author":{"@type":"Person","name":"Dean"},"publisher":{"@type":"Organization","name":"Amazon"}},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.5,"bestRating":5},"author":{"@type":"Person","name":"Someone"},"publisher":{"@type":"Organization","name":"Noogle"}}],"geo":{"@type":"GeoCoordinates","latitude":12.971167914890476,"longitude":77.5978368737318},"url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/localbusiness#rjs-lb-1","telephone":"+91-84259372x3","priceRange":"INR 200 - INR 500","openingHoursSpecification":[{"@type":"OpeningHoursSpecification","dayOfWeek":["Sunday","Monday","Tuesday","Wednesday","Thursday"],"opens":"10:00","closes":"21:00"},{"@type":"OpeningHoursSpecification","dayOfWeek":["Saturday"],"opens":"13:00","closes":"18:00"},{"@type":"OpeningHoursSpecification","dayOfWeek":["Friday"],"opens":"10:00","closes":"18:00"}],"acceptsReservations":true,"aggregateRating":{"@type":"AggregateRating","ratingValue":100,"bestRating":100,"ratingCount":1000},"areaServed":["Chennai","Osur","Hyderabad"],"menu":"https://www.restaurant.com/menu","keywords":"#Tag1, #Tag2, #Tag3, #Tag4"},{"@context":"https://schema.org","@type":"LocalBusiness","name":"Gotham Restaurant","address":{"@type":"PostalAddress","streetAddress":"12 E 12th St","addressLocality":"New York","addressRegion":"NY","postalCode":10003,"addressCountry":"US"},"image":["https://lh3.googleusercontent.com/p/AF1QipNaSKp5Aj8n9Pcqf2TCckFMMS93N4rEXmGHNTnd"],"review":[{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.9,"bestRating":5},"author":{"@type":"Person","name":"Sammy"},"publisher":{"@type":"Organization","name":"Google"}},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.6,"bestRating":5},"author":{"@type":"Person","name":"John"},"publisher":{"@type":"Organization","name":"Noogle"}}],"geo":{"@type":"GeoCoordinates","latitude":40.73420297304284,"longitude":-73.9983076246472},"url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/localbusiness#rjs-lb-2","telephone":"+1 212-380-8x60","priceRange":"$100 - $1200","openingHoursSpecification":[{"@type":"OpeningHoursSpecification","dayOfWeek":["Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday"],"opens":"08:00","closes":"21:00"},{"@type":"OpeningHoursSpecification","dayOfWeek":["Saturday"],"opens":"13:00","closes":"18:00"},{"@type":"OpeningHoursSpecification","dayOfWeek":["Friday"],"opens":"10:00","closes":"18:00"}],"acceptsReservations":false,"aggregateRating":{"@type":"AggregateRating","ratingValue":78,"bestRating":100,"ratingCount":9873},"areaServed":["NewYork"],"menu":"https://www.gotham.com/menu","keywords":"#Tag1, #Tag2, #Tag3, #Tag4"}]</script></head> + +<body> + <main> + <div id="rjs-lb-1"> + <!-- name --> + <p class="rjs-lb-1-name">Hookie Dookie</p> + + <!-- image=[] --> + <div> + <img class="rjs-lb-1-img" src="https://i.imgur.com/3aIBedv.jpeg" alt="picture of reception"> + <img class="rjs-lb-1-img" src="https://i.imgur.com/RbIZogg.jpeg" alt="another 1"> + <img class="rjs-lb-1-img" src="https://i.imgur.com/UL6OJWN.jpeg" alt="another 1"> + </div> + + <!-- address --> + <!-- geo will be generated from address --> + <div class="rjs-lb-1-loc"> + <!-- loc-st for street --> + <!-- any number of loc-st can be created but 2 is good --> + <p class="stl">008, Papanna street</p> + <p class="stl">St Mark's Rd</p> + + <!-- city --> + <p class="ct">Bengaluru</p> + + <!-- state --> + <p class="st">Karnataka</p> + + <!-- pincode --> + <p class="pc">560001</p> + + <!-- country --> + <p class="ctry">India</p> + </div> + + <!-- review --> + <section class="rjs-lb-1-reviews"> + + <div class="urate"> + <!-- rating value --> + <p class="rv">4.5</p> + + <!-- max rate --> + <p class="mr">5</p> + + <!-- authorO is Organisation class - pub class prop not req--> + <!-- authorP is Person class - pub class prop req--> + <!-- <p class="review-authorO">Foogle</p> --> + <p class="raterP">Dean</p> + + <p class="rpOn">Amazon</p> + </div> + + <div class="urate"> + <!-- rating value --> + <p class="rv">4.5</p> + + <!-- max rate --> + <p class="mr">5</p> + + <!-- authorO is Organisation class - pub class prop not req--> + <!-- authorP is Person class - pub class prop req--> + <!-- <p class="review-authorO">Foogle</p> --> + <p class="raterP">Someone</p> + + <p class="rpOn">Noogle</p> + </div> + + </section> + + <!-- telephone --> + <!-- data-reservation="true" for reservation accepted (Boolean)--> + <p class="rjs-lb-1-tel" data-reserve="true">+91-84259372x3</p> + + <!-- serv cuisine - can be more than 1--> + <p class="rjs-lb-1-csnt">Asian</p> + <p class="rjs-lb-1-csnt">Mexican</p> + + <!-- cost range --> + <p class="rjs-lb-1-cost">INR 200 - INR 500</p> + + <!-- opening hour specification --> + <section class="rjs-lb-1-workhours"> + <!-- wdr for working day range --> + <!-- wdr-HR capital HR means 24 hour format specification --> + <!-- wdr-hr capital hr means 12 hour format specification --> + <!-- sepeartor should be - --> + <p class="wdr">Sunday - Thursday <span class="HR">(10:00 - 21:00)</span></p> + <!-- <p class="wdr">Sunday - Thursday <span class="wdr-hr">(10:00AM - 09:00PM)</span></p> --> + + <!-- wd for single working day--> + <!-- wd-HR capital HR means 24 hour format specification --> + <!-- wd-hr capital hr means 12 hour format specification --> + <p class="wd">Saturday <span class="HR">(13:00 - 18:00)</span></p> + <!-- <p class="wd">Saturday <span class="hr">(01:00PM - 06:00PM)</span></p> --> + + <p class="wd">Friday <span class="hr">(10:00AM - 06:00PM)</span></p> + + </section> + + <!-- menu optional menu url--> + <a class="rjs-lb-1-menu" href="https://www.restaurant.com/menu"> + <p>Menu</p> + </a> + + + <!-- aggregate review --> + <div class="rjs-lb-1-aggrate"> + <!-- aggregate rate that got --> + <p class="arv">100</p> + + <!-- max possibly rate --> + <p class="mr">100</p> + + <!-- total user rate count --> + <p class="rc">1000</p> + </div> + + <iframe class="rjs-lb-1-map" src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3888.010685301285!2d77.59783687373181!3d12.971167914890476!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3bae17900055fdd7%3A0x6d90920a8379858d!2sHookie%20Dookie%20Cafe%20Lounge!5e0!3m2!1sen!2sin!4v1714251053888!5m2!1sen!2sin" width="400" height="300" style="border:0;" allowfullscreen="" loading="lazy" referrerpolicy="no-referrer-when-downgrade"></iframe> + + <p class="rjs-lb-1-kw"> + <span>#Tag1</span> + <span>#Tag2</span> + <span>#Tag3</span> + <span>#Tag4</span> + </p> + + <p class="rjs-lb-1-areaserves"> + <span>Chennai</span> + <span>Osur</span> + <span>Hyderabad</span> + </p> + <!-- + <p class="rjs-lb-1-areaserves"> + Bangalore + </p> --> + </div> + + <!-- restaurant 2 --> + <div id="rjs-lb-2"> + <!-- name --> + <p class="rjs-lb-2-name">Gotham Restaurant</p> + + <!-- image=[] --> + <div> + <img class="rjs-lb-2-img" src="https://lh3.googleusercontent.com/p/AF1QipNaSKp5Aj8n9Pcqf2TCckFMMS93N4rEXmGHNTnd" alt="picture of reception"> + + </div> + + <!-- address --> + <!-- geo will be generated from address --> + <div class="rjs-lb-2-loc"> + <!-- loc-st for street --> + <!-- any number of loc-st can be created but 2 is good --> + <p class="stl">12 E 12th St</p> + + + <!-- city --> + <p class="ct">New York</p> + + <!-- state --> + <p class="st">NY</p> + + <!-- pincode --> + <p class="pc">10003</p> + + <!-- country --> + <p class="ctry">United States of America</p> + </div> + + <!-- review --> + <section class="rjs-lb-2-reviews"> + + <div class="urate"> + <!-- rating value --> + <p class="rv">4.9</p> + + <!-- max rate --> + <p class="mr">5</p> + + <!-- authorO is Organisation class - pub class prop not req--> + <!-- authorP is Person class - pub class prop req--> + <!-- <p class="review-authorO">Foogle</p> --> + <p class="raterP">Sammy</p> + + <p class="rpOn">Google</p> + </div> + + <div class="urate"> + <!-- rating value --> + <p class="rv">4.6</p> + + <!-- max rate --> + <p class="mr">5</p> + + <!-- authorO is Organisation class - pub class prop not req--> + <!-- authorP is Person class - pub class prop req--> + <!-- <p class="review-authorO">Foogle</p> --> + <p class="raterP">John</p> + + <p class="rpOn">Noogle</p> + </div> + + </section> + + <!-- telephone --> + <!-- data-reservation="true" for reservation accepted (Boolean)--> + <p class="rjs-lb-2-tel" data-reserve="false">+1 212-380-8x60</p> + + + <!-- cost range --> + <p class="rjs-lb-2-cost">$100 - $1200</p> + + <!-- opening hour specification --> + <section class="rjs-lb-2-workhours"> + <!-- wdr for working day range --> + <!-- wdr-HR capital HR means 24 hour format specification --> + <!-- wdr-hr capital hr means 12 hour format specification --> + <!-- sepeartor should be - --> + <p class="wdr">Saturday - Thursday<span class="HR">(08:00 - 21:00)</span></p> + + <!-- wd for single working day--> + <!-- wd-HR capital HR means 24 hour format specification --> + <!-- wd-hr capital hr means 12 hour format specification --> + <p class="wd">Saturday <span class="HR">(13:00 - 18:00)</span></p> + + <p class="wd">Friday <span class="hr">(10:00AM - 06:00PM)</span></p> + + </section> + + <!-- menu optional menu url--> + <a class="rjs-lb-2-menu" href="https://www.gotham.com/menu"> + <p>Menu</p> + </a> + + + <!-- aggregate review --> + <div class="rjs-lb-2-aggrate"> + <!-- aggregate rate that got --> + <p class="arv">78</p> + + <!-- max possibly rate --> + <p class="mr">100</p> + + <!-- total user rate count --> + <p class="rc">9873</p> + </div> + + <iframe class="rjs-lb-2-map" src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3023.264596144853!2d-73.99830762464724!3d40.73420297304284!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x89c25999ce85bd67%3A0x3d32c30c093bc099!2sGotham%20Restaurant!5e0!3m2!1sen!2sin!4v1714230109461!5m2!1sen!2sin" width="400" height="300" style="border:0;" allowfullscreen="" loading="lazy" referrerpolicy="no-referrer-when-downgrade"></iframe> + + <p class="rjs-lb-2-kw"> + <span>#Tag1</span> + <span>#Tag2</span> + <span>#Tag3</span> + <span>#Tag4</span> + </p> + <!-- + <p class="rjs-lb-2-areaserves"> + <span>New York</span> + <span>Queens</span> + <span>Dakota</span> + </p> --> + + <p class="rjs-lb-2-areaserves"> + New York + </p> + </div> + </main> + + +</body></html> \ No newline at end of file diff --git a/test/outputs/browser-env/org.html b/test/outputs/browser-env/org.html new file mode 100644 index 0000000..a9dbd7f --- /dev/null +++ b/test/outputs/browser-env/org.html @@ -0,0 +1,142 @@ +<!DOCTYPE html><html lang="en"><head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Organisation</title> + <script src="./bundle.min.js"> + </script> + <script> + document.addEventListener('DOMContentLoaded', function () { + RichieJS.default({ richieNames: ['organization'] }) + }); + </script> +<script type="application/ld+json">[{"@context":"https://schema.org","@type":"Organization","name":"VideoLANO","logo":"https://www.videolano.com/img/logo.webp","image":["https://t3.ftcdn.net/jpg/06/31/36/22/360_F_631362231_5VR8Eo0R8VEflgSIfl0RgQvzyW194T5c.jpg","https://t3.ftcdn.net/jpg/06/31/36/22/360_F_631362231_5VR8Eo0R8VEflgSIfl0RgQvzyW194T5c.jpg","https://t3.ftcdn.net/jpg/06/31/36/22/360_F_631362231_5VR8Eo0R8VEflgSIfl0RgQvzyW194T5c.jpg"],"url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/org","sameAs":["https://www.instagram.com/videolano/","https://www.linkedin.com/in/videolano/","https://www.youtube.com/channel/videolano/"],"description":"We are a premier software company, offering top-notch web, mobile, and desktop development, SEO, digital marketing, UI/UX, and software solutions. With advanced AI integration, we deliver excellence on time, creatively, and affordably.","email":"hello@videolano.com","telephone":"+91-8425937x53","address":{"@type":"PostalAddress","streetAddress":"90, MGR Nagar Street, Public Office Road","addressLocality":"Nagapattinam","addressRegion":"TamilNadu","postalCode":611001,"addressCountry":"IN"},"foundingDate":"2023","taxID":"IN8E679878"},{"@context":"https://schema.org","@type":"Organization","name":"Joogle","logo":"https://www.joogle.com/img/logo.webp","image":["https://www.joogle.com/1.jpg","https://www.joogle.com/2.jpg","https://www.joogle.com/3.jpg"],"url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/org","sameAs":["https://www.instagram.com/joogle/","https://www.linkedin.com/in/joogle/","https://www.youtube.com/channel/joogle"],"description":"Joogle Web Design located in the Northern Suburbs is one of Perth's most affordable web design company's","email":"hello@joogle.com","telephone":"098733x2530","address":{"@type":"PostalAddress","streetAddress":"10,XYZ Street","addressLocality":"Chennai","addressRegion":"TamilNadu","postalCode":600028,"addressCountry":"IN"},"foundingDate":"2024","taxID":"IN9079875C"}]</script></head> + +<body> + <main> + + <!-- organisation instance 1 --> + <div id="org1"> + + <!-- name --> + <p class="rjs-org-1-name">VideoLANO</p> + + <!-- logo --> + <img class="rjs-org-1-logo" src="https://www.videolano.com/img/logo.webp" alt=""> + + <!-- image=[] --> + <div> + <img class="rjs-org-1-img" src="https://t3.ftcdn.net/jpg/06/31/36/22/360_F_631362231_5VR8Eo0R8VEflgSIfl0RgQvzyW194T5c.jpg" alt="picture of reception"> + + <img class="rjs-org-1-img" src="https://t3.ftcdn.net/jpg/06/31/36/22/360_F_631362231_5VR8Eo0R8VEflgSIfl0RgQvzyW194T5c.jpg" alt="another 1"> + + <img class="rjs-org-1-img" src="https://t3.ftcdn.net/jpg/06/31/36/22/360_F_631362231_5VR8Eo0R8VEflgSIfl0RgQvzyW194T5c.jpg" alt="another 1"> + </div> + + <!-- address --> + <div class="rjs-org-1-loc"> + <!-- loc-st for street --> + <!-- any number of loc-st can be created but 2 is good --> + <p class="stl">90, MGR Nagar Street</p> + <p class="stl">Public Office Road</p> + + <!-- city --> + <p class="ct">Nagapattinam</p> + + <!-- state --> + <p class="st">TamilNadu</p> + + <!-- pincode --> + <p class="pc">611-001</p> + + <!-- country --> + <p class="ctry">India</p> + </div> + + <!-- telephone --> + <p class="rjs-org-1-tel">+91-8425937x53</p> + + <!-- social media links --> + <section> + <a href="https://www.instagram.com/videolano/" class="rjs-org-1-rlink">Instagram</a> + <a href="https://www.linkedin.com/in/videolano/" class="rjs-org-1-rlink">LinkedIN</a> + <a href="https://www.youtube.com/channel/videolano/" class="rjs-org-1-rlink">Youtube</a> + </section> + + <p class="rjs-org-1-desc"> + We are a premier <b>software company</b>, offering top-notch web, mobile, and desktop development, SEO, + digital + marketing, UI/UX, and software solutions. With advanced <span>AI integration</span>, we deliver + excellence on time, + creatively, and affordably. + </p> + + <p class="rjs-org-1-email">hello@videolano.com</p> + + <p class="rjs-org-1-tid">IN8E679878</p> + + <p class="rjs-org-1-found">2023</p> + + </div> + + <!-- org instance 2 --> + <!-- organisation instance 1 --> + <div id="org2"> + + <!-- name --> + <p class="rjs-org-2-name">Joogle</p> + + <!-- logo --> + <img class="rjs-org-2-logo" src="https://www.joogle.com/img/logo.webp" alt=""> + + <!-- image=[] --> + <div> + <img class="rjs-org-2-img" src="https://www.joogle.com/1.jpg" alt="picture of reception"> + <img class="rjs-org-2-img" src="https://www.joogle.com/2.jpg" alt="another 1"> + <img class="rjs-org-2-img" src="https://www.joogle.com/3.jpg" alt="another 1"> + </div> + + <!-- address --> + <div class="rjs-org-2-loc"> + <!-- loc-st for street --> + <!-- any number of loc-st can be created but 2 is good --> + <p class="stl">10,XYZ Street</p> + + + <!-- city --> + <p class="ct">Chennai</p> + + <!-- state --> + <p class="st">TamilNadu</p> + + <!-- pincode --> + <p class="pc">600028</p> + + <!-- country --> + <p class="ctry">India</p> + </div> + + <!-- telephone --> + <p class="rjs-org-2-tel">098733x2530</p> + + <!-- social media links --> + <section> + <a href="https://www.instagram.com/joogle/" class="rjs-org-2-rlink">Instagram</a> + <a href="https://www.linkedin.com/in/joogle/" class="rjs-org-2-rlink">LinkedIN</a> + <a href="https://www.youtube.com/channel/joogle" class="rjs-org-2-rlink">Youtube</a> + </section> + + <p class="rjs-org-2-desc"> + Joogle Web Design located in the Northern Suburbs is one of Perth's most affordable web design company's + </p> + + <p class="rjs-org-2-email">hello@joogle.com</p> + + <p class="rjs-org-2-tid">IN9079875C</p> + + <p class="rjs-org-2-found">2024</p> + + </div> + </main> + + +</body></html> \ No newline at end of file diff --git a/test/outputs/browser-env/product.html b/test/outputs/browser-env/product.html new file mode 100644 index 0000000..9a01587 --- /dev/null +++ b/test/outputs/browser-env/product.html @@ -0,0 +1,187 @@ +<!DOCTYPE html><html lang="en"><head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Product Page</title> + <script src="./bundle.min.js"> + </script> + <script> + document.addEventListener('DOMContentLoaded', function () { + RichieJS.default({ richieNames: ['product'] }) + }); + </script> +<script type="application/ld+json">[{"@context":"https://schema.org/","@type":"Product","name":"Denim Jacket","image":["https://example.com/image1.jpg","https://example.com/image2.jpg"],"description":"Product Description Lorem ipsum dolor sit amet, consectetur adipiscing elit.","sku":"123456789","mpn":"ABC123","brand":{"@type":"Brand","name":"XYZ Brand"},"review":[{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.5,"bestRating":5},"author":{"@type":"Person","name":"John"}},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.5,"bestRating":5},"author":{"@type":"Organization","name":"Foogle"}}],"aggregateRating":{"@type":"AggregateRating","ratingValue":100,"bestRating":100,"ratingCount":1000},"offers":{"@type":"Offer","category":"Fees","price":990,"priceCurrency":"INR","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/product","priceValidUntil":"1970-01-31T00:00:00.000Z","availability":"InStock","itemCondition":"NewCondition","hasMerchantReturnPolicy":{"@type":"MerchantReturnPolicy","applicableCountry":"IN","returnPolicyCategory":"MerchantReturnFiniteReturnWindow","merchantReturnDays":30,"returnMethod":"ReturnByMail","returnFees":"FreeReturn"},"shippingDetails":{"@type":"OfferShippingDetails","shippingRate":{"@type":"MonetaryAmount","value":80,"currency":"INR"},"shippingDestination":{"@type":"DefinedRegion","addressCountry":"IN"},"deliveryTime":{"@type":"ShippingDeliveryTime","handlingTime":{"@type":"QuantitativeValue","minValue":1,"maxValue":3,"unitCode":"DAY"},"transitTime":{"@type":"QuantitativeValue","minValue":3,"maxValue":5,"unitCode":"DAY"}}}}},{"@context":"https://schema.org/","@type":"Product","name":"Denim Jacket","image":["https://example.com/image1.jpg","https://example.com/image2.jpg"],"description":"Product Description Lorem ipsum dolor sit amet, consectetur adipiscing elit.","sku":"123456789","mpn":"ABC123","brand":{"@type":"Brand","name":"XYZ Brand"},"review":[{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.5,"bestRating":5},"author":{"@type":"Person","name":"John"}},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.5,"bestRating":5},"author":{"@type":"Organization","name":"Foogle"}}],"aggregateRating":{"@type":"AggregateRating","ratingValue":100,"bestRating":100,"ratingCount":1000},"offers":{"@type":"Offer","category":"Fees","price":990,"priceCurrency":"INR","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/product","priceValidUntil":"1970-01-31T00:00:00.000Z","availability":"InStock","itemCondition":"UsedCondition","hasMerchantReturnPolicy":{"@type":"MerchantReturnPolicy","applicableCountry":"IN","returnPolicyCategory":"MerchantReturnFiniteReturnWindow","merchantReturnDays":30,"returnMethod":"ReturnByMail","returnFees":"FreeReturn"},"shippingDetails":{"@type":"OfferShippingDetails","shippingRate":{"@type":"MonetaryAmount","value":80,"currency":"INR"},"shippingDestination":{"@type":"DefinedRegion","addressCountry":"IN"},"deliveryTime":{"@type":"ShippingDeliveryTime","handlingTime":{"@type":"QuantitativeValue","minValue":1,"maxValue":3,"unitCode":"DAY"},"transitTime":{"@type":"QuantitativeValue","minValue":3,"maxValue":5,"unitCode":"DAY"}}}}}]</script></head> + +<body> + <!-- product instance 1 --> + <div class="product"> + + <!-- name --> + <h1 class="rjs-prod-1-name">Denim Jacket </h1> + + <!-- images --> + <img class="rjs-prod-1-img" src="https://example.com/image1.jpg" alt="Product Image 1"> + <img class="rjs-prod-1-img" src="https://example.com/image2.jpg" alt="Product Image 2"> + + <!-- description --> + <p class="rjs-prod-1-desc">Product Description Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> + + <!-- skuid --> + <p>SKU ID: <span class="rjs-prod-1-sku">123456789</span></p> + + <!--mpn code --> + <p>MPN Code: <span class="rjs-prod-1-mpn">ABC123</span></p> + + <!-- brand name --> + <p>Brand: <span class="rjs-prod-1-brand">XYZ Brand</span></p> + + + <p>Price: <span class="rjs-prod-1-cost" data-currency="inr">990</span></p> + + <p>Availability: <span class="rjs-prod-1-avail" data-avail="true">In Stock</span></p> + + + <p>Item Condition: <span class="rjs-prod-1-cond" data-cond="new">New</span></p> + + + <p>Return Policy: <span class="rjs-prod-1-returnin">30 days</span></p> + + <p>Return Fees: <span class="rjs-prod-1-returnfee">Free</span></p> + + <!-- delivery across and return policy applicable country --> + <p>Shipping Cost: <span class="rjs-prod-1-delcost" data-delover="india">80</span></p> + + <p class="rjs-prod-1-ptime" data-range="1-3">Processing Time: 1-3 business days</p> + + <p class="rjs-prod-1-ttime" data-range="3-5">Estimated Delivery Time: 3-5 business days</p> + + + <!-- review --> + <section class="rjs-prod-1-reviews"> + <div class="urate"> + <!-- rating value --> + <p class="rv">4.5</p> + + <!-- max rate --> + <p class="mr">5</p> + + <!-- authorO is Organisation class - pub class prop not req--> + <!-- authorP is Person class - pub class prop req--> + <p class="raterP">John</p> + </div> + + <div class="urate"> + <!-- rating value --> + <p class="rv">4.5</p> + + <!-- max rate --> + <p class="mr">5</p> + + <!-- authorO is Organisation class - pub class prop not req--> + <!-- authorP is Person class - pub class prop req--> + <p class="raterO">Foogle</p> + </div> + </section> + + <!-- aggregate review --> + <div class="rjs-prod-1-aggrate"> + <!-- aggregate rate that got --> + <p class="arv">100</p> + + <!-- max possibly rate --> + <p class="mr">100</p> + + <!-- total user rate count --> + <p class="rc">1000</p> + </div> + + + </div> + + <!-- product instance 2 --> + <div class="product"> + + <!-- name --> + <h1 class="rjs-prod-2-name">Denim Jacket</h1> + + <!-- images --> + <img class="rjs-prod-2-img" src="https://example.com/image1.jpg" alt="Product Image 1"> + <img class="rjs-prod-2-img" src="https://example.com/image2.jpg" alt="Product Image 2"> + + <!-- description --> + <p class="rjs-prod-2-desc">Product Description Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> + + <!-- skuid --> + <p>SKU ID: <span class="rjs-prod-2-sku">123456789</span></p> + + <!--mpn code --> + <p>MPN Code: <span class="rjs-prod-2-mpn">ABC123</span></p> + + <!-- brand name --> + <p>Brand: <span class="rjs-prod-2-brand">XYZ Brand</span></p> + + + <p>Price: <span class="rjs-prod-2-cost" data-currency="inr">990</span></p> + + <p>Availability: <span class="rjs-prod-2-avail" data-avail="true">In Stock</span></p> + + + <p>Item Condition: <span class="rjs-prod-2-cond" data-cond="used">New</span></p> + + + <p>Return Policy: <span class="rjs-prod-2-returnin">30 days</span></p> + + <p>Return Fees: <span class="rjs-prod-2-returnfee">Free</span></p> + + <!-- delivery across and return policy applicable country --> + <p>Shipping Cost: <span class="rjs-prod-2-delcost" data-delover="india">80</span></p> + + <p class="rjs-prod-2-ptime" data-range="1-3">Processing Time: 1-3 business days</p> + + <p class="rjs-prod-2-ttime" data-range="3-5">Estimated Delivery Time: 3-5 business days</p> + + + <!-- review --> + <section class="rjs-prod-2-reviews"> + <div class="urate"> + <!-- rating value --> + <p class="rv">4.5</p> + + <!-- max rate --> + <p class="mr">5</p> + + <!-- authorO is Organisation class - pub class prop not req--> + <!-- authorP is Person class - pub class prop req--> + <p class="raterP">John</p> + </div> + + <div class="urate"> + <!-- rating value --> + <p class="rv">4.5</p> + + <!-- max rate --> + <p class="mr">5</p> + + <!-- authorO is Organisation class - pub class prop not req--> + <!-- authorP is Person class - pub class prop req--> + <p class="raterO">Foogle</p> + </div> + </section> + + <!-- aggregate review --> + <div class="rjs-prod-2-aggrate"> + <!-- aggregate rate that got --> + <p class="arv">100</p> + + <!-- max possibly rate --> + <p class="mr">100</p> + + <!-- total user rate count --> + <p class="rc">1000</p> + </div> + + + </div> + + + +</body></html> \ No newline at end of file diff --git a/test/outputs/browser-env/productVarient/productCombined.html b/test/outputs/browser-env/productVarient/productCombined.html new file mode 100644 index 0000000..af97955 --- /dev/null +++ b/test/outputs/browser-env/productVarient/productCombined.html @@ -0,0 +1,185 @@ +<!DOCTYPE html><html lang="en"><head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Product Page</title> + <script src="../bundle.min.js"> + </script> + <script> + document.addEventListener('DOMContentLoaded', function () { + RichieJS.default({ richieNames: ['productwv'] }) + }); + </script> +<script type="application/ld+json">[{"@context":"https://schema.org/","@type":"ProductGroup","name":"Denim Jacket","description":"Product Description Lorem ipsum dolor sit amet, consectetur adipiscing elit.","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/productVarient/productCombined","brand":{"@type":"Brand","name":"XYZ Brand"},"productGroupID":"45428345ff87be22344034c5abbfe662","variesBy":["color","suggestedAge","suggestedGender"],"hasVariant":[{"@context":"https://schema.org/","@type":"Product","name":"Denim Jacket","image":["https://example.com/image1.jpg","https://example.com/image2.jpg"],"description":"Product Description Lorem ipsum dolor sit amet, consectetur adipiscing elit.","sku":"123456789","mpn":"ABC123","offers":{"@type":"Offer","category":"Fees","price":990,"priceCurrency":"INR","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/productVarient/productCombined?var=black_20_male","priceValidUntil":"1970-01-31T00:00:00.000Z","availability":"InStock","itemCondition":"NewCondition","hasMerchantReturnPolicy":{"@id":"#return_policy"},"shippingDetails":{"@id":"#shipping_policy"}},"audience":{"@type":"PeopleAudience","suggestedGender":"MALE","suggestedAge":{"@type":"QuantitativeValue","minValue":20}},"color":"Black"},{"@context":"https://schema.org/","@type":"Product","name":"Denim Jacket","image":["https://example.com/image1.jpg","https://example.com/image2.jpg"],"description":"Product Description Lorem ipsum dolor sit amet, consectetur adipiscing elit.","sku":"123456789","mpn":"ABC123","offers":{"@type":"Offer","category":"Fees","price":990,"priceCurrency":"INR","url":"https://www.cresteem.com//A:/Git/cresteem/Richie-JS/test/test-sample/productVarient/productCombined?var=brown_10_female","priceValidUntil":"1970-01-31T00:00:00.000Z","availability":"InStock","itemCondition":"NewCondition","hasMerchantReturnPolicy":{"@id":"#return_policy"},"shippingDetails":{"@id":"#shipping_policy"}},"audience":{"@type":"PeopleAudience","suggestedGender":"FEMALE","suggestedAge":{"@type":"QuantitativeValue","minValue":10}},"color":"Brown"}],"aggregateRating":{"@type":"AggregateRating","ratingValue":100,"bestRating":100,"ratingCount":2000},"review":[{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.5,"bestRating":5},"author":{"@type":"Person","name":"John"}},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.5,"bestRating":5},"author":{"@type":"Organization","name":"Foogle"}},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.5,"bestRating":5},"author":{"@type":"Person","name":"John"}},{"@type":"Review","reviewRating":{"@type":"Rating","ratingValue":4.5,"bestRating":5},"author":{"@type":"Organization","name":"Foogle"}}]},{"@context":"https://schema.org/","@id":"#shipping_policy","@type":"OfferShippingDetails","shippingRate":{"@type":"MonetaryAmount","value":80,"currency":"INR"},"shippingDestination":{"@type":"DefinedRegion","addressCountry":"IN"},"deliveryTime":{"@type":"ShippingDeliveryTime","handlingTime":{"@type":"QuantitativeValue","minValue":1,"maxValue":3,"unitCode":"DAY"},"transitTime":{"@type":"QuantitativeValue","minValue":3,"maxValue":5,"unitCode":"DAY"}}},{"@context":"https://schema.org/","@id":"#return_policy","@type":"MerchantReturnPolicy","applicableCountry":"IN","returnPolicyCategory":"MerchantReturnFiniteReturnWindow","merchantReturnDays":30,"returnMethod":"ReturnByMail","returnFees":"FreeReturn"}]</script></head> + +<body> + <div class="product"> + + <!-- name --> + <h1 class="rjs-prod-1-name" data-var="color-audage-gender">Denim Jacket | Black | Age 20 | Male</h1> + + <!-- images --> + <img class="rjs-prod-1-img" src="https://example.com/image1.jpg" alt="Product Image 1"> + <img class="rjs-prod-1-img" src="https://example.com/image2.jpg" alt="Product Image 2"> + + <!-- description --> + <p class="rjs-prod-1-desc">Product Description Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> + + <!-- skuid --> + <p>SKU ID: <span class="rjs-prod-1-sku">123456789</span></p> + + <!--mpn code --> + <p>MPN Code: <span class="rjs-prod-1-mpn">ABC123</span></p> + + <!-- brand name --> + <p>Brand: <span class="rjs-prod-1-brand">XYZ Brand</span></p> + + + <p>Price: <span class="rjs-prod-1-cost" data-currency="inr">990</span></p> + + <p>Availability: <span class="rjs-prod-1-avail" data-avail="true">In Stock</span></p> + + + <p>Item Condition: <span class="rjs-prod-1-cond" data-cond="new">New</span></p> + + + <p>Return Policy: <span class="rjs-prod-1-returnin">30 days</span></p> + + <p>Return Fees: <span class="rjs-prod-1-returnfee">Free</span></p> + + <!-- delivery across and return policy applicable country --> + <p>Shipping Cost: <span class="rjs-prod-1-delcost" data-delover="india">80</span></p> + + <p class="rjs-prod-1-ptime" data-range=" 1-3">Processing Time: 1-3 business days</p> + + <p class="rjs-prod-1-ttime" data-range="3-5">Estimated Delivery Time: 3-5 business days</p> + + + <!-- review --> + <section class="rjs-prod-1-reviews"> + <div class="urate"> + <!-- rating value --> + <p class="rv">4.5</p> + + <!-- max rate --> + <p class="mr">5</p> + + <!-- authorO is Organisation class - pub class prop not req--> + <!-- authorP is Person class - pub class prop req--> + <p class="raterP">John</p> + </div> + + <div class="urate"> + <!-- rating value --> + <p class="rv">4.5</p> + + <!-- max rate --> + <p class="mr">5</p> + + <!-- authorO is Organisation class - pub class prop not req--> + <!-- authorP is Person class - pub class prop req--> + <p class="raterO">Foogle</p> + </div> + </section> + + <!-- aggregate review --> + <div class="rjs-prod-1-aggrate"> + <!-- aggregate rate that got --> + <p class="arv">100</p> + + <!-- max possibly rate --> + <p class="mr">100</p> + + <!-- total user rate count --> + <p class="rc">1000</p> + </div> + + + </div> + + <div class="product"> + + <!-- name --> + <h1 class="rjs-prod-2-name" data-var="color-audage-gender">Denim Jacket | Brown | Age 10 | Female</h1> + + <!-- images --> + <img class="rjs-prod-2-img" src="https://example.com/image1.jpg" alt="Product Image 1"> + <img class="rjs-prod-2-img" src="https://example.com/image2.jpg" alt="Product Image 2"> + + <!-- description --> + <p class="rjs-prod-2-desc">Product Description Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> + + <!-- skuid --> + <p>SKU ID: <span class="rjs-prod-2-sku">123456789</span></p> + + <!--mpn code --> + <p>MPN Code: <span class="rjs-prod-2-mpn">ABC123</span></p> + + <!-- brand name --> + <p>Brand: <span class="rjs-prod-2-brand">XYZ Brand</span></p> + + + <p>Price: <span class="rjs-prod-2-cost" data-currency="inr">990</span></p> + + <p>Availability: <span class="rjs-prod-2-avail" data-avail="true">In Stock</span></p> + + + <p>Item Condition: <span class="rjs-prod-2-cond" data-cond="new">New</span></p> + + + <p>Return Policy: <span class="rjs-prod-2-returnin">30 days</span></p> + + <p>Return Fees: <span class="rjs-prod-2-returnfee">Free</span></p> + + <!-- delivery across and return policy applicable country --> + <p>Shipping Cost: <span class="rjs-prod-2-delcost" data-delover="india">80</span></p> + + <p class="rjs-prod-2-ptime" data-range=" 1-3">Processing Time: 1-3 business days</p> + + <p class="rjs-prod-2-ttime" data-range="3-5">Estimated Delivery Time: 3-5 business days</p> + + + <!-- review --> + <section class="rjs-prod-2-reviews"> + <div class="urate"> + <!-- rating value --> + <p class="rv">4.5</p> + + <!-- max rate --> + <p class="mr">5</p> + + <!-- authorO is Organisation class - pub class prop not req--> + <!-- authorP is Person class - pub class prop req--> + <p class="raterP">John</p> + </div> + + <div class="urate"> + <!-- rating value --> + <p class="rv">4.5</p> + + <!-- max rate --> + <p class="mr">5</p> + + <!-- authorO is Organisation class - pub class prop not req--> + <!-- authorP is Person class - pub class prop req--> + <p class="raterO">Foogle</p> + </div> + </section> + + <!-- aggregate review --> + <div class="rjs-prod-2-aggrate"> + <!-- aggregate rate that got --> + <p class="arv">100</p> + + <!-- max possibly rate --> + <p class="mr">100</p> + + <!-- total user rate count --> + <p class="rc">1000</p> + </div> + + + </div> + + + +</body></html> \ No newline at end of file diff --git a/test/outputs/browser-env/profilepage.html b/test/outputs/browser-env/profilepage.html new file mode 100644 index 0000000..47b5873 --- /dev/null +++ b/test/outputs/browser-env/profilepage.html @@ -0,0 +1,79 @@ +<!DOCTYPE html><html lang="en"><head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Profile Page</title> + <script src="./bundle.min.js"> + </script> + <script> + document.addEventListener('DOMContentLoaded', function () { + RichieJS.default({ richieNames: ['profile'] }) + }); + </script> +<script type="application/ld+json">{"@context":"https://schema.org","@type":"ProfilePage","dateCreated":"2024-06-06T20:37:00+05:30","dateModified":"2024-02-26T17:23:00+05:30","mainEntity":{"@type":"Person","@id":"iamspdarsan","name":"DARSAN","alternateName":"iamspdarsan","identifier":"iamspdarsan","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"FollowAction"},"userInteractionCount":391080},{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":9873221},{"@type":"InteractionCounter","interactionType":{"@type":"BefriendAction"},"userInteractionCount":33}],"agentInteractionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"WriteAction"},"userInteractionCount":87},{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1002},{"@type":"InteractionCounter","interactionType":{"@type":"FollowAction"},"userInteractionCount":35},{"@type":"InteractionCounter","interactionType":{"@type":"ShareAction"},"userInteractionCount":30}],"description":"Seasoned Web Developer skilled in turning design concepts into flawless, high-performance websites. Proficient in multiple languages and frameworks, I excel in crafting clean, maintainable and user-centric code. My expertise in SEO and UI/UX ensures captivating, user-focused experiences","image":["https://cresteem.com/img/team/darsanpng"],"sameAs":["https://www.instagram.com/iamspdarsan/","https://www.linkedin.com/in/iamspdarsan/","https://www.youtube.com/iamspdarsan"]},"hasPart":[{"@type":"Article","image":"https://incubator.ucf.edu/wp-content/uploads/2023/07/artificial-intelligence-new-technology-science-futuristic-abstract-human-brain-ai-technology-cpu-central-processor-unit-chipset-big-data-machine-learning-cyber-mind-domination-generative-ai-scaled-1.jpg","headline":"This is example 1 headline","url":"https://www.example.com/article-1","datePublished":"2024-06-06T20:37:00+05:30","author":{"@id":"iamspdarsan"}},{"@type":"Article","image":"https://imageio.forbes.com/specials-images/imageserve/64b5825a5b9b4d3225e9bd15/artificial-intelligence--ai/960x0.jpg?format=jpg&width=1440","headline":"This is example 2 headline","url":"https://www.example.com/article-2","datePublished":"2024-06-09T23:27:00+05:30","author":{"@id":"iamspdarsan"}}]}</script></head> + +<body> + + <main> + <div> + + <!-- datecreated --> + <p class="rjs-pp-pdt">2024-06-06 08:37 PM</p> + + <!-- datemodified --> + <p class="rjs-pp-mdt">2024-02-26 05:23 PM</p> + + <img class="rjs-pp-img" src="https://cresteem.com/img/team/darsanpng" alt=""> + + <!-- agentself interaction --> + <p>Posts Written By Author: <span class="rjs-pp-aposts">87</span></p> + <p>Posts Liked By Author: <span class="rjs-pp-aliked">1002</span></p> + <p>Author Follows: <span class="rjs-pp-afollows">35</span></p> + <p>Shared/Reposted Contents: <span class="rjs-pp-ashared">30</span></p> + + <!-- second-party interaction --> + <p>Author Followers: <span class="rjs-pp-followers">391080</span></p> + <p>Cummulative Likes: <span class="rjs-pp-likes">9873221</span></p> + <p>Mutual Connections: <span class="rjs-pp-bicon">33</span></p> + + <!-- name --> + <p class="rjs-pp-name">DARSAN</p> + + <p class="rjs-pp-altname">iamspdarsan</p> + + <p class="rjs-pp-uid">@iamspdarsan</p> + + <p class="rjs-pp-desc"><b>Seasoned Web Developer</b> skilled in turning design concepts into flawless, + high-performance websites. Proficient in multiple languages and frameworks, I excel in crafting + clean, maintainable and user-centric code. My expertise in <b>SEO and UI/UX</b> ensures + captivating, user-focused experiences</p> + + <div> + <a href="https://www.instagram.com/iamspdarsan/" class="rjs-pp-rlink">instagram</a> + <a href="https://www.linkedin.com/in/iamspdarsan/" class="rjs-pp-rlink">linkedin</a> + <a href="https://www.youtube.com/iamspdarsan" class="rjs-pp-rlink">youtube</a> + </div> + </div> + + <div> + + <!-- ra - recent activity/posts --> + <div class="rjs-pp-awork"> + <img class="timg" src="https://incubator.ucf.edu/wp-content/uploads/2023/07/artificial-intelligence-new-technology-science-futuristic-abstract-human-brain-ai-technology-cpu-central-processor-unit-chipset-big-data-machine-learning-cyber-mind-domination-generative-ai-scaled-1.jpg" alt=""> + <p class="head">This is example 1 headline</p> + <p class="pon">2024-06-06 08:37 PM</p> + <a class="url" href="https://www.example.com/article-1">Read More</a> + </div> + + <div class="rjs-pp-awork"> + <img class="timg" src="https://imageio.forbes.com/specials-images/imageserve/64b5825a5b9b4d3225e9bd15/artificial-intelligence--ai/960x0.jpg?format=jpg&width=1440" alt=""> + <p class="head">This is example 2 headline</p> + <p class="pon">2024-06-09 11:27 PM</p> + <a class="url" href="https://www.example.com/article-2">Read More</a> + </div> + + </div> + + </main> + + +</body></html> \ No newline at end of file diff --git a/test/outputs/browser-env/softwareapp.html b/test/outputs/browser-env/softwareapp.html new file mode 100644 index 0000000..8026074 --- /dev/null +++ b/test/outputs/browser-env/softwareapp.html @@ -0,0 +1,74 @@ +<!DOCTYPE html><html lang="en"><head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Software X - HomePage</title> + <script src="./bundle.min.js"> + </script> + <script> + document.addEventListener('DOMContentLoaded', function () { + RichieJS.default({ richieNames: ['software'] }) + }); + </script> +<script type="application/ld+json">[{"@context":"https://schema.org","@type":"SoftwareApplication","name":"God of War","operatingSystem":["WINDOWS"," PS4"],"applicationCategory":"GameApplication","aggregateRating":{"@type":"AggregateRating","ratingValue":99,"bestRating":100,"ratingCount":90864000},"offers":{"price":2000,"priceCurrency":"INR"}},{"@context":"https://schema.org","@type":"SoftwareApplication","name":"JobRAID","operatingSystem":["ANDROID","WINDOWS"],"applicationCategory":"BusinessApplication","aggregateRating":{"@type":"AggregateRating","ratingValue":96,"bestRating":100,"ratingCount":7900},"offers":{"price":5600,"priceCurrency":"INR"}}]</script></head> + +<body> + + + +<main> + + <!-- sapp instance 1 --> + <div> + <p class="rjs-sapp-1-name">God of War</p> + + <p> + Category: <span class="rjs-sapp-1-cat">Game</span> + </p> + + <p> + Supported on: <span class="rjs-sapp-1-os">Windows, PS4</span> + </p> + + <!-- aggregate rating --> + <div class="rjs-sapp-1-aggrate"> + <!-- rating value --> + <p><span class="arv">99</span> / <span class="mr">100</span></p> + <!-- rating counts --> + <p>Number of rating: <span class="rc">90864000</span></p> + </div> + + <p class="rjs-sapp-1-cost" data-currency="inr">2000</p> + + </div> + + + + <!-- sapp instance 2 --> + <div> + <p class="rjs-sapp-2-name">JobRAID</p> + + <p> + Category: <span class="rjs-sapp-2-cat">Business</span> + </p> + + <p>Supported on: </p> + <ol> + <li class="rjs-sapp-2-os">Android</li> + <li class="rjs-sapp-2-os">Windows</li> + </ol> + + <!-- aggregate rating --> + <div class="rjs-sapp-2-aggrate"> + <!-- rating value --> + <p><span class="arv">96</span> / <span class="mr">100</span></p> + <!-- rating counts --> + <p>Number of rating: <span class="rc">7900</span></p> + </div> + + <p class="rjs-sapp-2-cost" data-currency="inr">5600</p> + + </div> + +</main> + +</body></html> \ No newline at end of file diff --git a/test/outputs/browser-env/videos.html b/test/outputs/browser-env/videos.html new file mode 100644 index 0000000..6331a48 --- /dev/null +++ b/test/outputs/browser-env/videos.html @@ -0,0 +1,44 @@ +<!DOCTYPE html><html lang="en"><head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Videos</title> + <script src="./bundle.min.js"> + </script> + <script> + document.addEventListener('DOMContentLoaded', function () { + RichieJS.default({ richieNames: ['video'] }) + }); + </script> +<script type="application/ld+json">[{"@context":"https://schema.org","@type":"VideoObject","name":"TERRIBLY Misunderstood! Full-Frame Blackmagic Cinema Camera 6K [Review w/ Footage] - YouTube","description":"My review of the new full-frame Blackmagic Cinema Camera 6K with lots of beautiful footage...⚡︎ Blackmagic Cinema Camera 6K 👉🏻 https://amzn.to/3uB3mBx⚡︎ Mo...","thumbnailUrl":"https://i.ytimg.com/vi/pI4TnpCMgP8/maxresdefault.jpg","contentUrl":"https://www.youtube.com/watch?v=pI4TnpCMgP8","embedUrl":"https://www.youtube.com/embed/pI4TnpCMgP8?si=wPfEdco5EIZ9oaMW","uploadDate":"2023-11-24T09:00:41-08:00","duration":"PT11M44S","interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"WatchAction"},"userInteractionCount":62486},"expires":"3023-11-24T22:30:41.000+05:30","hasPart":[{"@type":"Clip","name":"Photo Testing","startOffset":30,"endOffset":200,"url":"https://www.youtube.com/watch?v=pI4TnpCMgP8&t=30s"},{"@type":"Clip","name":"Video Testing","startOffset":200,"endOffset":800,"url":"https://www.youtube.com/watch?v=pI4TnpCMgP8&t=200s"},{"@type":"Clip","name":"Cinematic Testing","startOffset":800,"endOffset":805,"url":"https://www.youtube.com/watch?v=pI4TnpCMgP8&t=800s"}]},{"@context":"https://schema.org","@type":"VideoObject","name":"Ben Affleck is The Batman - YouTube","description":"#benaffleck #batman #zacksnyder #zacksnydersjusticeleague #batmanvsuperman #henrycavill #anime #dceu #dcuniverse #dccomics #batmanarkhamknight","thumbnailUrl":"https://i.ytimg.com/vi/IHZDKOH624s/hqdefault.jpg","contentUrl":"https://www.youtube.com/watch?v=IHZDKOH624s","embedUrl":"https://www.youtube.com/embed/IHZDKOH624s?si=tG9q9eY3lhT7fTQi","uploadDate":"2022-08-01T21:08:18-07:00","duration":"PT0M43S","interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"WatchAction"},"userInteractionCount":658304},"expires":"3022-08-02T09:38:18.000+05:30","hasPart":[{"@type":"Clip","name":"Bruce Wayne Entry","startOffset":2,"endOffset":10,"url":"https://www.youtube.com/watch?v=IHZDKOH624s&t=2s"},{"@type":"Clip","name":"Clark Messing Around","startOffset":10,"endOffset":30,"url":"https://www.youtube.com/watch?v=IHZDKOH624s&t=10s"},{"@type":"Clip","name":"Batman Prep time","startOffset":30,"endOffset":35,"url":"https://www.youtube.com/watch?v=IHZDKOH624s&t=30s"}]}]</script></head> + +<body> + + <main> + <!-- video instance 1 --> + <div id="video-1"> + + <ul class="rjs-video-1-index"> + <li data-offset="30">Photo Testing</li> + <li data-offset="200">Video Testing</li> + <li data-offset="800">Cinematic Testing</li> + </ul> + + <iframe class="rjs-video-1-vframe" width="560" height="315" src="https://www.youtube.com/embed/pI4TnpCMgP8?si=wPfEdco5EIZ9oaMW" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe> + </div> + + <!-- video instance 2 --> + <div id="video-2"> + <ul class="rjs-video-2-index"> + <li data-offset="2">Bruce Wayne Entry</li> + <li data-offset="10">Clark Messing Around</li> + <li data-offset="30">Batman Prep time</li> + </ul> + + <iframe class="rjs-video-2-vframe" width="560" height="315" src="https://www.youtube.com/embed/IHZDKOH624s?si=tG9q9eY3lhT7fTQi" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe> + </div> + + </main> + + + +</body></html> \ No newline at end of file diff --git a/test/outputs/OP_Of_(10) courses.html b/test/outputs/node-env/Output_10_courses.html similarity index 98% rename from test/outputs/OP_Of_(10) courses.html rename to test/outputs/node-env/Output_10_courses.html index 59bf01e..6f6b865 100644 --- a/test/outputs/OP_Of_(10) courses.html +++ b/test/outputs/node-env/Output_10_courses.html @@ -4,6 +4,12 @@ <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Courses</title> + <script src="../bundle.min.js"></script> + <script> + document.addEventListener("DOMContentLoaded", function () { + RichieJS.default({ richieNames: ["ccourse", "course"] }); + }); + </script> <script type="application/ld+json"> { "@context": "https://schema.org", diff --git a/test/outputs/OP_Of_(11) events.html b/test/outputs/node-env/Output_11_events.html similarity index 97% rename from test/outputs/OP_Of_(11) events.html rename to test/outputs/node-env/Output_11_events.html index d0adb73..471d205 100644 --- a/test/outputs/OP_Of_(11) events.html +++ b/test/outputs/node-env/Output_11_events.html @@ -4,6 +4,12 @@ <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Events</title> + <script src="./bundle.min.js"></script> + <script> + document.addEventListener("DOMContentLoaded", function () { + RichieJS.default({ richieNames: ["event"] }); + }); + </script> <script type="application/ld+json"> [ { @@ -31,7 +37,7 @@ "price": 0, "priceCurrency": "INR", "url": "https://www.yourjs-eventsite.com/book-event", - "validFrom": "2024-05-14T08:14:08.705Z" + "validFrom": "2024-11-20T04:44:57.266Z" }, "performer": { "@type": "PerformingGroup", @@ -76,7 +82,7 @@ "price": 200, "priceCurrency": "INR", "url": "https://www.yourjs-eventsite.com/book-event", - "validFrom": "2024-05-14T08:14:08.705Z" + "validFrom": "2024-11-20T04:44:57.266Z" }, "performer": { "@type": "Person", "name": "DARSAN" }, "organizer": { @@ -122,7 +128,7 @@ "price": 10, "priceCurrency": "USD", "url": "https://www.yourjs-eventsite.com/book-event", - "validFrom": "2024-05-14T08:14:08.705Z" + "validFrom": "2024-11-20T04:44:57.266Z" }, "performer": { "@type": "PerformingGroup", "name": "DEAN and SAM" }, "organizer": { diff --git a/test/outputs/OP_Of_(12) faq.html b/test/outputs/node-env/Output_12_faq.html similarity index 96% rename from test/outputs/OP_Of_(12) faq.html rename to test/outputs/node-env/Output_12_faq.html index 13479aa..1a52a25 100644 --- a/test/outputs/OP_Of_(12) faq.html +++ b/test/outputs/node-env/Output_12_faq.html @@ -4,6 +4,12 @@ <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>FAQ Page</title> + <script src="./bundle.min.js"></script> + <script> + document.addEventListener("DOMContentLoaded", function () { + RichieJS.default({ richieNames: ["faq"] }); + }); + </script> <script type="application/ld+json"> { "@context": "https://schema.org", diff --git a/test/outputs/OP_Of_(13) videos.html b/test/outputs/node-env/Output_13_videos.html similarity index 92% rename from test/outputs/OP_Of_(13) videos.html rename to test/outputs/node-env/Output_13_videos.html index 556c697..e1f1030 100644 --- a/test/outputs/OP_Of_(13) videos.html +++ b/test/outputs/node-env/Output_13_videos.html @@ -4,6 +4,12 @@ <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Videos</title> + <script src="./bundle.min.js"></script> + <script> + document.addEventListener("DOMContentLoaded", function () { + RichieJS.default({ richieNames: ["video"] }); + }); + </script> <script type="application/ld+json"> [ { @@ -19,9 +25,9 @@ "interactionStatistic": { "@type": "InteractionCounter", "interactionType": { "@type": "WatchAction" }, - "userInteractionCount": 61689 + "userInteractionCount": 62486 }, - "expires": "3023-11-24T22:30:41+05:30", + "expires": "3023-11-24T22:30:41.000+05:30", "hasPart": [ { "@type": "Clip", @@ -59,9 +65,9 @@ "interactionStatistic": { "@type": "InteractionCounter", "interactionType": { "@type": "WatchAction" }, - "userInteractionCount": 657055 + "userInteractionCount": 658304 }, - "expires": "3022-08-02T09:38:18+05:30", + "expires": "3022-08-02T09:38:18.000+05:30", "hasPart": [ { "@type": "Clip", diff --git a/test/outputs/OP_Of_(14) localbusiness.html b/test/outputs/node-env/Output_14_localbusiness.html similarity index 98% rename from test/outputs/OP_Of_(14) localbusiness.html rename to test/outputs/node-env/Output_14_localbusiness.html index 52cc1fa..5b96c8d 100644 --- a/test/outputs/OP_Of_(14) localbusiness.html +++ b/test/outputs/node-env/Output_14_localbusiness.html @@ -4,6 +4,12 @@ <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Restaurants</title> + <script src="./bundle.min.js"></script> + <script> + document.addEventListener("DOMContentLoaded", function () { + RichieJS.default({ richieNames: ["localbusiness"] }); + }); + </script> <script type="application/ld+json"> [ { diff --git a/test/outputs/OP_Of_(15) org.html b/test/outputs/node-env/Output_15_org.html similarity index 97% rename from test/outputs/OP_Of_(15) org.html rename to test/outputs/node-env/Output_15_org.html index 09f9c16..b3c0d76 100644 --- a/test/outputs/OP_Of_(15) org.html +++ b/test/outputs/node-env/Output_15_org.html @@ -4,6 +4,12 @@ <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Organisation</title> + <script src="./bundle.min.js"></script> + <script> + document.addEventListener("DOMContentLoaded", function () { + RichieJS.default({ richieNames: ["organization"] }); + }); + </script> <script type="application/ld+json"> [ { diff --git a/test/outputs/OP_Of_(16) product.html b/test/outputs/node-env/Output_16_product.html similarity index 97% rename from test/outputs/OP_Of_(16) product.html rename to test/outputs/node-env/Output_16_product.html index c3f27dd..69a57cc 100644 --- a/test/outputs/OP_Of_(16) product.html +++ b/test/outputs/node-env/Output_16_product.html @@ -4,6 +4,12 @@ <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Product Page</title> + <script src="./bundle.min.js"></script> + <script> + document.addEventListener("DOMContentLoaded", function () { + RichieJS.default({ richieNames: ["product"] }); + }); + </script> <script type="application/ld+json"> [ { @@ -50,7 +56,7 @@ "price": 990, "priceCurrency": "INR", "url": "https://www.cresteem.com/test/test-sample/product", - "priceValidUntil": "2024-05-05T18:13:20.000Z", + "priceValidUntil": "2024-11-20T08:58:33.885Z", "availability": "InStock", "itemCondition": "NewCondition", "hasMerchantReturnPolicy": { @@ -134,7 +140,7 @@ "price": 990, "priceCurrency": "INR", "url": "https://www.cresteem.com/test/test-sample/product", - "priceValidUntil": "2024-05-05T18:13:20.000Z", + "priceValidUntil": "2024-11-20T08:58:33.885Z", "availability": "InStock", "itemCondition": "UsedCondition", "hasMerchantReturnPolicy": { diff --git a/test/outputs/OP_Of_(17) productCombined.html b/test/outputs/node-env/Output_17_productCombined.html similarity index 96% rename from test/outputs/OP_Of_(17) productCombined.html rename to test/outputs/node-env/Output_17_productCombined.html index 31b6332..12fc28b 100644 --- a/test/outputs/OP_Of_(17) productCombined.html +++ b/test/outputs/node-env/Output_17_productCombined.html @@ -4,6 +4,12 @@ <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Product Page</title> + <script src="../bundle.min.js"></script> + <script> + document.addEventListener("DOMContentLoaded", function () { + RichieJS.default({ richieNames: ["productwv"] }); + }); + </script> <script type="application/ld+json"> [ { @@ -13,7 +19,7 @@ "description": "Product Description Lorem ipsum dolor sit amet, consectetur adipiscing elit.", "url": "https://www.cresteem.com/test/test-sample/productVarient/productCombined", "brand": { "@type": "Brand", "name": "XYZ Brand" }, - "productGroupID": "80369227d029366a68317844038f619a", + "productGroupID": "197cef61d94f7a223ae6ef7b162449e8", "variesBy": ["color", "suggestedAge", "suggestedGender"], "hasVariant": [ { @@ -33,7 +39,7 @@ "price": 990, "priceCurrency": "INR", "url": "https://www.cresteem.com/test/test-sample/productVarient/productCombined?var=black_20_male", - "priceValidUntil": "2024-05-05T18:13:20.000Z", + "priceValidUntil": "2024-11-20T09:03:02.047Z", "availability": "InStock", "itemCondition": "NewCondition", "hasMerchantReturnPolicy": { "@id": "#return_policy" }, @@ -63,7 +69,7 @@ "price": 990, "priceCurrency": "INR", "url": "https://www.cresteem.com/test/test-sample/productVarient/productCombined?var=brown_10_female", - "priceValidUntil": "2024-05-05T18:13:20.000Z", + "priceValidUntil": "2024-11-20T09:03:02.047Z", "availability": "InStock", "itemCondition": "NewCondition", "hasMerchantReturnPolicy": { "@id": "#return_policy" }, diff --git a/test/outputs/OP_Of_(18) profilepage.html b/test/outputs/node-env/Output_18_profilepage.html similarity index 97% rename from test/outputs/OP_Of_(18) profilepage.html rename to test/outputs/node-env/Output_18_profilepage.html index 3205806..837975c 100644 --- a/test/outputs/OP_Of_(18) profilepage.html +++ b/test/outputs/node-env/Output_18_profilepage.html @@ -4,6 +4,12 @@ <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Profile Page</title> + <script src="./bundle.min.js"></script> + <script> + document.addEventListener("DOMContentLoaded", function () { + RichieJS.default({ richieNames: ["profile"] }); + }); + </script> <script type="application/ld+json"> { "@context": "https://schema.org", diff --git a/test/outputs/OP_Of_(19) searchpage.html b/test/outputs/node-env/Output_19_searchpage.html similarity index 83% rename from test/outputs/OP_Of_(19) searchpage.html rename to test/outputs/node-env/Output_19_searchpage.html index 6904342..fcbc963 100644 --- a/test/outputs/OP_Of_(19) searchpage.html +++ b/test/outputs/node-env/Output_19_searchpage.html @@ -6,6 +6,12 @@ <title>Search Form</title> <script src="./client.js" type="text/javascript" defer=""></script> + <script src="../bundle.min.js"></script> + <script> + document.addEventListener("DOMContentLoaded", function () { + RichieJS.default({ richieNames: ["searchbox"] }); + }); + </script> <script type="application/ld+json"> { diff --git a/test/outputs/OP_Of_(1) article.html b/test/outputs/node-env/Output_1_article.html similarity index 93% rename from test/outputs/OP_Of_(1) article.html rename to test/outputs/node-env/Output_1_article.html index f355618..88dd78b 100644 --- a/test/outputs/OP_Of_(1) article.html +++ b/test/outputs/node-env/Output_1_article.html @@ -5,6 +5,14 @@ <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Article Test Page</title> <link rel="shortcut icon" href="favicon.ico" type="image/x-icon" /> + + <script src="./bundle.min.js"></script> + <script> + document.addEventListener("DOMContentLoaded", function () { + RichieJS.default({ richieNames: ["article"] }); + }); + </script> + <script type="application/ld+json"> { "@context": "https://schema.org", diff --git a/test/outputs/OP_Of_(20) softwareapp.html b/test/outputs/node-env/Output_20_softwareapp.html similarity index 92% rename from test/outputs/OP_Of_(20) softwareapp.html rename to test/outputs/node-env/Output_20_softwareapp.html index 797ab86..d3d83f6 100644 --- a/test/outputs/OP_Of_(20) softwareapp.html +++ b/test/outputs/node-env/Output_20_softwareapp.html @@ -4,6 +4,12 @@ <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Software X - HomePage</title> + <script src="./bundle.min.js"></script> + <script> + document.addEventListener("DOMContentLoaded", function () { + RichieJS.default({ richieNames: ["software"] }); + }); + </script> <script type="application/ld+json"> [ { diff --git a/test/outputs/OP_Of_(2) notindex.html b/test/outputs/node-env/Output_2_notindex.html similarity index 100% rename from test/outputs/OP_Of_(2) notindex.html rename to test/outputs/node-env/Output_2_notindex.html diff --git a/test/outputs/OP_Of_(3) recipies.html b/test/outputs/node-env/Output_3_recipies.html similarity index 97% rename from test/outputs/OP_Of_(3) recipies.html rename to test/outputs/node-env/Output_3_recipies.html index 52fcdf5..8ea50ad 100644 --- a/test/outputs/OP_Of_(3) recipies.html +++ b/test/outputs/node-env/Output_3_recipies.html @@ -8,6 +8,12 @@ name="description" content="Discover the tantalizing world of Biryani: a symphony of aromatic spices, tender meats, and fluffy rice, all layered together to create a culinary masterpiece that promises an unforgettable dining experience." /> + <script src="../bundle.min.js"></script> + <script> + document.addEventListener("DOMContentLoaded", function () { + RichieJS.default({ richieNames: ["crecipe", "recipe"] }); + }); + </script> <script type="application/ld+json"> { "@context": "https://schema.org", @@ -101,9 +107,9 @@ "interactionStatistic": { "@type": "InteractionCounter", "interactionType": { "@type": "WatchAction" }, - "userInteractionCount": 36005520 + "userInteractionCount": 36085893 }, - "expires": "3020-05-16T11:00:00+05:30" + "expires": "3020-05-16T11:00:00.000+05:30" } } }, @@ -168,9 +174,9 @@ "interactionStatistic": { "@type": "InteractionCounter", "interactionType": { "@type": "WatchAction" }, - "userInteractionCount": 804932 + "userInteractionCount": 807674 }, - "expires": "3023-06-29T12:51:52+05:30" + "expires": "3023-06-29T12:51:52.000+05:30" } } } diff --git a/test/outputs/OP_Of_(4) recipies.html b/test/outputs/node-env/Output_4_recipies.html similarity index 97% rename from test/outputs/OP_Of_(4) recipies.html rename to test/outputs/node-env/Output_4_recipies.html index b416aa2..4b8dd70 100644 --- a/test/outputs/OP_Of_(4) recipies.html +++ b/test/outputs/node-env/Output_4_recipies.html @@ -8,6 +8,12 @@ name="description" content="Discover the tantalizing world of Biryani: a symphony of aromatic spices, tender meats, and fluffy rice, all layered together to create a culinary masterpiece that promises an unforgettable dining experience." /> + <script src="../bundle.min.js"></script> + <script> + document.addEventListener("DOMContentLoaded", function () { + RichieJS.default({ richieNames: ["crecipe", "recipe"] }); + }); + </script> <script type="application/ld+json"> [ { @@ -96,9 +102,9 @@ "interactionStatistic": { "@type": "InteractionCounter", "interactionType": { "@type": "WatchAction" }, - "userInteractionCount": 36005520 + "userInteractionCount": 36085893 }, - "expires": "3020-05-16T11:00:00+05:30" + "expires": "3020-05-16T11:00:00.000+05:30" } }, { @@ -160,9 +166,9 @@ "interactionStatistic": { "@type": "InteractionCounter", "interactionType": { "@type": "WatchAction" }, - "userInteractionCount": 804942 + "userInteractionCount": 807674 }, - "expires": "3023-06-29T12:51:52+05:30" + "expires": "3023-06-29T12:51:52.000+05:30" } } ] diff --git a/test/outputs/OP_Of_(5) movies.html b/test/outputs/node-env/Output_5_movies.html similarity index 96% rename from test/outputs/OP_Of_(5) movies.html rename to test/outputs/node-env/Output_5_movies.html index 7c82a80..84cface 100644 --- a/test/outputs/OP_Of_(5) movies.html +++ b/test/outputs/node-env/Output_5_movies.html @@ -4,6 +4,12 @@ <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Movies</title> + <script src="../bundle.min.js"></script> + <script> + document.addEventListener("DOMContentLoaded", function () { + RichieJS.default({ richieNames: ["cmovie", "movie"] }); + }); + </script> <script type="application/ld+json"> [ { diff --git a/test/outputs/OP_Of_(6) movies.html b/test/outputs/node-env/Output_6_movies.html similarity index 97% rename from test/outputs/OP_Of_(6) movies.html rename to test/outputs/node-env/Output_6_movies.html index bad3bf3..73a4ff2 100644 --- a/test/outputs/OP_Of_(6) movies.html +++ b/test/outputs/node-env/Output_6_movies.html @@ -4,6 +4,12 @@ <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Movies</title> + <script src="../bundle.min.js"></script> + <script> + document.addEventListener("DOMContentLoaded", function () { + RichieJS.default({ richieNames: ["cmovie", "movie"] }); + }); + </script> <script type="application/ld+json"> { "@context": "https://schema.org", diff --git a/test/outputs/OP_Of_(7) restaurants.html b/test/outputs/node-env/Output_7_restaurants.html similarity index 98% rename from test/outputs/OP_Of_(7) restaurants.html rename to test/outputs/node-env/Output_7_restaurants.html index 71a287c..c848540 100644 --- a/test/outputs/OP_Of_(7) restaurants.html +++ b/test/outputs/node-env/Output_7_restaurants.html @@ -4,6 +4,12 @@ <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Restaurants</title> + <script src="../bundle.min.js"></script> + <script> + document.addEventListener("DOMContentLoaded", function () { + RichieJS.default({ richieNames: ["crestaurant", "restaurant"] }); + }); + </script> <script type="application/ld+json"> [ { diff --git a/test/outputs/OP_Of_(8) restaurants.html b/test/outputs/node-env/Output_8_restaurants.html similarity index 98% rename from test/outputs/OP_Of_(8) restaurants.html rename to test/outputs/node-env/Output_8_restaurants.html index 55dac04..1f7d8d8 100644 --- a/test/outputs/OP_Of_(8) restaurants.html +++ b/test/outputs/node-env/Output_8_restaurants.html @@ -4,6 +4,12 @@ <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Restaurants</title> + <script src="../bundle.min.js"></script> + <script> + document.addEventListener("DOMContentLoaded", function () { + RichieJS.default({ richieNames: ["crestaurant", "restaurant"] }); + }); + </script> <script type="application/ld+json"> { "@context": "https://schema.org", diff --git a/test/outputs/OP_Of_(9) courses.html b/test/outputs/node-env/Output_9_courses.html similarity index 98% rename from test/outputs/OP_Of_(9) courses.html rename to test/outputs/node-env/Output_9_courses.html index dd52b5a..3496fd7 100644 --- a/test/outputs/OP_Of_(9) courses.html +++ b/test/outputs/node-env/Output_9_courses.html @@ -4,6 +4,12 @@ <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Courses</title> + <script src="../bundle.min.js"></script> + <script> + document.addEventListener("DOMContentLoaded", function () { + RichieJS.default({ richieNames: ["ccourse", "course"] }); + }); + </script> <script type="application/ld+json"> [ {