das ist mir ein Rätzel warum das bei einigen Browser auftritt
Ich hab Opera und damit überhaupt keine Probleme, ich werds mir demnächst nochmal genauer ansehen
Jetzt kommen bei mir manchmal statt # die Zeilennummern mit. Beispiel:
1.
String s = “";
2.
for(int i = 0; i < 5000; i++)
3.
s = s + "”;
4.
Vorschlag: ich würde auf jeden Fall versuchen, einen Knopf “Code kopieren” einzubauen,
der den Code zum Clipboard kopiert.
Auch wenn das Problem sich so lösen lässt, daß man den Code auf herkömmliche Art kopieren kann,
würde so ein Knopf trotzdem als Alternative gut passen.
Der hat dann noch den Vorteil, daß man den Text nicht auswählen muss.
Da ich zur Zeit versuche, das zu Beheben, mal kurz ein Zwischenstand:
a) Das Problem scheint daran zu liegen, das Geshi das ganze im HTML als
- (ordered list) aufbaut, und die verschiedenen Browser die unterschiedlich kopieren. Ich würde dann mal versuchen, ob das als table besser funktioniert.
b) Ich hätte das schon längst versucht, wenn ich nur finden würde, wo in dem **** PHP-Code das HTML rausgeschrieben wird…
c) Wie sollte das mit dem Knopf möglich sein, Andre? Ich kenne keine JS-Funktion oder so etwas, die etwas mit der Zwischenablage rumpfuschen kann.
Ist nur eine Idee, ich kenn mich mit Web Anwendungen nicht so aus.
Vielleicht geht’s ja über ein Applet?
Mit JavaScript geht (fast) alles
Der Quellcode sollte in einem versteckten(display: none; ) textarea-Element sein und eine ID erhalten, bspw. „sourcecode“. Dann einem Button die JS-Funktion geben, CopyToClipboard();
// erstmal nur für IE
function CopyToClipboard() {
var sc = document.getElementById('sourcecode').value.createTextRange();
sc.execCommand("RemoveFormat"); // für eventuell Formatierungen via <br /> etc
sc.execCommand("Copy");
}
Für Firefox ist das „markieren“ des Textes etwas aufwändiger aber das kann ich bei Bedarf gern auch noch schreiben.
Gut Schuß
VuuRWerK
Und das funktioniert dann in den gängigen Browsern? Das wäre ja schonmal ganz fein (nur müsste ich den PHP-Code wo das geschrieben wird trotzdem erstmal finden…)
So habs jetzt nochmal überarbeitet damits in allen gängigen Browsern funktioniert. FF, Opera, IE6. IE7 könnte mal bitte jemand testen da ich nur eine Standalone von dem hab funktionieren JavaScripte nur bedingt mit der Version.
Testen kann man es mal hier.
Es gibt allerdings im FF eine Einschränkung. Wer in seinem FF das signed.applets.codebase_principal_support nicht auf true hat oder erst gar nicht eingestellt wird eben bei meiner Version des Scriptes ein alert ausgeführt. Man kann es erlauben in dem man in seine „pref.js“ vom Firefox folgende Zeile schreibt:
user_pref("signed.applets.codebase_principal_support", true);
oder über about:config in die Adresszeile eingeben und dann einen neuen Boolean-Wert hinzufügt namens „signed.applets.codebase_principal_support“ und dessen Wert auf true setzt.
Wem das nicht gefällt der kann den Opera oder IE daher nehmen und es ohne jeglichen Einstellungen machen, die haben da anscheinend keinen so großen Riegel vorgeschoben.
Hier der Quelltext(da ich die OOP mag hab ich es auch gleich mal in OOP umgesetzt):
var isIE = (document.all) ? true : false;
function CopyToClipboard()
{
}
CopyToClipboard.prototype = {
copy : function(id) {
var sc = $(id);
sc.select();
if(isIE) {
if(window.clipboardData) {
var r = window.clipboardData.setData('Text', sc.value);
}
} else {
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
} catch(ex) {
if(confirm('Deine momentanen Einstellungen erlauben es nicht den Quelltext in die Zwischenablage zu kopieren. Willst Du wissen wie man es erlaubt?')) {
alert("Redirect zu einer Hilfeseite oder oeffnen eines Popups wo erklärt wird wie man es erlaubt.");
return(false);
} else {
alert('Text konnte nicht kopiert werden!');
return(false);
}
}
var clipboard, transferable, clipid;
var obj = new Object();
try {
clipboard = Components.classes["@mozilla.org/widget/clipboard;1"].createInstance(Components.interfaces.nsIClipboard);
} catch(ex) {
return(false);
}
try {
transferable = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
} catch(ex) {
return(false);
}
transferable.addDataFlavor("text/unicode");
obj = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
obj.data = sc.value;
transferable.setTransferData("text/unicode", obj, sc.value.length * 2);
clipid = Components.interfaces.nsIClipboard;
if(!clipboard) {
return(false);
}
clipboard.setData(transferable, null, clipid.kGlobalClipboard);
}
alert('Jetzt in der Zwischenablage:
' + sc.value);
return(true);
}
}
function $(id) {
return(document.getElementById(id));
}
var copyToClipboard = new CopyToClipboard();
Bei Fragen bitte fragen!
Gut Schuß
VuuRWerK
In IE7 funktioniert es. In FF bekomm ich diese Meldung:
Deine momentanen Einstellungen erlauben es nicht den Quelltext in die Zwischenablage zu kopieren.
Willst Du wissen wie man es erlaubt?
Leider weiss ich nicht wie man es erlaubt.
EDIT: Bin jetzt auf diese Seite gestossen: http://www.jeffothy.com/weblog/clipboard-copy/
Dort wird anscheinend eine Macromedia Flash Datei benutzt um das Kopieren für den Browser zu erledigen.
Ja genau das ist das Problem das der FF es nicht von vornherein erlaubt. Die Meldung habe ich erstellt so das es nicht zu ungefangenen Exceptions kommt.
Ich hab ja schon zuvor im Post beschrieben wie man es einstellt.
Das es im IE7 funktioniert hatte ich mir schon gedacht nur eben in meiner Standalone ist sowas einfach nicht drin, trotzdem danke fürs testen
Wenns fragen noch gibt dann immer her damit.
Gut Schuß
VuuRWerK
Richtig, ich hatte nicht darauf geachtet, sorry. Es geht jetzt mit FF.
Hm. Ich muss doch noch mal um Hilfe fragen.
Den Code, wo der eigentliche Code geschrieben wird habe ich jetzt gefunden. Für einen Kopieren-Button an einer geeigneten Stelle müsste ich den aufrufenden Code finden, das hab ich noch nicht
Aber hat jemand von euch eine Idee, wie man das machen könnte? Bisher ist das ganze ja eine
- , die dann eben falsch kopiert wird. Ich hatte das eben mal kurz in eine umgebaut, mit den Zeilennummern als linke Spalte, aber das gefällt mir auch nicht - es werden ja dann die Zeilennummern mitkopiert. Fällt jemandem eine HTML/CSS-Konstruktion ein, die das ganze Problem irgendwie löst?
Also ich hab mich mal fix hingesetzt und was umgesetzt was imho nicht das schönste ist aber dennoch funktioniert. Beim markieren des gesamten Quelltextes werden keine Zeilennummern mitkopiert dennoch aber angezeigt.
Hier mal fix das CSS:
/* content.css */
ol.linenumbers {
float: left;
/*border: 1px solid Red;*/
font-size: 12px;
font-family: monospace;
list-style-type: decimal;
}
/* IE6 Hack für korrekte Darstellung in IE6 */
* html ol.linenumbers {
/*border: 1px solid Red;*/
margin-left: 0;
padding-left: 35px;
}
div.sourcecode {
/*border: 1px solid #C0C0C0;*/
float: left;
}
pre {
font-size: 12px;
font-family: monospace;
}
Der (X)HTML-Code
[XML]
CopyPasteCopyPaste
- <!-- ... ~ ... -->
<!-- ... Sourcecode ... -->
Und testen könnt Ihr es hier: Klick!
Gut Schuß
VuuRWerK
Vielen Dank, das sieht wunderbar aus. Werd gleich versuchen, das in dieses Geshi-Gefrickel einzubauen.
Hmm. Mal schauen:
* MovingBar.java
* by André Uhres
*
*Den Hit-Button drücken.
*Wenn der Balken (moving bar) genau oben drüber ist, den Hit-Button wieder loslassen.
*Der Balken bewegt sich natürlich immer schneller!
*Pro Treffer gibt's einen Punkt. Bei Fehlschuss wird ein Punkt abgezogen.
*Pro Level muss man 10 Treffer erreichen.
*Mit 10 Punkten (also kein Fehlschuss) kommt man in den nächsten Level.
*Viel Glück!
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.text.*;
import javax.swing.*;
import javax.swing.Timer;
import javax.swing.border.*;
public class MovingBar extends JFrame implements ActionListener{
private boolean rightDirection = true;
private boolean newGame = true;
private JPanel toolbar = new JPanel();
private JPanel results = new JPanel();
private JButton btn = new JButton("Hit");{
btn.setPreferredSize(new Dimension(100,100));
}
private JLabel label = new JLabel();
private Bar bar;
private int position, points;
private int speed = 1;
private int level = 0;
private Toolkit tools = Toolkit.getDefaultToolkit();
private String score;
public MovingBar(){
setTitle("Moving Bar - Level 1");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel mainPanel = new JPanel();
bar = new Bar();
mainPanel.add(bar);
getContentPane().add(mainPanel,BorderLayout.CENTER);
btn.addActionListener(this);
toolbar.add(btn);
results.add(label);
getContentPane().add(results,BorderLayout.NORTH);
getContentPane().add(toolbar,BorderLayout.SOUTH);
setSize(500, 300);
setResizable(false);
setLocationRelativeTo(null);
setVisible(true);
bar.setPosition(0);
Timer timer = new Timer(1,this);
timer.start();
label.setText("V");
}
public void actionPerformed(ActionEvent evt){
if(evt.getSource() instanceof JButton){
byte b = 5b;
if( newGame ){
label.setText("");
points=0;
newGame = false;
}
if( position>200 && position<300 ){
hit();
}else{
if(speed<=(11+level)){
points--;
score=points+" points";
}
}
label.setText(score);
return;
}
if(rightDirection) position += speed;
else position -= speed;
if( position >480 ) rightDirection=false;
if( position <0 ) rightDirection=true;
bar.setPosition(position);
bar.repaint();
}
private void hit() {
if(speed<=(11+level)){
points++;
tools.beep();
speed++;
score=points+" points";
if(speed==(11+level)){
if(points==10){
score = score + " Super !";
level++;
setTitle("Moving Bar - Level "+(level+1));
}else{
score = score + " Game Over";
}
label.setText(score);
JOptionPane.showMessageDialog(this,"Level "+(level+1),"Click OK to continue",JOptionPane.INFORMATION_MESSAGE);
speed = 1+level;
newGame = true;
}
}
}
public static void main(final String[] args) {new MovingBar();}
}
/*
* Bar
*/
class Bar extends JPanel {
public Bar() {
setPreferredSize(new Dimension(10, 30));
setBackground(Color.red);
setBorder(new LineBorder(Color.BLACK));
}
public void setPosition(final int position){
setLocation( position, 0 );
}
}```
Ok, nicht übel, aber man sieht ja das Problem. Ich hab schon versucht, das mit line-height Angaben zu verbessern, aber das führt auch zu nicht viel. Ich werd mal weiter versuchen.
Ok sorry, da ist noch etwas total seltsam. In der Vorschau sah das seeehr viel besser aus...
Hab jetzt mal alles rückgängig gemacht. Irgendwie funktioniert das hier im Gesmatkontext nicht mehr, vielleicht floatet hier noch mehr rum und stört dann, oder was weiß ich…
Hm, ok da würd ich morgen nochmal drüber schauen wie es sich hier verhalten wird. Das Problem das etwas anderes „mitfloated“ ist gut möglich.
Ok ich schau mir das morgen an und da wird sich schon eine Lösung finden
Gut Schuß
VuuRWerK
Also hab das mal versucht mit dem kompletten Quellcode der hier einfließt bei solch einem Beitrag anzupassen. Naja es will nicht so recht wie ich das will Problem ist dabei auch die m. E. sehr merkwürdige Umsetzung des Highlightings, für jede Zeile eine
Inwiefern habt Ihr Zugriff auf die Geshi Umsetzung? Also den Teil wo am Ende der HTML-Code produziert wird? Vielleicht sollte man da schon was ändern für eine bessere Darstellung?
Also ich muss echt sagen das es so nicht wirklich lösbar ist, schade.
Gut Schuß
VuuRWerK
wir haben kompletten Zugriff auf den Geshicode, ist ja alles PHP.
Was mich halt wundert, ist dass Opera alles wunderbar kopiert
Wegen Kopieren ist ja auch alles Wunderbärchen Problem is ja jetzt die Darstellung des Sourcecodes.
Ich finde eben das das Geshi völlig unnötigen HTML-Code produziert und das macht eine weitere Verarbeitung sehr schwierig.
Gut Schuß
VuuRWerK
Ja, dass der Code vom Geshi … sagen wir mal, nicht so toll … ist, hab ich mir auch gedacht. Allerdings jetzt damit anzufangen, Geshi umzuschreiben, ist ja doch etwas unverhältnismäßig.
Zumal das Problem nicht am Geshi-Code liegt, sondern irgendwie am Forum. Als ich das da oben probiert hab, hat es in der Postvorschau nämlich geklappt. (Bis auf eine minimale Abweichung in der Zeilenhöhe bei den Zahlen und dem Code…)
Hm, also um das mit dem „runterrutschen“ des Quellcodes erstmal zu verhindern reicht es wenn Du dem div.sourcecode einfach noch das Attribute width: ???px; gibst, die genaue breite kann ich Dir sagen wenn ich daheim bin wo ich alles stehen hab. Damit wäre erstmal das Problem des „verrutschens“ weg.
Das andere Problem mit den Zeilennummern hab ich wie gesagt ca. 1std lang versucht zu beheben aber es wollte einfach nicht. Wenn ihr aber jetzt sagt das es semi-wichtig ist das die Zeilennummern mit dem Quellcode übereinstimmen kann man es ja erstmal so belassen, das kopieren mit dem selber markieren funktioniert ja dennoch einwandfrei.
Ich meld mich dann!
Gut Schuß
VuuRWerK