<p>I would like to display an RTF document in an SWT (actually Eclipse RCP) application.</p>

<p>I know there is a Swing widget for displaying and editing RTF text, but it is Swing and quite alien in look and feel when used in the otherwise platform (not to mention that to the last of my knowledge it did not display images and had only limited support for formatting)</p>

<p>Other options is to use COM interface on windows, but that works only on the windows platform and requires that an ActiveX RichEdit contol be installed on the customer machine... which can make the deployment of the application quite horrendous...</p>

<p>What are the other options for displaying rich documents inside Eclipse/SWT application?</p>

[{'answer_id': 81719, 'author': 'jrudolph', 'author_id': 7647, 'author_profile': 'https://Stackoverflow.com/users/7647', 'pm_score': 1, 'selected': False, 'text': "<p>You may use swt.custom.StyledText. That has many features to change the look of the text. But I don't think it can load or save RTF right now.</p>\n\n<p>I once wrote an HTML editor with it, but it is quite difficult, since the StyledText model to add styles to a part of the text is so alien compared to the way HTML/RTF works.</p>\n\n<p>AFAIK you can directly print from this control, which internally creates an RTF representation of the contents. But that's not exactly what you asked for.</p>\n"}, {'answer_id': 165279, 'author': 'BlueVoid', 'author_id': 193278, 'author_profile': 'https://Stackoverflow.com/users/193278', 'pm_score': 0, 'selected': False, 'text': '<p>I\'m not sure of a way to do it without using ActiveX.  If you do go this direction you might want to look into the <a href="http://www.alphaworks.ibm.com/tech/swtactivexcontainer?open&amp;S_TACT=106AH21W&amp;S_CMP=AWRSSJAV" rel="nofollow noreferrer">IBM Container for ActiveX Documents</a>, which is supposed to allow better integration of documents.</p>\n'}, {'answer_id': 170079, 'author': 'extraneon', 'author_id': 24582, 'author_profile': 'https://Stackoverflow.com/users/24582', 'pm_score': 1, 'selected': False, 'text': '<p>Why not first read the RTF text into a StyledDocument using the RTFEditorKit and then writing the StyledDocument to a StringWriter using the HTMLEditorKit?</p>\n\n<pre><code>String rtf = "whatever";\nBufferedReader input = new BufferedReader(new StringReader(rtf));\n\nRTFEditorKit rtfKit = new RTFEditorKit();\nStyledDocument doc = (StyledDocument) rtfKit.createDefaultDocument();\nrtfEdtrKt.read( input, doc, 0 );\ninput.close();\n\nHTMLEditorKit htmlKit = new HTMLEditorKit();       \nStringWriter output = new StringWriter();\nhtmlKit.write( output, doc, 0, doc.getLength());\n\nString html = output.toString();\n</code></pre>\n\n<p>And then display the HTML?</p>\n'}, {'answer_id': 269138, 'author': 'Aaron Digulla', 'author_id': 34088, 'author_profile': 'https://Stackoverflow.com/users/34088', 'pm_score': 1, 'selected': False, 'text': '<p>You might want to use the Swing control with the <a href="http://www.eclipsezone.com/eclipse/forums/t45697.html" rel="nofollow noreferrer">AWT/SWT bridge</a>. I used this to embed OpenOffice into an SWT app:</p>\n\n<pre><code>package ooswtviewer;\n\nimport java.awt.Panel;\n\nimport com.sun.star.awt.XView;\nimport com.sun.star.beans.Property;\nimport com.sun.star.beans.UnknownPropertyException;\nimport com.sun.star.beans.XPropertySet;\nimport com.sun.star.comp.beans.Frame;\nimport com.sun.star.comp.beans.NoConnectionException;\nimport com.sun.star.comp.beans.OOoBean;\nimport com.sun.star.comp.beans.OfficeDocument;\nimport com.sun.star.drawing.XDrawView;\nimport com.sun.star.frame.XController;\nimport com.sun.star.frame.XDesktop;\nimport com.sun.star.frame.XFrame;\nimport com.sun.star.frame.XFramesSupplier;\nimport com.sun.star.frame.XLayoutManager;\nimport com.sun.star.frame.XModel;\nimport com.sun.star.lang.WrappedTargetException;\nimport com.sun.star.ui.XUIElement;\nimport com.sun.star.uno.Any;\nimport com.sun.star.uno.UnoRuntime;\nimport com.sun.star.uno.XInterface;\nimport com.sun.star.view.XViewSettingsSupplier;\n\n/**\n * Code based on example from http://www.eclipsezone.com/eclipse/forums/t48966.html\n * \n * @author Aaron digulla\n */\npublic class OOoSwtViewer extends Panel\n{\n    private static final String RESOURCE_TOOLBAR_TEXTOBJECTBAR = "private:resource/toolbar/textobjectbar";\n    private static final String RESOURCE_TOOLBAR_STANDARDBAR = "private:resource/toolbar/standardbar";\n    private static final String RESOURCE_MENUBAR = "private:resource/menubar/menubar";\n\n    private static final long serialVersionUID = -1408623115735065822L;\n\n    private OOoBean aBean;\n\n    public OOoSwtViewer()\n    {\n        super();\n        aBean = new OOoBean();\n        setLayout(new java.awt.BorderLayout());\n        add(aBean, java.awt.BorderLayout.CENTER);\n\n        aBean.setAllBarsVisible (false);\n    }\n\n    public XPropertySet getXPropertySet ()\n    {\n        return getXPropertySet (getFrame ());\n    }\n\n    public XPropertySet getXPropertySet (Object o)\n    {\n        return (XPropertySet)UnoRuntime.queryInterface (XPropertySet.class, o);\n    }\n\n    public Frame getFrame ()\n    {\n        try\n        {\n            return aBean.getFrame ();\n        }\n        catch (NoConnectionException e)\n        {\n            throw new OOException ("Error getting frame from bean", e);\n        }\n    }\n\n    public XLayoutManager getXLayoutManager ()\n    {\n        try\n        {\n            return (XLayoutManager)UnoRuntime.queryInterface (XLayoutManager.class, getXPropertySet ().getPropertyValue ("LayoutManager"));\n        }\n        catch (Exception e)\n        {\n            throw new OOException ("Error getting LayoutManager from bean\'s properties", e);\n        }        \n    }\n\n    public void setMenuBarVisible (boolean visible)\n    {\n        if (visible)\n            getXLayoutManager ().showElement (RESOURCE_MENUBAR);\n        else\n            getXLayoutManager ().hideElement (RESOURCE_MENUBAR);\n    }\n\n    public void setStandardBarVisible (boolean visible)\n    {\n        if (visible)\n            getXLayoutManager ().showElement (RESOURCE_TOOLBAR_STANDARDBAR);\n        else\n            getXLayoutManager ().hideElement (RESOURCE_TOOLBAR_STANDARDBAR);\n    }\n\n    public void setTextObjectBarVisible (boolean visible)\n    {\n        if (visible)\n            getXLayoutManager ().showElement (RESOURCE_TOOLBAR_TEXTOBJECTBAR);\n        else\n            getXLayoutManager ().hideElement (RESOURCE_TOOLBAR_TEXTOBJECTBAR);\n    }\n\n\n    private Thread loadThread;\n    private Exception loadException;\n\n    public void setDocument(final String url)\n    {\n        loadThread = new Thread () {\n            public void run() {\n                try\n                {\n                    aBean.loadFromURL(url, null);\n                    aBean.aquireSystemWindow();\n\n                    setTextObjectBarVisible (false);\n\n//                    for (XUIElement e: getXLayoutManager ().getElements ())\n//                    {\n//                        XInterface i = (XInterface)e.getRealInterface ();\n//                        System.out.println (e);\n//                        System.out.println (i);\n//                        printProperties (getXPropertySet (e));\n//                    }\n\n                    /*\n                    System.out.println ("frame:");\n                    printProperties (getXPropertySet ());\n\nframe:\nTitle=test - OpenOffice.org Writer \nIndicatorInterception=Any[Type[com.sun.star.task.XStatusIndicator], null]\nLayoutManager=Any[Type[com.sun.star.frame.XLayoutManager], [Proxy:26506390,717ea70;msci[0];342169f1a1164ee688893a857f65b3e1,Type[com.sun.star.frame.XLayoutManager]]]\nDispatchRecorderSupplier=Any[Type[com.sun.star.frame.XDispatchRecorderSupplier], null]\nIsHidden=false\n                    */\n\n                    XController controller = aBean.getDocument ().getCurrentController ();\n                    /*\n                    System.out.println ("controller:");\n                    printProperties (getXPropertySet (controller));\n\ncontroller:\nIsConstantSpellcheck=true\nIsHideSpellMarks=false\nLineCount=1\nPageCount=1\n                    */\n\n                    /*\n                    System.out.println ("layoutManager:");\n                    printProperties (getXPropertySet (getXLayoutManager ()));\n\nlayoutManager:\nAutomaticToolbars=true\nHideCurrentUI=false\nLockCount=0\nMenuBarCloser=true\nRefreshContextToolbarVisibility=false\n                    */\n\n                    /*\n                    System.out.println ("document:");\n                    printProperties (getXPropertySet (aBean.getDocument ()));\n                    OfficeDocument doc = aBean.getDocument ();\nApplyFormDesignMode=false\nApplyWorkaroundForB6375613=false\nAutomaticControlFocus=false\nBasicLibraries=Any[Type[com.sun.star.script.XLibraryContainer], [Proxy:14806696,73ca178;msci[0];342169f1a1164ee688893a857f65b3e1,Type[com.sun.star.script.XLibraryContainer]]]\nBuildId=680$9310\nCharFontCharSet=1\nCharFontCharSetAsian=1\nCharFontCharSetComplex=1\nCharFontFamily=3\nCharFontFamilyAsian=6\nCharFontFamilyComplex=6\nCharFontName=Times New Roman\nCharFontNameAsian=Arial Unicode MS\nCharFontNameComplex=Tahoma\nCharFontPitch=2\nCharFontPitchAsian=2\nCharFontPitchComplex=2\nCharFontStyleName=\nCharFontStyleNameAsian=\nCharFontStyleNameComplex=\nCharLocale=com.sun.star.lang.Locale@fb6354\nCharacterCount=20\nDialogLibraries=Any[Type[com.sun.star.script.XLibraryContainer], [Proxy:3556929,73a39c0;msci[0];342169f1a1164ee688893a857f65b3e1,Type[com.sun.star.script.XLibraryContainer]]]\nForbiddenCharacters=Any[Type[com.sun.star.i18n.XForbiddenCharacters], [Proxy:11544872,7669148;msci[0];342169f1a1164ee688893a857f65b3e1,Type[com.sun.star.i18n.XForbiddenCharacters]]]\nHasValidSignatures=false\nHideFieldTips=false\nIndexAutoMarkFileURL=\nLockUpdates=false\nParagraphCount=1\nRecordChanges=false\nRedlineDisplayType=2\nRedlineProtectionKey=[B@f593af\nRuntimeUID=10\nShowChanges=true\nTwoDigitYear=1930\nWordCount=5\nWordSeparator=()        \n                    */\n\n//                    System.out.println ("viewData:");\n//                    printProperties (getXPropertySet (controller.getFrame ().getContainerWindow ()));\n\n                    XViewSettingsSupplier settingsSupplier = (XViewSettingsSupplier)UnoRuntime.queryInterface (XViewSettingsSupplier.class, controller);\n//                    System.out.println ("settingsSupplier:");\n//                    printProperties (settingsSupplier.getViewSettings ());\n                    settingsSupplier.getViewSettings ().setPropertyValue ("ShowVertRuler", Boolean.FALSE);\n                    settingsSupplier.getViewSettings ().setPropertyValue ("ShowHoriRuler", Boolean.FALSE);\n                    // Switch to Web Layout. This layout mode comes without gray border and the page borders automatically adujst to the frame\n                    settingsSupplier.getViewSettings ().setPropertyValue ("ShowOnlineLayout", Boolean.TRUE);\n//                    settingsSupplier.getViewSettings ().setPropertyValue ("ShowTextBoundaries", Boolean.TRUE);\n\n//                    XView view = (XView)UnoRuntime.queryInterface (XView.class, getFrame ());\n//                    System.out.println ("drawView="+view);\n//                    printProperties (getXPropertySet (view));\n\n                    /*\n                    XModel model = (XModel)UnoRuntime.queryInterface (XModel.class, doc);\n                    printProperties ("model", model);\n\n                    Same as getDocument()\n                    */\n\n                    /*\n                    System.out.println ("Interfaces implemented by aBean.getDocument():");\n                    for (Class c: OOoInspector.queryInterface (aBean.getDocument ()))\n                        System.out.println ("    "+c.getName ());\n    com.sun.star.datatransfer.XTransferable\n    com.sun.star.document.XDocumentInfoSupplier\n    com.sun.star.document.XDocumentLanguages\n    com.sun.star.document.XDocumentSubStorageSupplier\n    com.sun.star.document.XEmbeddedScripts\n    com.sun.star.document.XEventBroadcaster\n    com.sun.star.document.XEventsSupplier\n    com.sun.star.document.XLinkTargetSupplier\n    com.sun.star.document.XRedlinesSupplier\n    com.sun.star.document.XStorageBasedDocument\n    com.sun.star.document.XViewDataSupplier\n    com.sun.star.drawing.XDrawPageSupplier\n    com.sun.star.embed.XVisualObject\n    com.sun.star.frame.XLoadable\n    com.sun.star.frame.XModel\n    com.sun.star.frame.XModel2\n    com.sun.star.frame.XModule\n    com.sun.star.frame.XStorable\n    com.sun.star.frame.XStorable2\n    com.sun.star.script.provider.XScriptProviderSupplier\n    com.sun.star.style.XAutoStylesSupplier\n    com.sun.star.style.XStyleFamiliesSupplier\n    com.sun.star.text.XBookmarksSupplier\n    com.sun.star.text.XChapterNumberingSupplier\n    com.sun.star.text.XDocumentIndexesSupplier\n    com.sun.star.text.XEndnotesSupplier\n    com.sun.star.text.XFootnotesSupplier\n    com.sun.star.text.XLineNumberingProperties\n    com.sun.star.text.XNumberingRulesSupplier\n    com.sun.star.text.XPagePrintable\n    com.sun.star.text.XReferenceMarksSupplier\n    com.sun.star.text.XTextDocument\n    com.sun.star.text.XTextEmbeddedObjectsSupplier\n    com.sun.star.text.XTextFieldsSupplier\n    com.sun.star.text.XTextFramesSupplier\n    com.sun.star.text.XTextGraphicObjectsSupplier\n    com.sun.star.text.XTextSectionsSupplier\n    com.sun.star.text.XTextTablesSupplier\n    com.sun.star.ui.XUIConfigurationManagerSupplier\n    com.sun.star.util.XCloseable\n    com.sun.star.util.XCloseBroadcaster\n    com.sun.star.util.XLinkUpdate\n    com.sun.star.util.XModifiable\n    com.sun.star.util.XModifiable2\n    com.sun.star.util.XModifyBroadcaster\n    com.sun.star.util.XNumberFormatsSupplier\n    com.sun.star.util.XRefreshable\n    com.sun.star.util.XReplaceable\n    com.sun.star.util.XSearchable\n    com.sun.star.view.XPrintable\n    com.sun.star.view.XPrintJobBroadcaster\n    com.sun.star.view.XRenderable\n    com.sun.star.xforms.XFormsSupplier\n                    */\n\n                    /*\n                    System.out.println ("Interfaces implemented by controller:");\n                    for (Class c: OOoInspector.queryInterface (controller))\n                        System.out.println ("    "+c.getName ());\n\n    com.sun.star.awt.XUserInputInterception\n    com.sun.star.datatransfer.XTransferableSupplier\n    com.sun.star.frame.XController\n    com.sun.star.frame.XControllerBorder\n    com.sun.star.frame.XDispatchInformationProvider\n    com.sun.star.frame.XDispatchProvider\n    com.sun.star.task.XStatusIndicatorSupplier\n    com.sun.star.text.XRubySelection\n    com.sun.star.text.XTextViewCursorSupplier\n    com.sun.star.ui.XContextMenuInterception\n    com.sun.star.view.XControlAccess\n    com.sun.star.view.XFormLayerAccess\n    com.sun.star.view.XSelectionSupplier\n    com.sun.star.view.XViewSettingsSupplier\n                    */\n\n                    /*\n                    System.out.println ("Interfaces implemented by frame:");\n                    for (Class c: OOoInspector.queryInterface (getFrame ()))\n                        System.out.println ("    "+c.getName ());\n\n    com.sun.star.awt.XFocusListener\n    com.sun.star.awt.XTopWindowListener\n    com.sun.star.awt.XWindowListener\n    com.sun.star.document.XActionLockable\n    com.sun.star.frame.XComponentLoader\n    com.sun.star.frame.XDispatchInformationProvider\n    com.sun.star.frame.XDispatchProvider\n    com.sun.star.frame.XDispatchProviderInterception\n    com.sun.star.frame.XFrame\n    com.sun.star.frame.XFramesSupplier\n    com.sun.star.task.XStatusIndicatorFactory\n    com.sun.star.util.XCloseable\n    com.sun.star.util.XCloseBroadcaster\n                    */\n\n                    /*\n                    XFramesSupplier frames = OOoInspector.queryInterface (XFramesSupplier.class, getFrame ());\n                    printProperties ("frames", frames);\n\n                    for (int i=0; i&lt;frames.getFrames ().getCount (); i++)\n                    {\n                        XFrame frame = (XFrame)frames.getFrames ().getByIndex (i);\n                        printProperties ("Frame "+i, frame);\n                    }\n\nframes=[Proxy:16382237,6ace84c;msci[0];342169f1a1164ee688893a857f65b3e1,Type[com.sun.star.frame.XFramesSupplier]]\nTitle=test - OpenOffice.org Writer \nIndicatorInterception=Any[Type[com.sun.star.task.XStatusIndicator], null]\nLayoutManager=Any[Type[com.sun.star.frame.XLayoutManager], [Proxy:22149392,76bd794;msci[0];342169f1a1164ee688893a857f65b3e1,Type[com.sun.star.frame.XLayoutManager]]]\nDispatchRecorderSupplier=Any[Type[com.sun.star.frame.XDispatchRecorderSupplier], null]\nIsHidden=false\n                    */\n                    XPropertySet p = getXPropertySet (getFrame ());\n                    Any any = (Any)p.getPropertyValue ("LayoutManager");\n                    System.out.println (any);\n                    System.out.println (any.getClass ().getName ());\n                    XLayoutManager layoutManager = (XLayoutManager)any.getObject ();\n                    printProperties ("layoutManager", layoutManager);\n\n\n                    /*\n                    printProperties ("containerWindow", getFrame ().getContainerWindow ());\n\ncontainerWindow=[Proxy:11970262,6d33e60;msci[0];342169f1a1164ee688893a857f65b3e1,Type[com.sun.star.awt.XWindow]]\nnull\n                    */\n\n                    /*\n                    printProperties ("componentWindow", getFrame ().getComponentWindow ());\n\ncomponentWindow=[Proxy:25380515,8657cc4;msci[0];342169f1a1164ee688893a857f65b3e1,Type[com.sun.star.awt.XWindow]]\nnull\n                    */\n                }\n                catch (Exception e)\n                {\n                    e.printStackTrace ();\n                }\n            }\n        };\n        if (1 == 1)\n            loadThread.start ();\n        else\n            loadThread.run ();\n    }\n\n    /** closes the bean viewer and tries to terminate OOo.\n     */\n    public void terminate() throws NoConnectionException {\n        setVisible(false);\n        XDesktop xDesktop = null;\n        xDesktop = aBean.getOOoDesktop();\n        aBean.stopOOoConnection();\n        if (xDesktop != null)\n            xDesktop.terminate();\n    }\n\n    /** closes the bean viewer, leaves OOo running.\n     */\n    public void close() {\n        setVisible(false);\n        aBean.stopOOoConnection();\n    }\n\n    public void printProperties (String name, Object obj)\n    {\n        System.out.println (name+"="+obj);\n        if (obj != null)\n            printProperties (getXPropertySet (obj));\n    }\n\n    public void printProperties (XPropertySet set)\n    {\n        if (set == null)\n        {\n            System.out.println ("null");\n            return;\n        }\n\n        for (Property p: set.getPropertySetInfo ().getProperties ())\n        {\n            try\n            {\n                System.out.println (p.Name+"="+set.getPropertyValue (p.Name));\n            }\n            catch (Exception e)\n            {\n                throw new OOException ("Error getting value of property "+p.Name, e);\n            }\n        }\n    }\n\n}\n</code></pre>\n\n<p>You can use the control like this:</p>\n\n<pre><code>package ooswtviewer;\n\nimport java.awt.BorderLayout;\nimport java.awt.Frame;\nimport java.awt.Panel;\nimport java.io.File;\n\nimport javax.swing.JRootPane;\n\nimport org.eclipse.swt.SWT;\nimport org.eclipse.swt.awt.SWT_AWT;\nimport org.eclipse.swt.events.DisposeEvent;\nimport org.eclipse.swt.events.DisposeListener;\nimport org.eclipse.swt.layout.FillLayout;\nimport org.eclipse.swt.widgets.Composite;\nimport org.eclipse.swt.widgets.Display;\nimport org.eclipse.swt.widgets.Shell;\n\n/**\n * Code based on example from http://www.eclipsezone.com/eclipse/forums/t48966.html\n * \n * @author Aaron Digulla\n */\npublic class OOoSwtSnippet {\n    public static void main(String[] args) {\n        OOoSwtSnippet obj = new OOoSwtSnippet ();\n        try\n        {\n            obj.run (args);\n        }\n        catch (Exception e)\n        {\n            e.printStackTrace ();\n        }\n    }\n\n    public void run (String[] args) throws Exception\n    {\n        final Display display = new Display();\n        final Shell shell = new Shell(display);\n        shell.setLayout(new FillLayout());\n\n        Composite composite = new Composite(shell, SWT.NO_BACKGROUND\n                | SWT.EMBEDDED);\n\n        System.setProperty("sun.awt.noerasebackground", "true");\n\n        /* Create and setting up frame */\n        Frame frame = SWT_AWT.new_Frame(composite);\n        Panel panel = new Panel(new BorderLayout()) {\n            public void update(java.awt.Graphics g) {\n                paint(g);\n            }\n        };\n        frame.add(panel);\n        JRootPane root = new JRootPane();\n        panel.add(root);\n        java.awt.Container contentPane = root.getContentPane();\n\n        shell.setSize(800, 600);\n        final OOoSwtViewer viewer = new OOoSwtViewer();\n        contentPane.add(viewer);\n\n        // viewer.setDocument(NEW_WRITTER_DOCUMENT);\n        File document = new File ("test.odt");\n        String url = document.getAbsoluteFile ().toURL ().toString ();\n        url = "file:///" + url.substring (6);\n        System.out.println ("Loading "+url);\n        viewer.setDocument(url);\n\n        shell.setText ("OOoSwtSnippet");\n        shell.open();\n        shell.addDisposeListener(new DisposeListener() {\n            public void widgetDisposed(DisposeEvent e) {\n                try {\n                    viewer.close();\n                } catch (RuntimeException exception) {\n                    exception.printStackTrace();\n                }\n            }\n\n        });\n        while (!shell.isDisposed()) {\n            if (!display.readAndDispatch())\n                display.sleep();\n        }\n        display.dispose();\n    }\n\n}\n</code></pre>\n\n<p>OOException is a RuntimeException:</p>\n\n<pre><code>package ooswtviewer;\n\n/**\n * Wrapper for all OO exceptions to keep throws clauses in check\n * \n * @author Aaron Digulla\n */\npublic class OOException extends RuntimeException\n{\n\n    public OOException ()\n    {\n        super ();\n    }\n\n    public OOException (String message, Throwable cause)\n    {\n        super (message, cause);\n    }\n\n    public OOException (String message)\n    {\n        super (message);\n    }\n\n    public OOException (Throwable cause)\n    {\n        super (cause);\n    }\n\n}\n</code></pre>\n'}, {'answer_id': 1157851, 'author': 'Community', 'author_id': -1, 'author_profile': 'https://Stackoverflow.com/users/-1', 'pm_score': 1, 'selected': False, 'text': '<p><a href="http://sites.google.com/site/anshunjain/eclipse-musings/eclipse-hacks/eclipse-richt-text-editor" rel="nofollow noreferrer">http://sites.google.com/site/anshunjain/eclipse-musings/eclipse-hacks/eclipse-richt-text-editor</a></p>\n'}, {'answer_id': 2294741, 'author': 'Roland Tepp', 'author_id': 1712, 'author_profile': 'https://Stackoverflow.com/users/1712', 'pm_score': 2, 'selected': True, 'text': '<p>Actuall, I\'ve just found another widget that is quite promising atm:</p>\n\n<p><a href="http://onpositive.com/richtext" rel="nofollow noreferrer">http://onpositive.com/richtext</a></p>\n'}]
['https://Stackoverflow.com/questions/81671', 'https://Stackoverflow.com', 'https://Stackoverflow.com/users/1712/']