Dave Jarvis' Repositories

git clone https://repo.autonoma.ca/repo/keenwrite.git
M src/main/java/com/keenwrite/processors/markdown/MarkdownProcessor.java
1414
import com.keenwrite.processors.markdown.extensions.tex.TeXExtension;
1515
import com.keenwrite.processors.r.RInlineEvaluator;
16
import com.keenwrite.processors.r.RVariableProcessor;
1617
import com.vladsch.flexmark.util.misc.Extension;
1718
...
6465
6566
    if( mediaType == TEXT_R_MARKDOWN ) {
66
      result.add( RInlineExtension.create( context ) );
67
      processor = IDENTITY;
68
      evaluator = new RInlineEvaluator( context );
67
      final var rVarProcessor = new RVariableProcessor( IDENTITY, context );
68
      final var rInlineEvaluator = new RInlineEvaluator( rVarProcessor );
69
      result.add( RInlineExtension.create( rInlineEvaluator, context ) );
70
      processor = rVarProcessor;
71
      evaluator = rInlineEvaluator;
6972
    }
7073
    else {
...
7780
7881
    result.add( ImageLinkExtension.create( context ) );
79
    result.add( TeXExtension.create( processor, context ) );
82
    result.add( TeXExtension.create( evaluator, context ) );
8083
    result.add( FencedBlockExtension.create( processor, evaluator, context ) );
8184
M src/main/java/com/keenwrite/processors/markdown/extensions/r/RInlineExtension.java
3434
  private final BaseMarkdownProcessor mMarkdownProcessor;
3535
36
  private RInlineExtension( final ProcessorContext context ) {
37
    mEvaluator = new RInlineEvaluator( context );
36
  private RInlineExtension(
37
    final RInlineEvaluator evaluator,
38
    final ProcessorContext context ) {
39
    mEvaluator = evaluator;
3840
    mMarkdownProcessor = new BaseMarkdownProcessor( IDENTITY, context );
3941
  }
4042
4143
  /**
4244
   * Creates an extension capable of intercepting R code blocks and preventing
4345
   * them from being converted into HTML {@code <code>} elements.
4446
   */
45
  public static RInlineExtension create( final ProcessorContext context ) {
46
    return new RInlineExtension( context );
47
  public static RInlineExtension create(
48
    final RInlineEvaluator evaluator,
49
    final ProcessorContext context ) {
50
    return new RInlineExtension( evaluator, context );
4751
  }
4852
M src/main/java/com/keenwrite/processors/markdown/extensions/tex/TeXExtension.java
33
44
import com.keenwrite.ExportFormat;
5
import com.keenwrite.processors.Processor;
65
import com.keenwrite.processors.ProcessorContext;
76
import com.keenwrite.processors.markdown.extensions.HtmlRendererAdapter;
87
import com.keenwrite.processors.markdown.extensions.tex.TexNodeRenderer.Factory;
98
import com.vladsch.flexmark.html.HtmlRenderer;
109
import com.vladsch.flexmark.parser.Parser;
1110
import com.vladsch.flexmark.util.data.MutableDataHolder;
1211
import org.jetbrains.annotations.NotNull;
12
13
import java.util.function.Function;
1314
1415
import static com.vladsch.flexmark.parser.Parser.ParserExtension;
...
2930
   * Responsible for pre-parsing the input.
3031
   */
31
  private final Processor<String> mProcessor;
32
  private final Function<String, String> mEvaluator;
3233
3334
  /**
3435
   * Controls how the node renderer produces TeX code within HTML output.
3536
   */
3637
  private final ExportFormat mExportFormat;
3738
3839
  private TeXExtension(
39
    final Processor<String> processor, final ProcessorContext context  ) {
40
    mProcessor = processor;
40
    final Function<String, String> evaluator, final ProcessorContext context  ) {
41
    mEvaluator = evaluator;
4142
    mExportFormat = context.getExportFormat();
4243
  }
4344
4445
  /**
4546
   * Creates an extension capable of handling delimited TeX code in Markdown.
4647
   *
4748
   * @return The new {@link TeXExtension}, never {@code null}.
4849
   */
4950
  public static TeXExtension create(
50
    final Processor<String> processor, final ProcessorContext context  ) {
51
    return new TeXExtension( processor, context );
51
    final Function<String, String> evaluator, final ProcessorContext context  ) {
52
    return new TeXExtension( evaluator, context );
5253
  }
5354
...
6263
                      @NotNull final String rendererType ) {
6364
    if( "HTML".equalsIgnoreCase( rendererType ) ) {
64
      builder.nodeRendererFactory( new Factory( mExportFormat, mProcessor ) );
65
      builder.nodeRendererFactory( new Factory( mExportFormat, mEvaluator ) );
6566
    }
6667
  }
M src/main/java/com/keenwrite/processors/markdown/extensions/tex/TexNodeRenderer.java
44
import com.keenwrite.ExportFormat;
55
import com.keenwrite.preview.SvgRasterizer;
6
import com.keenwrite.processors.Processor;
76
import com.vladsch.flexmark.html.HtmlWriter;
87
import com.vladsch.flexmark.html.renderer.NodeRenderer;
...
1716
import java.util.Map;
1817
import java.util.Set;
18
import java.util.function.Function;
1919
2020
import static com.keenwrite.ExportFormat.*;
...
3939
4040
    public Factory(
41
      final ExportFormat exportFormat, final Processor<String> processor ) {
41
      final ExportFormat exportFormat,
42
      final Function<String, String> evaluator ) {
4243
      mNodeRenderer = EXPORT_RENDERERS.getOrDefault( exportFormat, RENDERER );
43
      mNodeRenderer.setProcessor( processor );
44
      mNodeRenderer.setEvaluator( evaluator );
4445
    }
4546
...
5354
  private static abstract class RendererFacade
5455
    implements NodeRenderer {
55
    private Processor<String> mProcessor;
56
    private Function<String, String> mEvaluator;
5657
5758
    @Override
...
7475
                          final HtmlWriter html );
7576
76
    private void setProcessor( final Processor<String> processor ) {
77
      mProcessor = processor;
77
    private void setEvaluator( final Function<String, String> evaluator ) {
78
      mEvaluator = evaluator;
7879
    }
7980
80
    Processor<String> getProcessor() {
81
      return mProcessor;
81
    Function<String, String> getEvaluator() {
82
      return mEvaluator;
8283
    }
8384
  }
...
9798
                 final NodeRendererContext context,
9899
                 final HtmlWriter html ) {
99
      final var text = getProcessor().apply( node.getText().toString() );
100
      final var text = getEvaluator().apply( node.getText().toString() );
100101
      final var content =
101102
        mIncludeDelimiter
...
118119
      final var tex = node.getText().toStringOrNull();
119120
      final var doc = MATH_RENDERER.render(
120
        tex == null ? "" : getProcessor().apply( tex ) );
121
        tex == null ? "" : getEvaluator().apply( tex ) );
121122
      final var svg = SvgRasterizer.toSvg( doc.getDocumentElement() );
122123
      html.raw( svg );
...
132133
                 final HtmlWriter html ) {
133134
      html.raw( TOKEN_OPEN );
134
      html.raw( getProcessor().apply( node.getText().toString() ) );
135
      html.raw( getEvaluator().apply( node.getText().toString() ) );
135136
      html.raw( TOKEN_CLOSE );
136137
    }
M src/main/java/com/keenwrite/processors/r/RInlineEvaluator.java
33
44
import com.keenwrite.processors.Processor;
5
import com.keenwrite.processors.ProcessorContext;
65
76
import java.util.function.Function;
87
import java.util.function.Predicate;
98
109
import static com.keenwrite.constants.Constants.STATUS_PARSE_ERROR;
1110
import static com.keenwrite.events.StatusEvent.clue;
12
import static com.keenwrite.processors.IdentityProcessor.IDENTITY;
1311
1412
/**
...
2725
   * Constructs an evaluator capable of executing R statements.
2826
   */
29
  public RInlineEvaluator( final ProcessorContext context ) {
30
    mProcessor = new RVariableProcessor( IDENTITY, context );
27
  public RInlineEvaluator( final RVariableProcessor processor ) {
28
    mProcessor = processor;
3129
  }
3230
M src/main/java/com/keenwrite/sigils/RKeyOperator.java
22
package com.keenwrite.sigils;
33
4
import com.keenwrite.collections.BoundedCache;
5
46
import java.util.function.UnaryOperator;
57
...
1214
  private static final char KEY_SEPARATOR_R = '$';
1315
16
  /** Minor optimization to avoid recreating an object. */
1417
  private final StringBuilder mVarName = new StringBuilder( 128 );
18
19
  /** Optimization to avoid re-converting variable names into R format. */
20
  private final BoundedCache<String, String> mVariables = new BoundedCache<>(
21
    2048
22
  );
1523
1624
  /**
...
3947
    assert !key.isBlank();
4048
41
    mVarName.setLength( 0 );
49
    return mVariables.computeIfAbsent( key, this::convert );
50
  }
4251
43
    //final var rVarName = new StringBuilder( key.length() + 3 );
52
  private String convert( final String key ) {
53
    mVarName.setLength( 0 );
4454
    mVarName.append( "v" );
4555
    mVarName.append( KEY_SEPARATOR_R );