Exemplo n.º 1
0
        /// <summary>
        /// Internal method which generates the HTML Output for the Sparql Results.
        /// </summary>
        /// <param name="results"></param>
        /// <param name="output"></param>
        private void GenerateOutput(SparqlResultSet results, TextWriter output)
        {
            HtmlTextWriter    writer      = new HtmlTextWriter(output);
            QNameOutputMapper qnameMapper = new QNameOutputMapper(_namespaces != null ? _namespaces : new NamespaceMapper(true));

            // Page Header
            writer.Write("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
            writer.RenderBeginTag(HtmlTextWriterTag.Html);
            writer.RenderBeginTag(HtmlTextWriterTag.Head);
            writer.RenderBeginTag(HtmlTextWriterTag.Title);
            writer.WriteEncodedText("SPARQL Query Results");
            writer.RenderEndTag();
            if (!Stylesheet.Equals(String.Empty))
            {
                writer.AddAttribute(HtmlTextWriterAttribute.Href, Stylesheet);
                writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/css");
                writer.AddAttribute(HtmlTextWriterAttribute.Rel, "stylesheet");
                writer.RenderBeginTag(HtmlTextWriterTag.Link);
                writer.RenderEndTag();
            }
            // TODO: Add <meta> for charset?
            writer.RenderEndTag();

            // Start Body
            writer.RenderBeginTag(HtmlTextWriterTag.Body);

            if (results.ResultsType == SparqlResultsType.VariableBindings)
            {
                // Create a Table for the results
                writer.AddAttribute(HtmlTextWriterAttribute.Width, "100%");
                writer.RenderBeginTag(HtmlTextWriterTag.Table);

                // Create a Table Header with the Variable Names
                writer.RenderBeginTag(HtmlTextWriterTag.Thead);
                writer.RenderBeginTag(HtmlTextWriterTag.Tr);

                foreach (String var in results.Variables)
                {
                    writer.RenderBeginTag(HtmlTextWriterTag.Th);
                    writer.WriteEncodedText(var);
                    writer.RenderEndTag();
                }

                writer.RenderEndTag();
                writer.RenderEndTag();
                writer.WriteLine();

                // Create a Table Body for the Results
                writer.RenderBeginTag(HtmlTextWriterTag.Tbody);

                // Create a Column for each Binding
                foreach (SparqlResult result in results)
                {
                    // Start Row
                    writer.RenderBeginTag(HtmlTextWriterTag.Tr);

                    foreach (String var in results.Variables)
                    {
                        // Start Column
                        writer.RenderBeginTag(HtmlTextWriterTag.Td);

                        if (result.HasValue(var))
                        {
                            INode value = result[var];

                            if (value != null)
                            {
                                switch (value.NodeType)
                                {
                                case NodeType.Blank:
                                    writer.AddAttribute(HtmlTextWriterAttribute.Class, CssClassBlankNode);
                                    writer.RenderBeginTag(HtmlTextWriterTag.Span);
                                    writer.WriteEncodedText(value.ToString());
                                    writer.RenderEndTag();
                                    break;

                                case NodeType.Literal:
                                    ILiteralNode lit = (ILiteralNode)value;
                                    writer.AddAttribute(HtmlTextWriterAttribute.Class, CssClassLiteral);
                                    writer.RenderBeginTag(HtmlTextWriterTag.Span);
                                    if (lit.DataType != null)
                                    {
                                        writer.WriteEncodedText(lit.Value);
                                        writer.RenderEndTag();
                                        writer.WriteEncodedText("^^");
                                        writer.AddAttribute(HtmlTextWriterAttribute.Href, _formatter.FormatUri(lit.DataType.AbsoluteUri));
                                        writer.AddAttribute(HtmlTextWriterAttribute.Class, CssClassDatatype);
                                        writer.RenderBeginTag(HtmlTextWriterTag.A);
                                        writer.WriteEncodedText(lit.DataType.ToString());
                                        writer.RenderEndTag();
                                    }
                                    else
                                    {
                                        writer.WriteEncodedText(lit.Value);
                                        if (!lit.Language.Equals(String.Empty))
                                        {
                                            writer.RenderEndTag();
                                            writer.WriteEncodedText("@");
                                            writer.AddAttribute(HtmlTextWriterAttribute.Class, CssClassLangSpec);
                                            writer.RenderBeginTag(HtmlTextWriterTag.Span);
                                            writer.WriteEncodedText(lit.Language);
                                            writer.RenderEndTag();
                                        }
                                        else
                                        {
                                            writer.RenderEndTag();
                                        }
                                    }
                                    break;

                                case NodeType.GraphLiteral:
                                    // Error
                                    throw new RdfOutputException("Result Sets which contain Graph Literal Nodes cannot be serialized in the HTML Format");

                                case NodeType.Uri:
                                    writer.AddAttribute(HtmlTextWriterAttribute.Class, CssClassUri);
                                    writer.AddAttribute(HtmlTextWriterAttribute.Href, _formatter.FormatUri(UriPrefix + value.ToString()));
                                    writer.RenderBeginTag(HtmlTextWriterTag.A);

                                    String qname;
                                    if (qnameMapper.ReduceToQName(value.ToString(), out qname))
                                    {
                                        writer.WriteEncodedText(qname);
                                    }
                                    else
                                    {
                                        writer.WriteEncodedText(value.ToString());
                                    }
                                    writer.RenderEndTag();
                                    break;

                                default:
                                    throw new RdfOutputException("Result Sets which contain Unknown Node Types cannot be serialized in the HTML Format");
                                }
                            }
                            else
                            {
                                writer.WriteEncodedText(" ");
                            }
                        }
                        else
                        {
                            writer.WriteEncodedText(" ");
                        }

                        // End Column
                        writer.RenderEndTag();
                    }

                    // End Row
                    writer.RenderEndTag();
                    writer.WriteLine();
                }

                // End Table Body
                writer.RenderEndTag();

                // End Table
                writer.RenderEndTag();
            }
            else
            {
                // Show a Header and a Boolean value
                writer.RenderBeginTag(HtmlTextWriterTag.H3);
                writer.WriteEncodedText("ASK Query Result");
                writer.RenderEndTag();
                writer.RenderBeginTag(HtmlTextWriterTag.P);
                writer.WriteEncodedText(results.Result.ToString());
                writer.RenderEndTag();
            }

            // End of Page
            writer.RenderEndTag(); //End Body
            writer.RenderEndTag(); //End Html
        }