Thread and post pages implemented (handler+template); PageOuter implemented; some fixes and features

main
Inga 🏳‍🌈 15 years ago
parent b4aefad99d
commit 5985b05691
  1. 2
      Builder/IISMainHandler/build.txt
  2. 16
      Common/UserContext.cs
  3. 2
      Common/dataobjects/Board.cs
  4. 41
      Common/dataobjects/Post.cs
  5. 29
      Common/dataobjects/Thread.cs
  6. 2
      Common/dataobjects/User.cs
  7. 2
      Core/DB/IDBConnection.cs
  8. 6
      Core/Util.cs
  9. 2
      Core/extensions/String.cs
  10. 3
      IISMainHandler/Extensions.cs
  11. 4
      IISMainHandler/HandlersFactory.cs
  12. 2
      IISMainHandler/IISMainHandler.csproj
  13. 88
      IISMainHandler/PageOuter.cs
  14. 4
      IISMainHandler/WebContext.cs
  15. 8
      IISMainHandler/handlers/BoardHandler.cs
  16. 30
      IISMainHandler/handlers/PostHandler.cs
  17. 41
      IISMainHandler/handlers/ThreadHandler.cs
  18. 30
      MySQLConnector/Connection.cs
  19. 2
      static/css/coffeehaus.css
  20. 3
      static/css/global.css
  21. BIN
      static/images/addreminder.gif
  22. BIN
      static/images/edit.gif
  23. BIN
      static/images/email2.gif
  24. BIN
      static/images/flat.gif
  25. BIN
      static/images/greyflat.gif
  26. BIN
      static/images/greythreaded.gif
  27. BIN
      static/images/new.gif
  28. BIN
      static/images/notifymod.gif
  29. BIN
      static/images/print.gif
  30. BIN
      static/images/reply.gif
  31. BIN
      static/images/threaded.gif
  32. 110
      templates/Full/Board.xslt
  33. 14
      templates/Full/Boards.xslt
  34. 80
      templates/Full/Post.xslt
  35. 107
      templates/Full/Thread.xslt
  36. 15
      templates/Full/elems/BoardInfo.xslt
  37. 38
      templates/Full/elems/Header.xslt
  38. 92
      templates/Full/elems/Main.xslt
  39. 162
      templates/Full/elems/PostInfo.xslt
  40. 15
      templates/Full/elems/ThreadInfo.xslt

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
namespace FLocal.Common {
abstract public class UserContext {
@ -22,12 +23,25 @@ namespace FLocal.Common {
abstract public string formatDateTime(DateTime dateTime);
abstract public XElement formatTotalPosts(long posts);
}
public static class UserContext_Extensions {
public static string ToString(this DateTime dateTime, UserContext context) {
/*public static string ToString(this DateTime dateTime, UserContext context) {
return context.formatDateTime(dateTime);
}*/
public static XElement ToXml(this DateTime dateTime) {
return new XElement("date",
new XElement("year", dateTime.Year),
new XElement("month", dateTime.Month),
new XElement("mday", dateTime.Day),
new XElement("hour", dateTime.Hour),
new XElement("minute", dateTime.Minute),
new XElement("second", dateTime.Second)
);
}
}

@ -156,7 +156,7 @@ namespace FLocal.Common.dataobjects {
if(!this.lastPostId.HasValue) {
return new XElement("none");
} else {
return this.lastPost.exportToXmlWithoutThread(context);
return this.lastPost.exportToXmlWithoutThread(context, false);
}
}

@ -20,6 +20,7 @@ namespace FLocal.Common.dataobjects {
public const string FIELD_TITLE = "Title";
public const string FIELD_BODY = "Body";
public const string FIELD_THREADID = "ThreadId";
public const string FIELD_PARENTPOSTID = "ParentPostId";
public static readonly TableSpec instance = new TableSpec();
public string name { get { return TABLE; } }
public string idName { get { return FIELD_ID; } }
@ -88,6 +89,11 @@ namespace FLocal.Common.dataobjects {
return this._body;
}
}
public string bodyShort {
get {
return this.body.Replace("<br />", Util.EOL).Substring(0, Math.Min(1000, this.body.IndexOf("<")));
}
}
private int _threadId;
public int threadId {
@ -102,6 +108,19 @@ namespace FLocal.Common.dataobjects {
}
}
private int? _parentPostId;
public int? parentPostId {
get {
this.LoadIfNotLoaded();
return this._parentPostId;
}
}
public Post parentPost {
get {
return Post.LoadById(this.parentPostId.Value);
}
}
protected override void doFromHash(Dictionary<string, string> data) {
this._posterId = int.Parse(data[TableSpec.FIELD_POSTERID]);
this._postDate = new DateTime(long.Parse(data[TableSpec.FIELD_POSTDATE]));
@ -111,20 +130,36 @@ namespace FLocal.Common.dataobjects {
this._title = data[TableSpec.FIELD_TITLE];
this._body = data[TableSpec.FIELD_BODY];
this._threadId = int.Parse(data[TableSpec.FIELD_THREADID]);
this._parentPostId = Util.ParseInt(data[TableSpec.FIELD_PARENTPOSTID]);
}
public XElement exportToXmlWithoutThread(UserContext context) {
public XElement exportToXmlSimpleWithParent(UserContext context) {
return new XElement("post",
new XElement("id", this.id),
new XElement("name", this.title),
new XElement("parent", this.thread.exportToXmlSimpleWithParent(context))
);
}
public XElement exportToXmlWithoutThread(UserContext context, bool includeParentPost) {
XElement result = new XElement("post",
new XElement("id", this.id),
new XElement("poster", this.poster.exportToXmlForViewing(context)),
new XElement("postDate", this.postDate.ToString(context)),
new XElement("lastChangeDate", this.postDate.ToString(context)),
new XElement("postDate", this.postDate.ToXml()),
new XElement("lastChangeDate", this.postDate.ToXml()),
new XElement("revision", this.revision),
new XElement("layer", this.layer),
new XElement("title", this.title),
new XElement("body", this.body),
new XElement("bodyShort", this.bodyShort),
new XElement("threadId", this.threadId)
);
if(includeParentPost) {
if(this.parentPostId.HasValue) {
result.Add(new XElement("parentPost", this.parentPost.exportToXmlWithoutThread(context, false)));
}
}
return result;
}
}

@ -5,6 +5,7 @@ using System.Text;
using System.Xml.Linq;
using FLocal.Core;
using FLocal.Core.DB;
using FLocal.Core.DB.conditions;
namespace FLocal.Common.dataobjects {
public class Thread : SqlObject<Thread> {
@ -152,17 +153,39 @@ namespace FLocal.Common.dataobjects {
public XElement exportToXml(UserContext context) {
return new XElement("thread",
new XElement("id", this.id),
new XElement("firstPostId", this.firstPost.exportToXmlWithoutThread(context)),
new XElement("firstPostId", this.firstPostId),
new XElement("topicstarter", this.topicstarter.exportToXmlForViewing(context)),
new XElement("title", this.title),
new XElement("lastPostId", this.lastPostId),
new XElement("lastPostDate", this.lastPostDate.ToString(context)),
new XElement("lastPostDate", this.lastPostDate.ToXml()),
new XElement("isAnnouncement", this.isAnnouncement),
new XElement("isLocked", this.isLocked),
new XElement("totalPosts", this.totalPosts),
new XElement("totalViews", this.totalViews),
new XElement("hasNewPosts", this.hasNewPosts()),
new XElement("body", this.firstPost.body)
new XElement("bodyShort", this.firstPost.bodyShort),
context.formatTotalPosts(this.totalPosts)
);
}
public IEnumerable<Post> getPosts(Diapasone diapasone, UserContext context) {
return Post.LoadByIds(
from stringId in Config.instance.mainConnection.LoadIdsByConditions(
Post.TableSpec.instance,
new ComparisonCondition(
Post.TableSpec.instance.getColumnSpec(Post.TableSpec.FIELD_THREADID),
ComparisonType.EQUAL,
this.id.ToString()
),
diapasone,
new JoinSpec[0],
new SortSpec[] {
new SortSpec(
Post.TableSpec.instance.getIdSpec(),
true
),
}
) select int.Parse(stringId)
);
}

@ -105,7 +105,7 @@ namespace FLocal.Common.dataobjects {
public XElement exportToXmlForViewing(UserContext context) {
return new XElement("user",
new XElement("id", this.id),
new XElement("regDate", this.regDate.ToString(context)),
new XElement("regDate", this.regDate.ToXml()),
new XElement("totalPosts", this.totalPosts),
new XElement("signature", this.signature),
new XElement("title", this.title),

@ -10,6 +10,8 @@ namespace FLocal.Core.DB {
List<string> LoadIdsByConditions(ITableSpec table, conditions.AbstractCondition conditions, Diapasone diapasone, JoinSpec[] joins, SortSpec[] sorts);
long GetCountByConditions(ITableSpec table, conditions.AbstractCondition conditions, JoinSpec[] joins);
Transaction beginTransaction(System.Data.IsolationLevel iso);
void lockTable(Transaction transaction, ITableSpec table);

@ -133,6 +133,12 @@ namespace FLocal.Core {
}
}
public static string EOL {
get {
return new string(new char[] { (char)0x0d, (char)0x0a });
}
}
}
}

@ -5,7 +5,7 @@ using System.Text;
namespace FLocal.Core {
static class StringExtension {
public static class StringExtension {
public static string PHPSubstring(this string str, int start, int length) {
if(start > str.Length) {

@ -9,8 +9,7 @@ namespace FLocal.IISHandler {
public static void WriteLine(this HttpResponse response, string toWrite) {
response.Write(toWrite);
response.Write((char)0x0d);
response.Write((char)0x0a);
response.Write(Core.Util.EOL);
}
public static string[] Split(this string str, string separator, StringSplitOptions options) {

@ -19,6 +19,10 @@ namespace FLocal.IISHandler {
return new handlers.BoardsHandler();
case "board":
return new handlers.BoardHandler();
case "thread":
return new handlers.ThreadHandler();
case "post":
return new handlers.PostHandler();
case "static":
return new handlers.StaticHandler(context.requestParts);
default:

@ -56,12 +56,14 @@
<Compile Include="handlers\BoardHandler.cs" />
<Compile Include="handlers\BoardsHandler.cs" />
<Compile Include="handlers\DebugHandler.cs" />
<Compile Include="handlers\PostHandler.cs" />
<Compile Include="handlers\RootHandler.cs" />
<Compile Include="handlers\StaticHandler.cs" />
<Compile Include="handlers\ThreadHandler.cs" />
<Compile Include="handlers\WrongUrlHandler.cs" />
<Compile Include="ISpecificHandler.cs" />
<Compile Include="MainHandler.cs" />
<Compile Include="PageOuter.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TemplateEngine.cs" />
<Compile Include="WebContext.cs" />

@ -0,0 +1,88 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FLocal.Core.DB;
using System.Xml.Linq;
using FLocal.Core;
namespace FLocal.IISHandler {
class PageOuter : Diapasone {
public readonly long perPage;
private PageOuter(long start, long count, long perPage)
: base(start, count) {
this.perPage = perPage;
}
private PageOuter(long perPage)
: base(0, -1) {
this.perPage = perPage;
}
public static PageOuter create(long perPage, long total) {
PageOuter result = new PageOuter(0, perPage, perPage);
result.total = total;
return result;
}
public static PageOuter createFromGet(string[] requestParts, long perPage, Dictionary<char, Func<long>> customAction, int offset) {
if(requestParts.Length > offset) {
if(requestParts[offset].ToLower() == "all") {
return new PageOuter(perPage);
} else if(Char.IsDigit(requestParts[offset][0])) {
return new PageOuter(long.Parse(requestParts[offset]), perPage, perPage);
} else {
return new PageOuter(customAction[requestParts[offset][0]](), perPage, perPage);
}
} else {
return new PageOuter(0, perPage, perPage);
}
}
public static PageOuter createFromGet(string[] requestParts, long perPage, Dictionary<char, Func<long>> customAction) {
return createFromGet(requestParts, perPage, customAction, 2);
}
public static PageOuter createFromGet(string[] requestParts, long perPage) {
return createFromGet(requestParts, perPage, new Dictionary<char,Func<long>>());
}
public XElement exportToXml(int left, int current, int right) {
XElement result = new XElement("pageOuter",
new XElement("unlimited", (this.count < 1).ToPlainString()),
new XElement("start", this.start),
new XElement("count", this.count),
new XElement("total", this.total),
new XElement("perPage", this.perPage)
);
if(this.count > 0) {
if(this.start + this.count < this.total) {
result.Add(new XElement("next", this.start + this.count));
}
}
HashSet<long> pages = new HashSet<long>();
for(long i=0; i<left; i++) {
pages.Add(i*this.perPage);
}
{
long totalFloor = this.total - (this.total % this.perPage);
for(long i=0; i<left; i++) {
pages.Add(totalFloor - i*this.perPage);
}
}
{
long startFloor = this.start - (this.start % this.perPage);
for(long i=current; i>-current; i--) {
pages.Add(startFloor + i*this.perPage);
}
}
result.Add(new XElement("pages",
from page in pages where (page >= 0) && (page <= this.total) orderby page select new XElement("page", page)
));
return result;
}
}
}

@ -51,6 +51,10 @@ namespace FLocal.IISHandler {
return dateTime.ToString();
}
public override System.Xml.Linq.XElement formatTotalPosts(long posts) {
return PageOuter.create(this.userSettings.postsPerPage, posts).exportToXml(2, 0, 2);
}
public DateTime requestTime;
public WebContext(HttpContext httpcontext) {

@ -6,6 +6,7 @@ using System.Web;
using System.Xml.Linq;
using FLocal.Common;
using FLocal.Common.dataobjects;
using FLocal.Core.DB;
namespace FLocal.IISHandler.handlers {
@ -19,10 +20,15 @@ namespace FLocal.IISHandler.handlers {
override protected XElement[] getSpecificData(WebContext context) {
Board board = Board.LoadById(int.Parse(context.requestParts[1]));
PageOuter pageOuter = PageOuter.createFromGet(context.requestParts, context.userSettings.threadsPerPage);
IEnumerable<Thread> threads = board.getThreads(pageOuter, context);
return new XElement[] {
new XElement("currentLocation", board.exportToXmlSimpleWithParent(context)),
new XElement("boards", from subBoard in board.subBoards select subBoard.exportToXml(context, true)),
new XElement("threads", from thread in board.getThreads(FLocal.Core.DB.Diapasone.unlimited, context) select thread.exportToXml(context))
new XElement("threads",
from thread in threads select thread.exportToXml(context),
pageOuter.exportToXml(1, 5, 1)
)
};
}

@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Xml.Linq;
using FLocal.Common;
using FLocal.Common.dataobjects;
namespace FLocal.IISHandler.handlers {
class PostHandler : AbstractGetHandler {
override protected string templateName {
get {
return "Post.xslt";
}
}
override protected XElement[] getSpecificData(WebContext context) {
Post post = Post.LoadById(int.Parse(context.requestParts[1]));
return new XElement[] {
new XElement("currentLocation", post.exportToXmlSimpleWithParent(context)),
new XElement("posts", post.exportToXmlWithoutThread(context, true))
};
}
}
}

@ -6,6 +6,9 @@ using System.Web;
using System.Xml.Linq;
using FLocal.Common;
using FLocal.Common.dataobjects;
using FLocal.Core;
using FLocal.Core.DB;
using FLocal.Core.DB.conditions;
namespace FLocal.IISHandler.handlers {
@ -18,10 +21,42 @@ namespace FLocal.IISHandler.handlers {
}
override protected XElement[] getSpecificData(WebContext context) {
Board board = Board.LoadById(int.Parse(context.requestParts[1]));
Thread thread = Thread.LoadById(int.Parse(context.requestParts[1]));
PageOuter pageOuter = PageOuter.createFromGet(
context.requestParts,
context.userSettings.postsPerPage,
new Dictionary<char,Func<long>> {
{
'p',
() => Config.instance.mainConnection.GetCountByConditions(
Post.TableSpec.instance,
new ComplexCondition(
ConditionsJoinType.AND,
new List<NotEmptyCondition> {
new ComparisonCondition(
Post.TableSpec.instance.getColumnSpec(Post.TableSpec.FIELD_THREADID),
ComparisonType.EQUAL,
thread.id.ToString()
),
new ComparisonCondition(
Post.TableSpec.instance.getIdSpec(),
ComparisonType.LESSTHAN,
int.Parse(context.requestParts[2].PHPSubstring(1)).ToString()
),
}
),
new JoinSpec[0]
)
}
}
);
IEnumerable<Post> posts = thread.getPosts(pageOuter, context);
return new XElement[] {
new XElement("currentLocation", board.exportToXmlSimpleWithParent(context)),
new XElement("boards", from subBoard in board.subBoards select subBoard.exportToXml(context, true))
new XElement("currentLocation", thread.exportToXmlSimpleWithParent(context)),
new XElement("posts",
from post in posts select post.exportToXmlWithoutThread(context, true),
pageOuter.exportToXml(2, 5, 2)
)
};
}

@ -141,6 +141,36 @@ namespace FLocal.MySQLConnector {
}
}
public long GetCountByConditions(ITableSpec table, FLocal.Core.DB.conditions.AbstractCondition conditions, JoinSpec[] joins) {
lock(this) {
using(DbCommand command = this.connection.CreateCommand()) {
command.CommandType = System.Data.CommandType.Text;
var conditionsCompiled = ConditionCompiler.Compile(conditions, this.traits);
string queryConditions = "";
if(conditionsCompiled.Key != "") queryConditions = "WHERE " + conditionsCompiled.Key;
ParamsHolder paramsHolder = conditionsCompiled.Value;
string queryJoins = "";
{
if(joins.Length > 0) {
throw new NotImplementedException();
}
}
command.CommandText = "SELECT COUNT(*) " + "FROM " + table.compile(this.traits) + " " + queryJoins + " " + queryConditions;
foreach(KeyValuePair<string, string> kvp in paramsHolder.data) {
command.AddParameter(kvp.Key, kvp.Value);
}
object rawCount = command.ExecuteScalar();
long count = (long)rawCount;
return count;
}
}
}
public FLocal.Core.DB.Transaction beginTransaction(System.Data.IsolationLevel iso) {
lock(this) {
Transaction transaction = new Transaction(this, iso);

@ -60,8 +60,6 @@ body {
border-style: solid;
border-width: 1px 1px 1px 1px;
border-color: #666699;
padding: 0px;
margin: 1px;
}
.catandforum {
font-size: 8pt;

@ -68,3 +68,6 @@ pre
.tablesurround > tr > td, .tableborders > tr > td {
border:solid 1px black;
}
.navigation {
margin:3px;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 B

@ -38,13 +38,13 @@
<img alt="Ïðåäûäóùàÿ ñòðàíèöà" border="0" width="12" height="15" style="vertical-align: text-bottom">
<xsl:attribute name="src">/static/images/greyprevious.gif</xsl:attribute>
</img>
<span>Ïðåä.</span>
<xsl:text>Ïðåä.</xsl:text>
</a>
</td>
<td class="navigation" nowrap="nowrap">
<a href="/ubbthreads.php?Cat=&amp;C=1">
<img src="/static/images/all.gif" alt="Ñïèñîê ôîðóìîâ" border="0" width="19" height="15" style="vertical-align: text-bottom" />
<span>Ñïèñîê</span>
<xsl:text>Ñïèñîê</xsl:text>
</a>
</td>
<td class="navigation" nowrap="nowrap">
@ -53,7 +53,7 @@
<img alt="Ñëåäóþùàÿ ñòðàíèöà" border="0" width="14" height="15" style="vertical-align: text-bottom">
<xsl:attribute name="src">/static/images/next.gif</xsl:attribute>
</img>
<span>Ñëåä.</span>
<xsl:text>Ñëåä.</xsl:text>
</a>
</td>
<td class="navigation">
@ -103,20 +103,10 @@
<tr class="tdheader">
<td colspan="5">
<font class="onbody">
<span class="separate">ñòðàíèöû:</span>
<a class="separate">0</a>
<a class="separate">
<xsl:attribute name="href">/Board/1/p20/</xsl:attribute>
<span>20</span>
</a>
<a class="separate">
<xsl:attribute name="href">/Board/1/p40/</xsl:attribute>
<span>40</span>
</a>
<a class="separate">
<xsl:attribute name="href">/Board/1/p60/</xsl:attribute>
<span>60</span>
</a>
<xsl:text>ñòðàíèöû:</xsl:text>
<xsl:apply-templates select="threads/pageOuter" mode="withCurrent">
<xsl:with-param name="baseLink">/Board/<xsl:value-of select="currentLocation/board/id"/>/</xsl:with-param>
</xsl:apply-templates>
</font>
</td>
</tr>
@ -124,92 +114,6 @@
</td>
</tr>
</table>
<br />
<table width="95%" align="center" cellpadding="1" cellspacing="1" class="tablesurround">
<tr>
<td>
<table cellpadding="3" cellspacing="1" width="100%" border="0" class="tableborders">
<tr class="tdheader">
<td colspan="3">Äîïîëíèòåëüíàÿ èíôîðìàöèÿ</td>
</tr>
<tr class="lighttable">
<td width="33%" class="small" valign="top">
<span>11 çàðåãèñòðèðîâàííûõ è 1 àíîíèìíûõ ïîëüçîâàòåëåé ïðîñìàòðèâàþò ýòîò ôîðóì.</span>
<br />
<br />
<span>Ìîäåðàòîðû:</span>
<a class="separate" href="/showprofile.php?User=Sash&amp;What=ubbthreads">Sash</a>
<a class="separate" href="/showprofile.php?User=DeadmoroZ&amp;What=ubbthreads">DeadmoroZ</a>&#160;
<br />
<br />
</td>
<td valign="top" align="left" class="small" width="33%">
<b>Ïðàâà</b>
<table style="margin-left:4em">
<tr><td>Âû ìîæåòå ñîçäàâàòü íîâûå òåìû</td></tr>
<tr><td>Âû ìîæåòå îòâå÷àòü íà ñîîáùåíèÿ</td></tr>
<tr><td>HTML îòêëþ÷åí</td></tr>
<tr><td>UBBCode âêëþ÷åí</td></tr>
</table>
</td>
<td class="small" valign="top">
<b>Ëåãåíäà:</b>
<table style="margin-left:4em">
<tr>
<td><img src="/static/images/book-notread.gif" alt="" style="vertical-align: text-bottom" /></td>
<td><span>Íîâûå ñîîáùåíèÿ</span></td>
</tr>
<tr>
<td><img src="/static/images/book-read.gif" alt="" style="vertical-align: text-bottom" /></td>
<td><span>Íåò íîâûõ ñîîáùåíèé</span></td>
</tr>
<tr>
<td><img src="/static/images/chat-notread.gif" alt="" style="vertical-align: text-bottom" /></td>
<td><span>Íîâûå ñîîáùåíèÿ</span></td>
</tr>
<tr>
<td><img src="/static/images/chat-read.gif" alt="" style="vertical-align: text-bottom" /></td>
<td><span>Íåò íîâûõ ñîîáùåíèé</span></td>
</tr>
</table>
</td>
</tr>
<tr class="lighttable">
<td align="left" width="33%" class="small">
<form method="get" action="/dosearch.php">
<span>Ïîèñê â ôîðóìå</span>
<input type="text" name="Words" class="formboxes" style="font-size:10px" />
<input type="submit" name="textsearch" value="Ïîèñê" class="buttons" style="font-size:10px" />
</form>
</td>
<td align="left" width="33%" class="small">
<form method="post" action="/addfav.php?Cat=&amp;Board=Common&amp;type=board&amp;src=&amp;showlite=">
<input type="submit" value="Â ôàâîðèòû!" class="buttons iconize" style="background-image:url('/images/favorites.gif');" />
</form>
<form method="post" action="/togglesub.php?Cat=&amp;Board=Common&amp;page=0&amp;src=&amp;sb=5&amp;o=">
<input type="submit" value="Ñïðÿòàòü" class="buttons iconize" style="background-image:url('/images/hide.gif');" />
</form>
<form action="/changerss.php?Cat=&amp;rss_board_add=Common&amp;src=" method="post">
<input type="submit" value="&#160;&#160;" class="buttons iconize" style="width:32px;background-image:url('/images/rss.png');" />
</form>
</td>
<td align="left" class="small">
<form method="post" action="/jumper.php">
<span>Ïåðåõîä â</span>
<select name="board" class="formboxes" style="font-size:10px" >
<option value ="-CATJUMP-1">-General-</option>
<option value="Common" selected="selected">&#160;&#160;&#160;Common</option>
<option value="current" >&#160;&#160;&#160;Current</option>
<option value="University" >&#160;&#160;&#160;University</option>
</select>
<input type="submit" style="font-size:10px" name="Jump" value="Ïåðåéòè" class="buttons" />
</form>
</td>
</tr>
</table>
</td>
</tr>
</table>
</xsl:template>
</xsl:stylesheet>

@ -22,17 +22,17 @@
</tr>
<tr class="lighttable">
<td width="45%" class="small" valign="top">
<span>Вы вошли в форум как summersun</span>
<xsl:text>Вы вошли в форум как summersun</xsl:text>
<br />
<span>18983 Зарегистрированных пользователей.</span>
<xsl:text>18983 Зарегистрированных пользователей.</xsl:text>
<br />
<span>Приветствуем нового пользователя,</span>
<xsl:text>Приветствуем нового пользователя, </xsl:text>
<a href="/showprofile.php?User=_PC&amp;What=ubbthreads">_PC</a>
<br />
<span>Сейчас 222 зарегистрированных и 54 анонимных пользователей в онлайне.</span>
<xsl:text>Сейчас 222 зарегистрированных и 54 анонимных пользователей в онлайне.</xsl:text>
<br />
<a href="/editdisplay.php?Cat=#offset">Òåêóùåå âðåìÿ:</a>
<span>08.06.2010 14:17, Вторник</span>
<xsl:text> 08.06.2010 14:17, Вторник</xsl:text>
</td>
<td width="30%" class="small" valign="top">
<b>Ïðîñìîòð íîâûõ ñîîáùåíèé</b>
@ -49,10 +49,10 @@
<b>Ëåãåíäà:</b>
<br />
<img src="/static/images/newposts.gif" alt="*" />
<span>Новые сообщения</span>
<xsl:text>Новые сообщения</xsl:text>
<br />
<img src="/static/images/nonewposts.gif" alt="*" />
<span>Нет новых сообщений</span>
<xsl:text>Нет новых сообщений</xsl:text>
</td>
</tr>
</table>

@ -0,0 +1,80 @@
<?xml version="1.0" encoding="Windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
<xsl:import href="elems\Main.xslt"/>
<xsl:import href="elems\PostInfo.xslt"/>
<xsl:template name="specific">
<xsl:call-template name="threadInfo"/>
<br />
<table width="95%" align="center" cellpadding="1" cellspacing="1" class="tablesurround">
<tr>
<td>
<table cellpadding="0" cellspacing="1" width="100%" class="tableborders">
<xsl:apply-templates select="posts/post"/>
</table>
</td>
</tr>
</table>
<br />
<xsl:call-template name="threadInfo"/>
</xsl:template>
<xsl:template name="threadInfo">
<table width="95%" align="center" cellpadding="1" cellspacing="1" class="tablesurround">
<tr>
<td>
<table cellpadding="3" cellspacing="1" width="100%" class="tableborders">
<tr class="darktable">
<td>
<table width="100%" cellpadding="0" cellspacing="0">
<tr class="darktable">
<td align="left" width="33%">
<font class="catandforum">
<xsl:apply-templates select="currentLocation" mode="breadcrumbs"/>
</font>
</td>
<td width="33%" align="right">
<table border="0" class="tablesurround">
<tr>
<td class="navigation" nowrap="nowrap">
<a>
<xsl:attribute name="href">/Board/<xsl:value-of select="currentLocation/post/parent/thread/parent/board/id"/>/</xsl:attribute>
<img src="/static/images/all.gif" alt="" border="0" width="19" height="15" style="vertical-align: text-bottom" />
<xsl:text>Ñïèñîê</xsl:text>
</a>
</td>
<td class="navigation" nowrap="nowrap">
<form method="get" action="/showflat.php" name="fullview">
<select name="fullview" class="formboxes" style="font-size:10px" onchange="document.forms.fullview.submit()">
<option value="0" >Íîðì</option>
<option value="1" >Îôò</option>
<option value="2" selected="selected">Ìóñ</option>
</select>
</form>
</td>
<td class="navigation" nowrap="nowrap">
<a>
<xsl:attribute name="href">/Thread/<xsl:value-of select="currentLocation/post/parent/thread/id"/>/p<xsl:value-of select="currentLocation/post/id"/>/</xsl:attribute>
<img alt="*" src="/static/images/flat.gif" style="vertical-align: text-bottom" />
<xsl:text>Ïëîñêèé</xsl:text>
</a>
</td>
<td class="navigation" nowrap="nowrap">
<a>
<img src="/static/images/greythreaded.gif" border="0" style="vertical-align: text-bottom" alt="Äåðåâî" />
<xsl:text>Äåðåâî</xsl:text>
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</xsl:template>
</xsl:stylesheet>

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="Windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
<xsl:import href="elems\Main.xslt"/>
<xsl:import href="elems\PostInfo.xslt"/>
<xsl:template name="specific">
<xsl:call-template name="threadInfo"/>
<br />
<table width="95%" align="center" cellpadding="1" cellspacing="1" class="tablesurround">
<tr>
<td>
<table cellpadding="0" cellspacing="1" width="100%" class="tableborders">
<tr class="tdheader">
<td>
<table width="100%" cellspacing="1" cellpadding="3" border="0">
<tr>
<td>
<xsl:text>ñòðàíèöû:</xsl:text>
<xsl:apply-templates select="posts/pageOuter" mode="withCurrent">
<xsl:with-param name="baseLink">/Thread/<xsl:value-of select="currentLocation/thread/id"/>/</xsl:with-param>
</xsl:apply-templates>
</td>
</tr>
</table>
</td>
</tr>
<xsl:apply-templates select="posts/post"/>
<tr class="tdheader">
<td>
<table width="100%" cellspacing="1" cellpadding="3" border="0">
<tr>
<td>
<xsl:text>ñòðàíèöû:</xsl:text>
<xsl:apply-templates select="posts/pageOuter" mode="withCurrent">
<xsl:with-param name="baseLink">/Thread/<xsl:value-of select="currentLocation/thread/id"/>/</xsl:with-param>
</xsl:apply-templates>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<br />
<xsl:call-template name="threadInfo"/>
</xsl:template>
<xsl:template name="threadInfo">
<table width="95%" align="center" cellpadding="1" cellspacing="1" class="tablesurround">
<tr>
<td>
<table cellpadding="3" cellspacing="1" width="100%" class="tableborders">
<tr class="darktable">
<td>
<table width="100%" cellpadding="0" cellspacing="0">
<tr class="darktable">
<td align="left" width="33%">
<font class="catandforum">
<xsl:apply-templates select="currentLocation" mode="breadcrumbs"/>
</font>
</td>
<td width="33%" align="right">
<table border="0" class="tablesurround">
<tr>
<td class="navigation" nowrap="nowrap">
<a>
<xsl:attribute name="href">/Board/<xsl:value-of select="currentLocation/thread/parent/board/id"/>/</xsl:attribute>
<img src="/static/images/all.gif" alt="" border="0" width="19" height="15" style="vertical-align: text-bottom" />
<xsl:text>Ñïèñîê</xsl:text>
</a>
</td>
<td class="navigation" nowrap="nowrap">
<form method="get" action="/showflat.php" name="fullview">
<select name="fullview" class="formboxes" style="font-size:10px" onchange="document.forms.fullview.submit()">
<option value="0" >Íîðì</option>
<option value="1" >Îôò</option>
<option value="2" selected="selected">Ìóñ</option>
</select>
</form>
</td>
<td class="navigation" nowrap="nowrap">
<a>
<img alt="*" src="/static/images/greyflat.gif" style="vertical-align: text-bottom" />
<xsl:text>Ïëîñêèé</xsl:text>
</a>
</td>
<td class="navigation" nowrap="nowrap">
<a>
<img src="/static/images/greythreaded.gif" border="0" style="vertical-align: text-bottom" alt="Äåðåâî" />
<xsl:text>Äåðåâî</xsl:text>
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</xsl:template>
</xsl:stylesheet>

@ -29,7 +29,7 @@
<td class="forumdescript" style="padding-right:0.5em">
<a href="/apostlist.php?Cat=&amp;Board=Common">
<xsl:attribute name="href">/Board/<xsl:value-of select="id"/>/</xsl:attribute>
<span>A</span>
<xsl:text>A</xsl:text>
</a>
</td>
<td class="forumdescript"><xsl:value-of select="description"/></td>
@ -51,7 +51,7 @@
</td>
<td width="10%" class="modcolumn" align="center">
<a href="/showprofile.php?User=Sash&amp;What=ubbthreads">Sash</a>
<span>, </span>
<xsl:text>, </xsl:text>
<a href="/showprofile.php?User=DeadmoroZ&amp;What=ubbthreads">DeadmoroZ</a>
</td>
</tr>
@ -60,25 +60,24 @@
<xsl:template match="lastPostInfo">
<xsl:choose>
<xsl:when test="post">
<xsl:value-of select="post/postDate"/><br />
<xsl:apply-templates select="post/postDate/date" mode="dateTime"/><br />
<a>
<xsl:attribute name="href">/Thread/<xsl:value-of select="post/threadId"/>/e<xsl:value-of select="post/id"/>/</xsl:attribute>
<span>îò </span>
<xsl:attribute name="href">/Thread/<xsl:value-of select="post/threadId"/>/p<xsl:value-of select="post/id"/>/</xsl:attribute>
<xsl:text>îò </xsl:text>
<xsl:value-of select="post/poster/user/name"/>
</a>
</xsl:when>
<xsl:otherwise>
<span>N/A</span>
<xsl:text>N/A</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="subBoards/board">
<span style="margin-left:0.5em;margin-right:0.5em">
<xsl:text> </xsl:text>
<a>
<xsl:attribute name="href">/Board/<xsl:value-of select="id"/>/</xsl:attribute>
<xsl:value-of select="name"/>
</a>
</span>
</xsl:template>
</xsl:stylesheet>

@ -8,19 +8,19 @@
<tr>
<td width="100%" class="topmenu" align="center">
<a href ="/" >Root</a>
<span> | </span>
<xsl:text> | </xsl:text>
<a href ="http://google.com/" target="_blank">Google</a>
<span> | </span>
<xsl:text> | </xsl:text>
<a href ="http://yandex.ru/" target="_blank">Yandex</a>
<span> | </span>
<xsl:text> | </xsl:text>
<a href ="http://mail.ru" target="_blank">Mail.ru</a>
<span> | </span>
<xsl:text> | </xsl:text>
<a href ="http://www.vedomosti.ru/" target="_blank">Vedomosti</a>
<span> | </span>
<xsl:text> | </xsl:text>
<a href ="http://www.afisha.ru/" target="_blank">Afisha</a>
<span> | </span>
<xsl:text> | </xsl:text>
<a href ="http://weather.yandex.ru/27612/" target="_blank">Weather</a>
<span> | </span>
<xsl:text> | </xsl:text>
<a href ="/sendmail.php" target="_blank">LAN Support</a>
</td>
</tr>
@ -35,18 +35,18 @@
<tr>
<td align="center" class="menubar">
<a href="/Boards/" target="_top">Ñïèñîê ôîðóìîâ</a>
<span> | </span>
<a href = "/word-search.php" target="_top">Ïîèñê</a>
<span> | </span>
<a href = "/login.php?Cat=" target="_top">My Home</a>
<span> | </span>
<a href = "/online.php?Cat=" target="_top">Êòî â îíëàéíå</a>
<span> | </span>
<a href = "/faq_russian.php" target="_top">FAQ</a>
<span> | </span>
<a href = "/logout.php?key=8b46d53aaa0096f6695478f81503082c" target="_top">Âûõîä</a>
<span> | </span>
<a href="/showmembers.php?Cat=&amp;page=1" target="_top">Ïîëüçîâàòåëè</a>
<xsl:text> | </xsl:text>
<a target="_top">Ďîčńę</a>
<xsl:text> | </xsl:text>
<a target="_top">My Home</a>
<xsl:text> | </xsl:text>
<a target="_top">Ęňî â îíëŕéíĺ</a>
<xsl:text> | </xsl:text>
<a target="_top">FAQ</a>
<xsl:text> | </xsl:text>
<a target="_top">Âűőîä</a>
<xsl:text> | </xsl:text>
<a target="_top">Ďîëüçîâŕňĺëč</a>
</td>
</tr>
</table>

@ -14,7 +14,7 @@
<xsl:call-template name="header"/>
<xsl:call-template name="specific"/>
<br />
<span>Data used for authoring this XHTML document:</span>
<xsl:text>Data used for authoring this XHTML document:</xsl:text>
<xmp><xsl:copy-of select="/"/></xmp>
</body>
</html>
@ -27,14 +27,21 @@
<xsl:attribute name="href">/Boards/</xsl:attribute>
<xsl:value-of select="category/name"/>
</a>
<span> &gt;&gt; </span>
<xsl:text> &gt;&gt; </xsl:text>
</xsl:if>
<xsl:if test="board/id">
<a>
<xsl:attribute name="href">/Board/<xsl:value-of select="board/id"/>/</xsl:attribute>
<xsl:value-of select="board/name"/>
</a>
<span> &gt;&gt; </span>
<xsl:text> &gt;&gt; </xsl:text>
</xsl:if>
<xsl:if test="thread/id">
<a>
<xsl:attribute name="href">/Thread/<xsl:value-of select="thread/id"/>/</xsl:attribute>
<xsl:value-of select="thread/name"/>
</a>
<xsl:text> &gt;&gt; </xsl:text>
</xsl:if>
</xsl:template>
@ -43,5 +50,84 @@
<xsl:value-of select="*/name"/>
</xsl:template>
<xsl:template match="date" mode="dateTime">
<span nowrap="nowrap">
<xsl:value-of select="year"/>
<xsl:text>-</xsl:text>
<xsl:value-of select="month"/>
<xsl:text>-</xsl:text>
<xsl:value-of select="mday"/>
<xsl:text> </xsl:text>
<xsl:value-of select="hour"/>
<xsl:text>:</xsl:text>
<xsl:value-of select="minute"/>
<xsl:text>:</xsl:text>
<xsl:value-of select="second"/>
</span>
</xsl:template>
<xsl:template match="date" mode="date">
<span nowrap="nowrap">
<xsl:value-of select="year"/>
<xsl:text>-</xsl:text>
<xsl:value-of select="month"/>
<xsl:text>-</xsl:text>
<xsl:value-of select="mday"/>
</span>
</xsl:template>
<xsl:template match="pageOuter/pages/page" mode="withoutCurrent">
<xsl:param name="baseLink"/>
<xsl:param name="selected">-1</xsl:param>
<xsl:if test="current() != '0'">
<xsl:text>|</xsl:text>
</xsl:if>
<a class="separate">
<xsl:if test="current() != $selected">
<xsl:attribute name="href"><xsl:value-of select="$baseLink"/><xsl:value-of select="current()"/></xsl:attribute>
</xsl:if>
<xsl:value-of select="current()"/>
</a>
</xsl:template>
<xsl:template match="pageOuter" mode="withoutCurrent">
<xsl:param name="baseLink"/>
<xsl:apply-templates select="pages/page" mode="withoutCurrent">
<xsl:with-param name="baseLink"><xsl:value-of select="$baseLink"/></xsl:with-param>
<xsl:with-param name="selected">-1</xsl:with-param>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="pageOuter" mode="withCurrent">
<xsl:param name="baseLink"/>
<xsl:apply-templates select="pages/page" mode="withoutCurrent">
<xsl:with-param name="baseLink"><xsl:value-of select="$baseLink"/></xsl:with-param>
<xsl:with-param name="selected">
<xsl:choose>
<xsl:when test="unlimited='false'">
<xsl:value-of select="start"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>-1</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:apply-templates>
<xsl:text>|</xsl:text>
<a class="separate">
<xsl:if test="unlimited='false'">
<xsl:attribute name="href"><xsl:value-of select="$baseLink"/>all</xsl:attribute>
</xsl:if>
<xsl:text>âñå</xsl:text>
</a>
<xsl:if test="next">
<xsl:text>|</xsl:text>
<a class="separate">
<xsl:attribute name="href"><xsl:value-of select="$baseLink"/><xsl:value-of select="next"/></xsl:attribute>
<xsl:text>Ñëåäóþùàÿ ñòðàíèöà</xsl:text>
</a>
</xsl:if>
</xsl:template>
</xsl:stylesheet>

@ -0,0 +1,162 @@
<?xml version="1.0" encoding="Windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
<xsl:template match="post">
<tr>
<td>
<table width="100%" cellspacing="1" cellpadding="3" border="0">
<tr>
<td width="120" valign="top" class="darktable" rowspan="2">
<a><xsl:attribute name="name">Post<xsl:value-of select="id"/></xsl:attribute></a>
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<a>
<xsl:attribute name="href">/User/<xsl:value-of select="poster/user/id"/>/</xsl:attribute>
<xsl:value-of select="poster/user/name"/>
</a>
</td>
</tr>
<tr>
<td class="small">
<b><xsl:value-of select="poster/user/title"/></b>
</td>
</tr>
<tr>
<td class="small">
<i></i>
</td>
</tr>
<tr>
<td class="small">
<i><font color="red"></font></i>
</td>
</tr>
<tr>
<td class="small">
<img src="/user/7901.jpg" alt="" width="80" height="80" />
</td>
</tr>
<tr>
<td class="small">
<xsl:text>Ðåã.: </xsl:text>
<xsl:apply-templates select="poster/user/regDate/date" mode="date"/>
</td>
</tr>
<tr>
<td class="small">
<xsl:text>Ñîîáùåíèé: </xsl:text>
<xsl:value-of select="poster/user/totalPosts"/>
</td>
</tr>
<tr>
<td class="small">
<xsl:text>Èç: </xsl:text>
<xsl:value-of select="poster/user/location"/>
</td>
</tr>
</table>
</td>
<td class="subjecttable">
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td align="left" width="65%" valign="top">
<a target="_blank" class="separate">
<xsl:attribute name="href">/Post/<xsl:value-of select="id"/>/</xsl:attribute>
<img border="0" src="/static/images/book-notread.gif" alt="" style="vertical-align: text-bottom" />
</a>
<b class="separate"><xsl:value-of select="title"/></b>
<img alt="new" src="/static/images/new.gif" />
<xsl:if test="parentPost/post">
<font class="small separate">
<xsl:text>[</xsl:text>
<a target="_blank">
<xsl:attribute name="href">/Post/<xsl:value-of select="parentPost/post/id"/>/</xsl:attribute>
<xsl:text>re: </xsl:text>
<xsl:value-of select="parentPost/post/poster/user/name"/>
</a>
<xsl:text>]</xsl:text>
</font>
</xsl:if>
<br />
<font class="small" style="padding-left:2em"><xsl:apply-templates select="postDate/date" mode="dateTime"/></font>
</td>
<td align="right" width="35%">
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td align="right">
<table class="tablesurround" border="0">
<tr>
<td class="navigation">
<a>
<xsl:attribute name="href">/PostReply/<xsl:value-of select="id"/>/</xsl:attribute>
<img src="/static/images/reply.gif" border="0" alt="Îòâåò íà ñîîáùåíèå" width="27" height="14" title="Îòâåò íà ñîîáùåíèå" style="vertical-align: text-bottom" />
</a>
</td>
<td class="navigation">
<a>
<img src="/static/images/edit.gif" border="0" alt="Ïðàâêà ñîîáùåíèÿ" title="Ïðàâêà ñîîáùåíèÿ" width="21" height="14" style="vertical-align: text-bottom" />
</a>
</td>
<td class="navigation">
<a target="_blank">
<img src="/static/images/print.gif" border="0" alt="Ïå÷àòü ñîîáùåíèÿ" title="Ïå÷àòü ñîîáùåíèÿ" />
</a>
</td>
<td class="navigation">
<a>
<img src="/static/images/addreminder.gif" border="0" alt="Äîáàâèòü òåìó â íàïîìèíàíèÿ!" title="Äîáàâèòü òåìó â íàïîìèíàíèÿ!" />
</a>
</td>
<td class="navigation">
<a>
<img src="/static/images/notifymod.gif" border="0" alt="Èçâåñòèòü ìîäåðàòîðà" title="Èçâåñòèòü ìîäåðàòîðà" />
</a>
</td>
<td class="navigation">
<a>
<img src="/static/images/email2.gif" border="0" alt="Îòâåòèòü ïðèâàòîì" title="Îòâåòèòü ïðèâàòîì" />
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="lighttable">
<table width="100%" cellspacing="0" cellpadding="0" style="table-layout: fixed">
<tr>
<td>
<br />
<font class="post">
<xsl:value-of select="body" disable-output-escaping="yes" />
<br />
<br />
</font>
</td>
</tr>
<xsl:if test="poster/user/signature != ''">
<tr>
<td>
<div style="width:100%;max-height:50px;height: expression( this.scrollHeight > 49 ? '50px' : 'auto' );overflow:hidden">
<font size="-2"><xsl:value-of select="poster/user/signature"/><br /></font>
</div>
</td>
</tr>
</xsl:if>
</table>
</td>
</tr>
</table>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>

@ -4,7 +4,7 @@
<xsl:template match="thread">
<tr>
<td align="left" class="lighttable">
<xsl:attribute name="title"><xsl:value-of select="body"/></xsl:attribute>
<xsl:attribute name="title"><xsl:value-of select="bodyShort"/></xsl:attribute>
<img alt="*" hspace="5" style="vertical-align: text-bottom">
<xsl:choose>
<xsl:when test="hasNewPosts='true'">
@ -23,14 +23,9 @@
<xsl:value-of select="title"/>
</a>
<span class="small" style="margin-left:1.5em">
<a class="separate">
<xsl:attribute name="href">/Thread/<xsl:value-of select="id"/>/0/</xsl:attribute>
<span>0</span>
</a>
<a class="separate">
<xsl:attribute name="href">/Thread/<xsl:value-of select="id"/>/20/</xsl:attribute>
<span>20</span>
</a>
<xsl:apply-templates select="pageOuter" mode="withoutCurrent">
<xsl:with-param name="baseLink">/Thread/<xsl:value-of select="id"/>/</xsl:with-param>
</xsl:apply-templates>
</span>
</td>
<td align="left" nowrap="nowrap" class="lighttable">
@ -55,7 +50,7 @@
</a>
</td>
<td nowrap="nowrap" align="center" class="lighttable">
<xsl:value-of select="lastPostDate"/>
<xsl:apply-templates select="lastPostDate/date" mode="dateTime"/>
</td>
</tr>
</xsl:template>

Loading…
Cancel
Save