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;