001/* 002 * Portions of this software was developed by employees of the National Institute 003 * of Standards and Technology (NIST), an agency of the Federal Government and is 004 * being made available as a public service. Pursuant to title 17 United States 005 * Code Section 105, works of NIST employees are not subject to copyright 006 * protection in the United States. This software may be subject to foreign 007 * copyright. Permission in the United States and in foreign countries, to the 008 * extent that NIST may hold copyright, to use, copy, modify, create derivative 009 * works, and distribute this software and its documentation without fee is hereby 010 * granted on a non-exclusive basis, provided that this notice and disclaimer 011 * of warranty appears in all copies. 012 * 013 * THE SOFTWARE IS PROVIDED 'AS IS' WITHOUT ANY WARRANTY OF ANY KIND, EITHER 014 * EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY 015 * THAT THE SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF 016 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND FREEDOM FROM 017 * INFRINGEMENT, AND ANY WARRANTY THAT THE DOCUMENTATION WILL CONFORM TO THE 018 * SOFTWARE, OR ANY WARRANTY THAT THE SOFTWARE WILL BE ERROR FREE. IN NO EVENT 019 * SHALL NIST BE LIABLE FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO, DIRECT, 020 * INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF, RESULTING FROM, 021 * OR IN ANY WAY CONNECTED WITH THIS SOFTWARE, WHETHER OR NOT BASED UPON WARRANTY, 022 * CONTRACT, TORT, OR OTHERWISE, WHETHER OR NOT INJURY WAS SUSTAINED BY PERSONS OR 023 * PROPERTY OR OTHERWISE, AND WHETHER OR NOT LOSS WAS SUSTAINED FROM, OR AROSE OUT 024 * OF THE RESULTS OF, OR USE OF, THE SOFTWARE OR SERVICES PROVIDED HEREUNDER. 025 */ 026 027package gov.nist.secauto.metaschema.core.datatype.markup.flexmark; 028 029import com.vladsch.flexmark.ast.Emphasis; 030import com.vladsch.flexmark.ast.StrongEmphasis; 031import com.vladsch.flexmark.parser.core.delimiter.AsteriskDelimiterProcessor; 032import com.vladsch.flexmark.parser.core.delimiter.Delimiter; 033import com.vladsch.flexmark.parser.core.delimiter.EmphasisDelimiterProcessor; 034import com.vladsch.flexmark.parser.delimiter.DelimiterRun; 035import com.vladsch.flexmark.util.ast.DelimitedNode; 036import com.vladsch.flexmark.util.misc.Utils; 037import com.vladsch.flexmark.util.sequence.BasedSequence; 038 039/** 040 * Provides a temporary fix for the broken {@link EmphasisDelimiterProcessor} in 041 * Flexmark. 042 */ 043public class FixedEmphasisDelimiterProcessor 044 extends AsteriskDelimiterProcessor { 045 // TODO: remove this class once vsch/flexmark-java#580 is merged 046 private final int multipleUse; 047 048 public FixedEmphasisDelimiterProcessor(boolean strongWrapsEmphasis) { 049 super(strongWrapsEmphasis); 050 this.multipleUse = strongWrapsEmphasis ? 1 : 2; 051 } 052 053 @SuppressWarnings("PMD.OnlyOneReturn") // for readability 054 @Override 055 public int getDelimiterUse(DelimiterRun opener, DelimiterRun closer) { 056 // "multiple of 3" rule for internal delimiter runs 057 if ((opener.canClose() || closer.canOpen()) && (opener.length() + closer.length()) % 3 == 0) { 058 if (opener.length() % 3 == 0 && closer.length() % 3 == 0) { 059 return this.multipleUse; // if they are each a multiple of 3, then emphasis can be created 060 } 061 return 0; 062 } 063 064 // calculate actual number of delimiters used from this closer 065 if (opener.length() < 3 || closer.length() < 3) { 066 return Utils.min(closer.length(), opener.length()); 067 } 068 // default to latest spec 069 return closer.length() % 2 == 0 ? 2 : multipleUse; 070 } 071 072 @Override 073 public void process(Delimiter opener, Delimiter closer, int delimitersUsed) { 074 DelimitedNode emphasis = delimitersUsed == 1 075 ? new Emphasis(opener.getTailChars(delimitersUsed), BasedSequence.NULL, closer.getLeadChars(delimitersUsed)) 076 : new StrongEmphasis(opener.getTailChars(delimitersUsed), BasedSequence.NULL, 077 closer.getLeadChars(delimitersUsed)); 078 079 opener.moveNodesBetweenDelimitersTo(emphasis, closer); 080 } 081 082}