# rvm_css v1.1 # Static CSS caching # # License: GNU GPLv2 or later # # Ruud van Melick # http://vanmelick.com/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YToxMDp7czo3OiJ2ZXJzaW9uIjtzOjM6IjEuMSI7czo2OiJhdXRob3IiO3M6MTU6IlJ1dWQg dmFuIE1lbGljayI7czoxMDoiYXV0aG9yX3VyaSI7czoyMToiaHR0cDovL3Zhbm1lbGljay5j b20vIjtzOjExOiJkZXNjcmlwdGlvbiI7czoxODoiU3RhdGljIENTUyBjYWNoaW5nIjtzOjQ6 InR5cGUiO2k6MTtzOjU6ImZsYWdzIjtpOjI7czo0OiJuYW1lIjtzOjc6InJ2bV9jc3MiO3M6 NDoiaGVscCI7czoyNjA3OiIJPHA+VGhpcyBwbHVnaW4gYXV0b21hdGljYWxseSBzdG9yZXMg YSBjb3B5IG9mIHlvdXIgc3R5bGUgc2hlZXQocykgYXMgYSBzdGF0aWMgZmlsZS4gU3RhdGlj IGZpbGVzIGFyZSBzZXJ2ZWQgc2V2ZXJhbCBvcmRlcnMgb2YgbWFnbml0dWRlIGZhc3RlciB0 aGFuIDxzcGFuIGNsYXNzPSJjYXBzIj5QSFA8L3NwYW4+IGZpbGVzICgyMDAgdGltZXMgZmFz dGVyLCBpbiBteSBvd24gdGVzdHMgb24gYSBGYXN0Q0dJLWJhc2VkIHNlcnZlcikuPC9wPgoK CTxwPlBvc3QtaW5zdGFsbGF0aW9uIHN0ZXBzOgoJPG9sPgoJCTxsaT5BY3RpdmF0ZSB0aGUg cGx1Z2luLjwvbGk+CgkJPGxpPkNyZWF0ZSBhIGRpcmVjdG9yeSBmb3IgdGhlIHN0YXRpYyBz dHlsZSBzaGVldCBmaWxlcyBpbiB0aGUgcm9vdCBvZiB5b3VyIHRleHRwYXR0ZXJuIGluc3Rh bGxhdGlvbi4gWW91IHNob3VsZCBtYWtlIHN1cmUgdGhhdCA8c3BhbiBjbGFzcz0iY2FwcyI+ UEhQPC9zcGFuPiBpcyBhYmxlIHRvIHdyaXRlIHRvIHRoYXQgZGlyZWN0b3J5LjwvbGk+CgkJ PGxpPlZpc2l0IHRoZSA8YSBocmVmPSJpbmRleC5waHA/ZXZlbnQ9cHJlZnMmYW1wO3N0ZXA9 YWR2YW5jZWRfcHJlZnMiPmFkdmFuY2VkIHByZWZlcmVuY2VzPC9hPiBhbmQgbWFrZSBzdXJl IHRoZSAmIzgyMjA7U3R5bGUgZGlyZWN0b3J5JiM4MjIxOyBwcmVmZXJlbmNlIGNvbnRhaW5z IHRoZSBkaXJlY3RvcnkgeW91IGNyZWF0ZWQgaW4gc3RlcCAyLiBUaGlzIHBhdGggaXMgYWx3 YXlzIGEgcmVsYXRpdmUgcGF0aCAodG8gdGhlIGRpcmVjdG9yeSBvZiB5b3VyIHJvb3QgdGV4 dHBhdHRlcm4gaW5zdGFsbGF0aW9uKS48L2xpPgoJCTxsaT5WaXNpdCB0aGUgPGEgaHJlZj0i aW5kZXgucGhwP2V2ZW50PWNzcyI+c3R5bGU8L2E+IHRhYiBhbmQgc2F2ZSBlYWNoIG9mIHlv dXIgc3R5bGUgc2hlZXRzIGFnYWluIChzYXZpbmcgY3JlYXRlcyB0aGUgc3RhdGljIGZpbGUp LjwvbGk+CgkJPGxpPlJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mIDxjb2RlPiZsdDt0eHA6 Y3NzIC8mZ3Q7PC9jb2RlPiB3aXRoIDxjb2RlPiZsdDt0eHA6cnZtX2NzcyAvJmd0OzwvY29k ZT4uPC9saT4KCTwvb2w+PC9wPgoKCTxwPlRoZSA8Y29kZT4mbHQ7dHhwOnJ2bV9jc3MgLyZn dDs8L2NvZGU+IHRhZyBzdXBwbGllZCBieSB0aGlzIHBsdWdpbiBoYXMgdGhlIGV4YWN0IHNh bWUgYXR0cmlidXRlcyBhcyB0aGUgYnVpbHQtaW4gPGNvZGU+Jmx0O3R4cDpjc3MgLyZndDs8 L2NvZGU+IHRhZyBhbmQgY2FuIGJlIHVzZWQgYXMgYSBkcm9wLWluIHJlcGxhY2VtZW50Ljwv cD4KCgk8cD5Ob3RlOiBiZWNhdXNlIG5vdCBhbGwgY2hhcmFjdGVycyBhcmUgYWxsb3dlZCBp biBmaWxlbmFtZXMsIGF2b2lkIHVzaW5nIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyBp biBzdHlsZSBzaGVldCBuYW1lcy48L3A+CgoJPHA+SWYgeW91IHdpc2ggdG8gdXNlIDxhIGhy ZWY9Imh0dHA6Ly9sZXNzY3NzLm9yZy8iPjxzcGFuIGNsYXNzPSJjYXBzIj5MRVNTPC9zcGFu PjwvYT4gc3ludGF4IGluIHlvdXIgc3R5bGVzaGVldHMsIHlvdSBuZWVkIHRvIGRvIHRoZSBm b2xsb3dpbmcgKHRoaXMgY291bGQgYmUgaW1wbGVtZW50ZWQgYXMgYSBwbHVnaW4pOgoJPG9s PgoJCTxsaT5Eb3dubG9hZCB0aGUgZmlsZSA8YSBocmVmPSJodHRwczovL3Jhdy5naXRodWIu Y29tL2xlYWZvL2xlc3NwaHAvbWFzdGVyL2xlc3NjLmluYy5waHAiPmxlc3NjLmluYy5waHA8 L2E+ICh2ZXJzaW9uIDAuMy41IG9yIGhpZ2hlcikgZnJvbSB0aGUgPGEgaHJlZj0iaHR0cDov L2xlYWZvLm5ldC9sZXNzcGhwLyI+bGVzc3BocDwvYT4gd2Vic2l0ZSBhbmQgdXBsb2FkIGl0 IHRvIHlvdXIgd2Vic2l0ZS48L2xpPgoJCTxsaT5FZGl0IHlvdXIgY29uZmlnLnBocCBmaWxl IGFuZCBhZGQgdGhpcyBqdXN0IGJlbG93IHRoZSAmIzgyMTY7JHR4cGNmZyYjODIxNzsgY29u ZmlndXJhdGlvbiBsaW5lczogPGNvZGU+cmVxdWlyZSAmIzM5Oy9wYXRoL3RvL2xlc3NjLmlu Yy5waHAmIzM5Ozs8L2NvZGU+PC9saT4KCTwvb2w+PC9wPgoKCTxwPlRoaW5ncyB5b3Ugc2hv dWxkIGtub3cgd2hlbiB1c2luZyA8c3BhbiBjbGFzcz0iY2FwcyI+TEVTUzwvc3Bhbj4gc3lu dGF4OgoJPG9sPgoJCTxsaT5SZW1lbWJlciB0byBzYXZlIGVhY2ggc3R5bGUgc2hlZXQgYW5l dyBlYWNoIHRpbWUgeW91IHVwZGF0ZSB0aGUgbGVzc3NjLmluYy5waHAgZmlsZS48L2xpPgoJ CTxsaT5JZiB5b3VyIDxzcGFuIGNsYXNzPSJjYXBzIj5MRVNTPC9zcGFuPiBjb2RlIGNhbm5v dCBiZSBwYXJzZWQsIGFuIGVycm9yIHdpbGwgYmUgc2hvd24gYXQgdGhlIGJvdHRvbSBvZiBj c3MgYWRtaW4gdGFiIGFuZCB0aGUgc3RhdGljIGNzcyBmaWxlIHdpbGwgbm90IGJlIHVwZGF0 ZWQuPC9saT4KCQk8bGk+V2hlbiBzcGVjaWZ5aW5nIG9ubHkgdGhlIGZpbGVuYW1lIGluIGFu ICYjODIyMDtAaW1wb3J0ICYjODIxNjtzdHlsZS5sZXNzJiM4MjE3OyYjODIyMTsgc3RhdGVt ZW50LCB0aGUgcGx1Z2luIGFzc3VtZXMgaXQmIzgyMTc7cyBpbiB0aGUgJiM4MjIwO1N0eWxl IGRpcmVjdG9yeSYjODIyMTsuIERvIG5vdCBsZWF2ZSBvdXQgdGhlICYjODIxNjsubGVzcyYj ODIxNzsgZXh0ZW5zaW9uITwvbGk+Cgk8L29sPjwvcD4iO3M6NDoiY29kZSI7czozNzUzOiIK aWYgKGNsYXNzX2V4aXN0cygnXFRleHRwYXR0ZXJuXFRhZ1xSZWdpc3RyeScpKSB7CiAgVHhw OjpnZXQoJ1xUZXh0cGF0dGVyblxUYWdcUmVnaXN0cnknKS0+cmVnaXN0ZXIoJ3J2bV9jc3Mn KTsKfQoKaWYgKHR4cGludGVyZmFjZSA9PSAnYWRtaW4nKQp7CiAgcmVnaXN0ZXJfY2FsbGJh Y2soJ3J2bV9jc3Nfc2F2ZScsICdjc3MnLCAnY3NzX3NhdmUnKTsKICByZWdpc3Rlcl9jYWxs YmFjaygncnZtX2Nzc19zYXZlJywgJ2NzcycsICdjc3Nfc2F2ZV9wb3N0ZWQnKTsKICByZWdp c3Rlcl9jYWxsYmFjaygncnZtX2Nzc19zYXZlJywgJ2NzcycsICdkZWxfZGVjJyk7CiAgcmVn aXN0ZXJfY2FsbGJhY2soJ3J2bV9jc3NfZGVsZXRlJywgJ2NzcycsICdjc3NfZGVsZXRlJyk7 CiAgcmVnaXN0ZXJfY2FsbGJhY2soJ3J2bV9jc3NfcHJlZnMnLCAncHJlZnMnLCAnJywgMSk7 CiAgcmVnaXN0ZXJfY2FsbGJhY2soJ3J2bV9jc3NfY2xlYW51cCcsICdwbHVnaW5fbGlmZWN5 Y2xlLnJ2bV9jc3MnLCAnZGVsZXRlZCcpOwp9CgoKZnVuY3Rpb24gcnZtX2NzcygkYXR0cykK ewogIGdsb2JhbCAkdHhwX2Vycm9yX2NvZGUsICRzLCAkcGF0aF90b19zaXRlLCAkcnZtX2Nz c19kaXIsICR2ZXJzaW9uOwoKICBleHRyYWN0KGxBdHRzKGFycmF5KAogICAgJ2Zvcm1hdCcg PT4gJ3VybCcsCiAgICAnbWVkaWEnICA9PiAnc2NyZWVuJywKICAgICduJyAgICAgID0+ICcn LAogICAgJ25hbWUnICAgPT4gJycsCiAgICAncmVsJyAgICA9PiAnc3R5bGVzaGVldCcsCiAg ICAndGl0bGUnICA9PiAnJywKICApLCAkYXR0cykpOwoKICBpZiAoJG4gPT09ICcnIGFuZCAk bmFtZSA9PT0gJycpCiAgewogICAgaWYgKCRzKQogICAgewogICAgICAkbmFtZSA9IHNhZmVf ZmllbGQoJ2NzcycsICd0eHBfc2VjdGlvbicsICJuYW1lPSciLmRvU2xhc2goJHMpLiInIik7 CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICRuYW1lID0gJ2RlZmF1bHQnOwogICAgfQog IH0KICBlbHNlaWYgKCRuYW1lID09PSAnJykKICB7CiAgICAkbmFtZSA9ICRuOwogIH0KCiAg aWYgKCRmb3JtYXQgPT09ICdsaW5rJyBhbmQgc3RycG9zKCRuYW1lLCAnLCcpICE9PSBmYWxz ZSkKICB7CiAgICAkbmFtZXMgPSBkb19saXN0KCRuYW1lKTsKICAgICRjc3MgPSAnJzsKCiAg ICBmb3JlYWNoICgkbmFtZXMgYXMgJG5hbWUpCiAgICB7CiAgICAgICRhdHRzWyduYW1lJ10g PSAkbmFtZTsKICAgICAgJGNzcyAuPSBydm1fY3NzKCRhdHRzKTsKICAgIH0KCiAgICByZXR1 cm4gJGNzczsKICB9CgogICRmaWxlID0gJHJ2bV9jc3NfZGlyLicvJy5zdHJ0b2xvd2VyKHNh bml0aXplRm9yVXJsKCRuYW1lKSkuJy5jc3MnOwoKICBpZiAoZW1wdHkoJHJ2bV9jc3NfZGly KSBvciAhaXNfcmVhZGFibGUoJHBhdGhfdG9fc2l0ZS4nLycuJGZpbGUpKQogIHsKICAgIGlm ICh2ZXJzaW9uX2NvbXBhcmUoJHZlcnNpb24sICc0LjMuMCcsICc+PScpKQogICAgewogICAg ICB1bnNldCgkYXR0c1snbiddKTsKICAgICAgJGF0dHNbJ25hbWUnXSA9ICRuYW1lOwogICAg fQogICAgZWxzZQogICAgewogICAgICB1bnNldCgkYXR0c1snbmFtZSddKTsKICAgICAgJGF0 dHNbJ24nXSA9ICRuYW1lOwogICAgfQoKICAgIHJldHVybiBjc3MoJGF0dHMpOwogIH0KCiAg aWYgKCRmb3JtYXQgPT09ICdsaW5rJykKICB7CiAgICByZXR1cm4gJzxsaW5rIHJlbD0iJy4k cmVsLiciIHR5cGU9InRleHQvY3NzIicuCiAgICAgICgkbWVkaWEgPyAnIG1lZGlhPSInLiRt ZWRpYS4nIicgOiAnJykuCiAgICAgICgkdGl0bGUgPyAnIHRpdGxlPSInLiR0aXRsZS4nIicg OiAnJykuCiAgICAgICcgaHJlZj0iJy5odS4kZmlsZS4nIiAvPic7CiAgfQoKICByZXR1cm4g aHUuJGZpbGU7Cn0KCgpmdW5jdGlvbiBydm1fY3NzX3NhdmUoKQp7CiAgZ2xvYmFsICRwYXRo X3RvX3NpdGUsICRydm1fY3NzX2RpcjsKCiAgJG5hbWUgPSAocHMoJ2NvcHknKSBvciBwcygn c2F2ZW5ldycpKSA/IHBzKCduZXduYW1lJykgOiBwcygnbmFtZScpOwogICRmaWxlbmFtZSA9 IHN0cnRvbG93ZXIoc2FuaXRpemVGb3JVcmwoJG5hbWUpKTsKCiAgaWYgKGVtcHR5KCRydm1f Y3NzX2Rpcikgb3IgISRmaWxlbmFtZSkKICB7CiAgICByZXR1cm47CiAgfQoKICAkY3NzID0g c2FmZV9maWVsZCgnY3NzJywgJ3R4cF9jc3MnLCAibmFtZT0nIi5kb1NsYXNoKCRuYW1lKS4i JyIpOwoKICBpZiAoJGNzcykKICB7CiAgICBpZiAocHJlZ19tYXRjaCgnIV5bYS16QS1aMC05 LytdKj17MCwyfSQhJywgJGNzcykpCiAgICB7CiAgICAgICRjc3MgPSBiYXNlNjRfZGVjb2Rl KCRjc3MpOwogICAgfQoKICAgICRmaWxlID0gJHBhdGhfdG9fc2l0ZS4nLycuJHJ2bV9jc3Nf ZGlyLicvJy4kZmlsZW5hbWU7CgogICAgaWYgKGNsYXNzX2V4aXN0cygnbGVzc2MnKSkKICAg IHsKICAgICAgJGhhbmRsZSA9IGZvcGVuKCRmaWxlLicubGVzcycsICd3YicpOwogICAgICBm d3JpdGUoJGhhbmRsZSwgJGNzcyk7CiAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgY2ht b2QoJGZpbGUuJy5sZXNzJywgMDY0NCk7CgogICAgICAkbGVzcyA9IG5ldyBsZXNzYygpOwog ICAgICAkbGVzcy0+c2V0Rm9ybWF0dGVyKCdjb21wcmVzc2VkJyk7CiAgICAgICRsZXNzLT5z ZXRJbXBvcnREaXIoJHBhdGhfdG9fc2l0ZS4nLycuJHJ2bV9jc3NfZGlyLicvJyk7CgogICAg ICB0cnkKICAgICAgewogICAgICAgICRjc3MgID0gJGxlc3MtPnBhcnNlKCRjc3MpOwogICAg ICB9CiAgICAgIGNhdGNoIChFeGNlcHRpb24gJGV4KQogICAgICB7CiAgICAgICAgZWNobyAi bGVzc3BocCBmYXRhbCBlcnJvcjogIi4kZXgtPmdldE1lc3NhZ2UoKTsKICAgICAgICByZXR1 cm47CiAgICAgIH0KICAgIH0KCiAgICAkaGFuZGxlID0gZm9wZW4oJGZpbGUuJy5jc3MnLCAn d2InKTsKICAgIGZ3cml0ZSgkaGFuZGxlLCAkY3NzKTsKICAgIGZjbG9zZSgkaGFuZGxlKTsK ICAgIGNobW9kKCRmaWxlLicuY3NzJywgMDY0NCk7CiAgfQp9CgoKZnVuY3Rpb24gcnZtX2Nz c19kZWxldGUoKQp7CiAgZ2xvYmFsICRwYXRoX3RvX3NpdGUsICRydm1fY3NzX2RpcjsKCiAg aWYgKHNhZmVfZmllbGQoJ2NzcycsICd0eHBfY3NzJywgIm5hbWU9JyIuZG9TbGFzaChwcygn bmFtZScpKS4iJyIpKQogIHsKICAgIHJldHVybjsKICB9CgogICRuYW1lID0gc3RydG9sb3dl cihzYW5pdGl6ZUZvclVybChwcygnbmFtZScpKSk7CiAgJGZpbGUgPSAkcGF0aF90b19zaXRl LicvJy4kcnZtX2Nzc19kaXIuJy8nLiRuYW1lOwoKICBpZiAoIWVtcHR5KCRydm1fY3NzX2Rp cikgYW5kICRuYW1lKQogIHsKICAgIHVubGluaygkZmlsZS4nLmNzcycpOwoKICAgIGlmIChj bGFzc19leGlzdHMoJ2xlc3NjJykpCiAgICB7CiAgICAgIHVubGluaygkZmlsZS4nLmxlc3Mn KTsKICAgIH0KICB9Cn0KCgpmdW5jdGlvbiBydm1fY3NzX3ByZWZzKCkKewogIGdsb2JhbCAk dGV4dGFycmF5OwoKICAkdGV4dGFycmF5Wydydm1fY3NzX2RpciddID0gJ1N0eWxlIGRpcmVj dG9yeSc7CgogIGlmICghc2FmZV9maWVsZCAoJ25hbWUnLCAndHhwX3ByZWZzJywgIm5hbWU9 J3J2bV9jc3NfZGlyJyIpKQogIHsKICAgIHNhZmVfaW5zZXJ0KCd0eHBfcHJlZnMnLCAicHJl ZnNfaWQ9MSwgbmFtZT0ncnZtX2Nzc19kaXInLCB2YWw9J2NzcycsIHR5cGU9MSwgZXZlbnQ9 J2FkbWluJywgaHRtbD0ndGV4dF9pbnB1dCcsIHBvc2l0aW9uPTIwIik7CiAgfQp9CgoKZnVu Y3Rpb24gcnZtX2Nzc19jbGVhbnVwKCkKewogICAgc2FmZV9kZWxldGUoJ3R4cF9wcmVmcycs ICJuYW1lPSdydm1fY3NzX2RpciciKTsKfQoiO3M6MzoibWQ1IjtzOjMyOiI3ODI1MmU0MmIx NTYyYzY1ZGU4Yzg1NTY2ZmRhM2FmYiI7fQ==