# smd_lib v0.1 # Shared function library used by smd_ plugins. # Stef Dawson # http://www.stefdawson.com/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6MzoiMC4xIjtzOjY6ImF1dGhvciI7czoxMToiU3RlZiBE YXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjY6Imh0dHA6Ly93d3cuc3RlZmRhd3Nvbi5j b20vIjtzOjExOiJkZXNjcmlwdGlvbiI7czo0NToiU2hhcmVkIGZ1bmN0aW9uIGxpYnJhcnkg dXNlZCBieSBzbWRfIHBsdWdpbnMuIjtzOjQ6InR5cGUiO2k6MjtzOjQ6Im5hbWUiO3M6Nzoi c21kX2xpYiI7czo0OiJoZWxwIjtzOjE0NzoiCTxoMT5zbWRfIHBsdWdpbiBsaWJyYXJ5PC9o MT4KCgk8cD5PZmZlcnMgbm8gcHVibGljIHRleHRwYXR0ZXJuIHRhZ3MuIEl0IGlzIHNpbXBs eSBhIHNoYXJlZCBsaWJyYXJ5IG9mIGNvbW1vbiBmdW5jdGlvbnMgdXNlZCBieSBzbWRfIHBs dWdpbnMuPC9wPgoKIjtzOjQ6ImNvZGUiO3M6NTY2NToiCmZ1bmN0aW9uIHNtZF9hZGRRU1Zh cigkdXJsLCAka2V5LCAkdmFsdWUpIHsKCSR1cmwgPSBzbWRfcmVtb3ZlUVNWYXIoJHVybCwg JGtleSk7CglpZiAoc3RycG9zKCR1cmwsICc/JykgPT09IGZhbHNlKSB7CgkJcmV0dXJuICgk dXJsIC4gJz8nIC4gJGtleSAuICc9JyAuICR2YWx1ZSk7Cgl9IGVsc2UgewoJCXJldHVybiAo JHVybCAuICcmJyAuICRrZXkgLiAnPScgLiAkdmFsdWUpOwoJfQp9CmZ1bmN0aW9uIHNtZF9y ZW1vdmVRU1ZhcigkdXJsLCAka2V5KSB7CgkkdXJsID0gcHJlZ19yZXBsYWNlKCcvKC4qKShc P3wmKScgLiAka2V5IC4gJz1bXiZdKz8oJikoLiopL2knLCAnJDEkMiQ0JywgJHVybCAuICcm Jyk7CgkkdXJsID0gc3Vic3RyKCR1cmwsIDAsIC0xKTsKCXJldHVybiAoJHVybCk7Cn0KCi8v IHJldHVybiBhIGxpc3Qgb2YgY2F0ZWdvcmllcyB1bmRlciAoYW5kIGluY2x1ZGluZykgdGhl IGdpdmVuIHBhcmVudCBjYXRlZ29yeQpmdW5jdGlvbiBzbWRfZ2V0U3ViQ2F0cygkcGFyZW50 LCRjYXR0eXBlKSB7CgkkcGFyZW50ID0gZG9TbGFzaCgkcGFyZW50KTsKCSRsZXh0cmVtID0g MTsgJHJleHRyZW0gPSAxOwoJZXh0cmFjdChzYWZlX3JvdygibGZ0IGFzIGxleHRyZW0sIHJn dCBhcyByZXh0cmVtIiwgInR4cF9jYXRlZ29yeSIsICJuYW1lPSckcGFyZW50JyBhbmQgdHlw ZSA9ICckY2F0dHlwZSciKSk7CgkkcnMgPSBzYWZlX3Jvd3Nfc3RhcnQoImlkLG5hbWUsdGl0 bGUiLCJ0eHBfY2F0ZWdvcnkiLCAibGZ0IGJldHdlZW4gJGxleHRyZW0gYW5kICRyZXh0cmVt IGFuZCB0eXBlID0gJyRjYXR0eXBlJyBvcmRlciBieSBsZnQgYXNjIik7CgkkY2F0cyA9IGFy cmF5KCk7CgoJd2hpbGUgKCRyb3cgPSBuZXh0Um93KCRycykpIHsKCQkkY2F0c1tdID0gYXJy YXkoCgkJCSdpZCcgPT4gJHJvd1snaWQnXSwKCQkJJ25hbWUnID0+ICRyb3dbJ25hbWUnXSwK CQkJJ3RpdGxlJyA9PiAkcm93Wyd0aXRsZSddCgkJKTsKCX0KCXJldHVybiAkY2F0czsKfQoK Ly8gU2VhcmNoZXMgdGhlIHBhc3NlZCAkc3RyIGZvciBwcmVkZXRlcm1pbmVkIHNlcXVlbmNl cyBvZiBjaGFyYWN0ZXJzCi8vIGFuZCwgaWYgdGhhdCBzZXF1ZW5jZSBpcyBpbiAkYWxsb3dl ZCwgcmVwbGFjZXMgaXQgYXMgZm9sbG93czoKLy8gID9jID0gY3VycmVudCBnbG9iYWwgY2F0 ZWdvcnkgKCFjID0gbm90IGN1cnJlbnQgY2F0ZWdvcnkpCi8vICA/cyA9IGN1cnJlbnQgc2Vj dGlvbiAoIXMgPSBub3QgY3VycmVudCBzZWN0aW9uKQovLyAgP3QgPSBjdXJyZW50IGFydGlj bGUgdGl0bGUgKCF0ID0gbm90IGN1cnJlbnQgdGl0bGUpCi8vICA/aWQgPSBjdXJyZW50IGFy dGljbGUgSUQsIHByZXBlbmRlZCB3aXRoICRpZHByZWZpeCAoIWlkID0gbm90IGN1cnJlbnQg SUQpCi8vICA/ZmllbGQgPSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBhcnRpY2xlJ3MgZmll bGQgKGNvdWxkIGJlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QpCi8vICAhZmllbGQgPSBub3Qg dGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGFydGljbGUncyBmaWVsZCAoY291bGQgYmUg YSBjb21tYS1zZXBhcmF0ZWQgbGlzdCkKLy8gQW55dGhpbmcgZWxzZSBpcyByZXR1cm5lZCB2 ZXJiYXRpbS4KLy8gT3V0cHV0cyB0d28gYXJyYXlzOyB0aGUgMXN0IGNvbnRhaW5pbmcgaXRl bXMgZm9yIGluY2x1c2lvbiwgdGhlIDJuZCBmb3IgZXhjbHVzaW9uCmZ1bmN0aW9uIHNtZF9n ZXRBdHRzKCRzdHIsICRhbGxvd2VkLCAkaWRwcmVmaXg9IiIpIHsKCWdsb2JhbCAkcHJldGV4 dCwgJHRoaXNhcnRpY2xlOwoKCSRvdXQgPSBhcnJheSgpOwoJJHN1Ym91dCA9IGFycmF5KCk7 Cgkkbm90b3V0ID0gYXJyYXkoKTsKCSRtYXRjaGVzID0gcHJlZ19zcGxpdCgnL1ssXHNdKy8n LCRzdHIsLTEsUFJFR19TUExJVF9OT19FTVBUWSk7CgoJZm9yICgkaWR4ID0gMDsgJGlkeCA8 IGNvdW50KCRtYXRjaGVzKTsgJGlkeCsrKSB7CgkJJHRoaXNtYXRjaCA9ICRtYXRjaGVzWyRp ZHhdOwoJCWlmICgoJHRoaXNtYXRjaCA9PT0gIj9jIikgJiYgaW5fYXJyYXkoIj9jIiwkYWxs b3dlZCkpIHsKCQkJLy8gVXNlIGdsb2JhbCBhcnRpY2xlIGNhdGVnb3J5LCBpZiBpdCBleGlz dHMKCQkJaWYgKCRwcmV0ZXh0WydjJ10gIT0gIiIpIHsKCQkJCWlmICghaW5fYXJyYXkoJHBy ZXRleHRbJ2MnXSwgJG91dCkpIHsKCQkJCQkkb3V0W10gPSAkcHJldGV4dFsnYyddOwoJCQkJ fQoJCQl9CgkJfSBlbHNlIGlmICgoJHRoaXNtYXRjaCA9PT0gIiFjIikgJiYgaW5fYXJyYXko IiFjIiwkYWxsb3dlZCkpIHsKCQkJLy8gRG9uJ3QgdXNlIGdsb2JhbCBhcnRpY2xlIGNhdGVn b3J5CgkJCWlmICgkcHJldGV4dFsnYyddICE9ICIiKSB7CgkJCQlpZiAoIWluX2FycmF5KCRw cmV0ZXh0WydjJ10sICRub3RvdXQpKSB7CgkJCQkJJG5vdG91dFtdID0gJHByZXRleHRbJ2Mn XTsKCQkJCX0KCQkJfQoJCX0gZWxzZSBpZiAoKCR0aGlzbWF0Y2ggPT09ICI/cyIpICYmIGlu X2FycmF5KCI/cyIsJGFsbG93ZWQpKSB7CgkJCS8vIFVzZSBhcnRpY2xlIHNlY3Rpb24KCQkJ aWYgKCRwcmV0ZXh0WydzJ10gIT0gIiIpIHsKCQkJCWlmICghaW5fYXJyYXkoJHByZXRleHRb J3MnXSwgJG91dCkpIHsKCQkJCQkkb3V0W10gPSAkcHJldGV4dFsncyddOwoJCQkJfQoJCQl9 CgkJfSBlbHNlIGlmICgoJHRoaXNtYXRjaCA9PT0gIiFzIikgJiYgaW5fYXJyYXkoIiFzIiwk YWxsb3dlZCkpIHsKCQkJLy8gRG9uJ3QgdXNlIGFydGljbGUgc2VjdGlvbgoJCQlpZiAoJHBy ZXRleHRbJ3MnXSAhPSAiIikgewoJCQkJaWYgKCFpbl9hcnJheSgkcHJldGV4dFsncyddLCAk bm90b3V0KSkgewoJCQkJCSRub3RvdXRbXSA9ICRwcmV0ZXh0WydzJ107CgkJCQl9CgkJCX0K CQl9IGVsc2UgaWYgKCgkdGhpc21hdGNoID09PSAiP3QiKSAmJiBpbl9hcnJheSgiP3QiLCRh bGxvd2VkKSkgewoJCQkvLyBVc2UgYXJ0aWNsZSBVUkwgdGl0bGUgaWYgdGhpcyBpcyBhbiBh cnRpY2xlLgoJCQkvLyBJdCdzIGFuIGFydGljbGUgaWYgdGhlIG5leHRfaWQgYXR0cmlidXRl IGV4aXN0cwoJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygnbmV4dF9pZCcsJHByZXRleHQpKSB7 CgkJCQlpZiAoJHRoaXNhcnRpY2xlWyd1cmxfdGl0bGUnXSAhPSAiIikgewoJCQkJCWlmICgh aW5fYXJyYXkoJHRoaXNhcnRpY2xlWyd1cmxfdGl0bGUnXSwgJG91dCkpIHsKCQkJCQkJJG91 dFtdID0gJHRoaXNhcnRpY2xlWyd1cmxfdGl0bGUnXTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9 IGVsc2UgaWYgKCgkdGhpc21hdGNoID09PSAiIXQiKSAmJiBpbl9hcnJheSgiIXQiLCRhbGxv d2VkKSkgewoJCQkvLyBEb24ndCB1c2UgYXJ0aWNsZSBVUkwgdGl0bGUKCQkJaWYgKGFycmF5 X2tleV9leGlzdHMoJ25leHRfaWQnLCRwcmV0ZXh0KSkgewoJCQkJaWYgKCR0aGlzYXJ0aWNs ZVsndXJsX3RpdGxlJ10gIT0gIiIpIHsKCQkJCQlpZiAoIWluX2FycmF5KCR0aGlzYXJ0aWNs ZVsndXJsX3RpdGxlJ10sICRub3RvdXQpKSB7CgkJCQkJCSRub3RvdXRbXSA9ICR0aGlzYXJ0 aWNsZVsndXJsX3RpdGxlJ107CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSBlbHNlIGlmICgoJHRo aXNtYXRjaCA9PT0gIj9pZCIpICYmIGluX2FycmF5KCI/aWQiLCRhbGxvd2VkKSkgewoJCQkv LyBVc2UgYXJ0aWNsZSBJRCwgcHJlcGVuZGVkIHdpdGggJGlkcHJlZml4CgkJCWlmIChhcnJh eV9rZXlfZXhpc3RzKCduZXh0X2lkJywkcHJldGV4dCkpIHsKCQkJCWlmICghaW5fYXJyYXko JGlkcHJlZml4IC4gJHByZXRleHRbJ2lkJ10sICRvdXQpKSB7CgkJCQkJJG91dFtdID0gJGlk cHJlZml4IC4gJHByZXRleHRbJ2lkJ107CgkJCQl9CgkJCX0KCQl9IGVsc2UgaWYgKCgkdGhp c21hdGNoID09PSAiIWlkIikgJiYgaW5fYXJyYXkoIiFpZCIsJGFsbG93ZWQpKSB7CgkJCS8v IERvbid0IHVzZSBhcnRpY2xlIElECgkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCduZXh0X2lk JywkcHJldGV4dCkpIHsKCQkJCWlmICghaW5fYXJyYXkoJGlkcHJlZml4IC4gJHByZXRleHRb J2lkJ10sICRub3RvdXQpKSB7CgkJCQkJJG5vdG91dFtdID0gJGlkcHJlZml4IC4gJHByZXRl eHRbJ2lkJ107CgkJCQl9CgkJCX0KCQl9IGVsc2UgaWYgKCgkdGhpc21hdGNoWzBdID09PSAi PyIpICYmIGluX2FycmF5KCI/ZmllbGQiLCRhbGxvd2VkKSkgewoJCQkvLyBVc2UgdGhlIGdp dmVuIGZpZWxkIG5hbWU7IHdoaWNoIG1heSBiZSBhIGNvbW1hLXNlcGFyYXRlZCBzdWJsaXN0 LgoJCQkvLyBTcGxpdCBvZmYgdGhlIGZpZWxkIG5hbWUgZnJvbSB0aGUgcXVlc3Rpb24gbWFy awoJCQkkZmllbGRuYW1lID0gc3Vic3RyKCR0aGlzbWF0Y2gsMSk7CgkJCWlmIChhcnJheV9r ZXlfZXhpc3RzKCduZXh0X2lkJywkcHJldGV4dCkpIHsgIC8vIENoZWNrIHRoaXMgaXMgYW4g YXJ0aWNsZQoJCQkJaWYgKGlzc2V0KCR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXSkpIHsKCQkJ CQkkZmllbGRDb250ZW50cyA9ICR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXTsKCQkJCX0gZWxz ZSB7CgkJCQkJJGZpZWxkQ29udGVudHMgPSAkZmllbGRuYW1lOwoJCQkJfQoJCQl9IGVsc2Ug ewoJCQkJJGZpZWxkQ29udGVudHMgPSAkZmllbGRuYW1lOwoJCQl9CgoJCQlpZiAoIWVtcHR5 KCRmaWVsZENvbnRlbnRzKSkgewoJCQkJJHN1Ym91dCA9IHByZWdfc3BsaXQoJy9bLFxzXSsv Jywgc3RyaXBfdGFncygkZmllbGRDb250ZW50cyksIC0xLCBQUkVHX1NQTElUX05PX0VNUFRZ KTsKCQkJCWZvcmVhY2ggKCRzdWJvdXQgYXMgJHN1Ym5hbWUpIHsKCQkJCQlpZiAoIWluX2Fy cmF5KCRzdWJuYW1lLCAkb3V0KSkgewoJCQkJCQkkb3V0W10gPSAkc3VibmFtZTsKCQkJCQl9 CgkJCQl9CgkJCX0KCQl9IGVsc2UgaWYgKCgkdGhpc21hdGNoWzBdID09PSAiISIpICYmIGlu X2FycmF5KCIhZmllbGQiLCRhbGxvd2VkKSkgewoJCQkvLyBOZWdhdGlvbi4gTWF5IGVpdGhl ciBiZSBhIGZpZWxkIG5hbWUgKGFuZCBtYXliZSBhbm90aGVyIENTTCkgb3IgYSBmaXhlZCB0 ZXJtLgoJCQkvLyBTcGxpdCBvZmYgdGhlIG5hbWUgZnJvbSB0aGUgZXhjbGFtYXRpb24gbWFy awoJCQkkZmllbGRuYW1lID0gc3Vic3RyKCR0aGlzbWF0Y2gsMSk7CgkJCWlmIChhcnJheV9r ZXlfZXhpc3RzKCduZXh0X2lkJywkcHJldGV4dCkpIHsgIC8vIENoZWNrIHRoaXMgaXMgYW4g YXJ0aWNsZQoJCQkJaWYgKGlzc2V0KCR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXSkpIHsKCQkJ CQkkZmllbGRDb250ZW50cyA9ICR0aGlzYXJ0aWNsZVskZmllbGRuYW1lXTsKCQkJCX0gZWxz ZSB7CgkJCQkJJGZpZWxkQ29udGVudHMgPSAkZmllbGRuYW1lOwoJCQkJfQoJCQl9IGVsc2Ug ewoJCQkJJGZpZWxkQ29udGVudHMgPSAkZmllbGRuYW1lOwoJCQl9CgoJCQlpZiAoIWVtcHR5 KCRmaWVsZENvbnRlbnRzKSkgewoJCQkJJHN1Ym91dCA9IHByZWdfc3BsaXQoJy9bLFxzXSsv Jywgc3RyaXBfdGFncygkZmllbGRDb250ZW50cyksIC0xLCBQUkVHX1NQTElUX05PX0VNUFRZ KTsKCQkJCWZvcmVhY2ggKCRzdWJvdXQgYXMgJHN1Ym5hbWUpIHsKCQkJCQlpZiAoIWluX2Fy cmF5KCRzdWJuYW1lLCAkbm90b3V0KSkgewoJCQkJCQkkbm90b3V0W10gPSAkc3VibmFtZTsK CQkJCQl9CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoIWluX2FycmF5KCR0aGlzbWF0 Y2gsICRvdXQpKSB7CgkJCQkkb3V0W10gPSAkdGhpc21hdGNoOwoJCQl9CgkJfQoJfQoKCXJl dHVybiBhcnJheSgkb3V0LCRub3RvdXQpOwp9CiI7czozOiJtZDUiO3M6MzI6IjNlOTBhYzMy NDYyYjcyNWNkMjdkODIzYjE0ODI0NjczIjt9