Beispiel #1
0
export function createLinks(
    urlResolver: UrlResolver,
    html: string,
    baseUrl: ResolvedUrl,
    deps: Set<ResolvedUrl>,
    absolute: boolean = false): string {
  const ast = parse5.parse(html, {locationInfo: true});
  const baseTag = dom5.query(ast, dom5.predicates.hasTagName('base'));
  const baseTagHref = baseTag ? dom5.getAttribute(baseTag, 'href') : '';

  // parse5 always produces a <head> element.
  const head = dom5.query(ast, dom5.predicates.hasTagName('head'))!;
  for (const dep of deps) {
    let href;
    if (absolute && !baseTagHref) {
      href = absUrl(urlResolver.relative(dep));
    } else {
      href = urlResolver.relative(baseUrl, dep);
    }
    const link = dom5.constructors.element('link');
    dom5.setAttribute(link, 'rel', 'prefetch');
    dom5.setAttribute(link, 'href', href);
    dom5.append(head, link);
  }
  dom5.removeFakeRootElements(ast);
  return parse5.serialize(ast);
}
Beispiel #2
0
  protected async *
      _transformIter(files: AsyncIterable<File>): AsyncIterable<File> {
    for await (const file of files) {
      if (file.path !== this.filePath) {
        yield file;
        continue;
      }

      const contents = await getFileContents(file);
      const parsed = parse5.parse(contents, {locationInfo: true});
      const base = dom5.query(parsed, baseMatcher);
      if (!base || dom5.getAttribute(base, 'href') === this.newHref) {
        yield file;
        continue;
      }

      dom5.setAttribute(base, 'href', this.newHref);
      dom5.removeFakeRootElements(parsed);
      const updatedFile = file.clone();
      updatedFile.contents = Buffer.from(parse5.serialize(parsed), 'utf-8');
      yield updatedFile;
    }
  }