-
Notifications
You must be signed in to change notification settings - Fork 103
/
PegDownFilter.scala
68 lines (61 loc) · 2.2 KB
/
PegDownFilter.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
* Copyright (C) 2009-2011 the original author or authors.
* See the notice.md file distributed with this work for additional
* information regarding copyright ownership.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.fusesource.scalate.filter.pegdown
import org.fusesource.scalate.{ TemplateEngineAddOn, RenderContext, TemplateEngine }
import org.fusesource.scalate.filter.Filter
import org.fusesource.scalate.util.ObjectPool
import org.pegdown.{ Extensions, PegDownProcessor }
object PegDownFilter extends TemplateEngineAddOn {
/**
* Add the markdown filter to the template engine.
*/
def apply(te: TemplateEngine) = {
val filter = new PegDownFilter()
filter.registerWith(te)
}
}
/**
* Renders markdown syntax with multi-markdown like extras.
*
* @author <a href="mailto:stuart.roebuck@gmail.com">Stuart Roebuck</a>
*/
class PegDownFilter(val extensions: Int = Extensions.ABBREVIATIONS |
Extensions.AUTOLINKS |
Extensions.DEFINITIONS |
Extensions.FENCED_CODE_BLOCKS |
Extensions.QUOTES |
Extensions.SMARTS |
Extensions.TABLES |
Extensions.WIKILINKS, processorPoolSize: Int = 10) extends Filter {
private val pegDownProcessorPool = new ObjectPool[PegDownProcessor](processorPoolSize, () => {
new PegDownProcessor(extensions)
})
def filter(context: RenderContext, content: String) = {
val pegDownProcessor = pegDownProcessorPool.fetch()
try {
pegDownProcessor.markdownToHtml(content).stripLineEnd
} finally {
pegDownProcessorPool.release(pegDownProcessor)
}
}
def registerWith(te: TemplateEngine) {
te.filters += "multimarkdown" -> this
te.pipelines += "mmd" -> List(this)
te.pipelines += "multimarkdown" -> List(this)
}
}