net.ruippeixotog.scalascraper.scraper.PolyHtmlExtractor.scala Maven / Gradle / Ivy
The newest version!
package net.ruippeixotog.scalascraper.scraper
import net.ruippeixotog.scalascraper.model.Element
/** An extractor like [[HtmlExtractor]] but whose extracted content type depends on the type of the input
* [[net.ruippeixotog.scalascraper.model.Element]] s. A `PolyHtmlExtractor` supports application of CSS queries and can
* be turned into a normal `HtmlExtractor` by calling its `apply[E]` method, fixing the type of the input `Element` as
* `E`.
*/
trait PolyHtmlExtractor { outer =>
/** The type of the extracted content as a function of the input elements.
*
* @tparam E
* the type of the input elements
*/
type Out[E <: Element]
/** Returns an `HtmlExtractor` obtained from this extractor by specifying the type of the input elements.
*
* @tparam E
* the type of the input elements
* @return
* an `HtmlExtractor` obtained from this extractor by specifying the type of the input elements.
*/
def apply[E <: Element]: HtmlExtractor[E, Out[E]]
/** Applies a CSS query to `ElementQuery` inputs before passing them to this extractor.
*
* @param cssQuery
* the CSS query to apply to input `ElementQuery` instances
* @return
* a `PolyHtmlExtractor` returning the contents extracted by this extractor after `cssQuery` is applied to the
* input queries.
*/
def mapQuery(cssQuery: String): PolyHtmlExtractor.Aux[Out] =
new PolyHtmlExtractor {
type Out[E <: Element] = outer.Out[E]
def apply[E <: Element] = outer[E].mapQuery(cssQuery)
}
/** Applies a CSS query to `ElementQuery` inputs before passing them to this extractor.
*
* @param cssQuery
* the CSS query to apply to input `ElementQuery` instances
* @return
* a `PolyHtmlExtractor` returning the contents extracted by this extractor after `cssQuery` is applied to the
* input queries.
*/
// TODO try to find a way to make this a DSL extension method. If that really can't be done, consider deprecating
// this DSL construction
def apply(cssQuery: String): PolyHtmlExtractor.Aux[Out] = mapQuery(cssQuery)
}
object PolyHtmlExtractor {
type Aux[Out0[E <: Element]] = PolyHtmlExtractor { type Out[E <: Element] = Out0[E] }
implicit def polyHtmlExtractorAsExtractor[E <: Element](
polyExtractor: PolyHtmlExtractor
): HtmlExtractor[E, polyExtractor.Out[E]] = polyExtractor[E]
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy