Какой простой способ динамически генерировать JavaScript в Seaside?
Я пытаюсь добавить Disqus в блог, который я пишу. Чтобы иметь дело с сеансами Seaside, мне нужно либо добавить в JS уникальный файл Discus_identifier, либо disqus_url. Я переопределил метод #script моего компонента, но он может возвращать только строковый литерал.
Я вижу два варианта:
- Динамически сгенерируйте JS, сохраните его в файл и загрузите этот файл в мой компонент.
- Добавьте постоянную ссылку для каждой записи в блоге.
Есть ли более простой способ? Или один (или оба) из этих способов легко сделать? Я новичок в Smalltalk и Seaside и не уверен, как выполнить любую из этих двух вещей.
2 ответа
Да, есть более простой способ. Вы можете сгенерировать правильный JS-код Discus прямо в методе #script. Он должен возвращать строковый литерал, но вы можете создать эту строку на лету. Например, используя WriteStream.
Ваши записи в блоге также нужны постоянная ссылка. Вы можете использовать метод #initialRequest: для обработки этих постоянных ссылок.
динамический javascript материал
если я прав, то такой сценарий вы получите и для таких вещей, как кнопки ретвитов. (что есть у меня под рукой, чтобы предоставить вам примеры).
То, что я сделал в своем блоге, это небольшой специализированный приморский компонент с именем BITRetweet, который вы настраиваете с помощью постоянной ссылки (а также имени пользователя и стиля). Забудьте о файлах (это только усложнит), все на лету. Это оказывает с этим:
BITRetweet>>renderContentOn: html
html script with: self customizedJavascript. html script url: self buttonJavascriptSource.
BITRetweet >> customizedJavascript
| script | script := JSScript new. script add: (('"',self permalink,'"') asJSObject assignTo: 'tweetmeme_url'). isCompact ifTrue:[ script add: ('"compact"' asJSObject assignTo: 'tweetmeme_style')]. script add: (('"',username,'"') asJSObject assignTo: 'tweetmeme_source'). script add: (('"',shortener,'"') asJSObject assignTo: 'tweetmeme_service'). ^ script
BITRetweet >>> buttonJavascriptSource
"Answers the url to the source of the script for the button. See: http://help.tweetmeme.com/2009/04/06/tweetmeme-button/" ^ 'http://tweetmeme.com/i/scripts/button.js'
и, наконец, небольшой взлом String, например:
Строка >>asJSObject
^ JSObject new alias: self
работа с постоянными ссылками
для постоянной ссылки есть две вещи:
- генерируя это
- используя его (заставляя приложение реагировать на запрос)
для 1 вы можете сделать что-то вроде этого:
PostComponent>>updateUrl: anUrl
super updateUrl: anUrl. anUrl addToPath: model asURLNice
Сообщение >>asURLNice
"Answers the receiver in an (destructive) encoded way which is url friendly" ^ String streamContents: [:stream| self do:[:char| char isSeparator ifTrue:[stream nextPut: $-] ifFalse:[ char isAlphaNumeric ifTrue:[ stream nextPut: char asLowercase asNonDiacritical]]]]
и для 2 вы должны сделать что-то вроде этого в основном компоненте приложения:
BlogApplication>>initialRequest: aRequestOrNil
| paths | super initialRequest: aRequestOrNil. aRequestOrNil ifNil:[^ nil]. (aRequestOrNil url asString endsWith: '/sitemap.xml') ifTrue:[ ^ self respondSitemap]. paths := aRequestOrNil url path. paths size < 2 ifTrue:[^nil]. (Post atURLTitle: paths last) ifNotNilDo: [:value | ^ self readPost: value].
живые примеры
вы можете увидеть все это в действии в моем блоге или в селективном творчестве, так как мне нужен asNonDiacritical, потому что я пишу на трех языках, но DiacriticalSupport доступен в http://squeaksource.com/, если вам это нужно
веселиться взлома
о /