https://github.com/dejan/auto_html
Collection of filters that transform plain text into HTML code.
https://github.com/dejan/auto_html
Last synced: 8 months ago
JSON representation
Collection of filters that transform plain text into HTML code.
- Host: GitHub
- URL: https://github.com/dejan/auto_html
- Owner: dejan
- License: mit
- Created: 2008-12-26T00:30:13.000Z (about 17 years ago)
- Default Branch: master
- Last Pushed: 2025-03-10T22:41:24.000Z (10 months ago)
- Last Synced: 2025-04-28T11:57:17.517Z (9 months ago)
- Language: Ruby
- Homepage: https://autohtml.makeme.tools
- Size: 489 KB
- Stars: 798
- Watchers: 26
- Forks: 185
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: MIT-LICENSE
Awesome Lists containing this project
- awesome-ruby - Auto HTML
- fucking-awesome-ruby - auto_html - Rails extension for transforming URLs to appropriate resource (image, link, YouTube, Vimeo video...). (View helpers)
- awesome-ruby - auto_html - Rails extension for transforming URLs to appropriate resource (image, link, YouTube, Vimeo video...). (View helpers)
- awesome-ruby - auto_html - Rails extension for transforming URLs to appropriate resource (image, link, YouTube, Vimeo video...). (View helpers)
README
# AutoHtml
AutoHtml is a collection of filters that transforms plain text into HTML code. See [live demo](https://autohtml.makeme.tools).
## Installation
Add this line to your application's Gemfile:
```ruby
gem 'auto_html'
```
And then execute:
```sh
$ bundle
```
Or install it yourself as:
```sh
$ gem install auto_html
```
## Abstract
AutoHtml uses concepts found in "Pipes and Filters" processing design pattern:
* `Filter` - transforms an input. In AutoHtml context, this is any object that does the transformation through `#call(String)` method. Filter options should be passed in initializer. AutoHtml provides some filters already, ie Link, Image, Markdown, etc.
* `Pipeline` - a composition of filters that transforms input by passing the output of one filter as input for the next filter in line. In AutoHtml context, this is the `AutoHtml::Pipeline` class. Since the same interface (method `#call`) is used to pass input, we can say that Pipeline is just another Filter, which means it can be used as a building block for other Pipelines, in a mix with other filters.
## Examples
```ruby
link_filter = AutoHtml::Link.new(target: '_blank')
link_filter.call('Checkout out auto_html: https://github.com/dejan/auto_html')
# => 'Checkout out my blog: https://github.com/dejan/auto_html'
emoji_filter = AutoHtml::Emoji.new
emoji_filter.call(':point_left: yo!')
# => '
yo!'
# Use Pipeline to combine filters
base_format = AutoHtml::Pipeline.new(link_filter, emoji_filter)
base_format.call('Checkout out auto_html: https://github.com/dejan/auto_html :point_left: yo!')
# => 'Checkout out my blog: https://github.com/dejan/auto_html
yo!'
# A pipeline can be reused in another pipeline. Note that the order of filters is important - ie you want
# `Image` before `Link` filter so that URL of the image gets transformed to `img` tag and not `a` tag.
comment_format = AutoHtml::Pipeline.new(AutoHtml::Markdown.new, AutoHtml::Image.new, base_format)
comment_format.call("Hello!\n\n Checkout out auto_html: https://github.com/dejan/auto_html :point_left: yo! \n\n http://gifs.joelglovier.com/boom/booyah.gif")
# => "
Hello!
\n\nCheckout out my blog: https://github.com/dejan/auto_html
" class="emoji" title=":point_left:" alt=":point_left:" height="20" witdh="20" align="absmiddle" /> yo!
\n\n\n"
```
## Bundled filters
Bellow is the list of bundled filters along with their optional arguments on initialization and their default values.
* `AutoHtml::Emoji`
* `AutoHtml::HtmlEscape`
* `AutoHtml::Image`, proxy: nil, alt: nil
* `AutoHtml::Link`, target: nil, rel: nil
* `AutoHtml::Markdown`
* `AutoHtml::SimpleFormat`
## Using AutoHtml with ActiveRecord
For performance reasons it's a good idea to store the formated output in the database, in a separate column, to avoid generating the same content on each access.
This can be acomplished simply by overriding the attribute writter:
```ruby
class Comment < ActiveRecord::Base
FORMAT = AutoHtml::Pipeline.new(
AutoHtml::HtmlEscape.new,
AutoHtml::Markdown.new
)
def text=(t)
super(t)
self[:text_html] = FORMAT.call(t)
end
end
```
Now, every time `text` attribute is set, `text_html` will be set as well:
```Ruby
comment = Comment.new(text: 'Hey!')
comment.text_html # => '
Hey!
'
```
## Development
### Install dependencies
```sh
bundle install
```
### Run Rubocop
```sh
rake rubocop
```
### Run tests
```sh
rake spec
```
## Licence
AutoHtml is released under the [MIT License](https://raw.githubusercontent.com/dejan/auto_html/master/MIT-LICENSE).
