Question

Je dois sortie HTML une liste de liens classés par catégorie dans exactement trois colonnes de texte. Ils doivent être affichés semblables à des colonnes dans un journal ou un magazine. Ainsi, par exemple, s'il y a 20 lignes au total de la première et deuxième colonnes contiendraient 7 lignes et la dernière colonne contiendraient 6. La liste doit être dynamique; il sera changé régulièrement.

La partie la plus délicate est que les liens sont classés avec un titre et ce titre ne peut pas être une « veuve ». Si vous avez un arrière-plan de la mise en page, vous saurez que ce moyen les titres ne peuvent pas être affichés en bas de la colonne - ils doivent avoir au moins un lien sous eux, sinon ils devraient remonter à la colonne suivante (je sais, techniquement il devrait y avoir deux lignes si je en train de faire la mise en page, mais dans ce cas-ci est acceptable). Je vais avoir du mal à trouver comment obtenir ce fait.

Voici un exemple de ce que je veux dire:

Shopping     Link 3      Link1
Link 1       Link 4      Link2
Link 2                   Link 3
Link 3       Cars
             Link 1      Music
Games        Link 2      Link 1
Link 1              
Link 2       News

Comme vous pouvez le voir, les « Nouvelles » est le titre en bas de la colonne du milieu, et ainsi est une « veuve ». C'est inacceptable. Je pourrais cogner à la colonne suivante, mais cela créerait une quantité inutilement grande de l'espace blanc au bas de la deuxième colonne. Au lieu de cela, la liste complète doit être rééquilibrée.

Je me demande si quelqu'un a des conseils sur la façon d'y parvenir, ou peut-être le code source ou un plug-in. Python est préférable, mais toute langue est très bien. Je suis juste essayer d'obtenir le concept général vers le bas.

Était-ce utile?

La solution

Le sens général est de construire une liste maîtresse de tous les éléments « coulants » (y compris les catégories), puis passer par la liste, le réglage des lignes par colonne selon les besoins de telle sorte qu'aucune catégories restent veuves (ou tout autre conditions que vous pourriez avoir. )

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top