'a'
mh-two-thousand-and-two
2024-04-12 44d2c92345cd156a59fc327b3060292a282d2893
1
2
"use strict";const RE_MEDIA_QUERY=/(?:(only|not)?\s*([^\s()]+)(?:\s*and)?\s*)?(.+)?/i,RE_MEDIA_FEATURE=/^(\(\s*[^()]+\)\s+[a-zA-Z]+\s+)+\(\s*[^()]+\)\s*$|^\(\s*[^()]+\)$/,RE_MQ_DISCRETE_EXPRESSION=/\(\s*([^\s:)]+)\s*(?::\s*([^\s)]+))?\s*\)/,RE_MQ_RANGE_EXPRESSION=/^\((?:([-+]?\d*\.?(?:\d+[a-zA-Z]*|\d+\s*\/\s*\d+))\s*(<|>|<=|>=)?\s*)?(aspect-ratio|resolution|width|height|device-width|device-height)(?:\s*(<|>|<=|>=)?\s*([-+]?\d*\.?(?:\d+[a-zA-Z]*|\d+\s*\/\s*\d+)))?\)$/,mediaQueryTypes=["screen"],featureValidatorMap={height:"number","min-height":"number","max-height":"number",width:"number","min-width":"number","max-width":"number",resolution:"resolution","min-resolution":"resolution","max-resolution":"resolution",orientation:"orientation","aspect-ratio":"ratio","min-aspect-ratio":"ratio","max-aspect-ratio":"ratio","device-height":"number","min-device-height":"number","max-device-height":"number","device-width":"number","min-device-width":"number","max-device-width":"number","prefers-color-scheme":"preferColorScheme"},featureValidator={number(e){const r=e.match(/^(\d+)(px|dp)?$/);if(r){if(r[2]){const t=r[1];return{value:t,reason:function(r){return"WARN: 媒体特征 `"+r+"` 的值 `"+e+"` 无需单位, 已自动转为 `"+t+"`"}}}return{value:e}}return{reason:function(r){return"ERROR: 媒体特征 `"+r+"` 的值 `"+e+"` 不正确, 必须为 `数值`"}}},resolution(e){if(/^\d+(dpi|dppx)$/.test(e))return{value:e};if(/^\d+$/.test(e)){return{value:e+"dpi",reason:function(e){return"WARN: 媒体特征 `"+e+"` 的单位为 `dpi | dppx` 自动补齐为 `dpi`"}}}return{reason:function(r){return"ERROR: 媒体特征 `"+r+"` 的值 `"+e+"` 不正确, 必须为 `数值 + dpi | dppx`"}}},orientation:e=>/^(portrait|landscape)$/.test(e)?{value:e}:{reason:function(r){return"WARN: 媒体特征 `"+r+"` 的值 `"+e+"` 不正确, 必须为 `portrait | landscape`"}},ratio:e=>/^(\d+\s*\/\s*\d+|\d+\.\d+|\d+)$/.test(e)?{value:e}:{reason:function(r){return"WARN: 媒体特征 `"+r+"` 的值 `"+e+"` 不正确, 必须为 `数值 | 数值/数值`"}},preferColorScheme:e=>/^(light|dark|no-preference)$/.test(e)?{value:e}:{reason:function(r){return"WARN: 媒体特征 `"+r+"` 的值 `"+e+"` 不正确, 必须为 `light | dark | no-preference`"}}};function parseQuery(e){const r=[];return{result:e.split(",").map((function(e){const t=(e=e.trim()).match(RE_MEDIA_QUERY),n=t[1],i=t[2],a=t[3]||"";if(!a.match(RE_MEDIA_FEATURE))return void r.push("WARN: 媒体特征格式错误");const o={};o.modifier=n,o.type=i?i.toLowerCase():"screen";let u=a.match(/\([^)]+\)/g)||[];return o.expressions=u.map((function(t){const n=new RegExp(`\\)\\s+([a-zA-Z]+)?\\s+${t.replace(/\(/,"\\(").replace(/\)/,"\\)")}`),i=e.match(n);let a="";if(i&&(a=i[1],"and"!==a&&"or"!==a))return void r.push("WARN: 媒体特征连接符必须为 and 或者 or");let o=t.match(RE_MQ_DISCRETE_EXPRESSION);return o?{type:"discrete",combineSymbol:a,feature:o[1],value:o[2]}:(o=t.match(RE_MQ_RANGE_EXPRESSION),o?{type:"range",combineSymbol:a,beforeValue:o[1],beforeSymbol:o[2],feature:o[3],afterSymbol:o[4],afterValue:o[5]}:void r.push('WARN: 无效的媒体特征表达式: "'+t+'"'))})),o})),error:r}}function validateDiscreteValue(e,r,t,n){const i=featureValidator[t](e.value),{value:a,reason:o}=i;let u="";return o&&o&&n.push(o(r)),a&&(u+=`${r}: ${a}`),u}function validateRangeValue(e,r,t,n){function i(e){let i=featureValidator[t](e);const{reason:a,value:o}=i;return a&&n.push(a(r)),o}let{beforeValue:a,beforeSymbol:o,afterSymbol:u,afterValue:s}=e,d=r;if(a){if(a=i(a),!a)return"";d=`${a} ${o} ${d}`}if(s){if(s=i(s),!s)return"";d=`${d} ${u} ${s}`}return d}function validateMediaCondition(e){if(e){const r=[],t=parseQuery(e);if(t.error.length>0)return t.error.forEach(t=>{t+=", 表达式: `"+e+"` 有错误,请检查",r.push(t)}),{reason:r};const n=[];return t.result.forEach(e=>{const{modifier:t,type:i,expressions:a}=e;if(-1===mediaQueryTypes.indexOf(i))return void r.push("WARN: 媒体类型 `"+i+"` 不支持");let o=t?`${t} ${i} and`:`${i} and`;a.forEach(e=>{const{feature:t,combineSymbol:n,type:i}=e,a=featureValidatorMap[t];if(!a)return o="",void r.push("WARN: 媒体特征 `"+t+"` 不支持");let u="";"discrete"===i?u=validateDiscreteValue(e,t,a,r):"range"===i&&(u=validateRangeValue(e,t,a,r)),u?o+=n?` ${n} (${u})`:` (${u})`:o=""}),n.push(o)}),{value:n.join(" or "),reason:r}}return{value:""}}function findMediaClassByCondition(e,r){if(r){return e.find(e=>e.condition===r)}return null}function wrapMediaCode(e,r){return`@media ${r} {\n${e}\n}`}module.exports={validateMediaCondition:validateMediaCondition,findMediaClassByCondition:findMediaClassByCondition,wrapMediaCode:wrapMediaCode};
//# sourceMappingURL=mediaquery.js.map