diff --git a/README.md b/README.md
index 5d1456c5ce..4c0d305a77 100644
--- a/README.md
+++ b/README.md
@@ -56,6 +56,69 @@ Edit `composer.json` and
composer update --prefer-dist tsugi/lib
+Making Changes and Contributing Back
+-------------------------------------
+
+This `tsugi/lib` directory is a git subtree that tracks the upstream repository
+at [tsugiproject/tsugi-php](https://github.com/tsugiproject/tsugi-php). When you
+make changes to files in this subtree, you can push those changes back to the
+original repository as a pull request.
+
+### Workflow for Contributing Changes
+
+1. **Make your changes** in the `tsugi/lib` directory as you normally would.
+
+2. **Commit your changes** in the parent repository:
+
+ git add tsugi/lib
+ git commit -m "Your commit message describing the changes"
+
+3. **Push changes back to the upstream repository**:
+
+ First, ensure you have the upstream repository configured as a remote:
+
+ git remote add tsugi-php https://github.com/tsugiproject/tsugi-php.git
+
+ Then push the subtree changes to a branch in the upstream repository:
+
+ git subtree push --prefix=tsugi/lib tsugi-php your-branch-name
+
+ This will create a new branch `your-branch-name` in the upstream repository
+ with your changes.
+
+4. **Create a Pull Request**:
+
+ - Navigate to https://github.com/tsugiproject/tsugi-php
+ - You should see a banner suggesting to create a PR from your new branch
+ - Click "Compare & pull request" and fill out the PR description
+ - Submit the PR for review
+
+### Alternative: Using a Fork
+
+If you prefer to work with a fork of the upstream repository:
+
+1. **Fork the repository** at https://github.com/tsugiproject/tsugi-php
+
+2. **Add your fork as a remote**:
+
+ git remote add tsugi-php-fork https://github.com/YOUR-USERNAME/tsugi-php.git
+
+3. **Push to your fork**:
+
+ git subtree push --prefix=tsugi/lib tsugi-php-fork your-branch-name
+
+4. **Create a PR** from your fork's branch to the upstream repository.
+
+### Notes
+
+- The `git subtree push` command extracts only the commits that affect files
+ in the `tsugi/lib` directory and creates a clean history in the upstream
+ repository.
+- Make sure your commit messages are clear and descriptive, as they will be
+ preserved in the upstream repository.
+- If you encounter conflicts during the push, you may need to pull the latest
+ changes from upstream first using `git subtree pull`.
+
Releasing
---------
diff --git a/include/setup.php b/include/setup.php
index 85be92ebc7..48efc98bfc 100644
--- a/include/setup.php
+++ b/include/setup.php
@@ -43,13 +43,14 @@ function print_stack_trace() {
if ( isset($CFG->upgrading) && $CFG->upgrading === true ) require_once("upgrading.php");
-// The vendor include and root
-if ( ! is_string($CFG->vendorroot) ) $CFG->vendorroot = $CFG->wwwroot."/vendor/tsugi/lib/util";
-if ( ! is_string($CFG->vendorinclude) ) $CFG->vendorinclude = $CFG->dirroot."/vendor/tsugi/lib/include";
-if ( ! is_string($CFG->vendorstatic) ) $CFG->vendorstatic = $CFG->dirroot."/vendor/tsugi/lib/static";
if ( is_string($CFG->staticroot) ) $CFG->staticroot = \Tsugi\Util\U::remove_relative_path($CFG->staticroot);
-require_once $CFG->vendorinclude . "/lms_lib.php";
+// Handle both cases: lib in parent directory structure vs standalone lib
+$lms_lib_path = $CFG->dirroot."/lib/include/lms_lib.php";
+if ( !file_exists($lms_lib_path) ) {
+ $lms_lib_path = $CFG->dirroot."/include/lms_lib.php";
+}
+require_once $lms_lib_path;
// Check to see if pre_config was included
// TODO: Make this a die() about a year after - Thu Nov 11 19:34:23 EST 2021
diff --git a/src/Config/ConfigInfo.php b/src/Config/ConfigInfo.php
index 5d0633b034..a1ecaa3188 100644
--- a/src/Config/ConfigInfo.php
+++ b/src/Config/ConfigInfo.php
@@ -767,14 +767,9 @@ class ConfigInfo {
*/
public $dbversion = false;
- /*
- * These are here to override the defaults for the vendor folder naming conventions
- *
- * It is unlikely you need to change these.
- */
- public $vendorroot = false;
- public $vendorinclude = false;
- public $vendorstatic = false;
+ public $vendorinclude = false; // No longer used in the code base
+ public $vendorroot = false; // No longer used in the code base
+ public $vendorstatic = false; // No longer used in the code base
/**
* The autoloader to be used when loading classes.
diff --git a/src/UI/Output.php b/src/UI/Output.php
index 1737382d1b..1cbe4aa2b1 100644
--- a/src/UI/Output.php
+++ b/src/UI/Output.php
@@ -178,16 +178,7 @@ function header() {
top: 0px !important;
}
-
-
-
-
-
-
- session_get('CSRF_TOKEN') ) {
echo(''."\n");
} else {
@@ -535,17 +526,11 @@ function googleTranslateElementInit() {
public static function getUtilUrl($path)
{
global $CFG;
- if ( isset($CFG->utilroot) ) {
- return $CFG->utilroot.$path;
- }
// From wwwroot
$path = str_replace('.php','',$path);
$retval = $CFG->wwwroot . '/util' . $path;
return $retval;
-
- // The old way from "vendor"
- // return $CFG->vendorroot.$path;
}
/**
diff --git a/static/js/html5shiv/html5shiv.js b/static/js/html5shiv/html5shiv.js
deleted file mode 100644
index 448cebd79e..0000000000
--- a/static/js/html5shiv/html5shiv.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/*
- HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
-*/
-(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();
-a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x";
-c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode||
-"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);
-if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d #mq-test-1 { width: 42px; }',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";if(a.matchMedia&&a.matchMedia("all").addListener)return!1;var b=a.matchMedia,c=b("only all").matches,d=!1,e=0,f=[],g=function(){a.clearTimeout(e),e=a.setTimeout(function(){for(var c=0,d=f.length;d>c;c++){var e=f[c].mql,g=f[c].listeners||[],h=b(e.media).matches;if(h!==e.matches){e.matches=h;for(var i=0,j=g.length;j>i;i++)g[i].call(a,e)}}},30)};a.matchMedia=function(e){var h=b(e),i=[],j=0;return h.addListener=function(b){c&&(d||(d=!0,a.addEventListener("resize",g,!0)),0===j&&(j=f.push({mql:h,listeners:i})),i.push(b))},h.removeListener=function(a){for(var b=0,c=i.length;c>b;b++)i[b]===a&&i.splice(b,1)},h}}(this),function(a){"use strict";function b(){v(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},g=function(a){return a.replace(c.regex.minmaxwh,"").match(c.regex.other)};if(c.ajax=f,c.queue=d,c.unsupportedmq=g,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var h,i,j,k=a.document,l=k.documentElement,m=[],n=[],o=[],p={},q=30,r=k.getElementsByTagName("head")[0]||l,s=k.getElementsByTagName("base")[0],t=r.getElementsByTagName("link"),u=function(){var a,b=k.createElement("div"),c=k.body,d=l.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=k.createElement("body"),c.style.background="none"),l.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&l.insertBefore(c,l.firstChild),a=b.offsetWidth,f?l.removeChild(c):c.removeChild(b),l.style.fontSize=d,e&&(c.style.fontSize=e),a=j=parseFloat(a)},v=function(b){var c="clientWidth",d=l[c],e="CSS1Compat"===k.compatMode&&d||k.body[c]||d,f={},g=t[t.length-1],p=(new Date).getTime();if(b&&h&&q>p-h)return a.clearTimeout(i),i=a.setTimeout(v,q),void 0;h=p;for(var s in m)if(m.hasOwnProperty(s)){var w=m[s],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?j||u():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?j||u():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(n[w.rules]))}for(var C in o)o.hasOwnProperty(C)&&o[C]&&o[C].parentNode===r&&r.removeChild(o[C]);o.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=k.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,r.insertBefore(E,g.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(k.createTextNode(F)),o.push(E)}},w=function(a,b,d){var e=a.replace(c.regex.comments,"").replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},i=!f&&d;b.length&&(b+="/"),i&&(f=1);for(var j=0;f>j;j++){var k,l,o,p;i?(k=d,n.push(h(a))):(k=e[j].match(c.regex.findStyles)&&RegExp.$1,n.push(RegExp.$2&&h(RegExp.$2))),o=k.split(","),p=o.length;for(var q=0;p>q;q++)l=o[q],g(l)||m.push({media:l.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:n.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}v()},x=function(){if(d.length){var b=d.shift();f(b.href,function(c){w(c,b.href,b.media),p[b.href]=!0,a.setTimeout(function(){x()},0)})}},y=function(){for(var b=0;b #mq-test-1 { width: 42px; }';
- docElem.insertBefore(fakeBody, refNode);
- bool = div.offsetWidth === 42;
- docElem.removeChild(fakeBody);
- return {
- matches: bool,
- media: q
- };
- };
- }(w.document);
-})(this);
-
-/*! matchMedia() polyfill addListener/removeListener extension. Author & copyright (c) 2012: Scott Jehl. Dual MIT/BSD license */
-(function(w) {
- "use strict";
- if (w.matchMedia && w.matchMedia("all").addListener) {
- return false;
- }
- var localMatchMedia = w.matchMedia, hasMediaQueries = localMatchMedia("only all").matches, isListening = false, timeoutID = 0, queries = [], handleChange = function(evt) {
- w.clearTimeout(timeoutID);
- timeoutID = w.setTimeout(function() {
- for (var i = 0, il = queries.length; i < il; i++) {
- var mql = queries[i].mql, listeners = queries[i].listeners || [], matches = localMatchMedia(mql.media).matches;
- if (matches !== mql.matches) {
- mql.matches = matches;
- for (var j = 0, jl = listeners.length; j < jl; j++) {
- listeners[j].call(w, mql);
- }
- }
- }
- }, 30);
- };
- w.matchMedia = function(media) {
- var mql = localMatchMedia(media), listeners = [], index = 0;
- mql.addListener = function(listener) {
- if (!hasMediaQueries) {
- return;
- }
- if (!isListening) {
- isListening = true;
- w.addEventListener("resize", handleChange, true);
- }
- if (index === 0) {
- index = queries.push({
- mql: mql,
- listeners: listeners
- });
- }
- listeners.push(listener);
- };
- mql.removeListener = function(listener) {
- for (var i = 0, il = listeners.length; i < il; i++) {
- if (listeners[i] === listener) {
- listeners.splice(i, 1);
- }
- }
- };
- return mql;
- };
-})(this);
-
-(function(w) {
- "use strict";
- var respond = {};
- w.respond = respond;
- respond.update = function() {};
- var requestQueue = [], xmlHttp = function() {
- var xmlhttpmethod = false;
- try {
- xmlhttpmethod = new w.XMLHttpRequest();
- } catch (e) {
- xmlhttpmethod = new w.ActiveXObject("Microsoft.XMLHTTP");
- }
- return function() {
- return xmlhttpmethod;
- };
- }(), ajax = function(url, callback) {
- var req = xmlHttp();
- if (!req) {
- return;
- }
- req.open("GET", url, true);
- req.onreadystatechange = function() {
- if (req.readyState !== 4 || req.status !== 200 && req.status !== 304) {
- return;
- }
- callback(req.responseText);
- };
- if (req.readyState === 4) {
- return;
- }
- req.send(null);
- }, isUnsupportedMediaQuery = function(query) {
- return query.replace(respond.regex.minmaxwh, "").match(respond.regex.other);
- };
- respond.ajax = ajax;
- respond.queue = requestQueue;
- respond.unsupportedmq = isUnsupportedMediaQuery;
- respond.regex = {
- media: /@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,
- keyframes: /@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,
- comments: /\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,
- urls: /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,
- findStyles: /@media *([^\{]+)\{([\S\s]+?)$/,
- only: /(only\s+)?([a-zA-Z]+)\s?/,
- minw: /\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,
- maxw: /\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,
- minmaxwh: /\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,
- other: /\([^\)]*\)/g
- };
- respond.mediaQueriesSupported = w.matchMedia && w.matchMedia("only all") !== null && w.matchMedia("only all").matches;
- if (respond.mediaQueriesSupported) {
- return;
- }
- var doc = w.document, docElem = doc.documentElement, mediastyles = [], rules = [], appendedEls = [], parsedSheets = {}, resizeThrottle = 30, head = doc.getElementsByTagName("head")[0] || docElem, base = doc.getElementsByTagName("base")[0], links = head.getElementsByTagName("link"), lastCall, resizeDefer, eminpx, getEmValue = function() {
- var ret, div = doc.createElement("div"), body = doc.body, originalHTMLFontSize = docElem.style.fontSize, originalBodyFontSize = body && body.style.fontSize, fakeUsed = false;
- div.style.cssText = "position:absolute;font-size:1em;width:1em";
- if (!body) {
- body = fakeUsed = doc.createElement("body");
- body.style.background = "none";
- }
- docElem.style.fontSize = "100%";
- body.style.fontSize = "100%";
- body.appendChild(div);
- if (fakeUsed) {
- docElem.insertBefore(body, docElem.firstChild);
- }
- ret = div.offsetWidth;
- if (fakeUsed) {
- docElem.removeChild(body);
- } else {
- body.removeChild(div);
- }
- docElem.style.fontSize = originalHTMLFontSize;
- if (originalBodyFontSize) {
- body.style.fontSize = originalBodyFontSize;
- }
- ret = eminpx = parseFloat(ret);
- return ret;
- }, applyMedia = function(fromResize) {
- var name = "clientWidth", docElemProp = docElem[name], currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[name] || docElemProp, styleBlocks = {}, lastLink = links[links.length - 1], now = new Date().getTime();
- if (fromResize && lastCall && now - lastCall < resizeThrottle) {
- w.clearTimeout(resizeDefer);
- resizeDefer = w.setTimeout(applyMedia, resizeThrottle);
- return;
- } else {
- lastCall = now;
- }
- for (var i in mediastyles) {
- if (mediastyles.hasOwnProperty(i)) {
- var thisstyle = mediastyles[i], min = thisstyle.minw, max = thisstyle.maxw, minnull = min === null, maxnull = max === null, em = "em";
- if (!!min) {
- min = parseFloat(min) * (min.indexOf(em) > -1 ? eminpx || getEmValue() : 1);
- }
- if (!!max) {
- max = parseFloat(max) * (max.indexOf(em) > -1 ? eminpx || getEmValue() : 1);
- }
- if (!thisstyle.hasquery || (!minnull || !maxnull) && (minnull || currWidth >= min) && (maxnull || currWidth <= max)) {
- if (!styleBlocks[thisstyle.media]) {
- styleBlocks[thisstyle.media] = [];
- }
- styleBlocks[thisstyle.media].push(rules[thisstyle.rules]);
- }
- }
- }
- for (var j in appendedEls) {
- if (appendedEls.hasOwnProperty(j)) {
- if (appendedEls[j] && appendedEls[j].parentNode === head) {
- head.removeChild(appendedEls[j]);
- }
- }
- }
- appendedEls.length = 0;
- for (var k in styleBlocks) {
- if (styleBlocks.hasOwnProperty(k)) {
- var ss = doc.createElement("style"), css = styleBlocks[k].join("\n");
- ss.type = "text/css";
- ss.media = k;
- head.insertBefore(ss, lastLink.nextSibling);
- if (ss.styleSheet) {
- ss.styleSheet.cssText = css;
- } else {
- ss.appendChild(doc.createTextNode(css));
- }
- appendedEls.push(ss);
- }
- }
- }, translate = function(styles, href, media) {
- var qs = styles.replace(respond.regex.comments, "").replace(respond.regex.keyframes, "").match(respond.regex.media), ql = qs && qs.length || 0;
- href = href.substring(0, href.lastIndexOf("/"));
- var repUrls = function(css) {
- return css.replace(respond.regex.urls, "$1" + href + "$2$3");
- }, useMedia = !ql && media;
- if (href.length) {
- href += "/";
- }
- if (useMedia) {
- ql = 1;
- }
- for (var i = 0; i < ql; i++) {
- var fullq, thisq, eachq, eql;
- if (useMedia) {
- fullq = media;
- rules.push(repUrls(styles));
- } else {
- fullq = qs[i].match(respond.regex.findStyles) && RegExp.$1;
- rules.push(RegExp.$2 && repUrls(RegExp.$2));
- }
- eachq = fullq.split(",");
- eql = eachq.length;
- for (var j = 0; j < eql; j++) {
- thisq = eachq[j];
- if (isUnsupportedMediaQuery(thisq)) {
- continue;
- }
- mediastyles.push({
- media: thisq.split("(")[0].match(respond.regex.only) && RegExp.$2 || "all",
- rules: rules.length - 1,
- hasquery: thisq.indexOf("(") > -1,
- minw: thisq.match(respond.regex.minw) && parseFloat(RegExp.$1) + (RegExp.$2 || ""),
- maxw: thisq.match(respond.regex.maxw) && parseFloat(RegExp.$1) + (RegExp.$2 || "")
- });
- }
- }
- applyMedia();
- }, makeRequests = function() {
- if (requestQueue.length) {
- var thisRequest = requestQueue.shift();
- ajax(thisRequest.href, function(styles) {
- translate(styles, thisRequest.href, thisRequest.media);
- parsedSheets[thisRequest.href] = true;
- w.setTimeout(function() {
- makeRequests();
- }, 0);
- });
- }
- }, ripCSS = function() {
- for (var i = 0; i < links.length; i++) {
- var sheet = links[i], href = sheet.href, media = sheet.media, isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet";
- if (!!href && isCSS && !parsedSheets[href]) {
- if (sheet.styleSheet && sheet.styleSheet.rawCssText) {
- translate(sheet.styleSheet.rawCssText, href, media);
- parsedSheets[href] = true;
- } else {
- if (!/^([a-zA-Z:]*\/\/)/.test(href) && !base || href.replace(RegExp.$1, "").split("/")[0] === w.location.host) {
- if (href.substring(0, 2) === "//") {
- href = w.location.protocol + href;
- }
- requestQueue.push({
- href: href,
- media: media
- });
- }
- }
- }
- }
- makeRequests();
- };
- ripCSS();
- respond.update = ripCSS;
- respond.getEmValue = getEmValue;
- function callMedia() {
- applyMedia(true);
- }
- if (w.addEventListener) {
- w.addEventListener("resize", callMedia, false);
- } else if (w.attachEvent) {
- w.attachEvent("onresize", callMedia);
- }
-})(this);
\ No newline at end of file
diff --git a/static/js/respond/respond.min.js b/static/js/respond/respond.min.js
deleted file mode 100644
index e8d6207f76..0000000000
--- a/static/js/respond/respond.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*! Respond.js v1.4.2: min/max-width media query polyfill
- * Copyright 2014 Scott Jehl
- * Licensed under MIT
- * http://j.mp/respondjs */
-
-!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){v(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},g=function(a){return a.replace(c.regex.minmaxwh,"").match(c.regex.other)};if(c.ajax=f,c.queue=d,c.unsupportedmq=g,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var h,i,j,k=a.document,l=k.documentElement,m=[],n=[],o=[],p={},q=30,r=k.getElementsByTagName("head")[0]||l,s=k.getElementsByTagName("base")[0],t=r.getElementsByTagName("link"),u=function(){var a,b=k.createElement("div"),c=k.body,d=l.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=k.createElement("body"),c.style.background="none"),l.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&l.insertBefore(c,l.firstChild),a=b.offsetWidth,f?l.removeChild(c):c.removeChild(b),l.style.fontSize=d,e&&(c.style.fontSize=e),a=j=parseFloat(a)},v=function(b){var c="clientWidth",d=l[c],e="CSS1Compat"===k.compatMode&&d||k.body[c]||d,f={},g=t[t.length-1],p=(new Date).getTime();if(b&&h&&q>p-h)return a.clearTimeout(i),i=a.setTimeout(v,q),void 0;h=p;for(var s in m)if(m.hasOwnProperty(s)){var w=m[s],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?j||u():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?j||u():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(n[w.rules]))}for(var C in o)o.hasOwnProperty(C)&&o[C]&&o[C].parentNode===r&&r.removeChild(o[C]);o.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=k.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,r.insertBefore(E,g.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(k.createTextNode(F)),o.push(E)}},w=function(a,b,d){var e=a.replace(c.regex.comments,"").replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},i=!f&&d;b.length&&(b+="/"),i&&(f=1);for(var j=0;f>j;j++){var k,l,o,p;i?(k=d,n.push(h(a))):(k=e[j].match(c.regex.findStyles)&&RegExp.$1,n.push(RegExp.$2&&h(RegExp.$2))),o=k.split(","),p=o.length;for(var q=0;p>q;q++)l=o[q],g(l)||m.push({media:l.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:n.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}v()},x=function(){if(d.length){var b=d.shift();f(b.href,function(c){w(c,b.href,b.media),p[b.href]=!0,a.setTimeout(function(){x()},0)})}},y=function(){for(var b=0;b #mq-test-1 { width: 42px; }';
- docElem.insertBefore(fakeBody, refNode);
- bool = div.offsetWidth === 42;
- docElem.removeChild(fakeBody);
- return {
- matches: bool,
- media: q
- };
- };
- }(w.document);
-})(this);
-
-(function(w) {
- "use strict";
- var respond = {};
- w.respond = respond;
- respond.update = function() {};
- var requestQueue = [], xmlHttp = function() {
- var xmlhttpmethod = false;
- try {
- xmlhttpmethod = new w.XMLHttpRequest();
- } catch (e) {
- xmlhttpmethod = new w.ActiveXObject("Microsoft.XMLHTTP");
- }
- return function() {
- return xmlhttpmethod;
- };
- }(), ajax = function(url, callback) {
- var req = xmlHttp();
- if (!req) {
- return;
- }
- req.open("GET", url, true);
- req.onreadystatechange = function() {
- if (req.readyState !== 4 || req.status !== 200 && req.status !== 304) {
- return;
- }
- callback(req.responseText);
- };
- if (req.readyState === 4) {
- return;
- }
- req.send(null);
- }, isUnsupportedMediaQuery = function(query) {
- return query.replace(respond.regex.minmaxwh, "").match(respond.regex.other);
- };
- respond.ajax = ajax;
- respond.queue = requestQueue;
- respond.unsupportedmq = isUnsupportedMediaQuery;
- respond.regex = {
- media: /@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,
- keyframes: /@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,
- comments: /\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,
- urls: /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,
- findStyles: /@media *([^\{]+)\{([\S\s]+?)$/,
- only: /(only\s+)?([a-zA-Z]+)\s?/,
- minw: /\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,
- maxw: /\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,
- minmaxwh: /\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,
- other: /\([^\)]*\)/g
- };
- respond.mediaQueriesSupported = w.matchMedia && w.matchMedia("only all") !== null && w.matchMedia("only all").matches;
- if (respond.mediaQueriesSupported) {
- return;
- }
- var doc = w.document, docElem = doc.documentElement, mediastyles = [], rules = [], appendedEls = [], parsedSheets = {}, resizeThrottle = 30, head = doc.getElementsByTagName("head")[0] || docElem, base = doc.getElementsByTagName("base")[0], links = head.getElementsByTagName("link"), lastCall, resizeDefer, eminpx, getEmValue = function() {
- var ret, div = doc.createElement("div"), body = doc.body, originalHTMLFontSize = docElem.style.fontSize, originalBodyFontSize = body && body.style.fontSize, fakeUsed = false;
- div.style.cssText = "position:absolute;font-size:1em;width:1em";
- if (!body) {
- body = fakeUsed = doc.createElement("body");
- body.style.background = "none";
- }
- docElem.style.fontSize = "100%";
- body.style.fontSize = "100%";
- body.appendChild(div);
- if (fakeUsed) {
- docElem.insertBefore(body, docElem.firstChild);
- }
- ret = div.offsetWidth;
- if (fakeUsed) {
- docElem.removeChild(body);
- } else {
- body.removeChild(div);
- }
- docElem.style.fontSize = originalHTMLFontSize;
- if (originalBodyFontSize) {
- body.style.fontSize = originalBodyFontSize;
- }
- ret = eminpx = parseFloat(ret);
- return ret;
- }, applyMedia = function(fromResize) {
- var name = "clientWidth", docElemProp = docElem[name], currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[name] || docElemProp, styleBlocks = {}, lastLink = links[links.length - 1], now = new Date().getTime();
- if (fromResize && lastCall && now - lastCall < resizeThrottle) {
- w.clearTimeout(resizeDefer);
- resizeDefer = w.setTimeout(applyMedia, resizeThrottle);
- return;
- } else {
- lastCall = now;
- }
- for (var i in mediastyles) {
- if (mediastyles.hasOwnProperty(i)) {
- var thisstyle = mediastyles[i], min = thisstyle.minw, max = thisstyle.maxw, minnull = min === null, maxnull = max === null, em = "em";
- if (!!min) {
- min = parseFloat(min) * (min.indexOf(em) > -1 ? eminpx || getEmValue() : 1);
- }
- if (!!max) {
- max = parseFloat(max) * (max.indexOf(em) > -1 ? eminpx || getEmValue() : 1);
- }
- if (!thisstyle.hasquery || (!minnull || !maxnull) && (minnull || currWidth >= min) && (maxnull || currWidth <= max)) {
- if (!styleBlocks[thisstyle.media]) {
- styleBlocks[thisstyle.media] = [];
- }
- styleBlocks[thisstyle.media].push(rules[thisstyle.rules]);
- }
- }
- }
- for (var j in appendedEls) {
- if (appendedEls.hasOwnProperty(j)) {
- if (appendedEls[j] && appendedEls[j].parentNode === head) {
- head.removeChild(appendedEls[j]);
- }
- }
- }
- appendedEls.length = 0;
- for (var k in styleBlocks) {
- if (styleBlocks.hasOwnProperty(k)) {
- var ss = doc.createElement("style"), css = styleBlocks[k].join("\n");
- ss.type = "text/css";
- ss.media = k;
- head.insertBefore(ss, lastLink.nextSibling);
- if (ss.styleSheet) {
- ss.styleSheet.cssText = css;
- } else {
- ss.appendChild(doc.createTextNode(css));
- }
- appendedEls.push(ss);
- }
- }
- }, translate = function(styles, href, media) {
- var qs = styles.replace(respond.regex.comments, "").replace(respond.regex.keyframes, "").match(respond.regex.media), ql = qs && qs.length || 0;
- href = href.substring(0, href.lastIndexOf("/"));
- var repUrls = function(css) {
- return css.replace(respond.regex.urls, "$1" + href + "$2$3");
- }, useMedia = !ql && media;
- if (href.length) {
- href += "/";
- }
- if (useMedia) {
- ql = 1;
- }
- for (var i = 0; i < ql; i++) {
- var fullq, thisq, eachq, eql;
- if (useMedia) {
- fullq = media;
- rules.push(repUrls(styles));
- } else {
- fullq = qs[i].match(respond.regex.findStyles) && RegExp.$1;
- rules.push(RegExp.$2 && repUrls(RegExp.$2));
- }
- eachq = fullq.split(",");
- eql = eachq.length;
- for (var j = 0; j < eql; j++) {
- thisq = eachq[j];
- if (isUnsupportedMediaQuery(thisq)) {
- continue;
- }
- mediastyles.push({
- media: thisq.split("(")[0].match(respond.regex.only) && RegExp.$2 || "all",
- rules: rules.length - 1,
- hasquery: thisq.indexOf("(") > -1,
- minw: thisq.match(respond.regex.minw) && parseFloat(RegExp.$1) + (RegExp.$2 || ""),
- maxw: thisq.match(respond.regex.maxw) && parseFloat(RegExp.$1) + (RegExp.$2 || "")
- });
- }
- }
- applyMedia();
- }, makeRequests = function() {
- if (requestQueue.length) {
- var thisRequest = requestQueue.shift();
- ajax(thisRequest.href, function(styles) {
- translate(styles, thisRequest.href, thisRequest.media);
- parsedSheets[thisRequest.href] = true;
- w.setTimeout(function() {
- makeRequests();
- }, 0);
- });
- }
- }, ripCSS = function() {
- for (var i = 0; i < links.length; i++) {
- var sheet = links[i], href = sheet.href, media = sheet.media, isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet";
- if (!!href && isCSS && !parsedSheets[href]) {
- if (sheet.styleSheet && sheet.styleSheet.rawCssText) {
- translate(sheet.styleSheet.rawCssText, href, media);
- parsedSheets[href] = true;
- } else {
- if (!/^([a-zA-Z:]*\/\/)/.test(href) && !base || href.replace(RegExp.$1, "").split("/")[0] === w.location.host) {
- if (href.substring(0, 2) === "//") {
- href = w.location.protocol + href;
- }
- requestQueue.push({
- href: href,
- media: media
- });
- }
- }
- }
- }
- makeRequests();
- };
- ripCSS();
- respond.update = ripCSS;
- respond.getEmValue = getEmValue;
- function callMedia() {
- applyMedia(true);
- }
- if (w.addEventListener) {
- w.addEventListener("resize", callMedia, false);
- } else if (w.attachEvent) {
- w.attachEvent("onresize", callMedia);
- }
-})(this);
\ No newline at end of file
diff --git a/tests/Util/LTI13Test.php b/tests/Util/LTI13Test.php
index 530f9d35ce..9ff90d845d 100644
--- a/tests/Util/LTI13Test.php
+++ b/tests/Util/LTI13Test.php
@@ -20,10 +20,9 @@
require_once "src/Config/ConfigInfo.php";
require_once "src/Blob/BlobUtil.php";
-$dirroot = dirname(__FILE__).'/../';
+$dirroot = dirname(__FILE__).'/../../';
$wwwroot = 'http://localhost:8888';
$CFG = new \Tsugi\Config\ConfigInfo($dirroot, $wwwroot);
-$CFG->vendorinclude = dirname(__FILE__).'/../../include';
$toppath = dirname(__FILE__).'/../..';
require_once $toppath.'/vendor/firebase/php-jwt/src/JWT.php';
diff --git a/tests/Util/LTITest.php b/tests/Util/LTITest.php
index 9ad04fba11..441880dd32 100644
--- a/tests/Util/LTITest.php
+++ b/tests/Util/LTITest.php
@@ -20,10 +20,9 @@
require_once "src/Config/ConfigInfo.php";
require_once "src/Blob/BlobUtil.php";
-$dirroot = dirname(__FILE__).'/../';
+$dirroot = dirname(__FILE__).'/../../';
$wwwroot = 'http://localhost:8888';
$CFG = new \Tsugi\Config\ConfigInfo($dirroot, $wwwroot);
-$CFG->vendorinclude = dirname(__FILE__).'/../../include';
require_once "include/setup.php";
diff --git a/util/launch.php b/util/launch.php
index 3b55c74234..b7c6c18886 100644
--- a/util/launch.php
+++ b/util/launch.php
@@ -1,7 +1,7 @@
vendorinclude . "/lms_lib.php";
+require_once $CFG->dirroot."/lib/include/lms_lib.php";
use \Tsugi\Core\LTIX;