Avatar billede carlsensoftware Nybegynder
29. oktober 2012 - 18:52 Der er 10 kommentarer og
1 løsning

Styling af "indhold"

Jeg har gennem længer tid lavet en hjemmeside i ASP og der er blevet mange hurtige ændringer/ ideer.
Og nu ser indholdet ganske forfærdeligt ud.
cirka så dan her....

if a=b then
if c=d then
Response.Write "Hallo world"
  end if
      Response.Write "Hallo all" 
end if


Det virker jo fint, men det skræmmer mit øje.
Jeg har ledt efter et program at pynte på koden, men jeg har ikke kunne finde et program som kan rette på udsenet af en min rodet kode. Jeg har fundet nogle til HTML, men ikke til fx ASP eller PHP.

Er det nogle som kender sådan et program. ( måske har du et liggenede i skuffen som du selv har lavet )

Mvh
Carlsen
Avatar billede softspot Forsker
30. oktober 2012 - 09:07 #1
Søg på Google efter "beautifier VBScript"!

Du vil nok komme frem til en del. Her er et lille udsnit:

www.sourceformat.com/vbscript-beautifier.htm
www.daansystems.com/vbsbeaut/
www.brothersoft.com/vbscript-beautifier-215333.html

Jeg har IKKE testet nogle af dem, så jeg kan ikke sige god for dem, men der burde være noget som kan få dig videre...
Avatar billede carlsensoftware Nybegynder
11. november 2012 - 18:16 #2
Jeg glemte at skrive at du skulle være freeware.

www.sourceformat.com/vbscript-beautifier.htm er dog freeware, men den ser ud til at ødelægge asp dokumenter.

Jeg har prøvet at søge, men har ikke haft held i at finde nogle freeware vbscript-bequtifier eller ligende.
Avatar billede softspot Forsker
12. november 2012 - 11:51 #3
Prøv at smide denne i en vbs-fil og køre den fra kommandolinjen:

option explicit
const tabs = 3

dim fso, f
dim code, firstPos, codePos, codeLen, codeBlockEnd
dim pretext

set fso = CreateObject("Scripting.FileSystemObject")
set f = fso.OpenTextFile(wscript.Arguments(0))
code = f.ReadAll()
f.close


firstPos = 1
codepos = instr(firstPos, code, "<%")
codelen = len(code)

do while codepos < codelen and codepos > 0
  pretext = mid(code, firstPos, codepos - firstPos)

  codeBlockEnd = instr(codepos+2, code, "%>")

  if len(pretext) > 0 then
    wscript.echo trim(pretext)
  end if

  wscript.echo beautifyASP(trim(mid(code, codepos, codeBlockEnd-codePos+2)))

  if codeBlockEnd > 0 then
    firstPos = codeBlockEnd + 2
    codepos = instr(firstPos, code, "<%")
  else
    codepos = 0
  end if
loop

if len(code) > firstPos then
  wscript.echo trim(mid(code,firstPos))
end if

function beautifyAsp(s)
  dim res: res = ""
  dim line, lines, indent
  dim re, mc, m, v, idx
  set re = new RegExp
  re.Global = true
  re.IgnoreCase = true
  re.Pattern = "([^\:""]*(""[^""]*"")*?)+(\:|$)"

  lines = split(s, vbCrLf) 
  indent = 0

  for each line in lines
    set mc = re.Execute(line)
    if mc.Count > 0 then
      idx = 0
      for each m in mc
        v = m.Value
        if right(v, 1) = ":" then v = mid(v, 1, len(v)-1)
        if v = "" and idx > 0 then exit for
        indent = getIndentBefore(v, indent)
        wscript.echo string(indent, " ") & trim(v)
        indent = getIndentAfter(v, indent)
        idx = idx + 1
      next
    end if
  next

  beautifyAsp = res
end function


function getIndentAfter(ln, byval indent)
  dim mc
  set mc = getFirstWord(ln) 
 
  getIndentAfter = indent 

  if mc.Count > 0 then
    select case mc.item(0).Value
      case "while", "if", "function", "sub", "do", "for", _
          "select", "case", "else", "elseif", "with", _
          "class", "public", "private"
        getIndentAfter = indent + tabs
    end select
  end if
end function


function getIndentBefore(ln, byval indent)
  dim mc
  set mc = getFirstWord(ln) 

  getIndentBefore = indent 

  if mc.Count > 0 then
    select case mc.item(0).Value
      case "end", "loop", "wend", "next", "elseif", "else"
        getIndentBefore = indent - tabs
    end select
  end if
end function


function getFirstWord(ln)
  dim re
  set re = new RegExp
  re.Global = true
  re.IgnoreCase = true
  re.Pattern = "^[a-z][a-z0-9_]*\b"
  set getFirstWord = re.execute(trim(ln))
end function

Du kan evt. omdirigere den til en ny fil med flg. kommando:

cscript beautify.vbs gammel-asp-fil.asp > ny-asp-fil.asp

Scriptet er råt og upoleret, så det skal nok mest opfattes som et udgangspunkt for videre arbejde. Hvis du kan bruge det, er det jo fint...
Avatar billede carlsensoftware Nybegynder
15. november 2012 - 21:29 #4
Jeg har afprøvet din kode og der nogle enkle fejl i koden.


Der bliver lavet for mange "indryk" fordi jeg flere gange har skrevet IF THEN ( uden END IF )

Ligesom i din kode ...

        if right(v, 1) = ":" then v = mid(v, 1, len(v)-1)
        if v = "" and idx > 0 then exit for
        indent = getIndentBefore(v, indent)
        wscript.echo string(indent, " ") & trim(v)
        indent = getIndentAfter(v, indent)
   

"indent"
går tilsynlande i minus eller nul. ( som bliver til en ulovlig handling)

Og hvorfor leder du efter ":" ? Din kode laver et RETURN efter ":"

så <td>Klokken 10:45</td>

bliver til

<td>Klokken 10:
45</td>

Måske skulle ":" havde været ";" ?
Avatar billede softspot Forsker
15. november 2012 - 22:31 #5
Grunden til at jeg leder efter kolon er, at statements kan adskilles af kolon på én linje, som f.eks. dette:

dim i: i = 1: do while i < 2: i = i + 1: loop

Jeg må lige have kigget på de andre ting og se om jeg kan finde nogle løsinger...
Avatar billede softspot Forsker
15. november 2012 - 22:44 #6
Du nævner noget med ombrydning efter kolon i html (<td>Klokken 10:45</td>), men det burde den slet ikke fortolke, så kan du vise et eksempel på kode hvor du oplever dette?

Jeg forsøger at undgå ombrydning i strenge med det regulære udtryk i beautifyAsp.
Avatar billede softspot Forsker
16. november 2012 - 00:22 #7
Jeg har rettet lidt i koden og umiddelbart får jeg ikke længere fejl på det med indent der går i minus. Ej heller kan jeg genskabe problemet med at html skulle blive ombrudt. Koden ser nu således ud (ret lig med den gamle, med enkelte modifikationer):

option explicit
const tabs = 3

dim fso, f
dim code, firstPos, codePos, codeLen, codeBlockEnd
dim pretext

set fso = CreateObject("Scripting.FileSystemObject")
set f = fso.OpenTextFile(wscript.Arguments(0))
code = f.ReadAll()
f.close


firstPos = 1
codepos = instr(firstPos, code, "<%")
codelen = len(code)

do while codepos < codelen and codepos > 0
  pretext = mid(code, firstPos, codepos - firstPos)

  codeBlockEnd = instr(codepos+2, code, "%>")
  if codeBlockEnd > 0 then codeBlockEnd = codeBlockEnd + 2

  if len(trim(pretext)) > 0 and trim(pretext) <> vbCrLf then
    wscript.echo trim(pretext)
  end if

  wscript.echo beautifyASP(trim(mid(code, codepos, codeBlockEnd-codePos)))

  if codeBlockEnd > 0 then
    firstPos = codeBlockEnd
    codepos = instr(firstPos, code, "<%")
  else
    codepos = 0
  end if
loop

if len(code) > firstPos then
  wscript.echo trim(mid(code,firstPos))
end if

function beautifyAsp(s)
  dim res: res = ""
  dim line, lines, indent
  dim re, mc, m, v, idx
  set re = new RegExp
  re.Global = true
  re.IgnoreCase = true
  re.Pattern = "([^\:""]*(""[^""]*"")*?)+(\:|$)"

  lines = split(s, vbCrLf) 
  indent = 0

  for each line in lines
    set mc = re.Execute(line)
    if mc.Count > 0 then
      idx = 0
      for each m in mc
        v = m.Value
        if right(v, 1) = ":" then v = mid(v, 1, len(v)-1)
        if v = "" and idx > 0 then exit for
        indent = getIndentBefore(v, indent)
        wscript.echo string(indent, " ") & trim(v)
        indent = getIndentAfter(v, indent)
        idx = idx + 1
      next
    end if
  next

  beautifyAsp = res
end function


function getIndentAfter(ln, byval indent)
  dim mc
  set mc = getFirstWord(ln) 
 
  getIndentAfter = indent 

  if mc.Count > 0 then
    select case mc.item(0).Value
      case "while", "function", "sub", "do", "for", _
          "select", "case", "else", "elseif", "with", _
          "class", "public", "private"
        getIndentAfter = indent + tabs
      case "if"
        if right(trim(ln), 4) = "then" then
          getIndentAfter = indent + tabs
        end if
    end select
  end if
end function


function getIndentBefore(ln, byval indent)
  dim mc
  set mc = getFirstWord(ln) 

  getIndentBefore = indent 

  if mc.Count > 0 then
    select case mc.item(0).Value
      case "end", "loop", "wend", "next", "elseif", "else"
        getIndentBefore = indent - tabs
    end select
  end if
end function


function getFirstWord(ln)
  dim re
  set re = new RegExp
  re.Global = true
  re.IgnoreCase = true
  re.Pattern = "^[a-z][a-z0-9_]*\b"
  set getFirstWord = re.execute(trim(ln))
end function
Avatar billede carlsensoftware Nybegynder
09. december 2012 - 14:24 #8
Det er rigtigt pænt af den at hjælpe mig. Jeg har haft lidt travlt og svare derfor langsom tilbage.
Koden virker desværre ikke endnu. Må skriver jeg bare så dårlig kode at den ikke kan finde ud af det. :-)
Jeg sender lige noget asp kode til dig når jeg sidder ved den rigtige computer. Så kan du kigge på det hvis du har lyst.

Mvh
Johnny Carlsen
Avatar billede softspot Forsker
10. december 2012 - 08:29 #9
Ja, gør det! Det er lettere at forholde sig til noget konkret kode :-)
Avatar billede carlsensoftware Nybegynder
12. december 2012 - 15:39 #10
Her er et udpluk af noget kode hvor det går galt.


<%
If Err.Number = 0 and (1*s_lkode) > 0 and recid > 0 Then
      strSQL = "SELECT * FROM ugeseddel WHERE us_id = " &  recid
      Set rs = Conn.Execute(strSQL)
     
      'Response.Write stimer &"-"& oldTimer &"-"& s_tkode
      if oldTimer*1 <> s_tkode*1 then
        btid = rs("Starttid")
        etid = rs("Slutitd")
        stimer = rs("Timer")
       
        if btid = "" then btid = "00:00"
        if etid = "" then etid = "00:00"

        btid = FormatDateTime(btid,4)
        etid = FormatDateTime(etid,4)
        'Response.Write(strSQL)
        'Response.Write Err.Number &" "& Err.Description &"< br/>"
        'Response.Write "FORM"

        '<tr>
        '    <th colspan="2">Indtast klokkeslet og timer. Klokkeslet format=12:00, timeformat= 1,5</th>
        '</tr>
        '<tr>
        '    <td colspan="2"><input type='submit' name='OK' value=""OK"" /></td>
        '</tr>
%>
        <form action="update_db.asp?upmode=time&id=<% Response.Write recid %>" name="Tider" id="Tider" method="post">

        <table class="typetime">
        <tr>
            <th colspan="3">Indtast klokkeslet og timer.<br> Klokkeslet format=08:05<br>Timeformat= 1,5</th>
        </tr>
        <tr>
            <td>Start tid</td><td>Slut tid </td><td>Timer</td>
        </tr>
        <tr>
            <td><input type="text" name="starttid" value=<% Response.Write "'"& btid &"'" %> size="8" maxlength="8" onkeydown="return FilterInput (event)" onchange="return checkForm(this)" /></td>
            <td><input type="text" name="sluttid" value=<% Response.Write "'"& etid &"'" %> size="8" maxlength="8" onkeydown="return FilterInput (event)" onchange="return checkForm(this)" /></td>
            <td><input type="text" name="sTimer" value=<% Response.Write "'"& stimer &"'" %> size="4" maxlength="4" onkeydown="return FilterInputTid (event)" /></td>
        </tr>
        <tr>
            <td colspan="3" class="tleft"><input type="submit" name="OK" value="GEM" /></td>
        </tr>
        </table>

        </form>
<%
else
        Response.Redirect "index.asp"
      end if
  else
      Response.Write "<br>"& Err.Number &" "& Err.Description
  end if
  'Response.Write(rs("Job"))
  If Err.Number <> 0 then Session("Message") = Session("Message")+" Fejl. Informationer er muligvis ikke gemt. !"
  if (1*s_lkode) = 0 Then
      'kode = Request.ServerVariables("HTTP_REFERER")
      'kode =  Request.QueryString("url") & "&Uge=" & Request.QueryString("uge") & "&aar=" & Request.QueryString("aar")

      'Response.Write "Redirect index.asp"
      Response.Redirect "index.asp"
  end if
end if
Avatar billede carlsensoftware Nybegynder
28. februar 2013 - 22:32 #11
Lukket
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester