@Override public int processLineContent(String line, int offset) { if (blockLineCount == 0) { Attributes attributes = new Attributes(); attributes.setCssClass("footnote"); //$NON-NLS-1$ // 0-offset matches may start with the "fnnn. " prefix. footnote = matcher.group(1); ((TextileContentState) state).footnoteBlockDetected(footnote); attributes.setId(state.getFootnoteId(footnote)); Textile.configureAttributes(attributes, matcher, 2, true); offset = matcher.start(LINE_REMAINDER_GROUP_OFFSET); builder.beginBlock(BlockType.PARAGRAPH, attributes); builder.beginSpan(SpanType.SUPERSCRIPT, new Attributes()); builder.characters(footnote); builder.endSpan(); builder.characters(" "); //$NON-NLS-1$ } if (markupLanguage.isEmptyLine(line)) { setClosed(true); return 0; } if (blockLineCount != 0) { builder.lineBreak(); } ++blockLineCount; getMarkupLanguage().emitMarkupLine(getParser(), state, line, offset); return -1; }
@Override public void emit() { String footnote = group(1); if (((TextileLanguage) getMarkupLanguage()).isPreprocessFootnotes() && !((TextileContentState) getState()).hasFootnoteNumber(footnote)) { builder.characters(group(0)); } else { String htmlId = state.getFootnoteId(footnote); int originalSegmentEndOffset = state.getLineSegmentEndOffset(); state.setLineCharacterOffset(start(1) - 1); state.setLineSegmentEndOffset(end(1) + 1); builder.beginSpan(SpanType.SUPERSCRIPT, new Attributes(null, "footnote", null, null)); //$NON-NLS-1$ builder.link("#" + htmlId, footnote); //$NON-NLS-1$ builder.endSpan(); state.setLineCharacterOffset(originalSegmentEndOffset); state.setLineSegmentEndOffset(originalSegmentEndOffset); } } }