gpt4 book ai didi

html - 如何输出没有 "widows"的多列 html?

转载 作者:可可西里 更新时间:2023-11-01 13:40:46 25 4
gpt4 key购买 nike

我需要将分类链接列表输出到 HTML,正好是三列文本。它们的显示方式必须类似于报纸或杂志中的专栏。因此,例如,如果总共有 20 行,第一列和第二列将包含 7 行,最后一列将包含 6 行。列表必须是动态的;它会定期更改。

棘手的部分是链接是用标题分类的,而这个标题不能是“寡妇”。如果你有页面布局背景,你就会知道这意味着标题不能显示在列的底部——它们下面必须至少有一个链接,否则它们应该跳到下一列(我知道,技术上如果我真的在做页面布局,它应该是两行,但在这种情况下,一行是可以接受的)。我很难弄清楚如何完成这项工作。

这是我的意思的一个例子:

Shopping     Link 3      Link1Link 1       Link 4      Link2Link 2                   Link 3Link 3       Cars             Link 1      MusicGames        Link 2      Link 1Link 1              Link 2       News

如您所见,“新闻”标题位于中间栏的底部,“寡妇”也是如此。这是无法接受的。我可以将它撞到下一列,但这会在第二列的底部产生不必要的大量空白。相反,整个列表需要重新平衡。

我想知道是否有人有任何关于如何完成此操作的提示,或者源代码或插件。Python 是首选,但任何语言都可以。我只是想把一般概念记下来。

最佳答案

总的要点是构建一个包含所有“可流动”项目(包括类别)的主列表,然后遍历该列表,根据需要调整每列的行数,以便没有类别保持寡落(或您可能有的任何其他条件。 )

Module Module1

Dim Categories As New Dictionary(Of String, List(Of String))

Sub Main()

Const Columns As Integer = 3

' create the category items
Dim ShoppingList As New List(Of String)
Dim GamesList As New List(Of String)
Dim CarsList As New List(Of String)
Dim NewsList As New List(Of String)
Dim MusicList As New List(Of String)

ShoppingList.Add("Link1")
ShoppingList.Add("Link2")
ShoppingList.Add("Link3")

GamesList.Add("Link1")
GamesList.Add("Link2")
GamesList.Add("Link3")
GamesList.Add("Link4")

CarsList.Add("Link1")
CarsList.Add("Link2")

NewsList.Add("Link1")
NewsList.Add("Link2")
NewsList.Add("Link3")

MusicList.Add("Link1")

' create the categories
Categories.Add("Shopping", ShoppingList)
Categories.Add("Games", GamesList)
Categories.Add("Cars", CarsList)
Categories.Add("News", NewsList)
Categories.Add("Music", MusicList)

' count each category and its items
Dim TotalRows As Integer = Categories.Count
For Each kvp As KeyValuePair(Of String, List(Of String)) In Categories
TotalRows += kvp.Value.Count
Next

' add a space between each category
TotalRows += (Categories.Count - 1)

' determine the number of rows per column
Dim RowsPerColumn As Integer = Int(TotalRows / Columns) + If((TotalRows Mod Columns) > 0, 1, 0)

' build a master list
Dim master As New List(Of String)
For Each kvp As KeyValuePair(Of String, List(Of String)) In Categories
master.Add(kvp.Key)
For Each item As String In kvp.Value
master.Add(item)
Next
master.Add(" ")
Next

' remove the last invalid blank item
master.RemoveAt(master.Count - 1)

' ensure that the RowsPerColumn'th-item in the list is not a category
Dim adjusted As Boolean
Do
adjusted = False
For i As Integer = 1 To master.Count - 1 Step RowsPerColumn - 1
If Categories.Keys.Contains(master(i)) Then
RowsPerColumn += 1 ' adjust rows per column (could go up or down)
adjusted = True
End If
Next
Loop While adjusted

' output resulting table
Using sw As New IO.StreamWriter("test.htm")
sw.WriteLine("<html>")
sw.WriteLine("<body>")
sw.WriteLine("<table cellspacing=""0"" cellpadding=""3"" border=""1"">")
For j As Integer = 0 To RowsPerColumn - 1
sw.WriteLine("<tr>")
Dim columnCount As Integer = 0 ' columns written
For i As Integer = j To master.Count - 1 Step RowsPerColumn
sw.WriteLine("<td>" & master(i) & "</td>")
columnCount += 1
Next
' if the number of columns actually written was less than Columns constant
If columnCount < Columns Then
For c As Integer = 0 To Columns - columnCount - 1
sw.WriteLine("<td>&nbsp;</td>")
Next
End If
sw.WriteLine("</tr>")
Next
sw.WriteLine("</table>")
sw.WriteLine("</body>")
sw.WriteLine("</html>")
End Using

End Sub

End Module

关于html - 如何输出没有 "widows"的多列 html?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2687028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com