Search in sources :

Example 6 with NoOpDocumentBuilder

use of org.eclipse.mylyn.wikitext.parser.builder.NoOpDocumentBuilder in project mylyn.docs by eclipse.

the class MultiplexingDocumentBuilderTest method setLocator.

@Test
public void setLocator() {
    DocumentBuilder delegateOne = new NoOpDocumentBuilder();
    DocumentBuilder delegateTwo = new NoOpDocumentBuilder();
    Locator locator = new ContentState();
    multiplexer = new MultiplexingDocumentBuilder(delegateOne, delegateTwo);
    multiplexer.setLocator(locator);
    assertSame(locator, delegateOne.getLocator());
    assertSame(locator, delegateTwo.getLocator());
}
Also used : NoOpDocumentBuilder(org.eclipse.mylyn.wikitext.parser.builder.NoOpDocumentBuilder) Locator(org.eclipse.mylyn.wikitext.parser.Locator) NoOpDocumentBuilder(org.eclipse.mylyn.wikitext.parser.builder.NoOpDocumentBuilder) DocumentBuilder(org.eclipse.mylyn.wikitext.parser.DocumentBuilder) MultiplexingDocumentBuilder(org.eclipse.mylyn.wikitext.parser.builder.MultiplexingDocumentBuilder) EventDocumentBuilder(org.eclipse.mylyn.wikitext.parser.builder.EventDocumentBuilder) MultiplexingDocumentBuilder(org.eclipse.mylyn.wikitext.parser.builder.MultiplexingDocumentBuilder) ContentState(org.eclipse.mylyn.wikitext.parser.markup.ContentState) Test(org.junit.Test)

Example 7 with NoOpDocumentBuilder

use of org.eclipse.mylyn.wikitext.parser.builder.NoOpDocumentBuilder in project mylyn.docs by eclipse.

the class MarkupHyperlinkDetector method detectHyperlinks.

public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {
    if (markupLanguage == null || file == null) {
        return null;
    }
    IDocument document = textViewer.getDocument();
    if (document == null || document.getLength() == 0) {
        return null;
    }
    String content;
    int contentOffset;
    try {
        if (region.getLength() == 0) {
            // expand the region to include the whole line
            IRegion lineInfo = document.getLineInformationOfOffset(region.getOffset());
            int lineLength = lineInfo.getLength();
            int lineOffset = lineInfo.getOffset();
            int lineEnd = lineOffset + lineLength;
            int regionEnd = region.getOffset() + region.getLength();
            if (lineOffset < region.getOffset()) {
                int regionLength = Math.max(regionEnd, lineEnd) - lineOffset;
                contentOffset = lineOffset;
                content = document.get(lineOffset, regionLength);
            } else {
                // the line starts after region, may never happen
                int regionLength = Math.max(regionEnd, lineEnd) - region.getOffset();
                contentOffset = region.getOffset();
                content = document.get(contentOffset, regionLength);
            }
        } else {
            content = document.get(region.getOffset(), region.getLength());
            contentOffset = region.getOffset();
        }
    } catch (BadLocationException ex) {
        return null;
    }
    MarkupParser markupParser = new MarkupParser(markupLanguage);
    final List<HyperlinkDescriptor> links = new ArrayList<>();
    markupParser.setBuilder(new NoOpDocumentBuilder() {

        @Override
        public void link(Attributes attributes, String hrefOrHashName, String text) {
            if (hrefOrHashName != null && !hrefOrHashName.startsWith("#")) {
                // $NON-NLS-1$
                IRegion region = createRegion();
                links.add(new HyperlinkDescriptor(hrefOrHashName, region));
            }
        }

        private IRegion createRegion() {
            int offset = getLocator().getLineCharacterOffset();
            int length = getLocator().getLineSegmentEndOffset() - offset;
            return new Region(offset, length);
        }

        @Override
        public void beginSpan(SpanType type, Attributes attributes) {
            if (type == SpanType.LINK) {
                if (attributes instanceof LinkAttributes) {
                    LinkAttributes linkAttributes = (LinkAttributes) attributes;
                    if (linkAttributes.getHref() != null && !linkAttributes.getHref().startsWith("#")) {
                        // $NON-NLS-1$
                        IRegion region = createRegion();
                        links.add(new HyperlinkDescriptor(linkAttributes.getHref(), region));
                    }
                }
            }
        }
    });
    markupParser.parse(content);
    if (!links.isEmpty()) {
        List<IHyperlink> hyperlinks = new ArrayList<>(links.size());
        for (HyperlinkDescriptor descriptor : links) {
            if (descriptor.href.indexOf(':') == -1 && descriptor.href.length() > 1 && descriptor.href.charAt(0) != '/') {
                IRegion hyperlinkRegion = new Region(descriptor.region.getOffset() + contentOffset, descriptor.region.getLength());
                if (region.getLength() > 0) {
                    if (!isInRegion(region, hyperlinkRegion)) {
                        continue;
                    }
                } else {
                    if (!(hyperlinkRegion.getOffset() <= region.getOffset() && (hyperlinkRegion.getOffset() + hyperlinkRegion.getLength()) >= region.getOffset())) {
                        continue;
                    }
                }
                try {
                    IPath containerPath = file.getParent().getFullPath();
                    IPath absolutePath = containerPath.append(descriptor.href);
                    IFile targetFile = ResourcesPlugin.getWorkspace().getRoot().getFile(absolutePath);
                    if (targetFile != null) {
                        if (targetFile.exists()) {
                            hyperlinks.add(new EditFileHyperlink(targetFile, hyperlinkRegion));
                        }
                        IContainer parent = targetFile.getParent();
                        if (parent.exists()) {
                            String nameNoExtension = targetFile.getName();
                            if (nameNoExtension.indexOf('.') != -1) {
                                nameNoExtension = nameNoExtension.substring(0, nameNoExtension.lastIndexOf('.') + 1);
                            }
                            IResource[] members = parent.members();
                            for (IResource resource : members) {
                                if (resource.getType() == IResource.FILE && resource.getName().startsWith(nameNoExtension) && !resource.equals(targetFile)) {
                                    hyperlinks.add(new EditFileHyperlink((IFile) resource, hyperlinkRegion));
                                }
                            }
                        }
                    }
                } catch (Throwable t) {
                // ignore
                }
            }
        }
        if (!hyperlinks.isEmpty()) {
            return hyperlinks.toArray(new IHyperlink[hyperlinks.size()]);
        }
    }
    return null;
}
Also used : NoOpDocumentBuilder(org.eclipse.mylyn.wikitext.parser.builder.NoOpDocumentBuilder) IFile(org.eclipse.core.resources.IFile) IPath(org.eclipse.core.runtime.IPath) ArrayList(java.util.ArrayList) LinkAttributes(org.eclipse.mylyn.wikitext.parser.LinkAttributes) Attributes(org.eclipse.mylyn.wikitext.parser.Attributes) IRegion(org.eclipse.jface.text.IRegion) LinkAttributes(org.eclipse.mylyn.wikitext.parser.LinkAttributes) IHyperlink(org.eclipse.jface.text.hyperlink.IHyperlink) Region(org.eclipse.jface.text.Region) IRegion(org.eclipse.jface.text.IRegion) IContainer(org.eclipse.core.resources.IContainer) IDocument(org.eclipse.jface.text.IDocument) BadLocationException(org.eclipse.jface.text.BadLocationException) IResource(org.eclipse.core.resources.IResource) MarkupParser(org.eclipse.mylyn.wikitext.parser.MarkupParser)

Aggregations

NoOpDocumentBuilder (org.eclipse.mylyn.wikitext.parser.builder.NoOpDocumentBuilder)7 DocumentBuilder (org.eclipse.mylyn.wikitext.parser.DocumentBuilder)5 ArrayList (java.util.ArrayList)3 Attributes (org.eclipse.mylyn.wikitext.parser.Attributes)2 EventDocumentBuilder (org.eclipse.mylyn.wikitext.parser.builder.EventDocumentBuilder)2 MultiplexingDocumentBuilder (org.eclipse.mylyn.wikitext.parser.builder.MultiplexingDocumentBuilder)2 Test (org.junit.Test)2 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)1 IContainer (org.eclipse.core.resources.IContainer)1 IFile (org.eclipse.core.resources.IFile)1 IResource (org.eclipse.core.resources.IResource)1 IPath (org.eclipse.core.runtime.IPath)1 BadLocationException (org.eclipse.jface.text.BadLocationException)1 IDocument (org.eclipse.jface.text.IDocument)1 IRegion (org.eclipse.jface.text.IRegion)1 Region (org.eclipse.jface.text.Region)1 IHyperlink (org.eclipse.jface.text.hyperlink.IHyperlink)1 BlockType (org.eclipse.mylyn.wikitext.parser.DocumentBuilder.BlockType)1 SpanType (org.eclipse.mylyn.wikitext.parser.DocumentBuilder.SpanType)1 LinkAttributes (org.eclipse.mylyn.wikitext.parser.LinkAttributes)1