quackage 1.0.29 → 1.0.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/debug/Harness.js
CHANGED
|
@@ -3,7 +3,9 @@ console.log('Fancy debug harness here. Shame if it would get quacked.');
|
|
|
3
3
|
let libQuackage = require('../source/Quackage-CLIProgram.js');
|
|
4
4
|
|
|
5
5
|
//libQuackage.run(['node', 'Harness.js', 'bp', 'pictunittest']);
|
|
6
|
-
libQuackage.run(['node', 'Harness.js', 'lint']);
|
|
6
|
+
//libQuackage.run(['node', 'Harness.js', 'lint']);
|
|
7
|
+
|
|
8
|
+
//libQuackage.run(['node', 'Harness.js', 'gjv', 'html/', '-p', 'PictoView']);
|
|
7
9
|
|
|
8
10
|
//libQuackage.run(['node', 'Harness.js', 'db', 'dist/documentation', '--meadow', 'model/MeadowModel-Extended.json']);
|
|
9
11
|
//libQuackage.run(['node', 'Harness.js', 'db', 'dist/documentation', '--meadow', 'model/MeadowModel-Extended.json', '-d', 'documentation-definition.json']);
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<div class="header">
|
|
2
|
+
<h1>About Grademaster</h1>
|
|
3
|
+
<h2>Where understanding and mastery are a weighed on a graduated scale.</h2>
|
|
4
|
+
</div>
|
|
5
|
+
<div class="content">
|
|
6
|
+
<p>Welcome to GradeMaster, your straightforward solution for managing and tracking student grades. Our web application is designed with simplicity and efficiency in mind, making it the perfect tool for teachers, students, and parents who want to stay informed and organized.</p>
|
|
7
|
+
|
|
8
|
+
<h3>Our Mission</h3>
|
|
9
|
+
|
|
10
|
+
<p>At GradeMaster, our mission is to streamline the grading process and provide an intuitive platform that fosters transparency and communication between educators, students, and parents. We believe that managing grades should be hassle-free, so you can focus on what truly matters: education.</p>
|
|
11
|
+
|
|
12
|
+
<h4>Key Features</h4>
|
|
13
|
+
|
|
14
|
+
<ul>
|
|
15
|
+
<li>Easy Grade Entry: Inputting grades is quick and straightforward, saving teachers valuable time.</li>
|
|
16
|
+
<li>Real-Time Updates: Students and parents can access up-to-date grades and performance summaries anytime, anywhere.</li>
|
|
17
|
+
<li>Customizable Reports: Generate detailed reports to monitor progress and identify areas for improvement.</li>
|
|
18
|
+
<li>Secure and Private: We prioritize your data privacy and security, ensuring that all information is protected.</li>
|
|
19
|
+
</ul>
|
|
20
|
+
|
|
21
|
+
<h3>Who Can Benefit?</h3>
|
|
22
|
+
<ul>
|
|
23
|
+
<li>Teachers: Simplify the grading process, save time, and maintain organized records.</li>
|
|
24
|
+
<li>Students: Stay informed about your academic performance and track your progress.</li>
|
|
25
|
+
<li>Parents: Keep up-to-date with your child's grades and support their educational journey.</li>
|
|
26
|
+
</ul>
|
|
27
|
+
|
|
28
|
+
<h3>Why Choose GradeMaster?</h3>
|
|
29
|
+
</ul>
|
|
30
|
+
<li>User-Friendly Interface: Our clean and intuitive design ensures that you can navigate the application with ease, regardless of your tech-savviness.</li>
|
|
31
|
+
<li>Reliable Performance: Built with robust technology, GradeMaster is reliable and fast, ensuring a seamless experience.</li>
|
|
32
|
+
<li>Dedicated Support: Our support team is here to help with any questions or issues you might encounter, ensuring you get the most out of GradeMaster.</li>
|
|
33
|
+
</ul>
|
|
34
|
+
|
|
35
|
+
<h3>Get Started</h3>
|
|
36
|
+
<p>Ready to simplify your grading process? Sign up today and discover how GradeMaster can make managing grades easier and more efficient than ever.</p>
|
|
37
|
+
<p>For more information, feel free to contact us or explore our FAQs.</p>
|
|
38
|
+
<p>Thank you for choosing GradeMaster – where simplicity meets efficiency in grade management.</p>
|
|
39
|
+
</div>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<h1>Legal Stuff (The Fun Version)</h1>
|
|
2
|
+
|
|
3
|
+
<p>Welcome to the GradeMaster Pro Legal Page! This is where we sprinkle a bit of humor on the otherwise dry and dusty legal stuff. Grab a cup of coffee, sit back, and enjoy our attempt to make legal jargon slightly less snooze-inducing.</p>
|
|
4
|
+
|
|
5
|
+
<h2>Terms of Use</h2>
|
|
6
|
+
<p>By using GradeMaster Pro, you agree to these terms. If you don’t agree, well, you probably shouldn’t be here. Seriously, we’ve put a lot of thought into this, so trust us, it’s worth agreeing to.</p>
|
|
7
|
+
<ol>
|
|
8
|
+
<li><strong>Don’t Be Evil</strong>: Stealing grades, hacking into accounts, or impersonating a teacher’s pet is strictly prohibited. Play nice!</li>
|
|
9
|
+
<li><strong>No Robots Allowed</strong>: Unless you’re a cool, teaching robot from the future, no automated systems or scripts here, folks. We like our users human.</li>
|
|
10
|
+
<li><strong>Use Responsibly</strong>: GradeMaster Pro is here to make your life easier, not to be used as a tool to procrastinate from actual grading. Use it wisely!</li>
|
|
11
|
+
</ol>
|
|
12
|
+
|
|
13
|
+
<h2>Privacy Policy</h2>
|
|
14
|
+
<p>We take your privacy very seriously. Like, top-secret, James Bond seriously. Here’s how we handle your info:</p>
|
|
15
|
+
<ul>
|
|
16
|
+
<li><strong>Data Collection</strong>: We collect only what we need to make your experience awesome. No more, no less.</li>
|
|
17
|
+
<li><strong>Cookies</strong>: Yes, we use cookies. Not the chocolate chip kind (sadly), but the digital kind to keep things running smoothly.</li>
|
|
18
|
+
<li><strong>Sharing Information</strong>: We don’t sell your data to third parties. We wouldn’t even know how to price it. Your secrets are safe with us.</li>
|
|
19
|
+
</ul>
|
|
20
|
+
|
|
21
|
+
<h2>Limitation of Liability</h2>
|
|
22
|
+
<p>Let’s keep this simple: if something goes wrong (like the internet breaking, your computer spontaneously combusting, or an alien invasion), GradeMaster Pro is not liable. We’re here to help, but some things are just out of our control.</p>
|
|
23
|
+
<ol>
|
|
24
|
+
<li><strong>No Guarantees</strong>: We strive for perfection, but we’re not perfect. If things go awry, we’ll do our best to fix them. No guarantees, but plenty of effort.</li>
|
|
25
|
+
<li><strong>Damages</strong>: In the rare event that GradeMaster Pro causes you any damages (physical, emotional, or psychological), our liability is limited to making funny jokes and sending good vibes your way.</li>
|
|
26
|
+
</ol>
|
|
27
|
+
|
|
28
|
+
<h2>Changes to This Agreement</h2>
|
|
29
|
+
<p>We might update these terms occasionally. When we do, we promise to give you a heads-up. No sneaky stuff. Check back here from time to time, or just trust that we’ll keep things reasonable.</p>
|
|
30
|
+
|
|
31
|
+
<h2>Contact Us</h2>
|
|
32
|
+
<p>Still awake? Impressive! If you have any questions, comments, or jokes to share, feel free to reach out to us at <a href="mailto:legal@grademasterpro.com">legal@grademasterpro.com</a>. We promise to respond faster than you can say “legal mumbo jumbo.”</p>
|
|
33
|
+
|
|
34
|
+
<p>Thanks for choosing GradeMaster Pro! Remember, with great grading power comes great responsibility. Use it wisely and keep on grading like a pro!</p>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "quackage",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.30",
|
|
4
4
|
"description": "Building. Testing. Quacking.",
|
|
5
5
|
"main": "source/Quackage.js",
|
|
6
6
|
"scripts": {
|
|
@@ -54,19 +54,19 @@
|
|
|
54
54
|
"@babel/preset-env": "^7.23.9",
|
|
55
55
|
"browserify": "^17.0.0",
|
|
56
56
|
"chai": "4.3.10",
|
|
57
|
-
"copy-files-from-to": "^3.
|
|
57
|
+
"copy-files-from-to": "^3.10.0",
|
|
58
58
|
"devextreme-showdown": "^1.0.1",
|
|
59
59
|
"gulp": "^4.0.2",
|
|
60
60
|
"gulp-babel": "^8.0.0",
|
|
61
61
|
"gulp-env": "^0.4.0",
|
|
62
62
|
"gulp-sourcemaps": "^3.0.0",
|
|
63
63
|
"gulp-terser": "^2.1.0",
|
|
64
|
-
"marked": "^
|
|
64
|
+
"marked": "^13.0.0",
|
|
65
65
|
"marked-tex-renderer": "^1.1.1",
|
|
66
66
|
"mocha": "10.4.0",
|
|
67
67
|
"npm-check-updates": "^16.14.20",
|
|
68
68
|
"nyc": "^15.1.0",
|
|
69
|
-
"pict-service-commandlineutility": "^1.0.
|
|
69
|
+
"pict-service-commandlineutility": "^1.0.13",
|
|
70
70
|
"vinyl-buffer": "^1.0.1",
|
|
71
71
|
"vinyl-source-stream": "^2.0.0"
|
|
72
72
|
}
|
|
@@ -33,6 +33,7 @@ let _Pict = new libCLIProgram(
|
|
|
33
33
|
|
|
34
34
|
// Template handling
|
|
35
35
|
require('./commands/Quackage-Command-Boilerplate.js'),
|
|
36
|
+
require('./commands/Quackage-Command-BuildJSONViews.js'),
|
|
36
37
|
require('./commands/Quackage-Command-ListTemplates.js'),
|
|
37
38
|
require('./commands/Quackage-Command-BuildTemplates.js')
|
|
38
39
|
]);
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
const libCommandLineCommand = require('pict-service-commandlineutility').ServiceCommandLineCommand;
|
|
2
|
+
const libFS = require('fs');
|
|
3
|
+
const libPath = require('path');
|
|
4
|
+
|
|
5
|
+
class QuackageCommandBuildTemplates extends libCommandLineCommand
|
|
6
|
+
{
|
|
7
|
+
constructor(pFable, pManifest, pServiceHash)
|
|
8
|
+
{
|
|
9
|
+
super(pFable, pManifest, pServiceHash);
|
|
10
|
+
|
|
11
|
+
this.options.CommandKeyword = 'generate_json_views';
|
|
12
|
+
this.options.Description = 'Generate pict ';
|
|
13
|
+
|
|
14
|
+
this.options.CommandArguments.push({ Name: '<folder>', Description: 'The folder path to build views in.' });
|
|
15
|
+
|
|
16
|
+
this.options.CommandOptions.push({ Name: '-p, --prefix [prefix]', Description: 'A "prefix" for the view set identifiers', Default: 'Default' });
|
|
17
|
+
|
|
18
|
+
this.options.Aliases.push('gjv');
|
|
19
|
+
|
|
20
|
+
this.viewSets = {};
|
|
21
|
+
|
|
22
|
+
this.addCommand();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Generate a JSON-only pict view.
|
|
27
|
+
*
|
|
28
|
+
* @param {string} pViewPrefix - The prefix for this set of files and views.
|
|
29
|
+
* @param {*} pViewName - The name of the view.
|
|
30
|
+
* @param {*} pViewContent - The HTML content of the view.
|
|
31
|
+
*/
|
|
32
|
+
generateView(pViewPrefix, pViewName, pViewContent)
|
|
33
|
+
{
|
|
34
|
+
let tmpViewNameClean = this.services.DataFormat.cleanNonAlphaCharacters(pViewName)
|
|
35
|
+
let tmpView = (
|
|
36
|
+
{
|
|
37
|
+
"ViewIdentifier": `${pViewPrefix}-${tmpViewNameClean}-View`,
|
|
38
|
+
|
|
39
|
+
"DefaultRenderable": `${pViewPrefix}-${tmpViewNameClean}-Renderable`,
|
|
40
|
+
"DefaultDestinationAddress": `#${pViewPrefix}-Content-Container`,
|
|
41
|
+
|
|
42
|
+
"AutoRender": false,
|
|
43
|
+
|
|
44
|
+
"Templates": [
|
|
45
|
+
{
|
|
46
|
+
"Hash": `${pViewPrefix}-${tmpViewNameClean}-Content-Template`,
|
|
47
|
+
"Template": pViewContent
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
"Renderables": [
|
|
51
|
+
{
|
|
52
|
+
"RenderableHash": `${pViewPrefix}-${tmpViewNameClean}-Renderable`,
|
|
53
|
+
"TemplateHash": `${pViewPrefix}-${tmpViewNameClean}-Content-Template`
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
});
|
|
57
|
+
return tmpView;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
addView(pViewPrefix, pViewRootPath, pViewFilePath)
|
|
61
|
+
{
|
|
62
|
+
// Load the view file
|
|
63
|
+
let tmpViewFileContent = libFS.readFileSync(pViewFilePath, 'utf8');
|
|
64
|
+
let tmpViewFileName = libPath.basename(pViewFilePath);
|
|
65
|
+
let tmpViewName = this.fable.DataFormat.cleanNonAlphaCharacters(this.fable.DataFormat.capitalizeEachWord(tmpViewFileName));
|
|
66
|
+
|
|
67
|
+
// Generate a view json
|
|
68
|
+
let tmpViewJSON = this.generateView(pViewPrefix, tmpViewName, tmpViewFileContent);
|
|
69
|
+
tmpViewJSON.CommentOriginalFilePath = pViewFilePath;
|
|
70
|
+
tmpViewJSON.CommentOriginalRootPath = pViewRootPath;
|
|
71
|
+
// Right now the view JSON will have the file extension in it of the template file. I kindof like this.
|
|
72
|
+
this.viewSets[tmpViewJSON.ViewIdentifier] = tmpViewJSON;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
generateViewsRecursively(pViewPrefix, pRootPath, pPath, fCallback)
|
|
76
|
+
{
|
|
77
|
+
libFS.readdir(pPath,
|
|
78
|
+
(pError, pFiles) =>
|
|
79
|
+
{
|
|
80
|
+
this.fable.Utility.eachLimit(pFiles, 1,
|
|
81
|
+
(pFileName, fEnumerationComplete)=>
|
|
82
|
+
{
|
|
83
|
+
let tmpFilePath = libPath.join(pPath, pFileName);
|
|
84
|
+
let tmpStat = libFS.stat(tmpFilePath,
|
|
85
|
+
(pFileStatError, pFileStats) =>
|
|
86
|
+
{
|
|
87
|
+
if (pFileStatError)
|
|
88
|
+
{
|
|
89
|
+
return fEnumerationComplete('File stat error during enumeration:'+pEnumerationError);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (pFileStats && pFileStats.isDirectory())
|
|
93
|
+
{
|
|
94
|
+
return this.generateViewsRecursively(pViewPrefix, pRootPath, tmpFilePath, fEnumerationComplete);
|
|
95
|
+
}
|
|
96
|
+
else
|
|
97
|
+
{
|
|
98
|
+
this.log.info(`Generating View JSON for ${pViewPrefix} from File [${pFileName}] in [${tmpFilePath}]`);
|
|
99
|
+
this.addView(pViewPrefix, pPath, tmpFilePath);
|
|
100
|
+
return fEnumerationComplete();
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
},
|
|
104
|
+
(pEnumerationError) =>
|
|
105
|
+
{
|
|
106
|
+
if (pEnumerationError)
|
|
107
|
+
{
|
|
108
|
+
return fCallback(`Error during recursive view JSON generation in folder [${pPath}]: ${pEnumerationError}`);
|
|
109
|
+
}
|
|
110
|
+
return fCallback();
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
generateViewsFromFolder(pViewPrefix, pPath, fCallback)
|
|
116
|
+
{
|
|
117
|
+
libFS.readdir(pPath,
|
|
118
|
+
(pError, pFiles) =>
|
|
119
|
+
{
|
|
120
|
+
this.fable.Utility.eachLimit(pFiles, 1,
|
|
121
|
+
(pFileName, fEnumerationComplete)=>
|
|
122
|
+
{
|
|
123
|
+
let tmpFilePath = libPath.join(pPath, pFileName);
|
|
124
|
+
let tmpStat = libFS.stat(tmpFilePath,
|
|
125
|
+
(pFileStatError, pFileStats) =>
|
|
126
|
+
{
|
|
127
|
+
if (pFileStatError)
|
|
128
|
+
{
|
|
129
|
+
return fCallback('File stat error during enumeration:'+pEnumerationError);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (pFileStats && pFileStats.isDirectory())
|
|
133
|
+
{
|
|
134
|
+
this.generateViewsRecursively(pViewPrefix, pPath, tmpFilePath, fEnumerationComplete);
|
|
135
|
+
}
|
|
136
|
+
else
|
|
137
|
+
{
|
|
138
|
+
this.addView(pViewPrefix, pPath, tmpFilePath);
|
|
139
|
+
return fEnumerationComplete();
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
},
|
|
143
|
+
(pEnumerationError) =>
|
|
144
|
+
{
|
|
145
|
+
if (pEnumerationError)
|
|
146
|
+
{
|
|
147
|
+
return fCallback(`Error building configuration only pict views for ${pPath}: ${pEnumerationError}`, pEnumerationError);
|
|
148
|
+
}
|
|
149
|
+
libFS.writeFileSync(`${this.fable.AppData.CWD}/${pViewPrefix}-View-Templates.json`, (JSON.stringify(this.viewSets, null, 4)));
|
|
150
|
+
return fCallback();
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
onRunAsync(fCallback)
|
|
156
|
+
{
|
|
157
|
+
let tmpPath = this.ArgumentString;
|
|
158
|
+
let tmpViewPrefix = this.CommandOptions.prefix;
|
|
159
|
+
let tmpCWDFolderPath = libPath.resolve(`${this.fable.AppData.CWD}/${tmpPath}`);
|
|
160
|
+
return this.generateViewsFromFolder(tmpViewPrefix, tmpCWDFolderPath, fCallback);
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
module.exports = QuackageCommandBuildTemplates;
|