Φτιάξτε μόνοι σας χρήσιμα utilities με JavaScript

Κώδικας, πληροφορίες, ερωτήσεις και απαντήσεις σχετικές με την JavaScript.

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Cmg__
Δημοσιεύσεις: 1710
Εγγραφή: 29 Μαρ 2005 22:40

Φτιάξτε μόνοι σας χρήσιμα utilities με JavaScript

Δημοσίευση από Cmg__ » 08 Απρ 2005 00:15

Loipon , dokimasa ton tropo poy moy eipes.
To mono poy katafere na diorthwsw itan to eikonidio to opoio itan san to wscript kai twra pleon einai opws prin.!
To ANOIGMA den yphrxe kan kai to eftiaksa egw!
Twra H efarmogh gia thn ektelesh ths energeias einai to :
C:\WINDOWS\system32\WScript.exe "%1" %*
(to %* to prosthesa egw opws moy eipes).To idi prog otan to anoigw leei Insufficient Arguments
kai otna sernw kapoio allo arxeio panw toy oyte antidra!!!
Nomizw pws pleon thelei farmakeftikh voithia gia na synelthei :hammer: :hammer:
Twra katevazw to scripter twn windows.As elpisw pws tha voithisei!!!!!

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Φτιάξτε μόνοι σας χρήσιμα utilities με JavaScript

Δημοσίευση από skeftomilos » 08 Απρ 2005 00:58

Το "%1" %* είναι ουσιώδες και ιδίως το τελικό %*. Το έβγαλα για λίγο ώστε να αναπαράγω το πρόβλημα.
ThyClub έγραψε:Μπορεί να μου εξηγήσει κάποιος τι δικαιώματα έχει ενα javascript? Δηλαδή τί μπορεί να κάνει χωρίς user confirmation κτλ
Αναφέρεσαι σε script μέσα σε HTML σελίδα. Γιατί ως ανεξάρτητο .js αρχείο έχει κάθε δικαίωμα που έχει ο τρέχον user των Windows. Και επειδή το 99,9% των χρηστών κάνουν μονίμως log-in ως adminitrators, μπορεί να κάνει τα πάντα, μέχρι και format το δίσκο. Τώρα ως embedded script σε HTML σελίδα:

- Μπορεί να κάνει κάθε είδους αλλαγή στο περιεχόμενο της σελίδας. Να προσθέσει, να αλλάξει, να αφαιρέσει, να μετακινήσει.

- Μπορεί να γράψει ακόμα και νέο κώδικα Javascript στη σελίδα. Ακούγεται τρελό αλλά συμβαίνει αρκετά συχνά. Π.χ.:

Κώδικας: Επιλογή όλων

<script>
  document.write&#40;"<scr" + "ipt>alert&#40;'crazy!'&#41;</scr" + "ipt>"&#41;
</script>
- Μπορεί να συλλέξει ορισμένες πληροφορίες για το μηχάνημα του χρήστη όπως λειτουργικό σύστημα, time-zone, γλώσσα, browser, color depth και ανάλυση οθόνης, εγκατεστημένα plug-ins και διαθεσιμότητα Java καθώς και την αμέσως προηγούμενη σελίδα που επισκέφτηκε ο χρήστης.

- Μπορεί να παγιδεύσει όλα τα διαθέσιμα συμβάντα των HTML elements (onMouseOver, onFocus κ.λπ.) με on-the-fly ρουτίνες.

- Μπορεί να διαβάσει και να γράψει cookies (διαβάζει μόνο τα cookies του δικού της domain).

- Μπορεί να δημιουργήσει framesets και frames από το τίποτα.

- Μπορεί να κάνει submit σε φόρμες, να αλλάξει το action, το target, τη method, τις hidden values κ.λπ.

- Μπορεί να κάνει submit σε φόρμες κρυμμένων IFrames, ανταλλάσσοντας κρυφά πληροφορίες με τον server.

- Μπορεί να σταματήσει το download της σελίδας.

- Μπορεί να ξαναφορτώσει τη σελίδα.

- Μπορεί να κάνει redirection.

- Μπορεί να επιστρέψει το χρήστη στην προηγούμενη σελίδα (Back) ή σε κάποια από τις προηγούμενες οι επόμενες (αν υπάρχουν).

- Μπορεί να εκτυπώσει τη σελίδα στον εκτυπωτή (με επιφύλαξη για το αν απαιτείται user confirmation ή όχι).

- Μπορεί να αλλάξει το μέγεθος του παραθύρου του browser, αλλά όχι μικρότερο από 100 x 100 pixels.

- Μπορεί να μετακινήσει το παράθυρο του browser αλλά όχι εκτός οθόνης.

- Μπορεί να δημιουργήσει pop-up παράθυρα και να αλλάξει το περιεχόμενό τους με κάθε τρόπο (εκτός αν το url ανήκει σε άλλο domain).

- Μπορεί να αφαιρέσει την toolbar και τη statusbar των pop-up παραθύρων κατά βούληση.

- Μπορεί να αλλάξει το μέγεθος και τη θέση των pop-up παραθύρων και να τα κλείσει αυτόματα.

- Μπορεί να διαβάσει και να μεταβάλλει πλήρως τα περιεχόμενα μίας άλλης σελίδας σε διπλανό frame, αρκεί να ανήκουν στο ίδιο domain.

- Μπορεί να γράψει στη status bar και να αλλάξει τον τίτλο του παραθύρου του browser.

- Μπορεί να εκτελεί κώδικα κατά διαστήματα με χρήση timers.

- Μπορεί να ελέγξει και να ελεγχθεί από Java Applets.

- Μπορεί να καταναλώσει το 100% της CPU και RAM και να γονατίσει το PC, μέχρι να κλείσει ο χρήστης το tab ή παράθυρο του browser.

- Μπορεί να βγάζει το ένα popup μετά το άλλο, προκαλώντας σύγχυση στο χρήστη.

- Μπορεί να μάθει αν ο χρήστης έχει ενεργοποιημένη τη Javascript. Είναι δηλαδή όπως ο άνθρωπος. Ξέρει ότι ζει όταν είναι ζωντανός, αλλά δεν ξέρει ότι δε ζει όταν δεν είναι ζωντανός. Πω, πω, τι είπα τώρα ο φιλόσοφος! Παρακαλώ τα γιαούρτια να μην έχουν μούχλα.
:D

Πάμε τώρα στα "ΔΕΝ".

- Δε μπορεί να διαβάσει και να γράψει στο δίσκο (εξαιρουμένων των cookies).

- Δε μπορεί να διαβάσει και να γράψει στο Clipboard.

- Δε μπορεί να διαβάσει και να γράψει στο Registry.

- Δεν έχει πρόσβαση στα bookmarks ή στη History list.

- Δε μπορεί να συνδεθεί ή να αποσυνδεθεί από το Internet.

- Δε μπορεί να γνωρίζει τα άλλα προγράμματα που λειτουργούν ταυτόχρονα ή να επικοινωνήσει μαζί τους.

- Δε μπορεί να εγκαταστήσει προγράμματα.

- Δε μπορεί να καλέσει COM libraries και ActiveX.

- Δε μπορεί να αλλάξει τη z-order του παραθύρου του browser (να τον στείλει "πίσω").

- Δε μπορεί να αλλάξει τα περιεχόμενα της address bar.

- Δε μπορεί να γράψει στα πεδία <input type="file"> ώστε να προκαλέσει αυτόματο upload.

- Δε μπορεί να εμποδίσει το χρήστη να κλείσει το παράθυρο του browser.

- Δε μπορεί να κλείσει το παράθυρο του browser μόνη της.

- Δε μπορεί να αφήσει κάποιο ίχνος στον υπολογιστή (εκτός από τα cookies).

- Δε μπορεί να κάνει crash τον browser ή το λειτουργικό σύστημα (ή δε θα έπρεπε να μπορεί - ο Firefox μου έχει crashάρει μερικές φορές!)

Επειδή η λίστα είναι σίγουρα ημιτελής, όποιος σκεφτεί κάτι άλλο παρακαλώ ας το συμπληρώσει.
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Φτιάξτε μόνοι σας χρήσιμα utilities με JavaScript

Δημοσίευση από skeftomilos » 15 Μάιος 2005 15:55

Σας έχει τύχει ποτέ να ανοίξετε ένα αρχείο κειμένου στο Notepad και να δείτε κάτι τέτοιο?

Εικόνα

Αφού το εξετάσατε προσεχτικά καταλάβατε ότι τα τετραγωνάκια που εμφανίζονται αντιστοιχούν σε αλλαγές γραμμής. Δηλαδή το κείμενο θα έπρεπε κανονικά να εμφανίζεται έτσι:

Εικόνα

Τα τετραγωνάκια αυτά εμφανίζονται όταν χρησιμοποιούμε τα Windows για να δούμε ένα αρχείο κειμένου που συντάχθηκε στο λειτουργικό σύστημα Unix. Στο Unix ως χαρακτήρας αλλαγής γραμμής χρησιμοποιείται ο χαρακτήρας NEW LINE με κωδικό ASCII 10, ενώ στα Windows το ζεύγος των χαρακτήρων CARRIAGE RETURN και NEW LINE με κωδικούς 13 και 10. Προκύπτει λοιπόν ένα πρόβλημα με ορισμένα προγράμματα όπως το Notepad που δεν θεωρούν ότι ο χαρακτήρας NEW LINE είναι αρκετός από μόνος του να δηλώσει την αλλαγή γραμμής. Μία λύση για το πρόβλημα αυτό είναι να χρησιμοποιήσετε κάποιο πιο σοφιστικέ πρόγραμμα για να ανοίξετε το αρχείο, όπως το WordPad ή το Word. Αν μάλιστα ανοίξετε το αρχείο στο WordPad και κάνετε Save, το αρχείο θα διορθωθεί και θα μπορείτε να το βλέπετε σωστά και με το Notepad.

Αν έχετε ένα μεγάλο αριθμό αρχείων κειμένου να διορθώσετε, θα είναι αρκετά κουραστικό να τα ανοίγετε και να τα σώνετε ένα-ένα στο WordPad. Γι αυτό μπορούμε να φτιάξουμε ένα Windows script για να αυτοματοποιήσουμε αυτή τη διαδικασία. Θα χρησιμοποιήσουμε φυσικά τη γλώσσα JavaScript και τη μέθοδο SendTo. Το script θα διορθώνει με μιας όλα τα αρχεία που θα έχουμε επιλέξει. Αφού λοιπόν θα προκαλέσουμε αλλαγές σε αρχεία θα πρέπει να είμαστε προσεκτικοί. Ιδιαίτερα πρέπει να προσέξουμε να μην πειράξουμε τυχόν binary αρχεία που μπορεί να έχουν επιλεγεί κατά λάθος. Γι αυτό θα επιτρέψουμε αλλαγές σε όσα αρχεία έχουν κατάληξη που δηλώνει με βεβαιότητα ότι είναι αρχεία κειμένου, δηλαδή txt, htm, xml, asp, js, vbs κ.λπ. Ακόμα και αυτά τα αρχεία όμως δε θα τα πειράξουμε αν δούμε ότι δε χρειάζονται διόρθωση. Η τεχνική που θα χρησιμοποιήσουμε για τους ελέγχους και τη διόρθωση είναι οι Regular Expressions. Είναι μία πολύ ισχυρή τεχνική για αναζήτηση και εντοπισμό "σχημάτων" μέσα σε μια ακολουθία χαρακτήρων (string). Έχει μία ιδιαίτερη σύνταξη, πολύ συμπαγή αλλά και δυσανάγνωστη για όσους τη δουν για πρώτη φορά. Η τεχνική αυτή εγκαινιάστηκε από τη γλώσσα Perl, και ήταν τόσο επιτυχημένη που σήμερα σχεδόν όλες οι γλώσσες την περιλαμβάνουν με τον ένα η τον άλλο τρόπο. Η JavaScript δεν αποτελεί εξαίρεση, και διαθέτει το αντικείμενο RegExp γι αυτή τη δουλειά. Αλλά ας δούμε τώρα τον κώδικα:

Κώδικας: Επιλογή όλων

if &#40;WScript.Arguments.Length == 0&#41; &#123;
  WScript.Echo&#40;"Insufficient arguments"&#41;
  WScript.Quit&#40;&#41;
&#125;

function valid_extension&#40;file_name&#41; &#123;
  var re_ext = /\.&#91;^\.\/\\&#93;*$/
  var valid_extensions = ".txt.log.htm.html.asp.php.pl.xml.rss.svg.js.vbs.css"
  if &#40;re_ext.exec&#40;file_name&#41;&#41; &#123;
    var ext = RegExp.lastMatch
    return new RegExp&#40;ext + "&#40;\\.|$&#41;", "i"&#41;.test&#40;valid_extensions&#41;
  &#125; else &#123;
    return false
  &#125;
&#125;

var fso = WScript.CreateObject&#40;"Scripting.FileSystemObject"&#41;
var re_newline = /&#40;^|&#91;^\r&#93;&#41;\n/g
var re_crlf = /\r\n/g
var re_lf = /\n/g
var msg = ""
var cnt_not_found = 0 
var cnt_unknown_ext = 0 
var cnt_not_fixed = 0 
var cnt_fixed = 0 

for &#40;var i = 0; i < WScript.Arguments.length; i++&#41; &#123;
  var file_name = WScript.Arguments&#40;i&#41;
  if &#40;!fso.FileExists&#40;file_name&#41;&#41; &#123;
    cnt_not_found++
  &#125; else if &#40;!valid_extension&#40;file_name&#41;&#41;&#123;
    cnt_unknown_ext++
  &#125; else &#123;
    var file = fso.GetFile&#40;file_name&#41;
    var stream = file.OpenAsTextStream&#40;1, 0&#41; // ForReading, ASCII.
    var data = stream.ReadAll&#40;&#41;
    stream.Close&#40;&#41;
    if &#40;!re_newline.test&#40;data&#41;&#41; &#123;
      cnt_not_fixed++
    &#125; else &#123;
      data = data.replace&#40;re_crlf, "\n"&#41;
      data = data.replace&#40;re_lf, "\r\n"&#41;
      if &#40;fso.FileExists&#40;file_name + ".tmp"&#41;&#41; &#123;
        WScript.Echo&#40;"Σφάλμα, το αρχείο " + file_name + ".tmp υπάρχει ήδη."&#41;
      &#125; else &#123;
        var stream = fso.OpenTextFile&#40;file_name + ".tmp", 2, true, 0&#41; // ForWriting, ASCII.
        stream.Write&#40;data&#41;
        stream.Close&#40;&#41;
        fso.DeleteFile&#40;file_name&#41;
        fso.MoveFile&#40;file_name + ".tmp", file_name&#41;
        cnt_fixed++
        msg += "\r\n" + cnt_fixed + "&#41; " + file.Name
      &#125;
    &#125;
  &#125;
&#125;

if &#40;cnt_fixed == 0&#41; &#123;
  msg = "Δε διορθώθηκε κανένα αρχείο."
&#125; else &#123;
  msg = "Διορθώθηκαν&#58;" + msg
&#125;
if &#40;cnt_not_found != 0&#41; &#123;
  msg += "\r\n\r\nΔε βρέθηκαν&#58; " + cnt_not_found
&#125;
if &#40;cnt_unknown_ext != 0&#41; &#123;
  msg += "\r\n\r\nΑρχεία με άγνωστο extension&#58; " + cnt_unknown_ext
&#125;
if &#40;cnt_not_fixed != 0&#41; &#123;
  msg += "\r\n\r\nΔε χρειάστηκαν διόρθωση&#58; " + cnt_not_fixed
&#125;
var msg = "Σύνολο αρχείων&#58; " + WScript.Arguments.length + "\r\n\r\n" + msg

WScript.Echo&#40;msg&#41;
Το script είναι αρκετά μεγάλο, κυρίως λόγω της ανάγκης για όλους αυτούς τους ελέγχους. Θα μπορούσε να είναι ακόμα μεγαλύτερο αν θέλαμε να μη διορθώνει μόνο τα επιλεγμένα αρχεία αλλά και τους επιλεγμένους φακέλους. Σε αυτή την περίπτωση θα μπορούσαμε να χρησιμοποιήσουμε αναδρομή ώστε επιλέγοντας π.χ. ένα hard drive όπως το C: να διορθώσουμε με μιας όλο το δίσκο! Αλλά καλύτερα να αποφύγουμε να δώσουμε τόση δύναμη στο script γιατί μπορεί να το μετανιώσουμε. Το script είναι ελεγμένο, αλλά αν τα αρχεία σας είναι πολύτιμα και αναντικατάστατα καλύτερα κάντε αντίγραφα πριν τα διορθώσετε. Ένας εύκολος και πρακτικός τρόπος για να έχετε το κεφάλι σας ήσυχο είναι να κάνετε ένα αντίγραφο όλου του φακέλου, το οποίο αμέσως μετά θα διαγράψετε (Delete). Το αντίγραφο θα πάει αυτόματα στο Recycle Bin των Windows, απ' όπου θα μπορέσετε να το ανακαλέσετε αν - φευ - υπάρξει ανάγκη. Μία δοκιμαστική εκτέλεση εμφάνισε τα παρακάτω:

Εικόνα

Εικόνα

Το script παρέκαμψε το αρχείο excel.bmp γιατί δεν έχει σωστή κατάληξη, και το αρχείο ok.txt γιατί δε χρειαζόταν διόρθωση. Βέβαια πρέπει να έχουμε τοποθετήσει το script στο φάκελο SendTo, και να του έχουμε δώσει ένα όνομα με κατάληξη .js (π.χ. Fix-NewLine.js).

Το μέγεθος του κώδικα δε μας επιτρέπει να τον εξετάσουμε λεπτομερώς, αλλά ας ρίξουμε μία ματιά σε μία Regular Expression για να πάρουμε μία ιδέα:

Κώδικας: Επιλογή όλων

var re_ext = /\.&#91;^\.\/\\&#93;*$/
Η παραπάνω είναι η έκτη γραμμή του script, και ορίζει τη Regular Expression που εντοπίζει την κατάληξη του αρχείου. Σε απλά ελληνικά διαβάζεται ως εξής:
Βρες ένα κομμάτι κειμένου που να αρχίζει με μία τελεία, να συνεχίζει με οσουσδήποτε χαρακτήρες εκτός από τελείες, καθέτους ή ανάποδες καθέτους, οι οποίοι να βρίσκονται στο τέλος του προς εξέταση κειμένου.
Τριάντα δύο λέξεις για να μεταφράσουν δεκαπέντε χαρακτήρες, αυτό θα πει συμπύκνωση νοημάτων! Κατ' αρχήν παρατηρούμε ότι μία regular expression αρχίζει και τελειώνει με μία κάθετο "/". Μέσα βρίσκονται γράμματα, αριθμοί και σύμβολα, που συνήθως έχουν ιδιαίτερη σημασία. Για παράδειγμα η τελεία σημαίνει "οποιοσδήποτε χαρακτήρας εκτός από το χαρακτήρα αλλαγής γραμμής". Ας δοκιμάσουμε και μία γράμμα-γράμμα μετάφραση:

Κώδικας: Επιλογή όλων

\.        μία τελεία.
&#91;^\.\/\\&#93; ένας χαρακτήρας εκτός από τελεία, κάθετος ή ανάποδη κάθετος.
*         οσοιδήποτε χαρακτήρες απ' αυτούς.
$         να βρίσκονται στο τέλος του προς εξέταση κειμένου.
Αναλυτική περιγραφή όλων των συμβόλων που χρησιμοποιούνται στις Regular Expressions θα βρείτε εύκολα από πολλές πηγές. Συνήθως δεν υπάρχει διαφορά από γλώσσα σε γλώσσα, επομένως αν μάθατε τις Regular Expressions σε Perl, τις ξέρετε παντού. Εγώ σας προτείνω είτε το εγχειρίδιο για scripting της Microsoft, είτε το Reference για JavaScript 1.5 της Netscape. Και στα δύο θα τις βρείτε εύκολα κάνοντας αναζήτηση για τη λέξη RegExp.
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Απάντηση

Επιστροφή στο “JavaScript και Frameworks”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης