# rvm_css v1.2 # 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: # ...................................................................... YToxMTp7czo0OiJuYW1lIjtzOjc6InJ2bV9jc3MiO3M6NzoidmVyc2lvbiI7czozOiIxLjIi O3M6NjoiYXV0aG9yIjtzOjE1OiJSdXVkIHZhbiBNZWxpY2siO3M6MTA6ImF1dGhvcl91cmki O3M6MjE6Imh0dHA6Ly92YW5tZWxpY2suY29tLyI7czoxMToiZGVzY3JpcHRpb24iO3M6MTg6 IlN0YXRpYyBDU1MgY2FjaGluZyI7czo0OiJ0eXBlIjtpOjU7czo1OiJmbGFncyI7aToyO3M6 ODoidGV4dHBhY2siO3M6MjY4OiIjQHByZWZzCiNAb3duZXIgcnZtX2Nzcwpydm1fY3NzX2Rp ciA9PiBTdHlsZXNoZWV0IGRpcmVjdG9yeQojQGxhbmd1YWdlIGVuLWdiCnJ2bV9jc3NfZGly ID0+IFN0eWxlc2hlZXQgZGlyZWN0b3J5CiNAbGFuZ3VhZ2UgbmwtbmwKcnZtX2Nzc19kaXIg PT4gU3R5bGVzaGVldC1tYXAKI0BsYW5ndWFnZSBkZS1kZQpydm1fY3NzX2RpciA9PiBTdGls dm9ybGFnZXZlcnplaWNobmlzCiNAbGFuZ3VhZ2UgZnItZnIKcnZtX2Nzc19kaXIgPT4gUsOp cGVydG9pcmUgZGVzIHN0eWxlIjtzOjQ6ImhlbHAiO3M6MjQ0NzoiPHA+VGhpcyBwbHVnaW4g YXV0b21hdGljYWxseSBzdG9yZXMgYSBjb3B5IG9mIHlvdXIgc3R5bGUgc2hlZXQocykgYXMg YSBzdGF0aWMgZmlsZS4gU3RhdGljIGZpbGVzIGFyZSBzZXJ2ZWQgc2V2ZXJhbCBvcmRlcnMg b2YgbWFnbml0dWRlIGZhc3RlciB0aGFuIDxzcGFuIGNsYXNzPSJjYXBzIj5QSFA8L3NwYW4+ IGZpbGVzICgyMDAgdGltZXMgZmFzdGVyLCBpbiBteSBvd24gdGVzdHMgb24gYSBGYXN0Q0dJ LWJhc2VkIHNlcnZlcikuPC9wPgoKPHA+UG9zdC1pbnN0YWxsYXRpb24gc3RlcHM6PGJyIC8+ CjxvbD4KCTxsaT5WaXNpdCB0aGUgPGEgaHJlZj0iaW5kZXgucGhwP2V2ZW50PXByZWZzJmFt cDtzdGVwPWFkdmFuY2VkX3ByZWZzIj5hZHZhbmNlZCBwcmVmZXJlbmNlczwvYT4gYW5kIG1h a2Ugc3VyZSB0aGUgJiM4MjIwO1N0eWxlIGRpcmVjdG9yeSYjODIyMTsgcHJlZmVyZW5jZSBj b250YWlucyB0aGUgZGlyZWN0b3J5IHdoZXJlIHlvdSB3YW50IHRvIHN0b3JlIHRoZSBzdGF0 aWMgPHNwYW4gY2xhc3M9ImNhcHMiPkNTUzwvc3Bhbj4gZmlsZXMuIFRoaXMgcGF0aCBpcyBh bHdheXMgYSByZWxhdGl2ZSBwYXRoICh0byB0aGUgZGlyZWN0b3J5IG9mIHlvdXIgcm9vdCB0 ZXh0cGF0dGVybiBpbnN0YWxsYXRpb24pLiBZb3Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IDxz cGFuIGNsYXNzPSJjYXBzIj5QSFA8L3NwYW4+IGlzIGFibGUgdG8gd3JpdGUgdG8gdGhhdCBk aXJlY3RvcnkuPC9saT4KCTxsaT5BY3RpdmF0ZSB0aGUgcGx1Z2luLjwvbGk+PGJyIC8+Cjwv b2w+PC9wPgoKPHA+VGhlIDxjb2RlPiZsdDt0eHA6cnZtX2NzcyAvJmd0OzwvY29kZT4gdGFn IHN1cHBsaWVkIGJ5IHRoaXMgcGx1Z2luIGhhcyB0aGUgZXhhY3Qgc2FtZSBhdHRyaWJ1dGVz IGFzIHRoZSBidWlsdC1pbiA8Y29kZT4mbHQ7dHhwOmNzcyAvJmd0OzwvY29kZT4gdGFnIGFu ZCBjYW4gYmUgdXNlZCBhcyBhIGRyb3AtaW4gcmVwbGFjZW1lbnQsIGJ1dCB5b3Ugc2hvdWxk biYjODIxNzt0IGhhdmUgdG8gdXNlIGl0LCBiZWNhdXNlIHRoaXMgcGx1Z2luIG92ZXJyaWRl cyB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2YgdGhlIDxjb2RlPiZsdDt0eHA6Y3NzJmd0Ozwv Y29kZT4gdGFnLjwvcD4KCjxwPk5vdGU6IGJlY2F1c2Ugbm90IGFsbCBjaGFyYWN0ZXJzIGFy ZSBhbGxvd2VkIGluIGZpbGVuYW1lcywgYXZvaWQgdXNpbmcgbm9uLWFscGhhbnVtZXJpYyBj aGFyYWN0ZXJzIGluIHN0eWxlIHNoZWV0IG5hbWVzLjwvcD4KCjxwPklmIHlvdSB3aXNoIHRv IHVzZSA8YSBocmVmPSJodHRwOi8vbGVzc2Nzcy5vcmcvIj48c3BhbiBjbGFzcz0iY2FwcyI+ TEVTUzwvc3Bhbj48L2E+IHN5bnRheCBpbiB5b3VyIHN0eWxlc2hlZXRzLCB5b3UgbmVlZCB0 byBkbyB0aGUgZm9sbG93aW5nICh0aGlzIGNvdWxkIGJlIGltcGxlbWVudGVkIGFzIGEgcGx1 Z2luKTo8YnIgLz4KPG9sPgoJPGxpPkRvd25sb2FkIHRoZSBmaWxlIDxhIGhyZWY9Imh0dHBz Oi8vcmF3LmdpdGh1Yi5jb20vbGVhZm8vbGVzc3BocC9tYXN0ZXIvbGVzc2MuaW5jLnBocCI+ bGVzc2MuaW5jLnBocDwvYT4gKHZlcnNpb24gMC4zLjUgb3IgaGlnaGVyKSBmcm9tIHRoZSA8 YSBocmVmPSJodHRwOi8vbGVhZm8ubmV0L2xlc3NwaHAvIj5sZXNzcGhwPC9hPiB3ZWJzaXRl IGFuZCB1cGxvYWQgaXQgdG8geW91ciB3ZWJzaXRlLjwvbGk+Cgk8bGk+RWRpdCB5b3VyIGNv bmZpZy5waHAgZmlsZSBhbmQgYWRkIHRoaXMganVzdCBiZWxvdyB0aGUgJiM4MjE2OyR0eHBj ZmcmIzgyMTc7IGNvbmZpZ3VyYXRpb24gbGluZXM6IDxjb2RlPnJlcXVpcmUgJiMzOTsvcGF0 aC90by9sZXNzYy5pbmMucGhwJiMzOTs7PC9jb2RlPjwvbGk+PGJyIC8+Cjwvb2w+PC9wPgoK PHA+VGhpbmdzIHlvdSBzaG91bGQga25vdyB3aGVuIHVzaW5nIDxzcGFuIGNsYXNzPSJjYXBz Ij5MRVNTPC9zcGFuPiBzeW50YXg6PGJyIC8+CjxvbD4KCTxsaT5SZW1lbWJlciB0byBzYXZl IGVhY2ggc3R5bGUgc2hlZXQgYW5ldyBlYWNoIHRpbWUgeW91IHVwZGF0ZSB0aGUgbGVzc3Nj LmluYy5waHAgZmlsZS48L2xpPgoJPGxpPklmIHlvdXIgPHNwYW4gY2xhc3M9ImNhcHMiPkxF U1M8L3NwYW4+IGNvZGUgY2Fubm90IGJlIHBhcnNlZCwgYW4gZXJyb3Igd2lsbCBiZSBzaG93 biBhdCB0aGUgYm90dG9tIG9mIGNzcyBhZG1pbiB0YWIgYW5kIHRoZSBzdGF0aWMgY3NzIGZp bGUgd2lsbCBub3QgYmUgdXBkYXRlZC48L2xpPgoJPGxpPldoZW4gc3BlY2lmeWluZyBvbmx5 IHRoZSBmaWxlbmFtZSBpbiBhbiAmIzgyMjA7QGltcG9ydCAmIzgyMTY7c3R5bGUubGVzcyYj ODIxNzsmIzgyMjE7IHN0YXRlbWVudCwgdGhlIHBsdWdpbiBhc3N1bWVzIGl0JiM4MjE3O3Mg aW4gdGhlICYjODIyMDtTdHlsZSBkaXJlY3RvcnkmIzgyMjE7LiBEbyBub3QgbGVhdmUgb3V0 IHRoZSAmIzgyMTY7Lmxlc3MmIzgyMTc7IGV4dGVuc2lvbiE8L2xpPjxiciAvPgo8L29sPjwv cD4iO3M6NDoiY29kZSI7czozODMzOiIKaWYgKGNsYXNzX2V4aXN0cygnXFRleHRwYXR0ZXJu XFRhZ1xSZWdpc3RyeScpKSB7CiAgVHhwOjpnZXQoJ1xUZXh0cGF0dGVyblxUYWdcUmVnaXN0 cnknKQogICAgLT5yZWdpc3RlcigncnZtX2NzcycpCiAgICAtPnJlZ2lzdGVyKCdydm1fY3Nz JywgJ2NzcycpOwp9CgppZiAodHhwaW50ZXJmYWNlID09ICdhZG1pbicpCnsKICByZWdpc3Rl cl9jYWxsYmFjaygncnZtX2Nzc19zeW5jJywgJ2NzcycsICdjc3Nfc2F2ZScpOwogIHJlZ2lz dGVyX2NhbGxiYWNrKCdydm1fY3NzX3N5bmMnLCAnY3NzJywgJ2Nzc19zYXZlX3Bvc3RlZCcp OwogIHJlZ2lzdGVyX2NhbGxiYWNrKCdydm1fY3NzX3N5bmMnLCAndHhwLmNzcycsICdpbXBv cnQnKTsKICByZWdpc3Rlcl9jYWxsYmFjaygncnZtX2Nzc19zeW5jJywgJ3BsdWdpbl9saWZl Y3ljbGUucnZtX2NzcycsICdlbmFibGVkJyk7CiAgcmVnaXN0ZXJfY2FsbGJhY2soJ3J2bV9j c3Nfc2V0dXAnLCAncGx1Z2luX2xpZmVjeWNsZS5ydm1fY3NzJywgJ2luc3RhbGxlZCcpOwog IHJlZ2lzdGVyX2NhbGxiYWNrKCdydm1fY3NzX2NsZWFudXAnLCAncGx1Z2luX2xpZmVjeWNs ZS5ydm1fY3NzJywgJ2RlbGV0ZWQnKTsKfQoKCmZ1bmN0aW9uIHJ2bV9jc3MoJGF0dHMpCnsK ICBnbG9iYWwgJGRvY3R5cGUsICRwcmV0ZXh0OwoKICBleHRyYWN0KGxBdHRzKGFycmF5KAog ICAgJ2Zvcm1hdCcgPT4gJ3VybCcsCiAgICAnbWVkaWEnICA9PiAnc2NyZWVuJywKICAgICdu YW1lJyAgID0+ICRwcmV0ZXh0Wydjc3MnXSwKICAgICdyZWwnICAgID0+ICdzdHlsZXNoZWV0 JywKICAgICd0aGVtZScgID0+IGlzc2V0KCRwcmV0ZXh0Wydza2luJ10pID8gJHByZXRleHRb J3NraW4nXSA6ICcnLAogICAgJ3RpdGxlJyAgPT4gJycsCiAgKSwgJGF0dHMpKTsKCiAgaWYg KCRuYW1lID09PSAnJykKICB7CiAgICAgICRuYW1lID0gJ2RlZmF1bHQnOwogIH0KCiAgaWYg KCRmb3JtYXQgPT09ICdsaW5rJyBhbmQgc3RycG9zKCRuYW1lLCAnLCcpICE9PSBmYWxzZSkK ICB7CiAgICAkbmFtZXMgPSBkb19saXN0KCRuYW1lKTsKICAgICRjc3MgPSAnJzsKCiAgICBm b3JlYWNoICgkbmFtZXMgYXMgJG5hbWUpCiAgICB7CiAgICAgICRhdHRzWyduYW1lJ10gPSAk bmFtZTsKICAgICAgJGNzcyAuPSBydm1fY3NzKCRhdHRzKTsKICAgIH0KCiAgICByZXR1cm4g JGNzczsKICB9CgogIGlmICgkdGhlbWUpCiAgewogICAgJHNraW5kaXIgPSBzdHJ0b2xvd2Vy KHNhbml0aXplRm9yVXJsKCR0aGVtZSkpLicvJzsKICB9CgogICRmaWxlID0gZ2V0X3ByZWYo J3J2bV9jc3NfZGlyJykuJy8nLiRza2luZGlyLnN0cnRvbG93ZXIoc2FuaXRpemVGb3JVcmwo JG5hbWUpKS4nLmNzcyc7CgogIGlmIChlbXB0eShnZXRfcHJlZigncnZtX2Nzc19kaXInKSkg b3IKICAgICFpc19yZWFkYWJsZShnZXRfcHJlZigncGF0aF90b19zaXRlJykuJy8nLiRmaWxl KSBhbmQKICAgICghcnZtX2Nzc19zeW5jKCkgb3IgIWlzX3JlYWRhYmxlKGdldF9wcmVmKCdw YXRoX3RvX3NpdGUnKS4nLycuJGZpbGUpKQogICkKICB7CiAgICAkYXR0c1snbmFtZSddID0g JG5hbWU7CgogICAgcmV0dXJuIGNzcygkYXR0cyk7CiAgfQoKCiAgaWYgKCRmb3JtYXQgPT0g J2xpbmsnKSB7CiAgICByZXR1cm4gdGFnX3ZvaWQoJ2xpbmsnLCBhcnJheSgKICAgICAgJ3Jl bCcgICA9PiAkcmVsLAogICAgICAndHlwZScgID0+ICRkb2N0eXBlICE9ICdodG1sNScgPyAn dGV4dC9jc3MnIDogJycsCiAgICAgICdtZWRpYScgPT4gJG1lZGlhLAogICAgICAndGl0bGUn ID0+ICR0aXRsZSwKICAgICAgJ2hyZWYnICA9PiBodS4kZmlsZSwKICAgICkpOwogIH0KCiAg cmV0dXJuIGh1LiRmaWxlOwp9CgoKZnVuY3Rpb24gcnZtX2Nzc19zeW5jKCkKewogIGlmICgh Z2V0X3ByZWYoJ3J2bV9jc3NfZGlyJykpCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAg JGJhc2VkaXIgPSBnZXRfcHJlZigncGF0aF90b19zaXRlJykuJy8nLmdldF9wcmVmKCdydm1f Y3NzX2RpcicpLicvJzsKCiAgaWYgKCFmaWxlX2V4aXN0cygkYmFzZWRpcikpCiAgewogICAg bWtkaXIoJGJhc2VkaXIsIDA3NTUpOwogIH0KICBlbHNlaWYgKCFpc193cml0YWJsZSgkYmFz ZWRpcikpCiAgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgaWYgKCRycyA9IHNhZmVfcm93 c19zdGFydCgnKicsICd0eHBfY3NzJywgJzE9MScpKQogIHsKICAgIHdoaWxlICgkcm93ID0g bmV4dFJvdygkcnMpKQogICAgewogICAgICBleHRyYWN0KCRyb3cpOwoKICAgICAgaWYgKHBy ZWdfbWF0Y2goJyFeW2EtekEtWjAtOS8rXSo9ezAsMn0kIScsICRjc3MpKQogICAgICB7CiAg ICAgICAgJGNzcyA9IGJhc2U2NF9kZWNvZGUoJGNzcyk7CiAgICAgIH0KCiAgICAgIGlmICgh ZW1wdHkoJHNraW4pKQogICAgICB7CiAgICAgICAgJHNraW4gPSBzdHJ0b2xvd2VyKHNhbml0 aXplRm9yVXJsKCRza2luKSk7CgogICAgICAgIGlmICghZmlsZV9leGlzdHMoJGJhc2VkaXIu JHNraW4pKQogICAgICAgIHsKICAgICAgICAgIG1rZGlyKCRiYXNlZGlyLiRza2luLCAwNzU1 KTsKICAgICAgICB9CiAgICAgICAgZWxzZWlmICghaXNfd3JpdGFibGUoJGJhc2VkaXIuJHNr aW4pKQogICAgICAgIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAg JHNraW5kaXIgPSAkc2tpbi4nLyc7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAg ICAgJHNraW5kaXIgPSAnJzsKICAgICAgfQoKICAgICAgJGJhc2VmaWxlID0gJGJhc2VkaXIu JHNraW5kaXIuc3RydG9sb3dlcihzYW5pdGl6ZUZvclVybCgkbmFtZSkpOwogICAgICAkY3Nz ZmlsZSAgPSAkYmFzZWZpbGUuJy5jc3MnOwoKICAgICAgaWYgKGZpbGVfZXhpc3RzKCRjc3Nm aWxlKSBhbmQgIWlzX3dyaXRhYmxlKCRjc3NmaWxlKSkKICAgICAgewogICAgICAgIGNvbnRp bnVlOwogICAgICB9CgogICAgICBpZiAoY2xhc3NfZXhpc3RzKCdsZXNzYycpKQogICAgICB7 CiAgICAgICAgJGhhbmRsZSA9IGZvcGVuKCRmaWxlLicubGVzcycsICd3YicpOwogICAgICAg IGZ3cml0ZSgkaGFuZGxlLCAkY3NzKTsKICAgICAgICBmY2xvc2UoJGhhbmRsZSk7CiAgICAg ICAgY2htb2QoJGZpbGUuJy5sZXNzJywgMDY0NCk7CgogICAgICAgICRsZXNzID0gbmV3IGxl c3NjKCk7CiAgICAgICAgJGxlc3MtPnNldEZvcm1hdHRlcignY29tcHJlc3NlZCcpOwogICAg ICAgICRsZXNzLT5zZXRJbXBvcnREaXIoZ2V0X3ByZWYoJ3BhdGhfdG9fc2l0ZScpLicvJy5n ZXRfcHJlZigncnZtX2Nzc19kaXInKS4nLycpOwoKICAgICAgICB0cnkKICAgICAgICB7CiAg ICAgICAgICAkY3NzICA9ICRsZXNzLT5wYXJzZSgkY3NzKTsKICAgICAgICB9CiAgICAgICAg Y2F0Y2ggKEV4Y2VwdGlvbiAkZXgpCiAgICAgICAgewogICAgICAgICAgZXJyb3JfbG9nKCJs ZXNzcGhwIGZhdGFsIGVycm9yOiAiLiRleC0+Z2V0TWVzc2FnZSgpKTsKICAgICAgICAgIHJl dHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZpbGVfcHV0X2NvbnRlbnRz KCRjc3NmaWxlLCAkY3NzKSBhbmQgY2htb2QoJGNzc2ZpbGUsIDA2NDQpOwogICAgfQogIH0K CiAgcmV0dXJuIHRydWU7Cn0KCgpmdW5jdGlvbiBydm1fY3NzX3NldHVwKCkKewogIGlmICgh Z2V0X3ByZWYoJ3J2bV9jc3NfZGlyJykpCiAgewogICAgc2V0X3ByZWYoJ3J2bV9jc3NfZGly JywgJ2NzcycsICdhZG1pbicsICcxJywgJ3RleHRfaW5wdXQnLCAnMjAnKTsKICB9Cn0KCgpm dW5jdGlvbiBydm1fY3NzX2NsZWFudXAoKQp7CiAgICBzYWZlX2RlbGV0ZSgndHhwX3ByZWZz JywgIm5hbWU9J3J2bV9jc3NfZGlyJyIpOwogICAgc2FmZV9kZWxldGUoJ3R4cF9sYW5nJywg Im93bmVyPSdydm1fY3NzJyIpOwp9CiI7czozOiJtZDUiO3M6MzI6IjE0ZmQ3ODAxNTExZjZk MDU5NTg3YjJkMDdlNzM2YTFlIjt9